7/20/2008

Good Software Engineers

First there was The Dip. It basically says that if you are not aiming at being the best at what you do, you are wasting your time. The big pay-off is only for those who are exceptional. The others are interchangeable. This got me thinking...I'm spending about a third of the week as a software engineer and I don't want to waste that much time, so I better make sure I keep improving in this profession.

Then there was this blog post describing brilliant engineers as Done and Gets Things Smart: "Not superstars: superheroes! People who are freakishly good at what they do. People who finish things so fast that they seem to have paranormal assistance. People who can take in any new system or design for all intents instantaneously, with no "ramp-up", and who can immediately bring insights to bear that are quite simply beyond your rustic abilities." (I don't know if you know this blog by Steve Yegge, but over time, it became my favourite. Yes, the entries are long and the blog is not updated very often...but if you pass that dip, his entries are just excellent.) After reading this post, it was clear that I am not what he describes as a freakishly brilliant engineer and I will never be.

Finally, there was Zen and the Art of Motorcycle Maintenance written around the fuzzy notion of quality and the concept of good. At the end of the book, Chris, the son, asks if it is hard to maintain and take care of a motorcycle. His father answers: "Not if you have the right attitudes. It's having the right attitudes that's hard." I read it at a time where I was slightly bored at work. "The only Zen you find on tops of mountains is the Zen you bring there." And I was not bringing any anymore.

So I was bored and since I'm not a super-hero engineer and will never be, The Dip is saying that I'm wasting my time. Stuck!

But then I thought some more about attitudes and quality. Whenever I create a good piece of software, something with quality, I love it. So I should do just that. I might not be the greatest engineer, but I can be a good one. One that designs good software, one that continuously learns how to inject some more quality into his work, one that has the right attitudes.

I needed a plan, a target. I defined what I thought was a good engineer so I can chase it.

Here it is...the good software engineer defined in three facets. Since I don't think it is possible to reach perfection in any of these facets, it is all about the path up the mountain, not the summit.

Technical Facet

- Needs to know how to program. Not simply how to program Java or C++...how to write beautifully readable code.
- Has to know how to structure software and master design patterns.
- Must know the classic algorithms, data structures and what is a state machine.
- Designs for testability, conceptual integrity and scalability (and possibly reuse).

Soft Skills Facet

- Learns from the past. It is scary to read software books published in the seventies that describes problems we are still living more than 30 years later.
- Is good at explaining ideas and presenting designs.
- Brainstorms and is open to evaluate and discuss eccentric ideas.

Attitudes Facet

- Cares about his work and his colleagues work.
- Aims for quality.
- Irradiates friendliness.