This essay is about software engineering and the personal qualities of experts.
07 Mar, 2021
My current position requires me to lead a team, mentor colleagues, and interview job applicants. I also talk with many non-technical people who want to know more about my profession. More often, I have to explain what a software engineer does and the key characteristics that make him good at it. Thus, I decided to systemize my thoughts and write this article.
I will start by briefly describing what the discipline of software engineering is. Then, I will talk about the responsibilities of engineers in the development process, and then I will finish by describing the essential qualities of this profession. I believe that this approach will help you see the big picture and how different traits fit in.
Of course, this is a highly subjective topic, and this blog post presents my personal views on the matter.
Software engineering is a discipline that deals with how to create reliable computer programs that solve real-world problems. It is the systematic application of scientific knowledge and methods to the process of building software applications.
Programs vary in purpose, size, and technological complexity. We use computers for entertainment, communication, education, science, healthcare, and many more. All those applications have different requirements and face unique challenges. Despite their distinctions, there is a lot in common between how we built them and the technologies we use. Software engineering systematizes standard techniques for creating any software.
Some applications are simple and easy to develop, even by a hobbyist programmer. Others are more complex and require more engineers to work together. On the extreme, there are software projects where many teams of people with different skills have to work together for a long time. Synchronizing a large group of people to work together is a difficult task no matter the field, but there are many unique challenges specific to software creation.
In contrast to popular belief, computers have limitations. They execute sequences of exact arithmetic and logical operations, which obey the laws of mathematics. We build computers with different physical parts, which imposes other limitations on the programs running on them. Software engineering connects real-world requirements with what is possible within those technical boundaries.
Anyone can learn to write code and create useful tools. But you must rely on proven methods and practices to build complex computer programs successfully and predictably.
Software engineers translate business requirements and specifications to instructions that a computer can understand.
There are many different structured processes used for developing software. They define different roles, responsibilities, and practices. Despite their distinctions, all processes include activities related to requirements gathering and analysis, software design and architecture, implementation, testing, and maintenance.
A software engineer is involved in each one of these activities.
Note that this does not mean that a single person knows and does everything. Development teams consist of people with different backgrounds and skill sets. For example, you can have engineers specialized in front-end, back-end and database development, software architecture, quality assurance, deployment, and security. The team might include non-technical members who handle project management, business analysis, and user interface design.
As stated previously, computers have their limitations. It is not always possible to satisfy all business requests, and in such cases, engineers must identify and communicate the problem with the stakeholders.
Decision-makers rely on estimations provided by engineers to plan budgets and release dates. Sometimes estimates are not economically feasible, and engineers and other development team members have to look for another solution or change the requirements.
Software engineers must set the right expectations, explain what is possible, and present viable options to decision-makers.
What about programming? Of course, this is what we do most of our time, but as you saw, there is a lot of preparation work before we start writing code. We are also responsible for testing, delivering, and maintaining the software product.
Now we have a better idea of how we create software and can discuss the essential qualities needed for software engineering. As you shall see, there is nothing magical or unusual, and everything is related to their responsibilities.
A sound software engineer has to possess a lot of technical knowledge. He has to understand computer science fundamentals, be proficient in different programming languages, paradigms, and frameworks, and be familiar with development methodologies. There is no one solution fits all approach, and having various tools for different tasks is very important.
Studying computer science or software engineering at university and obtaining a degree is probably the best way to start your career. But that is neither enough nor a guarantee that you will do well in practice.
Many well-recognized experts in the field are self-thought. Although there is no consensus on whether you need a degree, there are specific topics considered fundamental by almost everybody. You must possess at least rudimentary knowledge of them. Some are discrete mathematics, algebra, algorithms, data structures, object-oriented programming, functional programming, database technologies, and computer systems architecture.
It is not enough to know only the theory. Certain things are learned just by practicing. Over time, engineers build intuition and improve their abilities to analyze requirements, estimate more accurately, write cleaner code, and other valuable skills. We often have to anticipate the future and make decisions with limited information. In such situations, experience is priceless.
I will not attempt to quantify how much you need to know or how many years of experience you must have. I will only say that the more you know, and the more you have practiced, the better.
If I have to describe the difference between a scientist and an engineer in one word, that is it!
When building software, it is crucial to have a practical mindset. It might surprise you, but not every project needs to adhere to the highest performance, scalability, and quality standards. Sometimes it is ok to release an incomplete or imperfect feature earlier to get feedback. Shockingly, you do not have to write automated tests and documentation for every line of code.
Best practices are not a silver bullet and should not be applied blindly in every case. They come at a cost, and you have to evaluate whether these investments are necessary and if they will pay off.
Sound engineers understand that complex solutions take more time to develop and introduce additional risk to the project. They value simplicity and know when a design is good enough.
Developing software is one of the most complex jobs known to man. Engineers have to interact with people coming from different backgrounds. It is essential to listen to others, treat them respectfully, be transparent, and communicate with others in a calm and well-mannered way.
Instead of just saying no, professionals will explain why something can not be done and propose an alternative solution. They will actively participate during the requirements analysis and design phases and suggest improvements.
Discussing your ideas with fellow engineers and getting feedback is crucial. Software development is complicated, and it is easy to make mistakes or miss something.
Remember that the most outstanding achievements in human history result from a team effort.
I understand that this is a highly subjective topic with many opinions. I value everyone's right to express their thoughts, but I want to disagree with a few highly valued traits by popular belief.
Nowadays, it seems that if you are not passionate about everything related to software engineering, you can not be good at it.
First and foremost, the scientific method uses observation, reason, and logic. When people are emotional about something, they often act irrationally and are biased toward a specific solution without considering all pros and cons.
Being passionate about something you have done a hundred times is impossible. But that does not mean you will do a lousy job. On the contrary, you will probably do much better than a fellow developer filled with enthusiasm because this is the first time he will work on such an assignment.
I think that majority of engineers are optimistic by nature. We create tools for others and improve their lives. Every day we use our imagination to construct something or solve a puzzle. Altogether, it is an exciting and rewarding vocation.
Unfortunately, being too optimistic when so many things can go wrong will only get you into trouble.
We often underestimate an assignment's complexity and forget to consider edge cases. In best scenarios, this leads to minor bugs in production. Sometimes we miss deadlines or have to do overtime hours. But on extreme occasions, it can also cause a massive loss of money or a loss of human life.
Overall, I do not think that being optimistic is terrible, nor that being pessimistic is good. I believe that both types of personalities complement each other. Remember that optimists invent airplanes and pessimists invent parachutes.
Supreme communication skills are also a bit exaggerated. Software engineers are not motivational speakers, salespeople, or psychologists - all professions where communication skills are crucial.
As I mentioned previously, it is vital to collaborate, listen, and treat people respectfully. If you do that, you will always find your way with people. Some individuals are natural communicators, but for others, this is not very difficult to learn and apply.
The perception of time is subjective, and it isn't easy to accurately measure people on that scale. What is fast for someone can be slow for someone else. A person can learn at a varying speed depending on the subject and his experience.
And what does it mean to learn something? Do we need a basic understanding of the topic, or do we want to become experts? Many subjects are not possible to learn quickly, and it takes considerable time to understand the basics. In that sense, I believe that time spent learning correlates with accumulated knowledge.
Nowadays, it isn't easy to find great software engineers, and there are many reasons for that.
On the one hand, we have purely economic causes. There is a high demand for software from all industries. At the same time, it is a relatively new profession, and there are just not enough people with the required specialization.
On the other hand, there might be some misunderstanding in the industry about what makes a software engineer suitable for a job. Judging by most blog posts on this matter and job descriptions, the best engineers know everything about software development and are perfect human beings. They are passionate and optimistic, learn new things quickly, motivate their colleagues, never give up, have achieved nirvana, and can walk on water. No wonder it is so hard to find good employees!
I think these unrealistic expectations cause many people to burn out and quit their job. Some of them never get back to it, which complicates things further. In addition, people spend their time learning less critical skills, instead focusing on what matters.
I can only imagine how young fellows looking for their first job feel when reading job descriptions. I hope they read this and stop feeling bad because of their imperfections. Remember, the most important thing is knowledge. Do not waste your time trying to learn every programming language or framework. Instead, focus on fundamental engineering concepts and practices that are technology agnostic. It does not take much time to become pragmatic or to learn to collaborate. Most of the time, you only need to change your mindset.
Software engineers are regular people and not some kind of mythical creatures that are good at everything. They all have some flaws in their personalities, as all humans do. That does not mean they are bad at work or unsuitable for our team.