Aspiring dev to CTO - What is the core non-tech skills needed for a programmer?
What do I need to practise outside tech, to become a better programmer?
Beyond specific tech tools or programming skills, these would be
Systems Thinking
Understanding processes in logical terms : If this happen, do this, else that
Understanding of "cause and effect"
Planning and deciding on how to change processes, to reach a desired goal
Practising cause and effect on a much larger scale. : Visualising, organising and understanding how large systems and processes, interact with each other over many logical interactions. Especially how any unexpected outcome in one system, can cascade into various errors in other systems.
Other very useful skills (to help with systems thinking)
Keeping track of a large number of things in your head
and/or organising a large number of things on a board / paper / chart
Simple math (plus, minus, multiply, divide).
Advance math and simple statistics is a huge plus (but not a requirement).
Some imagination and creativity
Soft skills (that universal to all jobs)
Communicating and coordinating within a larger team
Dealing with stressful situations
If the items in “Systems Thinking” looks familiar, it’s because you are already practising it in your current job, or daily lives, even if you do not realise it.
Almost every job involves either executing a process, or planning one, as part of a larger system.
For example, a chef in a restaurant, will check the inventory of ingredients that they have, at the start of their work shift. With the following in mind …
if any of the supplies are low, they will need to make an order for ingredients
if any of the supplies are low, and the ingredients will not come in time. They may need to remove items from the menu
failure to do so, may cause orders to not be fulfilled later in the shift, which may then cause unhappy customer
unhappy customers, may cause unhappy bosses, or loss in revenue/tips.
So the process in this case (inventory checking), is straight forward and is done once per day.
Its purpose is easy to understand (maintain business operations)
Its failure is understandable (unable to maintain cooking process). - Its failure even has cascading effects to other systems (waiters needing to manage the chaos when things run out with unhappy customers).
You may even be thinking on how to improve the processes: For example you are able to cut down on serving time. If the waiter’s uses a messaging system to input their orders in a tablet, an order is automatically printed out in the kitchen at the other end of the hall.
Thinking about these processes, and how it can be improved or changed; experimenting with it, and understanding how such changes can improve (or degrade) the process.
Is all part of systems thinking. In a way …
❗ Programming is defining and iterating the day to day processes (called functions), on a whole different mind-bending scale of executing a billion times over.
Instead of planning and executing a process which is done once a day, it’s executed potentially a million times a second. Likewise, instead of a handful of different documented processes in a single restaurant, you are looking into potentially over a hundred thousand different functions and processes interacting with each other.
If the scale of these functions and process sounds intimidating, worry not, because you will only be building these things things, one function at a time. While working with other developers, in building and interact with their functions.
You do not need to understand the working of every process and function, you would only need to have a high level general abstract understanding of it all. And just enough understanding to use other peoples functions.
All while maintaining a deep understanding of the function and process you are writing.
Large teams is also where soft skills in communications, is essential in more senior positions, with larger team sizes.
If thinking about processes, the why’s and hows, everyday and improving on them appeals to you, this maybe the right job for you.
Especially, if you find joy in helping others lives or quality of life improve through the processes you put in place. Programming is a path that is able to let you do so at scale.
If all this sounds good, perhaps programming is a career that is suitable for you
As a programmer myself, there is a danger that the above list of skills can be viewed as a form of gatekeeping. But that is not the intention here. If you are weak in any of the above core skills, it does not mean it’s impossible to be a programmer, or to learn programming.
It simply means you have to start practising and developing these skills today. And figure out a workflow that helps compensate for the gaps. For example, if you find it hard to visualize in your head a large number of things, put it in writing, put it on pen and paper.
This article is part of larger series of "Questions from devs to CTO" - and my attempts to formalize my verbel answers into a series of articles.