Developing softwares requires good soft skills
I consider myself a very introverted person, a passionate developer, and at the same time a perfectionist. I can't say I spent my childhood coding on a Commodore64 to develop a fun videogame while writing the game engine all by myself, because I did not.
Being born in 1996 I've never seen a Commodore64 or any CPU architecture before the x86, instead, I spent my childhood playing video games, mostly Metin2 (happy memories), and I started programming in 2014 in an attempt to build an awful Android application. It was during my University years that my love story with programming began: it was like creating something new, like playing Minecraft but with thousands of blocks you can build on your own, so I became really passionate and even today I still love programming. So, with my past and my character, I thought it was a good idea to focus on becoming the best programmer in this world. What could go wrong? Long story short, three years ago I got my Bachelor Degree in Engineering & Computer Science and my first job in this field, that's the moment I found out that programming is not everything: for the average software developer programming is half of the job he has to do, let me explain why.
While programming it's only me and my computer. No noise, no talking, no distraction. I can have fun trying to figure out the best way to solve my issues, thinking about patterns, software architectures and data structures. That's how I like to imagine programming. In reality, half the time of my job is spent writing on Slack, moving cards on Trello, all while waiting for a call to start on Google Meet, but that's ok because we are not working on our side projects, programming is our job and we are paid to develop something useful to someone else, usually the client or our company and it means that we have to deal and interact with other people in different roles, interests and priorities. What I found out is that half of my job is managing relationships with my colleagues and clients, trying to read their minds to understand their expectations, trying to prioritize the right things and cooperate, coordinate and, above all, communicate properly. We are human beings after all, aren't we? All the tools and methodologies we created to help us with project management can help us building bigger projects but can't replace human relationships and they need our soft skills to be effective.
As I said, programming is a team activity that involves many people in different roles. What's the first thing that multiple people do? Communicate! Communication is one of the most important things human beings do and the same rule applies to software developers. Let me tell you a secret: you can be the best programmer on this planet but no one will recognize how good your job and your software are if you are bad at communication, simply because they can't understand what you built, its value, and how hard it has been. Or, worst case, you can't build anything useful for others if you can't communicate with people and understand what they need. Being an introverted person I figured out these things the hard way: making mistakes, both in my personal and work life. How many times have you started a task, being sure of the goal, just to learn that you were wrong after you worked on it for two days? This usually happens to me for two reasons:
- The client did not explain well the goal of the feature or I didn't ask enough questions while analyzing the task.
- I focus too much on the implementation details, the code, architecture, data structures and I forget about the real problem, so I develop something that solves the wrong problem.
Coordination is the second keyword: we communicate to coordinate our needs and goals, that's how a team works. If you are too egocentric you will end up doing a one-man show and if you are unselfish you will end up doing everything the others want you to do, which usually leads to having too many or too few responsibilities and delivering nothing useful for the project. I think we have to coordinate with our colleagues as if we were threads that are trying to write on a file that is locked by a mutex, so we have to synchronize to avoid:
- race conditions: execution out of other
- deadlocks: competing processes are waiting for each other to finish, allowing neither of them to finish
- starvation: the resource is locked by others and a thread never gains access to it
- livelocks: two threads playing ping pong
Finally, Cooperation, given a look on Google, is defined as
“ the action or process of working together to the same end ”
I think there is little I can add. Cooperation is something hard to find and it depends on communication, coordination as well as the company culture, colleagues' characters, and even our years of experience in the field. For example, in my first job experience, I was micro-managed as hell, it was like there were no need to communicate because everything was written in a Trello card or a cell of some Excel file, literally everything. In my second job experience, we were using Jira with a team of 12 people but everyone was just minding its own business, trying to figure out a way to work as little as possible, no cooperation at all, it was like a confusing bunch of monkeys throwing sh*t each other. Now, in my current job I've found a healthy culture where I feel like we are a team with a common goal to pursue, even if I still have to move cards on Trello and write issues on GitHub. These are just tools to pursue a goal: the focus is on delivering something worthy, not just moving a card to make the project manager happier. I feel like Trello could disappear tomorrow and we still would be here writing good software, cooperating for a common goal.
Consistency, to me it means being balanced and consistent with the quality of the code I write and the quality of my interactions with others. It's not good to write code as Uncle Bob does for four days a week and delete the production database on the last day of the week. And it's not good to be very friendly for four days a week and then scream at your colleagues on the other one. I try to do a good job, just every day. Sometimes I do the best I can, sometimes I try to avoid my worst. You need to know yourself and admit your limits. Try to be reliable for the team.
I do not want to teach anything to anyone, in particular people with more years of experience than me, like senior developers. I'm just collecting some thoughts I made during my short journey as a software developer and how it has been different from my expectations. I hope these words may be helpful for other introverts and young developers stepping into this industry.