Job description smells

Job description smells dog

I love reading Job Descriptions (JD). I know, this sounds a bit strange. Given the rapid changes in the Information Technology sector, it's a way to get a perspective on market trends especially with hiring software engineers and managers.

Along the way, I've come across more than a few questionable, funny, or downright outrageous requirements or qualifications embedded in JDs, mostly the unicorn and purple squirrel ones. To start the week off, I thought I would share with you a few JD smells. For the non-coder audience, a "code smell" is any symptom in the source code of a program that possibly indicates a deeper problem.

Let's have some fun!

"Establish an impeccable engineering culture of technology innovation and excellence, characterized as highly collaborative, execution-focused, customer-centric, and high velocity."

Smell: "Impeccable culture" seems to indicate a command and control management style. And, the only thing that would push this into the buzz word stratosphere is somehow including the word "synergistic" into that statement.

"Comfortable with ambiguity and rapid change: excited about pushing out lots of code quickly and constantly iterating."

Smell: I need a code monkey ASAP!

"Ability to communicate well with business stakeholders, resolve competing or contradictory objectives, and to unify disparate ideas into a homogenized solution."

Smell: Our politics and internal organization resemble a Rube Goldberg machine.

"Implement and encourage successful asynchronous collaboration across the BU's global R&D organization."

Smell: Asynchronous collaboration, how does that work? I have an idea, just use a Promise, and it might eventually take care of itself. More coding humor!

"Experience upgrading, converting and integrating legacy technologies with modern architectures a plus."

Smell: As a software developer, there's a lot of work here you're going to hate doing. Most of it will be working on a monolithic application long forgotten.

"Oversee translation of product direction into plans to deliver high-quality products on time and within budget."

Smell: Our backlogs are half-baked, we miss our deadlines, and we're underfunded as a department. Did I forget to tell you that it's common to get bounced out of bed at 2 am to fix something that broke??

"Foster a thriving culture which marries both quality and delivery, employee engagement and retention in a highly competitive local market."

Smell: Our culture resembles Office Space. No, wait, it is Office Space!

"Can solve even the toughest and most complex of problems; great at gleaning meaning from whatever data is available; is a quick study of the new and different; adds personal wisdom and experience to come to the best conclusion and solution, given the situation; uses multiple problem-solving tools and techniques."

Smell: There's no way you're going to be successful in this role.

What are you hiding?

While most of this is tongue and cheek, there's something valuable each of us can take away. The question is, during the interview process, how open is the organization about sharing their dirty laundry? As the candidate, you're the one that will attempt to meet the expectations and solve all the ills listed (not listed) in the JD.

When HR and hiring managers write a job description, they imagine a future state. They also write from the perspective of knowing the problems and how to fix them.

A note to the hiring manager, elicit creativity from the candidate by sharing the "why" and "what" and let them explain the "how." In the JD, write about your current set of issues and then ask your candidates to share how they would go about solving them?

Wow, I know, scary. How many companies value that type of transparency? After all, the candidate you hire will quickly figure out, did I get sold a bill of goods?

Does your company suffer with retaining employees? Maybe there's a disconnect between the before and after hired states: what they think they're getting vs. what's actually there. Think about it.

What are some of the funniest or questionable statements or claims you've seen in JDs? Please share!

The servant leadership philosophy

Servant leadership philosophy Gandhi quote

What is the servant leadership philosophy? In this article, I'll share my experiences with applying what I believe to be the fundamental concepts: empowerment, transparency, collaboration, and adaptation.

I've spent plenty of years in command and control structures and understand the pros and cons of dictatorial management styles. Back in 2001, I accepted a position at McDATA to help lead the acquisition of a small storage software startup in San Jose. After the transaction closing, I spent a considerable amount of time with the product and engineering teams and learned about a software development methodology called XP. The acquired company's processes were vastly different from the waterfall models followed at McDATA. From that point forward, I knew our SDLC had to change and hoped to infuse iterative software development into McDATA.

I didn't realize I was missing some huge pieces of the puzzle since Agile processes are about a cultural transformation; one I was not yet equipped to drive forward.

Fast forward to 2013, a position at Rally Software, and an Agile itch I needed to scratch for some time. I learned why I hadn't been successful at McDATA convincing the stakeholders on the merits of Agile. At Rally, I was in the presence of experts and absorbed as much information and took as many classes as possible. I felt like Neo plugging into the "Matrix" to learn kung fu. While technology and process are critical, I discovered Agile was about people and more importantly, a servant leadership state of mind.

The servant leadership philosophy

I like to define the servant leadership philosophy as a set of behavioral values and characteristics of a company or, how we agree to interact with one another. My experience shows me a single individual can demonstrate servant leadership, but it takes an entire organization to make it genuine. Accountability is also critical since you have to reward the valued behaviors and weed out the ones that don't work.

There's a ton of literature to be found on the formal principles of servant leadership. There are a few essential beliefs for me, empowerment, transparency, collaboration, and adaptation, and I've included thoughts on each. I know there are more attributes of servant leadership, so I don't want to discount the ones not listed. Google "servant leadership" and you'll find a deluge of information on the topic.


Imagine hiring bright people to solve difficult problems and structuring an organization to help them get their jobs done. It requires a clear business vision and strategy as well as knowing which products to build and why. Organizing around this level of clarity enables autonomy which leads to empowerment.

Tell people and teams the "what," provide mentoring and coaching, and let them figure out the "how."


How often do people in an organization share an event that didn't go well? Are they thrown under the bus? And, do they own it and have a supportive environment to help clean it up? Trust, vulnerability, transparency, and accountability are vital traits of servant leadership. Do you and your company embrace these qualities?


I characterize an organization's overall behavior as either management by conflict or collaboration. I always ask myself, how do I want to show up today for work? I choose collaboration as conflict leaves people the options of fight or flight. I can't think of a more stressful situation to be in for 8+ hours each day and expect people to do their best work.

Disagreement is part of the collaboration process although it can't be the primary way an organization operates.


One of my mottos is inspect and adapt, everything, always. Not only does this include project and iteration level of work but individual hard and soft (EQ) skills. I believe improvement is the key to personal and professional success.

It only takes embracing a few essential characteristics of servant leadership get you to a whole new way of leading and working with people. Anyone at any level can adopt these principles since all of us have centers of responsibility and influence. Impact your corner of the world and watch the fruit of your efforts blossom.

Comments, questions, or corrections?? Let me know!

Using Route 53, Cloudfront, and to serve HTTPS pages

HTTPS everywhere graphic

For those of you using Route 53, CloudFront, and, this post explains how to securely serve your pages using HTTPS and CloudFront.

Starting October 2017, Google made good on "HTTPS Everywhere" unveiled at I/O 2014. The follow up was also posted on the Google Webmaster Central Blog under HTTPS as a ranking signal.

Hopefully, the above links explain why serving your site via HTTPS is important and frankly, required.

The folks over at were awesome in helping with the wayfinders and crafting a workaround. They provided a link to Route53 SSL Naked Domain Redirect which set up the framework for this solution.

Overall, there are three AWS configuration steps:

  • Setup your SSL certificate

  • Create a CloudFront distribution

  • Create a Route 53 alias

Setup your SSL certificate

Using AWS Certificate Manager (ACM), you'll either import an existing certificate or create a new one. When your current certificate expires, keep in mind that AWS provides these for FREE including wildcard certificates.

Create a CloudFront distribution

In the AWS console, navigate to CloudFront. Click on Create a Distribution then Get Started under Web. You will see a variety of options under Create Distribution.

Origin Settings

The value for Origin Domain Name is <username> If in doubt, log into and view your site. You'll see the correct URL address in the browser.

In Origin Protocol Policy, select HTTP. When CloudFront pulls anything from the origin (<username>, it needs to be done using HTTP. only supports HTTP at the time of this post. I kept all of the other default settings under Origin Settings.

CloudFront Origin Domain Name and Origin Protocol Policy

Default Cache Behavior Settings

Scroll down to Default Cache Behavior Settings. I changed the following settings in this section:

  • Viewer Protocol Policy to Redirect HTTP to HTTPS.

  • Cache Based on Selected Request Headers to All.

  • Forward Cookies to All.

  • Query String Forwarding and Caching to Forward all, cache based on all.

CloudFront Default Cache Behavior Settings is a service to serve pages from Evernote easily and not a platform to build an application. The headers, cookies, and query string settings can be adjusted to enable a bit more caching. I didn't spend the time to tune these options since caching isn't a concern for me right now.

Distribution Settings

Scroll down to Distribution Settings. Enter the domain name(s) that points to your site in Alternate Domain Names (CNAMEs). My domain is

Under SSL Certificate, you'll select Custom SSL Certificate and from the dropdown, find the certificate you created or uploaded in ACM.

Under Custom SSL Client Support, select Only Clients that Support Server Name Indication (SNI). All modern browsers support SNI so you should be good here. All of the other options remain the CloudFront defaults. Last, click on Create Distribution and wait for CloudFront to deploy your distribution. Creating the distribution can take 15 to 30 minutes.

CloudFront Distribution Settings

Create a Route 53 alias

Navigate to Route 53in the AWS console and go into your hosted zone. Click on Create Record Set. Under Name, enter the subdomain you'll be using for your site. I entered blog. Select A - IPv4 address under Type and click Yes on Alias. When you click on Alias Target, wait a few seconds and then you'll see a listing of available targets. Select the CloudFront distribution you created in the next step. Last, click on Create to complete this setup.

Route 53 alias settings for CloudFront

Something to keep in mind

Depending on how you configured your CloudFront distribution, you might need to invalidate your cache if you modify an existing page and want it to show up right away. I find that even though there is minimal caching with this setup, caching does occur.


I'm a big fan and user of Evernote. I came across when I was looking for a simple way to blog. I didn't want to spin up, theme, and maintain a full CMS or go with one of the public blogging sites. While there are some quirks with Evernote and getting the post formatting correct, I like the workflow as well as the support for markdown.

And sure, this might be overkill for most since you can deploy a static site to S3 and use CloudFront. Once Evernote,, and AWS is setup correctly, posting an article becomes simple.

Comments, questions, or corrections?? Let me know!

You're doing it wrong! Hiring, that is...

Hiring phrases

Are curious about how to hire exceptional product development people? In today's job market, changing your approach can make all the difference in attracting outstanding talent.

Over the course of my career, I've been on both sides of the hiring table more times than I care to think about. In the past, when hiring for software engineering and product development roles, I've participated in a variety of interviewing practices that make the hairs on the back of my neck stand up. I can only imagine how the candidates might have felt.

You remember the stories some years ago about the off the wall questions companies would ask candidates. Most of this was humorous and designed to get a person thinking about how to solve a problem. Somewhere along the way, the interview process went down a really dark path. It seemed to become . . . if the candidate actually survives the interview, we'll hire them.

There are several schools of thought on hiring practices. Let me offer five simple ways to improve your hiring process based upon many years of recruiting software engineers and product developers.


  1. Sell the candidate

  2. Both hard AND soft skills are important

  3. The most important hard skill is learning

  4. It takes a village to interview a candidate

  5. Let candidates do their best work

Sell the candidate

That's right, somebody has to actually SELL your company and the open position to the candidate. You might think, but I work for Google, Amazon, Uber?? Do yourself a favor and check your company ego identity at the door. Humility is part of the process. Transparency goes a long way in attracting key talent. Talk about your company's vision and mission, the role of your group, key metrics, why you love what you do, and details about the open position. Selling the candidate is important even if you work for Apple and especially if you're a startup.

Building excitement is critical in making a connection with the candidate and will go a long way in the hiring process.

If you don't know how to sell the candidate, no problem. Develop a sales talk track, designate somebody on the interview team as the "salesperson," then practice. Remember, you don't want to end up with the steak knives!

Both hard AND soft skills are important

We all know how important competency is when interviewing a candidate. What many interview teams miss are the "other" skills. You might have heard the term Emotional Intelligence or EQ. I summarize EQ as, how aware are people of their own situations and emotions, those of others around them, and how do they respond in turn? Yes, this suggests a whole lot of individual responsibility for one's actions. You've seen the gifted software engineer with a low EQ. A response to a simple request might be rude, derogatory, or demeaning. Other signs are the rabbit hole syndrome or the lack of good interpersonal skills.

Based on the values of your organization, group, and/or team, identify those EQ behaviors you want to reward. In the past, I've co-created such values as

  • A willingness to forgive and forget

  • Diplomacy - it's still a thing

  • Give real-time feedback

  • Use your own sense of humor

  • Clarity in communication

  • Gracefully handle change

  • Learn to listen

  • Have patience

  • Give respect to get respect

  • Demonstrate caring

  • Collaboration over conflict

If you think software engineers and product developers don't want to talk about the emotional or "soft" topics, think again.

To create an EQ behavior list, use a short, time-boxed working session with stickies. Ask, what values and behaviors do we want to reward in our team, group, department, or company? Have each individual do a readout then group the stickies. Based upon the resulting groups, develop a list of EQ behavior questions to use in your interview process.

The most important hard skill is learning

Now we get to the fun part…the technical assessment. Get out the acronym list, it's time to grill! Think again.

What do you really want from a product developer, software engineer, or any position you hire? Putting EQ aside, you want somebody that is competent for the role and has the aptitude to learn. That's it.

Every industry is undergoing rapid change due to the disruption of the Internet. A few years ago, there were tech and non-tech companies. Today, every business is a tech company. Software is the key differentiator between succeeding, or not, in the local and global marketplace.

These macro changes require us to think differently about the people we hire. One tool I've used quite a bit is Strengthfinders. It's also a great team building tool. Of the 34 key strengths or traits, there is one called the "Learner." Strengthfinders is a quick and easy way to determine if the candidate has this quality. You can even offer to pay the $20 for the Kindle book and online assessment. Even if you don't hire the candidate, they'll walk away with a ton of information about themselves and a bit of good will for your company and brand.

Whatever your assessment tool of choice, use something objective when screening candidates for the "learning" quality.

It takes a village to interview a candidate

If you're like most companies, only a few people interview a candidate for a position. This is true of individual contributor and leadership roles. Remember, most employees interact with much more people in your company than their immediate team. This is your chance to get input from key stakeholders before you make a hiring decision. The feedback could be the difference between a great and not so great hire. With a little planning, it's easy to structure a process that works.

Identify a variety of people throughout your organization to participate in the interview process and have each of them play a "role." I mentioned one of them earlier in the article, "salesperson." Select the hard and soft skills you identify as important for the position. Link a role with a skill or behavior such as "sharpshooter" for the person evaluating a candidate's troubleshooting abilities. And, have some fun and develop your own verbiage for the pairing of roles and skills.

Make sure you recap every interview right after the candidate leaves. Everybody has specific pieces of information about the candidate and it needs to be shared with the entire interview team. Take note on the consensus of red, yellow, and green flags about the candidate. If you get enough of a specific concern, follow up with the candidate and be transparent about what the team experienced. Try to determine if it's a real issue and something that would prevent moving forward with the candidate. Finally, use a thumbs up or down vote and let the team decide whether the candidate moves on to the next step.

If hired, the interview team will probably interact with the candidate the most. Empower the team to help make the decision.

Let the candidate do their best work

Over the years, the technical part of an interview process has manifested the most egregious behavior. It's quite shocking when I hear stories about "the worst interview ever!"

I have a belief that people want to solve hard problems and do their best work every day. How do people do their best work? I believe it's mostly the environment. The challenge as a hiring manager is to emulate your company's working environment and allow the candidate to stretch and fill that space to see if they thrive or not.

Most work environments are highly collaborative, supportive, transparent, responsible, and free of blame. They are not pressure cookers, death marches, or dictatorships.

Here's an example of how I attempted to emulate a work environment for a technical assessment or coding challenge (I prefer coding exercise). I would tell the candidate we wanted them to do their best work. We are in a highly collaborative and supportive environment, and value sustainability in our iterative software development process. We like to keep pressure to a minimum since we know nobody likes to work under stress. Then I would instruct the candidate to review the coding exercise and ask questions, and to also give me a time that they will start to work on it, the amount of time they plan to put into it, and when I could expect to receive a Github link with their completed code. I would go on to tell them that I realize their time is valuable and they probably have enough on their plate already with their current job, personal commitments, and family. And, if you find yourself running short on time, document what you would have done, where, and why.

It's a very different approach and one that has been very successful in finding amazing people. BTW, the coding exercise was completed in the comfort of the candidate's home using their own equipment and tools. This process complements the technical assessment during the onsite interview and, in many cases, opens the door to meaningful conversations.

Hopefully, this article has given you or your organization a few ideas on how to improve your hiring process. I use all of these on a regular basis and they work extremely well. If you have any comments, questions or feedback on the article, let me know!

Watch out for the underscore! Setting privileges using phpMyAdmin and MySQL

phpMyAdmin and MySQL

I use a combination of phpMyAdmin and the MySQL command line when administering my sites. I also like to use underscores within my database and table names. Yesterday, I came across a particularly interesting situation setting privileges on a database using both phpMyAdmin and MySQL.

Lets make sure we're all on the same page when it comes to using underscores in schema object names. As you will see, the underscore is perfectly valid so this usage comes down to personal preference.

So, what's the issue?

I was setting up a Drupal site to use the Drush sql-sync command and need to add the Lock Tables privilege to a MySQL user. Initially I created the privileges using phpMyAdmin. I am using version 3.4.10 and MySQL 5.5.24. Notice the underscores in both graphics.

phpMyAdmin graphic 1

phpMyAdmin graphic 2

Since I didn't have the Lock Tables privilege listed, I needed to add it. I shelled into my VPS and used the MySQL command line. After issuing the GRANT command on red_d7,

-- Using the MySQL command line.

mysql> GRANT ... LOCK TABLES ON `red\_d7`.* TO...

I didn't determine this until I did a bunch of troubleshooting . . . In general, this isn't very intuitive. While I realize _ and % are MySQL wildcard characters, I think phpMyAdmin shouldn't expose this level of detail to the end user.

Given the above graphic, there are two privileges for the database red_d7. If you run a command that requires Lock Tables, you get the infamous ERROR 1044 (42000) at line 40: Access denied for user . . . to database 'red_d7'. My assumption is MySQL finds the first privilege line and ignores the second; privileges don't appear to aggregate.

The solution

My workaround was to Revoke (delete) the first line with the escape character leaving the second line with just the underscore.

phpMyAdmin graphic 3

I chose to Revoke the first line since since the database name red_d7 works with both phpMyAdmin and the MySQL command line. If you use phpMyAdmin to revise the privileges, it doesn't add the escape backslash back to the database name.

Comments, questions, corrections?? Let me know!

Drush 5 core-rsync file ownership Issues

Drush 5

Drush is a very powerful tool that can be used for a variety of site building and maintenance tasks. Today, I want to look at the Drush 5 command core-rsync and some gotchas I discovered when moving my site files around.

To be clear, I'm not talking about using core-rsync to manage Drupal code. In my opinion, it's best to use Git and the git-flow process to do that. The focus of this article is only on the files directory under your sites/sitename folder.

Configuration background

With each new site or project, I like to use the Development to Testing to Production workflow. Even if you've rolled out the smallest Drupal site, you'll immediately recognize the problem once you start making changes or begin your next iteration. Like many of you, I use my local machine as the Development server for small projects. My Testing and Production servers are typically hosted on a Virtual Private Server (VPS) somewhere in the cloud.

So, what's the problem?

After using core-rsync to sync files to and from your Development server, file ownership can change leaving your Drupal installation in a bit of a mess. So, it's important to pay close attention to the core-rsync --mode option. This states:

The unary flags to pass to rsync; --mode=rultz implies rsync -rultz. Default is -akz.

The rsync referred to here is the *nix command called rsync -- a fast, versatile, remote (and local) file-copying tool. Notice the bolded default above. We'll get to that in a minute.

Development to testing or production to development?

Typically, in a three server workflow environment, data moves from Production backwards to Development. Although, the first time you bring up a site, you'll probably need to get the initial files onto Testing. Using Drush, this can be accomplished via the following command:

# At a command prompt.

drush core-rsync @dev:%files/ @test:%files

If you are pulling files from Production back to Development, you reverse the source and destination:

# At a command prompt.

drush core-rsync @prod:%files/ @dev:%files

If you haven't setup Drush Aliases before, there is a wealth of information to get you started:

After running the first command, what happens? First, you'll get a message saying all files in the destination folder will be destroyed and replaced. Second, the file transfer will occur. And third, the file ownership for all files on the Testing server will mirror your Development machine. This is probably not what you want. For me, my Development machine had the file owner as robert and the group ownership as staff. I'm running Ubuntu and Apache on my VPSes so, on my Testing server, the owner needs to be my remote login id and the group ownership needs to be www-data.

The solution

You'll need to change the core-sync --mode options as well as activate the setgid bit on each sites/sitename/files folder.


The default core-rsync options for rsync are --mode=akz. If you look at the rsync man page, you will notice that the -a option really means archive mode or all of the following: -rlptgoD. The -g and -o options are to preserve owner and group. We don't want that. So, the new core-rsync commands would look like:

# At a command prompt.

drush core-rsync @dev:%files/ @test:%files --mode=zkrlptD

drush core-rsync @prod:%files/ @dev:%files --mode=zkrlptD

We are almost there.

Change the setgid bit

There is another small problem though. Since we are not preserving the owner and group, the files will come across as the Drush Alias remote-user with it's corresponding group. Again, not quite what we want. What I need is for the the group ownership on my Development machine to be staff and the Testing server to be www-data.

Before using the core-rsync command, find the "files" folder on each server (Development, Testing, and Production) and change the setgid bit. This will allow the group ownership to be inherited by new files and folders created in the files directory. As a side note, most standard Drupal installations have the files folder located at <drupal_root_dir>/sites/default/files. I am also assuming you have already setup the correct group ownership on the files folder. To change the setgid bit, use the following command. You need to be in your <drupal_root_dir>/sites/default directory when you run the command. This will find all directories under files and change the setgid bit.

# At a command prompt.

find ./files -type d -exec chmod g+s '{}' \;

Now, when you run the core-rsync command, you'll get the right files with the right ownership and Drupal should be happy!

Comments, questions, or corrections?? Let me know!