As a long-time programmer, I occasionally get the question:
“Where do I start learn to code?”
My answer to this has become a counter-question:
“What kind of software do you want to build?”
Yes, there is more than one kind of software! That shouldn’t be a surprise. However, over the years I noticed similarities in the use of software and a relationship between the software and the lifestyle of the engineer writing it: you.
In this article, I will introduce 13 different “fields” of software engineering. Each field has different communities, different career opportunities, and a different study path. Choosing a field may help you focus your studies.
Even though this article is quite long, it will not go into detail how to actually start with each field. My goal is that you can choose a field and make it easier for your mentor to give advice about how to actually get started.
◦ Outfitter — Making people look good
◦ Service Provider — Offer a service using code
◦ Contractor — Writing code on demand
◦ Maker — Use code to make things work
◦ Analyst — Finding meaning in data
◦ Scientist — Explaining the world through code
◦ Entertainer — Entertaining people with code
◦ Toolmaker —Increase efficiency through code
◦ Inventor — Next level code
◦ Maintainer — Taking care of the world
◦ Teacher — Making people understand
◦ Artist — Inspiring with code
◦ Activist — Changing the world with code
Let’s start with the most common…
or “The mass market of software engineering.”
People like to be presented in a certain light. This is why many people pay for the product “homepage”. In the past 25 years, a lot of software has been created to maintain and build homepages. Famous examples are Wordpress, Drupal or Typo 3.
These days, thanks to services like WIX or Shopify, homepages can be made without writing any code at all. Your work may be reduced to tailoring an existing tool or service. When everyone can make a homepage, salaries are low. You need to be efficient and reliable to compete. An engineer needs to learn just enough to get the intended effect, leaving as much as possible to existing tools.
It doesn’t feel a lot like engineering. You will not build things that are special or are needed to ease any pain. It is not well paid and stressful. But you are not working in a vacuum. Your competition is struggling with the same things. As long as your simply products satisfy the customer, a simple presentation is fine.
The field of outfitters is not limited to homepages. There are many other ways of presentation! Online shops, PoS-devices, advertising displays in stores, digital fashion and mobile apps may be equally important to the presentation. Any kind of software here is set-up to be dominated by a few, effective tools that just need to be tailored.
That is true unless you want to exceed the limits. To take more pride in your work, you might want to unlock the high-end market. High-end homepages — like high-end cars — are made for luxury goods. As an engineer, you will need to push the existing limits in many aspects. A challenge that grows with every year as the standards evolve around you.
To become a high-end engineer, you will need to make a lot of regular homepages, homepages at a WIX level or even lower. Just to understand the limitations and subtleties of the field. In the beginning, this has very little to do with writing new things and more with selecting, testing, evaluating, choosing settings.
Be it through code or configuration: to make things look good is vital to many businesses. As such its value shouldn’t be underestimated. Often this requires beside technical skills a sense and respect for visual design.
The engineers are often split into two fractions: the visual part (aka. front-end) and the support part (aka. back-end). The Front-end focuses on things shown on a display. The back-end focuses on the parts needed to make it all work. Beginners often start in the front-end because it is quicker to see changes and has less risk of breaking things. For that reason, front-end engineers tend to earn less than back-end engineers.
Simplicity matters for a homepage. Often a homepage is reduced to the user clicking to reveal different parts. In advanced cases, they may fill out a form, do a little interaction and maybe order something. But the technology that makes homepages work can also be used for much, much more. You can use the same skills to make a better wage with less stress as:
or “Reducing stress by solving problems through code.”
Service applications are pieces of software that solve a certain problem for its user. Obvious the areas of personal communication (WhatsApp, Facebook Messenger, GMail), document management (Dropbox, Google Drive, Youtube) or publication (Facebook, Medium, imgur,…) come to mind. But services can cover a lot more! How about a time-tracking service? A meeting reminder? A translation software? The list is endless.
Web-services are all based on the same technology used to make regular homepages. The use of technology, however, is often a lot more complex. Tools like React, Redux, Backbone, Ruby on Rails, Meteor, or Laravel are made to manage the complexity. Those tools work for regular homepages but they excel when you need to write services. Services need to do their job reliably. While a new version of a homepage may use a completely new system, a service should better improve incrementally.
A service may start as a short, few months, project. But if it is successful you may need to stick with it for years. Deadlines matter significantly less. With every feature, you need to balance the needs of many customers. It is much more important for your work to be stable and much less important for your work to be exciting. Usually, you can sit down and get to know a piece of code a lot better. This also means that you have less pressure to go with the times.
Services are also by no means restricted to the web. Be it an iOS application, a smartwatch, a TV integration or to work with custom printers. Just because you are best with web technology doesn’t mean that web technology is the best for the service you want to provide. This question becomes a constant challenge for you. Will this new tool provide additional value to my service? Is it worth investing your time on an Android version? How many people can it support? Will this new programming language make everything faster?
Even without consideration for new technologies, knowing which feature to pick is hard. Even if you are experienced at coding, your first service will likely not work out great. This kind of judgment can be practiced though. Working with senior engineers and experienced managers can make your life a lot easier.
There is competition in the service field but it is less intense for the engineer. You need to be informed about trends but there is no inherent pressure to follow them. Unlike the homepage world, there is often a separation between operation engineers (short: Ops) and product developers. Ops are people that take care that the service runs. Product developers make sure that the product gets better. Front-end or back-end product developers? It might be better to blur the lines and become Full-stack.
At a service level, you also need to expand your horizons. Can new technology make your product obsolete? You better learn quickly to stay on top or fail!
This does not suit you? There is less pressure when you are a:
or “Selling your time writing code.”
Many companies/freelancers do not try to specialize in something particular. Instead of trying to build their own products, they offer to write software for others in exchange for money.
Contractors are the mercenaries of the software world. They try to satisfy whatever is requested by the customer. Often this is focused on in-house software like warehouse management, time tracking, HR software or accounting software. The companies that request mercenaries to do things are usually busy and don’t want to take care of a specific part of their business. As long as there is no product that can be used or adapted to the needs of the customer. Customers will need someone with enough skills to build a custom solution to fit their needs.
Working as a contract software engineer requires dealing with deadlines and making sure that a product is delivered as specified. Engineers in this field try to play it safe. Never overestimate, always make sure you know that you can deliver. For that reason, you usually don’t talk about what programming language or software you use to get the job done.
If you have a good manager this can be a stress-less job. If your software works well, you will not see any gratitude. If there is a problem, you might need to fix it. You will need to bend to the wish of the customer and have very little creative freedom. This also means that a passable solution is often all that is called for, while a well-engineered solution would be a waste of time. This kind of software doesn’t need to look good. Still, it is usually paid well. Particularly if you — or your company — have made a name for themselves.
I didn’t mention web technology here. That is because when you are a contractor you best become very flexible in your skill set.
Can this integrate with Java? — Can be done.
The API is available only in C? — Better pull that old book off of your shelf.
Servers still running Windows XP? — Oh my.
The only way to limit this is in the sale process. It becomes very important that you — or your sales-person — sell something that you can deliver with tools you are used to. If all that project managing is annoying to you, you could take on long-term employment as a…
or “This machine needs to run somehow.”
Every mobile phone you use has some software running it. There will be more robots in the future and those will need software too. Not to mention autonomous cars or connected homes. All of the software for those machines has to be written/put-together at some point.
When you write for hardware you are usually bound by tight constraints. The hardware might need special tools to be connected to your software. You may even need to build tools to get it running. Sometimes you need to adjust for very slow hardware. A lot of details can be put into the software that runs the hardware of our lives. You don’t believe me? Try to program an elevator!
Software to be used with specialized hardware often needs to be highly reliable. You need to understand all the limitations of the hardware and figure out how to utilize it best. This is a very different challenge from writing software that is supposed to run on many machines, like web or desktop software.
Also, the time span for a hardware project is a lot longer. It can take years until you see the first version in production. Even if you can use modern (rapid) development processes, it can still take months. Patience and practical skills are required to excel at this.
Your software may be used by millions of people and literally drive the world, but you do your job best when no one ever notices. You need to be okay with that and take pride from within.
Universities have quite good programs to study hardware, and a degree helps you to be hired by a company with resources to finance the prototyping. Additional engineering know-how and/or interest helps as well. Engineers that can provide good software are — and will likely stay —in high-demand and are well paid because of that.
These days the internet of things (IoT) is one field of hardware-engineering. IoT devices are often small and collect a lot of data. This data is subsequently processed by software, written by:
or “People that understand numbers and know how to use them.”
Data-Analyst or Data-Scientist are professional titles often used for people that take large data sets and find meaning in them. Usually, only large organizations have the reach to gather enough data to make analysts necessary. They are often using tools that are less common in other domains like Julia and R as it is more important to be adaptable to their process than to work in a team.
Working in this field usually requires secondary expertise. Analysts may need finance knowledge to analyze trends for banks or investment firms. They may need medical insight to work at medical companies to look at the effectiveness of treatments. They may work at research centers, supporting scientists like in an observatory for astronomers or a boat for marine biology. I even met analysts working for fashion brands to predict what amount of stock needs to be on the shelves at what time of the year.
All of the applications I have seen have to deal with future prediction and analysis of the past. Also, Data Visualization is a big part of this as they need to explain their findings to an audience. Often, engineers start out either doing data visualization and then become better at the numbers stuff or the other way around.
This sort of work does have deadlines but those are not as strict as in other fields. Their effort is calm, and the approach analytical. When their methods fail, hardly anyone can argue what the mistake was. Even if they make mistakes it can make or break a company. If you can present your findings (or the absence) in a reasonable manner the job is relatively secure, well paid and within reasonable working hours.
You need to communicate with different professionals in the field. In many cases, analysts need to work with service engineers that use their algorithms or scientists that come up with ideas. As an analyst, you need to gain respect by being self-confident and knowledgeable in multiple adjacent fields. The ability to grasp difficult concepts in conversation is also helpful. These days Artificial Intelligence in general and Machine Learning, in particular, are hot topics in this field.
A common problem of analysts is that their opinion alone carries little weight. They would need to attend conferences and write papers to be noticed by the scientific community. Other people usually spend their career doing that:
or “Advancing from chalkboards and pieces of paper.”
Scientists explore the world around us and try to make sense of it. If you want to become a scientist, you will soon find that computers and custom software are used to draw conclusions. Often, scientists can work together with data analysts to find new understanding in existing data. Without understanding the basics of how to take advantage of software, your peers might easily run laps around you in the future.
Be it biology, geography, astronomy, social science, physics, history: some understanding of how software engineering works will help you get better results.
Keeping your eyes on the target and choosing the right technology will remain a challenge, though, and your efforts in software engineering will not immediately improve your recognition in the scientific community. By spending time learning to code, you are not spending time on the actual science.
If you want to become a scientist with knowledge in engineering, it is my strong suggestion that you focus on the science part first and learn some basics on the side. Understanding some basic Python or Unix helps a lot of young scientists I know. If at a later point in life, you happen to become serious about a certain topic, it might be just the right time to deepen your knowledge and find out what things you need to know.
It should be noted that almost any degree can be combined with technology. So, if you find yourself in a position where you feel that a career in science isn’t your thing, you can effectively change careers by knowing software engineering: A trained lawyer (science of human contracts) with a software engineering background can be very valuable when it comes to machine contracts, as they often behave surprisingly similar. A social psychologist with the skills to build interfaces may be very successful in producing services for a broader spectrum of people with their insight, just to give a few examples.
Rationality is too much for you? How about to the other side of the spectrum:
or “Use lights and sounds to stimulate the brain.”
Making games is the art of triggering enjoyment, satisfaction in others. All they do is push some buttons or swish around with their fingers and yet it becomes joy.
Computer games are the best-known kind of software entertainment. But software is used in almost any field these days. 3D animation or effects in movies for example. Creators not only use software-tools specifically made for cutting. They also hire developers to build futuristic user interfaces, create special effects unseen, position and generate armies of digital warriors, etc.
Big events have also started to employ more software to entertain. Some big-name musicians have reactive displays on their stages. Making sure that the effects on stage appear on time is a very particular engineering skill. Many musical instruments these days are built using software. Making toys for kids or modern experiences at amusement parks also fall in that category. All this software has something in common: it values experience over function.
Entertainment comes in all forms and sizes. What you do might have mass-appeal or only appeals to a few people. As an engineer, you can focus on things that can be used by an entertainer or become an entertainer yourself. In any case, it helps to enjoy what you are making. It is also a bonus that you get to see other people enjoying your work.
The release time of entertainment products is part of the experience: “Avengers Endgame — April 26, 2019”. If the deadline isn’t kept, fans become upset and the experience is tainted. In TV the deadlines are set in stone and if your game is promoted to kids on Saturday morning, then you better make sure that you are awake and ensure that the servers are running.
This means you are scheduling your life around the experience. Once published, products are in big parts definite. Work quickly on your initial idea and steadily improve it until the deadline arrives. Always keeping a working, albeit imperfect, version at hand. After publishing, your work will be praised by critics and customers or become a flop. Needless to say, that game developers are eager to make every second count.
If you have a lot of passion, you want to make the best possible work. For that, many game-engineers learn every aspect of building a game before they go into serious development. Be it audio effects, data storing, network protocols, 3d graphics. Your first game might be written all by yourself but in a bigger team, it often makes more sense to specialize.
While Games and entertainment-through-software have become big business, software engineers are often not compensated fairly. Employers exploit the passion of engineers to build a game. Death marches are but one of the symptoms.
As the industry is maturing, entertainment workers have recently started to unite for better working conditions. Indie developers that just work on their titles have launched massive successes in recent years. Which shows that confident all-rounders with a vision still can make it on their own. But that might also be a big gamble.
In the game industry, there are general purpose workers, whose lifestyle is different. They make applications and other software to build games or other things, I call them:
or “Software engineers use software to write, test and publish software”
I write my code with a text editor. I don’t use Word. The text editor I use is without formatting features but it makes it easier for me to understand what I write. It automatically colors sections of text so I can read quicker. It also shows documentation beside my cursor. It has so many features that I can not count them here. My text editor is usually called an Integrated Development Environment or short: IDE. My IDE, the tool I use to write code, was made by many toolmakers.
My distinction between a tool and service is subtle but important: Tools work on their own. No maintenance needed by the tool maker. If you write a tool it should run without your constant need of attention. This has a lot of impact on the life of a Toolmaker in comparison to a Service Provider or Contractor.
Just because a particular tool doesn’t look good or isn’t comfortable to use doesn’t mean it isn’t the best tool for the job! Some tools are so specialized that the user would even use it in a broken state than not have that tool at all!
This fact changes a lot for the life and motivation of a Toolmaker. They need to be on the lookout for how people use things and the inefficiencies they encounter. They need to be inventive in the ways they build tools and preferably be able to build tools that are sturdy, easy to learn and understand and bring value to the table. There is not a clear way to tell how good a tool is, but professionals are quick about dropping a tool for another if the other tool replaces enough of the functionality.
Tools will always stay in competition with other tools. My IDE is a compromise. I know that there are other, universally acclaimed, IDEs available but the one I use now suits me best. I know this because I used quite a few IDEs over the past 15 years. This is true for most tools I have seen.
Your work in this field is filled with both relaxation and constant tension. You cannot really quantify what the best next steps are. On the other hand, it often doesn’t matter. Sometimes it might be better to not upset the users and refrain from publishing a feature and risk users leaving.
Being a Toolmaker is a rather unspectacular job. Usually, you do not have a clear impact on society but your tool may have a lot of small impact on its user. Only a few tools base their success on sparking joy. Instead, tools often relieve pains. Your work might be crucial to the success of another company but you only contribute a small part. Unless tools completely break there is no need for Toolmakers to work overtime, which gives them time for hobbies or family.
Tools elevate individuals and, if they are very successful, industries. But this is not enough for some people:
or “Visionaries that want to change the world!”
When the railroad took hold of the world, there were men that bet a big amount of their money on building tracks and building trains. At that time the engineers and entrepreneurs did know one thing that the public didn’t: Trains are going to be the next great thing.
The same thing is true for people that use Bitcoin (or other blockchains) to empower their software. People that apply artificial intelligence to recognize faces in images. They have a vision of how to change the way we buy groceries and make food for ourselves at home.
Before Google started taking over the world, many approaches to making the internet searchable were attempted (entertainment recommendation: Halt and Catch Fire). Just because people have a vision of how the world could be different doesn’t mean that always works out. Google Glass is a prime example of that. This makes your life working as a Visionary stressful and risky. As an engineer, it may very well be the case that you can’t cash in your last paycheck and whatever software you made has a high risk of becoming useless very quickly.
On the flip side: if it works you can earn a lot of money (assuming you didn’t get played in your contract) and respect by prooving to have bet on the right technology.
If you happen to succeed, it is good to look back on the History of trains. Trains and railroads were made by risk-taking inventors. The first trains have very little in common with the trains that we have now. Not only do the trains look different, but they also need to be treated with a different kind of mindset than what was needed for the first train. This is linked to economics:
When you build your first successful, new technology, it usually doesn’t matter how stable it is or what side effects it may have. The first trains were slow. They made the passengers and the environment dirty & sick. They broke down often. But they were still viable because there was no competition and they were exciting. Once people have accepted a technology, the mindset changes and you need to build products that overcome the first issues and become more economically efficient.
Many people with visions can’t make the switch from inventing new things to maintaining and improving them:
or “Making sure that our world doesn’t burn.”
There is a very underappreciated side of software engineering: Maintenance. It is personally sad to me that this field doesn’t get as much attention as the other fields, but that is how it is.
Maintenance engineers may live very different lives from the other kinds of engineers on this list. Software can run forever, but these days new technology often replaces older technology or gets refurbished in waves to make it appeal to modern audiences with modern senses.
That is not the case for all systems. Some companies use very, very important pieces of technology that were written 20 or 50 years ago! My father used to program with a system called the i-series, aka. OS400. It is used to manage businesses. Warehouses, sales, receipts, salaries and more were processed through those systems. More of those systems than you might think are still in use! Maintenance engineers on those systems can have very high job security and maintaining expert knowledge in case something happens can be very important for a company to have.
However, in salary negotiations you are in a weak position because once you have this expert knowledge you have a hard time selling your skill to another company which means that you and your employer will find a middle ground between you not leaving and them not paying more than they have to (as you will be a constant cost on their business). A maintenance job can be very boring but also very predictable. Some characters fit this kind of work better than others.
I would like to stress once more that I believe maintenance engineers are very important! I have heard of a piece of software, written 30 years ago in Fortran, that runs at the core of international air travel. The person maintaining this software died and it is too scary for new engineers to try and change it. Any slight mistake and international air travel may stop working. While this may very well be just an unfounded rumor — the company will certainly not brag publicly about it — I believe it is reasonable to be concerned about the maintenance of software for nuclear reactors, train systems, space programs, medical equipment (hospitals!) or other facilities.
If you believe that your character is fit to understanding strange legacy systems and you are okay receiving little reward and recognition for a job that may be crucial to millions of people then by all means, please pursue a career in this field. You are dearly needed!
Is all that too much for you, then you can still go down a classic alternative road:
or “Software needs to be taught like any other thing.”
Those who can’t do, teach.
Those who do, can’t teach.
Spending time to be good at something always requires focus, it is a kind of specialization which some are better at than others. I consider being able to teach as specialization in itself. Teachers in software engineering only sometimes show up in classrooms. Often professionals called evangelists teach other developers how to use a certain tool or service at conferences or in online articles. Other people are writing documentation and books on software and hold presentations on the fascination of new technology. (Check out Julia Evan’s work)
All those people need to know how to write a certain kind of code, they need to know how to read code and often work in the field. But they also need to practice writing, speaking, and other educational methods.
Depending on the country, teachers are more or less respected members of society. Evangelists in silicon valley are rock-stars. They have the skill to charm and excite people about new technology. They can become thought leaders with an impressive paycheck and a personal following. If you don’t want to be exposed to public opinion you can teach on a personal level in a school environment. That is usually less well paid.
Code schools are held for every level and books are still being bought. You may be able to educate the next generation of engineers and — more than any single software could — change an entire field by mentoring the right student to become the next Satoshi or Zuckerberg.
Some teachers even teach kids to express their creativity through code. Creative coding is one of the bases to become an:
or “Anything can become an art form.”
There have always been people making art with new technology. The same is true with code. Code can be used to make installations, stupid things, impressive features that can make people reflect on society, humanity, and existence. Just have a look at the Ars Electronica if you need some inspiration.
Artists often work with visual algorithms and need to lose their fear of math. Particularly for 2D or 3D visuals. Just take a look at the feed of Mario Klingemann who makes art with Machine Learning or the generative Art of Sabine Wiluch.
An artists work in code can be more rewarding than traditional art because the medium is newer. Any artwork will likely be more relevant to the times. However, due to the extreme use of digital art in entertainment, it is also a challenging field. Boundaries are pushed every year and as an artist, you may often wonder if your efforts wouldn’t be better spent in entertainment.
As an artist, you need to look deeply at how a piece of technology influences its surroundings and have an interest in the mechanics of the interaction. This might mean that you need to research or test on many levels. Many artists stick with and explore the field that they start out in, only a few manage to become cross-disciplinary.
If dedication to a message and exploration of existence is your thing, it might very well mean that you should write software. Even though that may mean that your work has little to do with what engineering is about. Also, you probably might starve every now and then, as is the fate over every artist until recognition.
Artists can inspire change but often it is just a subtle reflection on the status quo. Some people want to change to happen sooner:
or “We can change humanity’s course through software.”
Wikipedia has been revolutionary in educating the world and it is run by volunteers. An engineer started by making a service to edit texts together and share it freely with others. It may have been an idea or hobby, but it turned out to become a philosophical conundrum of our times. Information can be free but often isn’t.
Storing and distributing information is cheaper than ever. Why isn’t all information equally available to all people at all times? There are people that believe the power should be taken from organizations. They invest their personal time trying to change the status quo by writing software and tools to empower everyone.
Part of this effort is focused on publishing data openly and helping whistleblowers and suppressed minorities getting their word out. It can also be on developing tools that have no immediate monetary value but might be used to help the environment (wildlife preserves, animal tracking, independent temperature measurements) or take down a monopoly that has a stronghold on society (Wikipedia replace encyclopedias, open social networks to replace Facebook, …).
Another part is also in providing equal opportunity to everyone in the world. Code editors, documentation, frameworks, text editors, spreadsheet software and even the operating systems that run our computers used to cost a lot of money. The open source movement has made large parts of software engineering a common good. It accelerated us as a society.
Depending on your personal stance and goals, you might need to fight for the greater good without personal reward. But companies have come to notice that open software can be in their interest. Most of the major software powers in the world already contribute to varying degrees to open source software! Google, Alibaba, Apple, IBM, Amazon, Microsoft,…
This means that you can make a living as an Activist. However, it may help to have a reputation or experience in another field first.
I believe this covers most of the fields of software engineering.
The people you work with are almost as important as what you are trying to achieve. No matter if you are doing well or not, a good manager has the ability to ground you. No matter what you do. No matter how talented you are or how hard you work on it. Even with very good people around you. At some point, you likely run into a dead-end. A project that can’t be finished, a product with a bad market fit, a competitor that was quicker to market or an idea that was ahead of its time. If you are surrounded by the wrong people this may well ruin your self-confidence: Did I choose the wrong career? Did I not understand where technology was heading? Will I ever be able to make something useful? These sort of questions may lead you to abandon the path of software engineering. Your friends, your mentors or a good team can help you through that.
Just because we work with computers doesn’t mean that you can escape the human aspect. Social structures come with greed, vanity, ignorance, pride,… Those things have just as much effect on software engineering as they have any other part of life. If you are unhappy with an experience you have, ask yourself: Is this pain required to do what you want to do? Is this necessary to provide the value that you are seeking to provide? Likely your struggle is something specific to the humans around you rather than the work you are doing. It also means that switching jobs — switching fields even — can reveal the new facets of what is often reduced to: “software engineering”.
Thank you for taking your time reading this far. Do you have a clearer picture now? Do you know what field to choose? I would love to get your feedback as a comment. Before you do though, maybe discuss your thought with your mentors first. They might add some perspective.
Wishing you all the best on your road,
I wouldn’t have published this if it weren’t for you. ❤️
All illustrations were made for use in this article by Dominik Heidegger, my brother, who is working on his career-change to tattoo-artist.