What is a Software Engineer?
A software engineer is a person whose job is to generally design, implement, and maintain programs or code.
Depending on the company, they may end up responsible for more, but between all company sizes, programming is the shared responsibility.
People who have mastered fundamental software engineering have many career options to them:
- They can remain in software development and climb the software engineering ladder.
- They have choices in industries — pretty much everything requires software. Do you enjoy music? You could engineer DAWs, VSTs, etc. Do you like hardware and electronics? You might like IoT and embedded.
- They may choose to switch to related jobs or disciplines that work closely with code but are not directly responsible for developing it (e.g., SRE, Security, etc.).
- They may choose to go into leadership or management positions if they have the required soft skills.
Required Knowledge & Skills
- Programming Fundamentals — Intermediate to advanced in one or more languages, and fundamentals common to most languages (e.g., flow control, primitive/complex types, compilation/execution, dependency management).
- Programming Paradigms — Most start off learning sequential, imperative, OOP. But knowing the rest of the paradigms and the strengths and weaknesses of each is extremely important and often required.
- Algorithms & Data Structures — At their core, SEs need to know how to break down complex problems and solve them optimally. Knowing when to use what is a crucial skill. Also, a strong knowledge of math is useful, depending on the positions you want to work.
- Database Fundamentals — Databases are the crux of all data storage. Generally, people will learn a relational database (e.g., MySQL, Postgres) and a NoSQL database (e.g., Mongo) at a minimum. You learn more specific knowledge for specific jobs.
- Basic Networking — Applications have to communicate in one way or another, so software engineers must be familiar with networking basics (TCP/IP, HTTP(S), REST, sockets, routing, proxies, load balancing, etc.).
- Basic Security — Although security is a distinct (and vast) field, software engineers should understand rudimentary security for development, which includes various topics like encryption, input sanitation, authentication, authorization, ciphers, hashing, high availability, tracing & logging, etc.
- Basic Scripting & Terminal — Knowing your way around a command prompt/terminal is crucial for system administration and deploying applications. Scripting is also useful for automating tasks.
- Basics of Operating Systems — Understanding how software runs on computers allows for writing higher quality code, following best practices, and debugging, especially on lower-level languages like C, C++, etc.
- Basics of Testing — You should ideally know a language-specific framework as well as a generic API testing framework. I say “ideally” because some startups move too quickly to justify the effort in writing huge regression suites.
The knowledge and skills of software developers vary along a broad spectrum.
Some portions of the industry are designing basic web applications or websites and may not require Computer Science degrees or knowledge of algorithms.
Other portions of the industry are working on cutting edge technology like machine learning, blockchain, data analytics, etc. These fields require a strong knowledge of systems engineering, algorithms, data structures, and other hard topics.
It is this set of knowledge and expertise that separates the software “engineers” from the “coders.”
And naturally, there exists everything in-between. The more advanced your knowledge, the more opportunities you open for yourself.
Categories / Concentrations
Due to the vast array of languages, tools, and use cases, there are various categories of software engineers that focus on different things. Some of these distinctions align with differences in their industries.
Generally, software engineers learn the baseline knowledge listed above, and then additionally learn more specifics about a given concentration:
- Back-End or Systems — Specialize in developing portions of applications (often called “services”) that process logic, interact with databases, handle authentication, etc. These services do the heavy lifting and processing for applications. Typically back-end developers are keen on algorithms and CS fundamentals as well as database, caching, authentication, message brokering, and various other topics. You can use any language or framework for back-end development, so there’s vast diversity even in just back-end or systems engineering.
- Full-Stack — Specialize in both front-end and back-end. Smaller companies with fewer engineers are more likely to require ownership over full stacks. This position is becoming more and more infeasible due to the outrageous number of tools, languages, and technologies there are to learn. See this blog post from Andy Shora to learn more.
- Embedded — Specialize in software that lives in embedded devices. Think microprocessors, smart devices, and IoT devices. There’s a distinction here because embedded development typically involves lower-level languages interacting with the operating system, networking + sockets, drivers, memory, firmware, hardware — requiring some different programming paradigms, languages, and practices.
- Blockchain — Blockchain is a separate field whose software engineers specialize in the development and optimization of blockchain protocols, smart contracts, and web applications utilizing blockchain. This field includes cryptocurrencies as well, for which blockchain sits at the core.
- Networking — Specialize in the automation of network configuration and communication. Several certifications around networking (many championed by Cisco and CompTIA) exist and require months, up to years, of study. The intersection of network engineering and software engineering is Software-Defined Networks, which include initiatives to automate network configuration and communication worldwide.
- ML & AI — Specialize in mathematics, statistics, data science, and deep learning, which all culminate in projects like self-driving cars, electronic assistants, and other “intelligent” software. Artificial intelligence will probably rule the world one day.
- Game — Specialize in a variety of topics required for making games, including game theory, bits and pieces of ML and AI (for NPC and enemy behavior), networking (multiplayer games), and even graphics programming in some cases. Game dev is broad, however, also encompassing mobile development for mobile games, web development for web-based games, etc.
- Graphics — Specialize specifically in advanced mathematics, linear algebra, compression, and other computation related to the management and production of graphics, including ray-tracing, among other things. Game developers are not necessarily graphics developers and vice-versa. For example, a game developer might use the Unreal Engine to create video games. But a graphics engineer would be developing the Unreal Engine itself, writing algorithms for processing graphics and other mechanics.
- Cloud — Cloud developers focus on applications for specific cloud providers. For example, you might specialize in writing code and architecting applications/solutions that are tailored specifically for AWS, GCP, Azure, etc. Note that Cloud Software Engineers are different than Platform/Infrastructure Engineers, whose responsibilities lie more around configuring, architecting, provisioning, etc., of the cloud.
- Mobile — Specialize in creating phone apps, especially Android and iOS (Windows and other phone OSes command tiny portions of the market). There’s been a recent rise in cross-platform mobile app frameworks/libraries (React Native, Flutter, Xamarin, etc.).
- …and many more. There are plenty of other “concentrations” in software engineering. Happy to add them if you think I missed something and reply to this story.
It could potentially be rewarding and fun to switch concentrations. However, some of them (e.g., Machine Learning) often require a lot of time and study because of how complex the content is.
Switching between disciplines within software engineering is not unlike switching between concentrations in the medical field — an anesthesiologist couldn’t become a surgeon overnight and vice-versa.
Similarly, most of us probably can’t pick up AI in just a month, even as a senior engineer.
These averages include all seniority levels as well as all industries. Entry-level salaries might be several thousand lower, while senior positions might be much, much higher.
Salary will vary according to many factors, so don’t take the following bullets as law. But in general:
- More senior positions earn more money.
- Startups tend to pay less income and benefits but give more stock or share options.
- Specific industries and sub-categories pay more (e.g., ML/AI engineers earn more than UI or web developers)
- Jobs in cities and states with a higher cost of living will pay more (e.g., California salaries are generally higher than Kentucky salaries)
Naturally, these numbers are for most salary workers in the industry. If you’re a senior fellow who helped build a company from the ground up, your salary could be in the several hundred thousand to millions (!!!).
Different companies have different variations, but there’s usually a software engineering ladder of skill/seniority.
Entry-level engineers will join as “Jr.” or “Level 1” software engineers. Junior engineers are required to apply their fundamental knowledge by coding and fixing bugs.
Mid-level to senior engineers are required to take on more significant roles surrounding decision-making, architecture, design, and leadership.
Due to the varied roles, well-rounded software engineers can often promote or transfer into other positions such as leadership, management, and related disciplines in software.
However, if you prefer just to keep hacking at stuff, you can climb your way past “Senior” to “Staff,” “Senior Staff,” “Principal,” “Distinguished,” and even “Fellow” levels.
Maybe you could become the hacker-in-chief (CTO) and found your own company.
Note: Larger companies tend to have more levels/distinctions.
Plenty of options here, regardless of what you want to do. There is room for growth, both vertically and horizontally. It’s a dream occupation for those of us lucky enough to love it.
In terms of how to get promoted, most companies will have unique promotion schedules and rubrics. These rubrics gauge your competencies to determine your level of seniority and skill.
The most critical part will be talking to your manager about what your goals are so they can help you get there.
As examples, check out the following resources:
- Software Engineering Competency Matrix [Sijin Joseph]
- Engineering Competency Matrix [CircleCI]
- Career Framework Matrix [GitLab]
- Engineering Ladders Linklist [Benjamin Reitzammer]
Naturally, the best way to gain experience and learn is to work on real projects with other senior engineers.
However, in addition to daily work, it can also be helpful to get coaching for a variety of different things, from coding to leadership and other intangibles.
Learning & General Education
Revisit the Required Knowledge section above for a general overview of topics you should know as a software engineer.
I wrote a separate article detailing various free and paid resources for learning:
Also, I created a detailed learning roadmap (currently only front-end and back-end). I’m currently working on in-depth companion articles, complete with links to resources.
The Static Void Academy is an online academy for becoming a software engineer. Here, you’re not just learning to…
As a software engineer, you have virtually unlimited choices in tech conferences all over the world.
There are also large, multi-disciplinary conferences hosted or sponsored by tech giants. These conferences will cover an expansive array of knowledge and tools, and there will typically be thousands of attendees and speakers. Examples include Microsoft Ignite, AWS re:Invent, Google I/O, Mobile World Congress (mobile devices), E3 (video games), and many more.
Traveling to these conferences and attending the workshops, speaker events, and networking events is immensely beneficial for self-growth and continued learning.
For a more comprehensive list of tech conferences, check out:
I recently wrote another article about interviewing resources for software engineers:
Those resources are on top of the well-known websites and resources for practicing programming problems:
Another innovative company is TripleByte — you can take an assessment and automated interview online, and great performance here guarantees an onsite interview with top tech companies.
Testimonials & Opinions
I have my own opinions, which I’ll include. But I’ve also included select quotes and thoughts from other, real engineers in the industry as well.
Disclaimer: All opinions belong to people quoted and do not reflect the views of their employers.
My favorite part about being [a software engineer] is that we’re here to solve problems… it’s applicable to every field of industry. Whatever field you’re in, software engineering can help you out.
My biggest gripe with the job is that I don’t see enough diversity.
— Prithvi K, SDE II @ Microsoft
I guess I like the quiet space to solve a puzzle with language and do it in as simplest a way as possible.
One thing that I dislike is that the industry can be toxic. People glorify hard interviews and long hours.
— E (asked to remain anonymous)
Been at it since the 70s. Still having a great time…
There is a bunch more to this job then sitting at a keyboard typing. Like you, solving problems is what makes me tick.
— reddilada on Reddit
My dad has been a programmer for many years and for as long as I can remember he as always had a poor work life balance ie putting in 12 hour days, working over weekends/holidays , recently working over sick leave. This has impacted my relationship with him badly and as a whole family.
—theholybellows on Reddit
Also, I wrote a few other articles covering various points. This one covers some of the benefits and advantages of working in software:
10 Reasons to Become a Software Engineer
Have you thought about joining the software industry? It’s booming.
Alternatively, this article covers a couple of downsides of software:
Have I missed something? I’d love your feedback!
Want to be quoted? Tell me what you love and hate about software engineering, and there’s a chance I’ll add it to this story!
Interested in learning software? Check out the Static Void Academy’s first course for beginners!