About the author:

Hi, I'm José, professional Software Engineer, Freelancer, and serial Entrepreneur. Find me on Github.

Back when I was fresh out of school and I started to program professionally, I didn’t care about the job titles I’d get. I was comfortable being an “IT Analyst”, a “Development Engineer”, or even a “Junior Developer”. If the position involved programming and I felt like I was a good fit, then I would take it.

As time passed, I started to notice the industry distinguishes people who are just “Programmers” from those who have the merit to call themselves “Software Engineers”. I started to wonder where I fit in the broad and blurry spectrum of job positions. Was my career extensive enough for me to fall into the coveted ranks of Software Engineers?

As it turns out, years of experience is an important factor—there’s no better teacher than practice—but there’s more to it. In my quest to become a Great Software Engineer, I noticed seven important skills you must develop before you can call yourself an engineer. Let me share them with you.

System Design

In civil engineering, a building’s foundations must be solid, or else the building could collapse. Similarly, a software engineer should be able to lay down sound foundations for their creations. You must be capable of envisioning the ’big picture’ of how your software system is going to be assembled, and how it will operate. The ability to “draw on paper” blueprints for a project will make you great. Don’t just wait for a nice set of UML files to come along—get involved in making them. People expect true engineers to have a say about how a system should be built from the very beginning. Even if your design tools are just pen and paper.

Language Agnostic

This one was a little difficult for me to accept when I was a beginner. No matter how much you love a programming language, it’s more important to know that languages are just tools. It’s not unusual that you will be required to learn a new language on the spot for a variety of reasons. It’s no coincidence that a great programmer does not write “Java Developer” or “ _ Developer” in his or her résumé. Always be open and prepared to learn and play with new technologies.

Be Proficient with a low-level Programming Language

If you’re curious, you might have already looked into “Software Engineer” job postings from Google, Facebook, etc. Did you notice what they have in common? They’re usually adamant that you be proficient with at least one “general purpose programming language”. I believe there’s no better career investment than learning C/C++, which is not only general purpose but also low-level, unlike some newer counterparts such as Java or Python. C/C++ is powerful and its mastery will make it easier to understand how a computer works under the hood. And the fact that so many languages are modeled after C/C++ means you’ll be able to pick up many other languages more easily.

Understand your clients

Part of your job as an engineer, when you interact with clients, is to clarify what it is that they really want. Clients may have a great ideas, but they often won’t know how to translate them into real, concrete software, until an engineer comes to help. The ability to make the client’s ideas evolve and mature is a great skill to cultivate.

Algorithmic Complexity

While not all projects share the same level of difficulty, a time will come when you will be required to manipulate huge chunks of data. How well you deal with a such a tricky task will make you stand out from the crowd. Are you able to recognize why a linear implementation is better than an exponential one, and why it is worse than a logarithmic one? If your project is critical, this can make the difference between success and failure.

If you want to learn algorithmic complexity and other important computer science concepts, be sure to check out our book Computer Science Distilled.

Writing Skills

This one applies to a variety of duties that are part of creating software. From writing commit messages or API documentation, to choosing good variable names. Are your commit messages clear? Do they represent an isolated chunk of work? This can save the life of the next programmer trying to find which change introduced a bug. When you throw a fancy/tricky one-liner in the codebase, you should have the courtesy (and skill) to add a comment that explains what you did in clear English. Everyone will thank you for it!

Integrity

Throughout your career, you should ask yourself if this is really what you want to do. Do you see yourself doing your work for the rest of your life? Do you have a true passion for coding? These fundamental questions should always guide you. While it may not always be possible, try to get those jobs that kindle your interest. Be sure to take the initiative, keep a positive attitude and show genuine care for your coworkers and clients. This is one of the earliest pieces of advice I received, and that I’ll never forget: at the end of the day, interpersonal skills matter more than technical skills. For me, nothing has been proven to be more true.

José Campaña