Thursday, June 13, 2013

What makes a great Developer

Passion

It's the taste of success that comes with every little task that you've mastered, and smart solutions you've found that turn out advantageous. Programming is not just a job, it's an Art - it's Poetry. With Passion comes Motivation and thus Progress. Software development is not only huge, but also evolving very fast. A good developer enjoy's keeping up-to-date, since he knows that there's always a better way to do something. Learning new ways, satisfies his hunger.


Curiosity

A Program is deterministic. There is no such thing as an accident in a computers world. Every effect has its cause. A great developer does not accept accidents. He'd rather search and debug the numerous layers of a Software and it's environment to find the very reason. He builds up deep knowledge by doing that, allowing him to better understand, read and interpret weird behaviour of an application. A good developer does not program by Accident.

“The important thing is not to stop questioning. Curiosity has its own reason for existing.” - Albert Einstein

"The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents." - 
Nathaniel Borenstein



Cognition

Programming is the act of solving a problem. Problems can be factorized into multiple parts that work together as a whole. To find and reflect those in your mind, and imagine their interaction is a true skill. There is nothing more to say about that.


Meticulosity

Programming is full pitfalls that can be tracked down to the very microcosm of Software Development. The Devil is in the details, and even the smallest sluttery can easily tear a Project down. That's why perfection is so powerful, and important for high quality and success. If you accept a single flaw, you will most likely accept a second, ... and a third ... until you got a mess. A good developer cannot accept flaws and thus avoids many pitfalls increasing quality. There is an analogy to the Broken Windows Theory, which basically says that a single broken window can easily lead to more serious deviance, crime, abandonment and demolishment of its house.


Time

Greatness comes with experience. It's the iterations of improvement that have been lived through, that really matter. Yes, you can simply follow advices, patterns and best practice. But that has nothing to do with Wisdom, which evolves by doing mistakes and iterations.


Humbleness

A great developer knows that he doesn't, and will never know everything. He knows, that there is always room for improvement, also in his own work. He admits his mistakes and accepts critisism.


Tenacity

A good developer declares war on every workaround. He will fight it even if he has to struggle hour after hour, through the night, until the sun rises. Even the greatest developer meets problems, that he might not consider solvable in the first place. But he takes it as a challenge, unless it's not an antipattern. "It won't work" is not an option. Hard-earned success evolves self-confidence.

Vision

In Software development, it is common to work long times on small tasks. While beeing focused, it's easy to get lost and overlook the impact on the rest of the system. A good developer is skilled in keeping an eye on the bigger picture, foreseeing sideeffects of a current decision. Still he may intentionally choose to postpone their treatment going step-by-step.


Lazyness

This might sound stupid in the first place, but its not. Lazyness leads to a lot of improvements. The probably most important thing it leads to is Automation. Everytime you have successfully refused to do something manually by automating it, you have already improved. Automation is the key to faultlessness, efficiency and progress. Faultlessness, because ideally a computer doesnt make any mistakes (which is not entirely true in every aspect), but humans do real quick. Efficiency, because it's an investment saving time in the long run. The earlier you automate something, the more you get out of it. Progress, because every process that does not demand mental resources anymore leaves room for something else. What you don't have to think of doesn't hinder you, whereas software development is actually completely blown up with barriers that you have to think of all the time.

A good developer is too lazy to
  • write a complete API doc, he lets JavaDoc do the job.
  • format his code properly, he lets his IDE do the job.
  • test a functionality over and over again, so he automates it using xUnit. 
  • read complicated methods, so he writes short readable methods with good names.
  • write the same lines of code all over again. He seeks for ways to refactor to avoid such boilerplate code, since he is too lazy to repeat himself. (DRY)
  • implement that functionality that nobody asked for. (YAGNI)
  • use bitwise shifting for a subtraction, he keeps it simple stupid (KISS).
  • write code at all, he lets his colleague do it for him (Pair Programming).
    Nah, i was just kidding on this one ;-) 

What do you think makes a great developer?

7 comments:

  1. Use a RDBMS, intelligently. Eliminates rafts of code. Eliminates client side kludges. Makes your bald spot disappear.

    ReplyDelete
  2. Replies
    1. this is what i actually ment with ambition. but i couldn't find a better word. you just found it for me, tenacity is exactly what i ment. ill change that. thank you

      Delete
  3. I think sometimes all above is not enough. Or there is no enough one of them, basically : time.

    Understanding legacy code without comment and specification is a nightmare. Everybody states that his code is readable thats why he doesnt leave any doc.

    Agile doesnt tell anything about right, up-to-date specification existence. Although thats the base of requirements.

    ReplyDelete
  4. Nice post. I'm not sure I'm in 100% agreement about tenacity and laziness though. My take is this:

    You never have unlimited time (or money which buys time) on any project. Experienced developers generally learn to think about cost/benefit analysis, or whether the investment of time into something will earn a return sufficient to justify it.

    Your comment "A good developer declares war on every workaround" I think is a little off because a week spent to resolve a workaround is a week not spent building something different. If the issue being looked at is minor, doesn't cause security issues, major UX breaks, etc, sometimes the correct approach is really to let it go.

    Overall, great article. Even if we disagree on an individual point, I think the fact that you're thinking about these things means we agree on the overall goals of software development!

    ReplyDelete
    Replies
    1. I left out the laziness part:

      I think the reason we prefer to use tools to document an API rather than doing it ourselves isn't laziness, but again a cost/benefit analysis. We could spend an hour of documentation time for every hour of dev time. We'd hopefully never do that though because the value being added to the software would be dramatically diminished.

      The real reason we build tools to simplify/automate isn't that we're lazy, it's that we're efficient. I know this is what you are implying, but I quit using the term 'lazy' a while ago because when I talk to business people they interpret it wrong and it paints developers in a bad light. I got uncomfortable making that joke and I think 'efficient' is more descriptive although less amusing.

      Cheers!

      Delete
    2. thank you for your comment. i agree, good cost/benefit judgement is very important for efficient solutions, and in the real business world, you have to be efficient most of the time. this post is more about a 'perfect world' situation - im assuming that one is not bound to any deadline thus seeking the most perfect outcome instead of the most efficient outcome.

      Delete