What does a Software Engineer do?

This one is for the noobs!  Let’s go back to the basics and describe what a software engineer actually does.

Software engineers write programs that computers can interpret and execute.  The best example of this is the program that runs on your computer hardware called your operating system!  Windows and MacOS are two of the most widely used pieces of software that are run everyday by millions of people.  They were designed to operate the hardware that they run on and allow other software engineers to write programs that the operating system could execute.  These are the common applications you use daily – software such as Microsoft Excel and Google Chrome.  In fact, these applications also give you the ability to create other programs that THEY can run – Microsoft Excel can run programs called Macros, Google Chrome can run programs called web pages.

Software engineering isn’t just about running other programs.  Like software running your computer, anything that a computer is attached to can be controlled by software.  So if a computer is attached to something like a refrigerator, the refrigerator can be controlled by a piece of software.  An example would be where the software engineer may write a program to keep the temperature at a specific setting and if the temperature drops, then the program would tell the refrigerator to turn on the cooling device.

So what else are computers attached to?  Not surprisingly, pretty much everything – planes. cars, televisions and monitors, phones, watches, and 3D printers.  Anything that doesn’t have a computer attached to it, eventually will.  That’s the beauty of where we are right now, software is eating the world! 

Types of Software Engineers

There are all types of software that an engineer can write.  Here’s a list of the types of software engineers there are and what languages that they typically program in.

Operating System Developers – These engineers write the underlying programs that are layered on top of the computer hardware.  They develop common application program interfaces (API) that other software developers can use to interact with the hardware.  Essentially these guys are the engineers that write Microsoft Windows, MacOS, iOS, Android and the various types of Linux.  Most parts of these operating systems are written in C, C++, for the MacOS some pieces are written in Objective-C, and for Windows C#.

Application Engineers – Application engineers are engineers who write applications for the operating systems to run.  So on Windows, these are the folks that write applications like Microsoft Word, Excel.  On the Mac it’s the engineers that write Mail, iMovie.  For Linux, they’re usually server technologies such as MySQL, Nginx, and Apache.

Backend Engineers – Backend engineers write code that utilize server applications that run on top of the operating systems.  They are primarily concerned with processing requests that are coming from the web browsers and passed into the backend.  Web users generally never see what’s happening between the servers on the backend.  Users are more likely to see the results delivered from the backend to the front end (web pages in HTML).   Every programming language is used when processing the web browser requests – Java, C, C++, C#, Python, PHP, Ruby, GoLang, and even JavaScript.  Not only do these engineers know how to program, they’ll also be very familiar with configuring applications that support the data processing that is required to process requests, such as a database server, cache servers web servers and/or application servers.

Frontend Engineers – Frontend engineers write code that runs in the web browser exclusively.  So the primary language is generally HTML/CSS/Javascript –  anything that runs in the web browser.  This used to include Flash, but most complicated browser applications today are written only in JavaScript.  One primary trait of a frontend engineer is that they’re usually more design-oriented than backend engineers.  They’ll be more focused on making sure things not only function, but that they look good as well.

Full Stack Engineers – Full stack engineers combine the skills of both the backend engineers and the frontend engineers.  They’re adept at handling both client side application code (HTML/CSS/JavaScript) and backend programming languages (Java, C, C++, PHP, Ruby, etc).

DevOp Engineers – DevOp engineers are the guys that make sure that web applications are always running, functioning and able to handle a surge of web traffic (scaling).  They make sure that when you code is ready to be deployed, things are done in an orderly manner and things are ok afterwards.  They make sure that all the different applications that are running on the servers are playing nice with each other and that they are secure from hackers.  The programming that they do is usually is limited to scripting languages (PHP, Python, Ruby) and occasionally compiled languages (GoLang, C, C++).   

Mobile Engineers – Mobile engineers are the people who write the applications that run on your phones.  The two big major operating systems are iOS (iPhone, iPad) and Android (Samsung, Pixel).  The languages used for this type of development are either Java and Kotlin for Android development and Objective-C and Swift for iOS development.

Embedded Software Engineers – These engineers write the software for really small computers that need specialized software to function, just like the refrigerator example we mentioned above.  These tiny computers are the things that provide the logic for stuff like televisions, printers, cameras – just about anything that has a display and some controls!  Because of the limited space that is available to run this specialized software, the programming language is usually either C or C++.

Typical Day of a Software Engineer

So what’s the day-to-day look like for a software engineer? The day usually begins with a meeting, called a “Scrum”.  In the scrum, engineers talk about what they had worked on the previous day and what they’re currently working on.  They’ll talk about anything that’s blocking their progress and whether or not they’ll be able to complete the work that they’re doing in the time that they estimated.  For every new piece of code (feature) that they have to write, there’s usually a “spec” which outlines what the mew piece of software has to do.  For user-facing applications, this usually comes with a design that outlines exactly what the visual layout (colors, spacing, dimensions) should look like (User Interface).  Most feature specs usually outline what the inputs and outputs will be, and what to do in case something isn’t correct.   The engineer works on the code until they think it’s done and it meets the requirements of the spec.

Once the feature is complete, they’ll submit their code for review from their peers.  Once feedback from their peers is complete, they’ll submit it to ‘testing’.  Testing involves other people in the company taking a look at the feature and making sure that it works as expected.  If there are problems and discrepancies, the code goes back to the engineer, so that they can fix the problem.  This process repeats itself until the testing team feels like they’ve tested all the difference scenarios that may exist.  Then the code is packaged up and deployed.  For Operating System Engineers, Application Engineers,  Mobile Engineers, or Embedded Software Engineers, the feature is combined with other features to create what’s called a ‘release’.  Each release is given a version and each version then is submitted as a whole to testing to find more bugs or missed requirements or bugs that come from.

When an application is released to the world, and people start using it, people will find ‘bugs’ (glitches) in the software – something that isn’t functioning the way it’s supposed to.  In other cases, the software feature isn’t quite right for the users when they use it.  They’ll request it to work in a different way or ask for a new feature entirely.  The new features, feature changes and bugs are all cataloged and aggregated into a list of work for the engineers.  Each engineer picks (or is assigned) the work and the cycle starts all over again.

Check out these other experiences:

Personal Note

Personally as a software engineer, the most gratifying thing for me is working on something that I know potentially millions of people will use.  It’s a fun and intellectually challenging process that always pushes me to learn new things and forces me to keep my programming skills sharp.  It also is a fun way to be part of a team process.  While the perception is that you’re working in isolation, it’s very far from the truth (at least in large organizations).  You need to constantly work with your team members to make sure that your code is working together and that the software requirements are meeting the expectations of the users who use it.  If you enjoy working as part of a team and enjoy logical (not mathematical) problems, then software engineering is a great choice for a career option!