What makes a good software engineer?
Well, I’m a software engineer by trade, and most recently an embedded software engineer. So, what makes a good software engineer?
- Programming languages. For embedded software, this means C; very rarely C++; and a passing knowledge of assembler, at least in general terms, is a bonus.
- Scripting languages. It’s useful to know one at least; they come in handy for knocking up tools and for automating processes. I’m a big Python fan, but the choice of language is less important than the ability and willingness to wield it.
- Real-time/multithreaded experience. Vital for embedded software, which lives or dies on reliability and response time; and arguably increasingly important on the desktop too.
- Debugging experience: tools, techniques, mindset.
- Testing: approaches, committment.
- Quality. Appreciate and judge the need for code accuracy, precision, efficiency, maintainability; often these are antagonistic.
- Tools. Familiarity with the development toolset: IDEs, compilers, debuggers, source control systems, bug trackers, build tools and processes.
- Hardware. Specific to the embedded engineer, this, but: the ability to read a datasheet, trace a schematic, identify parts on a board really, really, helps.
- System/architecture design, including avoidance of this-is-right hubris.
- Module design.
- Interface design: to my mind, one of the most important, difficult, and neglected areas of design.
- Fine-grained design: class, function structure.
- Knowledge and appreciation of design patterns.
- Knowledge and appreciation of object-oriented design.
- Humility: there’s always something new to learn. Open-mindedness.
- Active seeker of new knowledge.
- Adaptable to changing environments.
- Rapid uptake. There’s often times when you need to soak up knowledge: new projects, new technologies, new hardware. Being a quick study really shines here.
- Clear reporting to project management.
- Good and professional communication with suppliers, customers.
- Presentation and training skills, both in preparation and delivery.
- Collaboration with peers.
- Mentoring, encouragement, development of juniors.
- Ability to give, receive, and act upon objective reviews.
- Ability, and willingness, to participate in process improvement activities.
- Diplomacy. Able to form professional relationships with colleagues, suppliers, customers, even if you don't like them on a personal level or respect them on a technical level. Able to navigate politically-dangerous waters: be the bearer of bad news, respect confidentiality, manage conflicts.
- Good written English. The great forgotten skill of the industry, in my opinion. Engineers spend a lot of time writing specifications, reviews, documentation; reviews; code comments; email communications.
- Clear, concise, accurate writing, particularly in technical contexts.
- Ability to structure documents, sections, paragraphs, sentences, to tell a compelling and clear technical story.
- Estimation: accurate and reliable. Not that that’s ever really achievable, but close is better than wild.
- Delivery: reliable delivery, or failing that, good early communication of slippage and of possible remedies.
- Multi-tasking. Often many simultaneous demands and distractions: manage and prioritize.
- Reactive and proactive: sometimes a difficult line to walk. Anticipate everything and you’ll have time for nothing.
So, any suggestions for additions?
[Updated 12th July: added testing. Doh! It’s so important, it shouldn’t have been an afterthought. Added diplomacy.]