Software engineering = collaboration + coding. The neglected part of the equation.
The software engineering craft changed tremendously in the last couple of years. Back in the days the classic geek developer would be graduate from at least Mathematics high school. Then graduated with Mathematics, Physics or Computer engineering university degree. And happily started coding without messing with too much people on a daily basis, just doing your coding magic and let the managers handle everything else. Which is great and despite those prerequisites were never a guarantee for a successful career, in most of the cases they were absolutely enough.
Well, things seems to change and programming is not anymore reserved for math geniuses, gamers, geeks or computer science graduates. With the new industrial revolution - the digital invasion which happened in the last 10+ years, information technologies became part of everyone's life. IT and programming as part of it, became one of the richest and most employee-seeking industries in the world. A lot of people got prequalified and started working as developers (or some sort of IT), coming from all sorts of technical or non-technical backgrounds. The emerging software academies, detecting both the high demand from the industry and the high prequalification rates, along with the overall seeking for rapid software development education without the university overhead, actually became one of the major boosters of this process which changes our industry.
Developers are also not only coding machines anymore. In fact, coding is only part of our everyday duties. We are quality engineers, managers, team leaders, scrum masters, architects. We communicate with clients, with colleagues, with different stakeholders, with all sorts of technical and non-technical staff on a daily basis. We might be even all-in-one, if working as a contractor, in a small company or as a some sort of freelancer. With the new COVID-19 mini-revolution called Remote work, this type of all-in-one working becomes even more popular, transforming software engineers from coders to people with wide range of technical and non-technical (soft) skills.
Having all that in place, I would like to present you with couple non-technical abilities I believe every developer should possess at some level in order to work efficiently.
Team work and ability to cooperate
Being able to work in a team and cooperate efficiently with your colleagues is the first and most obvious soft skill for every software engineer. Yet, we all have met people which are simply "tough" to work with. Knowing-all rockstars, passive-aggressive guys which don't accept other's opinion, laterns unable to be interrupted at any cost striving to possess the conversation. Those are all definitions of a people no one wants to cooperate with. And no matter what you do, you will always have to cooperate with someone for getting your job done. Don't be an asshole, don't be the ghost. Communicate properly, listen to others people opinion and respect them, provide your part of the team work in the most efficient way.
Verbosity and ability to express
Inability for expressing and lack of verbosity is something which might not seem like an important asset to have. We are not all born with this. This is true. What I am addressing here is having good enough verbosity so that other people can understand your ideas, thoughts and suggestions. As with the team work, we all have met a guy which hangs in chaotic stream of unstructured explanations, without using proper technical or business terms and practically unable to express his idea. And the inevitable question afterwards "I don't know if you managed to understand what I mean". It doesn't matter if you have it great in your head. If you can't present, express and defend your ideas or thoughts properly, the risk of being rejected is increasing. Because without that, it seems like you simply don't know what are you talking about and you are not prepared enough. Try to avoid that.
Focus and pragmatism
Have you ever been in a conversation, brainstorming, call or discussion session which starts with specific problem and ends with everyone asking "What were we discussing here in the first place? Does anyone understand what decision was made?". Yes, it happens. You must always being able to keep your focus and stick to the exact problem or issue you are solving. Don't flood conversations with unrelated stuff. Don't jump from topic to topic randomly. Be concrete and stick to the topic. No useless waste of time. If you want to talk for something else, bring it appropriately, after the primary discussion. This also applies for your work as a developer. Focus on the problem your are solving and always apply pragmatic approach - don't overengineer, trying to think ahead of time or implement features that are not requested, try to think in business and then in tech, don't reinvent the wheel. Keep it simple, focus and get the job done.
Understanding the business
This is the greatest issue I have observed not only for us, the developers, but for anyone in the technical chain (QAs for example). If you don't understand the core concepts of the business upon you build software, you practically have no idea what you are doing. This might even become a disaster, since you have no clue what is properly working state of the software in business terms. And without that, you are lost. Always try your best to understand the basics of the domain you work on. This gives you the safety that you know what are you doing and the certainty that your decisions are working for the business. And last but not least - you must be adequate when talking with business people (where the opposite is not always required!).
Ability to help and support
The wheel is spinning and there will always someone who will know less then you or just needs your help. Always do your best to support your colleagues. Don't blame, irritate, chuckle or assert dominance and unnecessary self-esteem. Provide helping hand and remember that tomorrow you will ask someone for help.
Being organized and self-disciplined
We are people of logic. Everything we do must follow logical, organized path. Whatever you do, you must have good self-organization and discipline in every aspect. How many times you went to someone's PC and see fifty open tabs, desktop with zips, photos, source files and shortcuts in a chaotic mess, even working with multiple IDEs upon the same source code with different windows scattered across the screen. You should always organize your work clean and properly. Starting from JIRA tickets and ending with your IDE. This shows you know what you are doing and you do it professionally.
In conclusion, the collaboration part of the equation is as important, as the coding itself. There is no more vacuum buffer between developers and real business. We all have to cooperate efficiently in order to get our job done.