You won’t be surprised to learn that being a software developer requires spending a significant amount of time learning new technologies. The industry moves at a blistering pace; new languages, new frameworks, and updated versions of well established tools are released in the wild all the time. Just keeping up can feel like a job in itself! The rate of progress in our community certainly makes being a developer an exciting and demanding job. But it also means a considerable emphasis is placed on technology alone, often to the detriment of other crucial skills.
When I first started as a developer, I dramatically underestimated the role ‘soft’ skills played in my work. It’s easy to make the assumption that, given the buzz around this or that cool new framework, the ‘hard’ skills are far and away the most important you’ll learn. Let me be clear, to be a good software engineer, you must be able to write clean, well designed code using appropriate technologies. But here is the key point I wish to make…
A good software engineer is not just a translator between humans to machines. A good software engineer does not simply transmute requirements into code. A good software engineer is first and foremost an effective problem solver.
You also won’t be surprised to learn that solving problems effectively is a much more general challenge than ‘learn technology X; build solution Y’. One needs to first ask themselves whether the problem to be solved is even a problem at all. Challenging assumptions about the nature of the problem is key to revealing what the real obstacles are, and it pays enormous dividends to the business both at the time of asking and in the future.
Once the true problem is established, then high level solution design can begin. Depending on the complexity of the domain and/or the solution required, it can be a herculean effort to tease out accurate and precise requirements. This is particularly true when the stakeholders have little experience with the production of software. At this stage, gathering requirements thoroughly is a difficult task that takes foresight and powerful communication skills.
After understanding the proposed solution, planning a minimum viable product (MVP) is next. This means carefully balancing the availability and completeness of features with the time and resources required to implement and release them. Agreeing timescales can be tricky, as software often takes much longer to build than stakeholders realise, and estimating development effort is an infamously delicate task.
All of this is done before writing one line of code. Agile methodologies are designed to remove the constraints of traditional software development lifecycles (and they do that well when adhered to), but they also ask a lot of developers. The iterative nature of these methodologies means returning to the above steps frequently. Fortunately, well resourced teams will have business analysts, project managers, and quality assurance personnel on hand to help. But even if you find yourself in such a lucky position, a good developer will have a deep understanding of these steps and will be able to assist if necessary.
Building excellent software involves actively listening to the stakeholders of a potential development, prioritising limited resources, managing risk of implementation and release using CI/CD techniques and much more. While doing all of that, a good engineer needs to ensure that all the stakeholders are well informed and as satisfied as possible with the progress being made. It requires patience, collaboration, and curiosity. Few of these qualities are considered ‘hard’ skills, but they are as important as being a competent programmer. Neglect them at your peril.