The software engineering skills to become world-class go far beyond just coding. Anyone can hire a decent coder on Upwork overseas for cheap. In my 20+ years of experience, I'd argue your soft skills matter as much, if not more, than your hard coding skills. I've worked with some "coding geniuses" over the years; those that weren't as good but showed some humility and the ability to work well in a team usually made the most progress. They had the mindset of solving the problem to see the different angles. While they may not be the fastest at debugging the solution, they communicated clearly and effectively to their peers and stakeholders. These made the best programmers and consultants I've worked with in my 20 years in the field.
These hierarchy of software engineering skills is loosely mapped to the Dreyfus Model
To give an idea what the typical skills are needed at each career ladder.
Software Architect/VP/CTO drive the strategy for their products and services
Principal Software Engineer: Industry leader, owns the technology blueprint.
Lead Software Engineer: Establishes workflow, architecture, systems, and best practices.
Senior Software Engineer: Works autonomously as part of a team, guiding junior devs.
Junior Software Engineer: Learning code base, best practices, with direction.
The great thing about software engineering skills is they are 'stackable' and build upon each other. It's one thing to be able to code and a different game understanding code to develop strategy and create very profitable and useful solutions. Breaking down the skills needed for software engineering a bit further as each skillset.
I've identified the 12 core software engineering skills from my path to from novice to architect broken out by soft skills vs. hard skills. I learned in my consulting days the soft skills matter as much, if not more than hard skills. When you have solid relationships and you miss a deadline or don't understand the codebase as well, they are generally more forgiving and willing to cut some slack.
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." M. Fowler (1999)
This is obvious as it's the programmer's bread and butter. Coding means package code to deliver a solution to a problem. When starting MASTER THE FUNDAMENTALS of ONE LANGUAGE first. Once you understand one platform or language well, you will have the foundation to pick up other languages much faster.
Coding Skills involve a subset of software engineering skills that make a "complete" developer. It's one thing to create code that makes a program work, but an entirely different beast when you need to work in a team constantly upgrading new features rapidly, getting your commits pushed on time, and demoed to the stakeholders.
On one of the consulting projects I worked on, I needed to build a Microsoft Office integration of a zoom-like competitor at the time. I was using VSTO. I was solid in C#, but I knew nothing about developing plugins for M$ Office. The tech lead I worked with didn't know C# or VSTO, but he had one HUGE asset going for him; he knew debugging inside and out and has taught me the art of debugging on its own is a considerable asset/skillset. So VSTO is a strange mix of trying to get a new tech to work with old tech, which created some issues on its own.
Ah yes, I was debugging. The bane of every developer's existence. Especially those you can't duplicate or hide somewhere in no man's land and blame the IDE or the language itself! I often wonder how many of those bugs were due to using Visual Studio?
Each developer on its platform will be developing on a solid slate of tools - from debuggers, IDE's; during my consulting days, I had a MacBook and found that strange as we were mainly developing in windows (Visual Studio, before they were on Macs and acquired Xamarin to create iOS apps)
It's easy to get distracted by shiny new objects to increase productivity and remove as many tedious tasks as possible but getting the foundations down on your core development tools is necessary. Maybe you have the freedom to choose your editor - sublime, VS Code.
There's no way Space X could've flown on its own without taking the time and iterations of breaking down into smaller, more solvable ones. Inexperienced developers may get paralyzed by the sheer magnitude of a particular program or codebase, but once you get the hang of solving one small piece of the puzzle, even one LINE of code.
After the developer chunks and breaks down the tasks, they've got to estimate how long it's going to take. This is another software engineering skill set that separates the best from the rest. This comes with experience, and top developers have a good sense of how long things will take, but they typically fall for Parkinson's' Law, like everyone else in office space.
ATTENTION TO DETAIL
Top software engineers pay attention to details to create a master product like carpenters. After they've estimated tasks, inevitably, they know there are some variables out of their control that affects the deadline (scope creep, technical issues, etc.). So they apply the Pareto principle to focus on the top, pressing problems to solve for that particular deadline.
The core foundation of software engineering skills. Developers use logic commands to direct the computer to do what it wants. Logic builds algorithms and data structures to solve more complex solutions in the shortest time (or space possible). Technically every program in the world is driven by two things. 1) loops and 2) if statements
It was a constant stream of new projects and technologies to learn in my consulting days. While it was insanely busy working 70 hours a week to pick up the tech and deliver (billing at least $150/hour), I realized the importance of rapid skill acquisition when clients expect results. You're scrambling to understand the codebase and the tech.
Oh man, the best people I've worked with usually were not "unicorn programmers." On the contrary, the ones with the best communication skills and knew enough tech with some humility were the easiest to work with. This matters even more with the mass adoption of remote work.
This goes hand in hand with communication but needs a category of its own. The ability to ask the right questions determines the results you will get. Tony Robbins goes so far as to say, "The quality o the questions determine the quality of your life." Just replace "your life" with "your career," and it's just as relevant.
Software is rarely developed in a vacuum. Even though it may feel you're doing the heavy lifting, project managers, product managers, stakeholders, other departments/teams, vendors, etc. The impact of software these days typically has a broad reach.
Whether you are aware of it or not, you're constantly marketing yourself. What do people think of you? How do they line up with what you want them to say? This is probably one of the best definitions of marketing. It's 100% in your control.
Not to get all woo-woo, but every 10x developer has gone through the "dip" many times in their careers. I've seen several developers I worked with dial down their jobs only because they couldn't believe they could do the work. There are proven strategies to navigate and avoid this … don't let this be YOUR fate.
Software engineers typically have a lot of autonomy, which makes it a lucrative career besides the pay, remote flexibility, and other perks. However, the ability to do deep work to solve complex problems is not reserved for the elites - it's a high-leverage software engineering skill.