Category Archives: Hiring Developers

How To Attract Great Software Developers, Part II: The Natural Habitat


“We have nothing that is really our own;
we hold everything as a loan.”
― Nicolas Poussin

In the previous installment of this series, I explained why many software companies attract charlatans instead of great developers. I summarized the problem by postulating the first rule of hiring great software developers:

To be able to attract truly great developers, a company has to be truly great itself

Thus, if companies can’t attract (or retain) great software developers they are most likely not great themselves. Great, from a great developer’s point of view, mind you. There are many companies out there who are probably considered “great” by ordinary people (and even investors), but this doesn’t mean they are a great place to be for great software developers.

Today, I want to explain what great developers look for when selecting a company. However, keep in mind that no two great software developers are the same. Still, in my experience, most of them share a common set of expectations.

1. Challenging projects that matter

The main goal of great software developers is working on challenging projects where they can demonstrate and hone their skills. Implementing a mission critical embedded system from scratch (like the mars rover) most likely is. Adapting an accounting system such that it’s in line with the latest tax regulations most likely isn’t. It’s the hallmark of great software developers that they always look for new ways of doing things and learning new techniques and technologies — that’s why they’ve become great, after all. When you look at a great developer, you see a snapshot of a life-long journey towards excellence.

The most attractive projects are projects that have top management or even better media attention. Don’t be fooled by the fact that most great software developers are introverts — as every human being, they still want to feel needed and also like to show off every now and then. This is a manifestation of positive pride: pride in workmanship.

On the perfect project, they would work together with other like-minded great developers, ideally recognized experts in the field from which they can learn and to whom they can look up to.

2. Freedom and the absence of friction

Great software developers are individuals who turned their hobby into profession. They want to be ever productive and spend as much time as possible doing what they love most: writing awesome code. Anything that distracts them from coding is thus abhorred. To them, having to fill in time sheets, write meeting minutes, apply for admin rights, attend regular status meetings is creativity-killing utter waste of time.

Great developers love to freely choose their development tools and when and from where they work. Forcing them to use a particular IDE or to commute daily in order to work on-site in a noisy open-plan office is diametrically opposed to what they look for.

3. Decent pay

Money does matter, even to introverts. But it matters less to great software developers than to average people. More important are challenging projects and a frictionless environment. By paying way-above-average salaries, even mediocre companies may be able to lure in great software developers every now and then. They will, however, always lose them, regardless of whether they stay or leave.

So there you have it: feed them great projects, give them freedom and keep bureaucracy out. Pay them enough that they feel comfortable. The latter is the easiest to achieve. Offering a steady stream of challenging projects that matter and providing a hassle-free environment is hard in the long run, especially for a successful company that grows due to its success. The bigger companies get the more they become driven by fear — fear to lose what they have accumulated in terms of wealth and reputation. They fight this fear by adding more and more creativity-stifling policies to maintain the status quo.

Thus, it’s the sad fate of every successful company to become bureaucratic and boring in the long run. Regardless of whether great software developers stay just for the money (at the expense of losing their greatness), or leave — the second law of hiring great software developers can’t be escaped:

In the long run, great software developers cannot be retained

People Patterns In Software Development: The Major Tom

“Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away.”
– Antoine de Saint-Exupery

In this day and age, especially in large corporations, you can find a special breed of software developers who just can’t KISS. For every problem, even the simplest, they dream up a solution that is so complex, so over-engineered that when you look at it, it’s next to impossible to tell what problem it’s trying to solve. When you delve down the layers of abstractions and technologies you soon get lost and forget where you started from.

In 2001, Joel Spolsky coined the term “Architecture Astronaut” to describe folks that love to complexify. However, according to his definition, “It’s very hard to get them to write code or design programs, because they won’t stop thinking about architecture”. To me, however, his definition of an Architecture Astronaut sounds more like a particular variant of a Non-Painter.

The individual I want to talk about today bears a strong resemblance to an Architecture Astronaut, at least on the surface. Contrary to the Architecture Astronaut, he does design programs and does write code — actually, he’s a quite prolific coder. However, what such a developer really does is building overly complex, not-from-this world systems and hence I call him “Major Tom”, in reference to the astronaut character “Major Tom” in David Bowie’s song “Space Oddity“. This song, “depicts an astronaut who casually slips the bonds of the world to journey beyond the stars”. Later in the song, it’s revealed that Major Tom is forever stuck in space and will never return back to earth.

Here’s an example that gives you insight into the thought process of a Major Tom, which can be helpful for diagnosing one.

Let’s assume you have two processes running. One of them (process A) depends on the other (process B). For reliability, process A wants to regularly check whether B is still alive. The initial and obvious choice would be to have process B emit a “live tick” message at regular intervals, potentially including a running counter. A Major Tom’s journey to the stars (and beyond) could look like this:

1. Let’s use a Unix pipe between the processes to exchange the live tick message.

2. But what if the processes are distributed across different machines? Pipes don’t work across machines, so let’s use UDP (datagram) sockets.

3. But with UDP, datagram delivery is not guaranteed, so let’s better use a TCP (stream) socket instead.

4. But what if the machines are based on different architectures that use a different byte order (i. g. big-endian vs. little-endian)? Wouldn’t the counter value be interpreted wrongly? Let’s better use a platform-independent data exchange technology like Protocol Buffers on top of it. This has the additional benefit of supporting backwards compatibility should the message format change and one never knows what additional messages need to be exchanged between process A and process B in the future.

This reasoning goes on and on, let me spare us the rest. In this hypothetical example, a possible final design could look like this:

N. All involved processes register the services that they offer (a “live tick” service, for instance) with a central service registry. Service consumers discover available services offered by service providers. A dedicated, load-balanced broker connects service providers and service consumers which exchange JSON objects via rest API calls over a triply redundant TLS connection.

Now, every software developer is — to some extend — familiar with such lines of thinking and sometimes also leaves solid ground. But while healthy developers stop early and descend back due to the pull exerted by the YAGNI principle as well as time and budget considerations, Major Toms only know one direction: up, up, up in the sky, which translates to more, more, more complexity.

APPEARANCE

Major Toms don’t have any special appearance. They come in all shapes and sizes.

PERSONALITY

Why do Major Toms have such a strong desire to inflate everything? Let’s explore the main drivers, which depend on the particular personality of the Major Tom.

One huge source for not-of-this-earth complexity is the boredom felt by a super-smart developer. I’ve observed many times that developers with a very high IQ have a hard time doing menial work, and sooner or later every task becomes menial to them. The only way to calm down their insatiable mind is to constantly feed it with complexity.

Another cause for cosmic designs can be software engineers with a strong scientific background, especially computer scientists holding PhDs. Some of these individuals are all about research and insist on always creating something novel. Keeping things simple, going for the absolute necessary, and using “mundane” technology is often beneath them.

Last, but not least, there’s a possibility that people create uber-complex designs for job security reasons. Especially Fake Surgeons are known for using strategies like this in order to maintain a massive head start over the rest of the team, thinking “if you can’t comprehend my complex code, you’re not going to replace me.”

RATING

According to the Q²S² framework, a Major Tom’s rating is 4/1/3/3.

(The second Q-rating is so low because of the incidental, unnecessary complexity that causes poor maintainability and poor performance. Hence, the value of what a Major Tom creates is of low, sometimes even negative value to the company.)

POLAR OPPOSITE

The Wolf

CONCLUSION

Major Toms have a passion for making mountains out of molehills but not for shipping production-grade software within budget, in time. Instead of adhering to the trusted XP principle of “doing the simplest thing that could possibly work”, they program in the future tense and constantly ask “but what if?”. The result is often something that resembles a Rube Goldberg machine that nobody (apart from the Major Tom who created it) is able to maintain.

Sometimes it’s possible to cure a Major Tom, and since they are smart and prolific, it’s always worthwhile trying to redirect their energy into more valuable channels. Here are some tactics that might work:

1. Explain that software development is a learning process, that great systems must evolve from simple to complex, just like an oyster grows a pearl from grain of sand, like a vase is made in traditional pottery.
2. Explain that a simple first implementation doesn’t preclude a more elaborate implementation later, once the need for additional complexity has been proven.
3. Explain that a simple design is not a sign of weakness but a sign of strength, that simple design is often the result of hard thinking and discarding of non-essential parts.
4. Explain that doing simple things extremely well can be as satisfying as working with hip technologies.
5. Explain that a company’s main job is to generate money to feed the hungry mouths of its owners and employees, so all successful commercial software development must be done within time and financial constraints.

If your attempts to ground a Major Tom are fruitless, it’s time to go separate ways. Fortunately, when confronted with your down-to-earth ideas, pathological Major Toms usually launch their jet packs and head off for another planet.

How To Attract Great Software Developers, Part I: The Man In The Mirror

“Everything is energy and that’s all there is to it. Match the frequency of the energy you want and you cannot help but get that reality. It can be no other way”
— Albert Einstein

These days, almost every software company is looking for software developers. Not just any software developers, mind you, it’s great software developers that everybody’s craving.

Such companies know that — as has been confirmed again and again in many studies over the last decades — great software developers are easily 10 times as productive as average software developers. Productive as in “able to craft quality products”. It’s not about intelligence, nor the talent to give great talks, write awesome research papers, file patents, implement one prototype after another. It’s not about ranks, titles, grades, number of diplomas or PhDs. It’s all about the great developer’s ability to ship money-generating products on time. Those people are few and far between.

The sad truth is that the main problem of such companies is often not that they have a shortage of great developers — they suffer from far too many below average developers (again, in terms of money-generating productivity). These companies don’t ship awesome products, not to mention on time.

As a countermeasure, they recruit for great developers. What they often forget to do is take a critical look in the mirror. If they did, they would understand that what they try to do is akin to a hobo courting a beautiful princess. It’s nothing more than an exercise in futility! To attract someone attractive, you have to be attractive yourself. It’s that easy!

Realistically, the great developers that such companies are after are already with a highly attractive employer. Why should they change down?

Desperate as these companies are, they employ tricks that are as old as mankind: making themselves appear more beautiful than they really are. They dye their hair, they apply tons of makeup, but it’s just a cover up for something that’s ugly or not there at all.

They try to lure great developers in by telling them that they will be working in a modern workspace, be part of a global, agile team of the brightest minds, that they will shape the future of a whole industry, and so on.

Obviously, everybody, not just great developers, knows that this is pure BS and that a company which resorts to such measures must be a) far from great and b) really desperate.

The latter naturally attracts a special breed of developers. Con artists, who also apply tons of makeup to hide their shortcomings, which I usually refer to as Non-Painters; and so the vicious circle continues for the poor company. Birds of a feather flock together. Pretenders attract pretenders. But the converse is equally true.

Let’s conclude this installment by postulating the first rule of hiring great developers:

To be able to attract truly great developers, a company has to be truly great itself.

In the next installment, we’ll take a look at the hallmarks of great software companies and what great developers are attracted to.

Do They Treat You Like A Superuser?

“A good workman is known by his tools”
— proverb

The process of getting admin rights as a corporate software developer is definitely on a spectrum. Over the last 20+ years, I’ve written code for more than ten companies and boy, do their policies differ!

In one case, I had full admin rights from day one. In more typical cases, I had to start a workflow to request admin rights which would arrive within hours to days. In one extreme case, I had to do an online training about the dangers of working with admin rights before I could start the workflow. After I passed the exam and once my request was approved (7 days later), I would be granted admin rights only for a limited number of time (180 days at most). Even worse — the online training course would need to be taken again as well!

Let’s meditate a little bit on this latter case. Too me, it’s an utter catastrophe. As software developers, we constantly need to maintain and tweak our PC, our beloved toolbox. We need to install or upgrade development tools, device drivers and the like, sometimes just for the purpose of experimentation and learning. What if I wanted to switch to a newer version of g++ one day only to find out that my ‘sudo’ rights had expired? Sure, I could start the workflow again, wait a couple of days for approval, but why? Such processes are nothing but a nuisance that break developers’ flow and inspiration while not adding any real security.

A software developer is not a regular user — a software developer is a superuser, literally. If a company has to have their software developers take training courses to ensure that they don’t work in a root shell all day they should not have been hired in the first place. Doesn’t it border on insulting if you learn in such a training that you should not open email attachments from unknown senders, especially while being logged-in as root? You don’t say!

If a company doesn’t give you unlimited superuser rights within a couple of hours, you’re definitely not treated like a superuser. You’re rather treated like a regular office worker who has no clue about how computers work, let alone computer security.

It’s not just about wasted time. It’s about lack of empowerment and trust. But it’s mainly about a missing software culture: are you viewed as precious human capital that develops top-notch software products which will make the company thrive, or are you rather viewed as a schmuck that poses an severe risk to the company?

A company with good software culture understands the chief need of creative makers, which is: working on interesting projects in a frictionless, libertarian environment where they can spend most of their time doing what they love most: craft exciting software.

Restricting software developers in terms of admin rights is just one problem of companies lacking good software culture, but it’s symptomatic. While such shops might manage to lure in great creators, they will certainly not be able to retain them in the long run.

People Patterns In Software Development: The Non-Painting Painter And The Non-Painter

“If you put off everything till you’re sure of it, you’ll never get anything done.”
— Norman Vincent Peale

I once read about an individual who wanted to become a painter. But instead of painting, he spend a lot of time and money on finding the right canvases, brushes, and paints. He read dozens of books on painting, went to museums, studied the great masters but never got around to paint a picture.

Inspired by this story I coined the phrase “Non-Painting Painter” to label individuals who behave in such manner.

It’s highly likely that you will encounter non-painting painters in your career, so it’s worthwhile to shed more light on their attributes and behaviors, because it’s easy to misdiagnose them. It’s especially common to confuse them with a more extreme form, which I call the “Non-Painter”. Non-painting painters and non-painters have a lot in common (after all, they don’t paint), but while there is hope for cure for the former, all is lost for the latter.

APPEARANCE

Both, non-painting painters and non-painters are indistinguishable by looks, sight, or sound. You recognize them by their personality traits.

PERSONALITY TRAITS

Both, non-painting painters and non-painters procrastinate, they are on the constant lookout for reasons to evade their primary task. This doesn’t imply that they are lazy — far from it! They spend a lot of effort on side issues. What they don’t do is get the task done that they are supposed to do.

To them, there is always more research to be done, more code samples to study, more design documents to write, more meetings to call for. They cannot start to code unless the coding standards have been approved by QA and to avoid this from ever happening, they permanently submit change requests. Then, some day, they hear about a new build system, programming language, software tool that need to be evaluated because this would “save us from so many problems in the future”.

Other characterizing attributes of both, the non-painting painter and the non-painter are that they are usually smart people with above-average social skills. They have a lot to say, seem to be well-versed with many contemporary technologies (at least superficially) as well as everyday topics. They are a naive hiring manager’s dream come true.

To qualify as a non-painting painter, it’s imperative that such an individual still possess a willingness and ability to actually perform the task they so eagerly avoid to do. The chief reason why they don’t perform is rooted in fear. Fear to make mistakes, fear to look stupid in front of coworkers. But contrary to the non-painting painter’s believe, it’s no shame to have little experience, as long as there’s a strong desire to learn and improve. In his book “The Passionate Programmer”, Chad Fowler goes as far as giving this advice: “Always be the worst guy in every band you’re in. – so you can learn. The people around you affect your performance. Choose your crowd wisely.”

But let’s now turn to the pathological, incurable sibling of the non-painting painter — the non-painter. Non-painters also don’t produce what they’re supposed to, they also waste time on unimportant, minute details and side issues. But contrary to the non-painting painter, they have neither the intention, nor the ability to get the job done. If that wasn’t bad enough, in almost all cases they go to great length to prevent also teammates from getting their jobs done, thus multiplying their own unproductivity. Why? Non-painters are in constant fear that well-performing teammates steal the limelight from them and expose them for what they are: freeloading charlatans.

RATING

According to the Q²S² framework, the rating of a non-painting painter and a non-painter is the same: 2/1/4/2; the Q²S² framework is unfortunately not able to discern them.

POLAR OPPOSITE

The Codenator

CONCLUSION

A non-painting painter is still a painter, alas an inhibited one. My recommendation is to give non-painting people the benefit of the doubt and not by default label them as non-painters. If they don’t have the courage to speak about their fears, a senior developer should approach them and provide support and guidance. Just like Attaboys, non-painting painters often are diamonds in the rough. If they are open about their inexperience and strive hard to improve, they can turn into a valuable asset. However, if their productivity doesn’t improve, relabeling them as non-painters is more than deserved and non-painters have no place in the team.

People Patterns In Software Development: The Q²S² Framework

“Some people come into our life as a blessing, while others come into our life as a lesson, so love them for who they are instead of judging them for who they are not.”
— Yolanda Hadid

As you know, “People-Patterns in Software Development” (PPSD) is a tongue-in-cheek series in which I present personality traits of software developers and arrange them in patterns. In order to make these patterns easier to compare, I came up with an evaluation framework that I’ve dubbed “Q²S² framework.”

Each letter of the Q²S² (or QQSS) acronym represents one of the four dimensions, along which developers are assessed: Quantity, Quality, Social, and Sharing.

QUANTITY

Quantity captures how prolific a person is. Is an individual a doer who creates or rather somebody who consumes things created by others? Low-producing software developers, even highly educated ones, have difficulties writing code. They overthink, get stuck in analysis-paralysis and have a hard time entering insert mode. But even if they do start, they often don’t sustain and end up failing to make it to the finish line. But getting things done is essential: a bridge over a river is worthless if it ends three meters short of the other bank.

High-volume producers, on the other hand, are totally sold on action, they want to get their hands dirty. If they encounter a Gordian knot, they simply cut it. Without knowing the details, they start with a “shitty first draft” and shape it into the final product. To them, software development is like pottery making: they begin with a lump of clay and turn it slowly but steadily into a vase—and then proceed to make another one, and another one. Whether these vases are of decent quality is a completely different story.

QUALITY

According to a popular definition, quality is the degree to which something meets or exceeds the expectations of its customers. While a certain amount of quantity is essential, it’s by no means sufficient. Quality-oriented developers create software that performs well, is easy to use, and has a low defect rate.

There is a type of quality that is not visible to the customer called internal quality. High internal quality means that the software is easy to comprehend and extend by maintenance developers, and thus supports the incorporation of future requirements. Low internal quality means that the code is hard to maintain, that it is full of technical debt. So much technical debt, in fact, that over time—due to compound interest—the maintenance costs becomes so high that a software company is forced to declare bankruptcy, literally, sometimes. High internal quality, by contrast, denotes investment protection and is the foundation of long-term business success.

Since internal quality is so frequently neglected, I stress its importance a lot. Still, for the sake of simplicity, I decided to merge external and internal quality into a single “quality” dimension. Therefore, a developer with a high-quality rating in the Q²S² framework pays utmost attention to both external and internal quality.

SOCIAL

Even a super-productive, high-quality programmer is still only able to achieve so much in a day. The best carpenter in the world may build you the finest log cabin, yet he’s unable to build a skyscraper, let alone a city. By the same token, some of today’s software products are so large and demanding, it’s imperative that their construction is distributed over many shoulders. To achieve great products, people from different disciplines and backgrounds have to work together smoothly.

The biggest challenges a large software project faces these days are sociological in nature, not technological. Hence, the ability to effectively interact with other individuals is a crucial skill for every software developer. This includes being able to communicate clearly, present ideas in a comprehensible way, give and take criticism, and the willingness to compromise.

SHARING

It goes without saying that productive, high-quality developers are a blessing for every company. But developers who are willing and able to share their knowledge with coworkers can lift them to new heights and thus boost the productivity of the whole team. Like Robert Noyce, co-founder of Intel said: “Knowledge is power. Knowledge shared is power multiplied.” Imagine the benefits if all software developers followed the “each one teach one” maxim.

Developers with a great sharing attitude introduce new tools and techniques, host coderetreats, write blogs, and give one-on-one advice. What is important, however, is that this is done on top of their daily work as above-average-quantity, above-average-quality developers. All knowledge sharing must be founded on and validated by practical, real-world experience. Beware wannabe experts who only teach because they can’t do or don’t want to do what they were once hired for.

CONCLUSION

All four dimensions of this framework are all about the product. Quantity and quality are about the individual programmer’s direct influence on the product, while social and sharing are indirect: it’s the individual programmer’s influence on the influence of other programmers on the product.

You may wonder why there are no dimensions for intelligence, experience, and knowledge. Even though most job interviews put a lot of emphasis on these attributes, to me, by themselves, they are pretty meaningless. At best, such attributes can be viewed as necessary but insufficient. All that matters in the end is the product. Or, to put it another way: “It’s the product”, stupid!”

From now on, I will include Q²S² ratings in all people-patterns. Every dimension has a rating, ranging from one to five, just like is the case for most star-based classification systems that are in use today:

1: Far below average
2: Below average
3: Average
4: Above average
5: Far above average

Thus, a 4/3/5/2 rating describes a developer that produces at an above average rate with average quality, has extremely good social skills but is poor at teaching.

For the sake of completeness, I’ve also added ratings to the patterns presented so far:

Codenator: 5/3/1/1
Statler/Waldorf: 2/2/2/1
Programming Hipster: 4/4/2/2