What's a software engineer, anyway?

I’ve received a lot of feedback over the past couple of weeks regarding my last two blog posts. The overwhelming majority seem to really like them. There are some, however, that have raised some interesting questions. Questions that deserve a bit more exploration than a simple blog comment provides. For instance, some seem to be drawing a distinction between web developers and software engineers based on the ability to complete some sort of task. Whether someone is capable of implementing quicksort from memory or setting up a server on their own or implementing a neural network for predictive analysis shouldn’t be the measure of whether someone is a software engineer or not.

As I stated before, a software engineer is simply someone who writes code for a living. That’s it. How do you know if your primary job is actually writing code? It’s actually quite formulaic.

Software engineering functions

There are two primary functions of a software engineer: development and maintenance. Development is the fun part, the part where you get to create new things or augment existing things with new functionality. Development is the breath of a software engineer – it’s what we live for. There’s nothing more exciting than creating something new. And every software engineer wants to be doing this as much as possible. Unfortunately, that only lasts for so long.

The second function, maintenance, is what many software engineers dread. This is otherwise known as fixing bugs. When it follows development pretty closely, people generally don’t mind. But when you’re maintaining code somebody else wrote, especially if it was written a long time ago, this quickly turns into the part that many engineers hate. Everyone is always looking for a way to get back into development, even though maintenance is a nice mental break from the hurried development cycle.

Almost all software engineers begin their careers doing maintenance. It’s very common for interns or other junior engineers to simply start by fixing bugs. In fact, some companies do that with more experienced engineers, too. The reason behind this is because figuring out what’s wrong helps you to learn about the software as a whole. Debugging is an excellent way to get acclimated to a new code base. There is nothing as revealing as stepping through code that you’ve never seen before to figure out why something is happening.

Engineers move on to real development, creating something from scratch, when they’re good enough at the maintenance tasks that they know their way around the software.

Software engineering focus areas

All software engineers perform functions in one of two focus areas. The first focus area is components. Almost all software engineers start out working on components, which are just pieces of some larger system. You’ll work on a single piece of something within a specific framework so that you can get the job done easily. The majority of software engineers remain component-based for most of their careers.

The second focus area is systems. These are usually software engineers who started out working on components and became fascinated with how the larger framework and ecosystem worked. Understanding systems is a very different skill set from understanding components because you need to think about relationships. Components within the system have relationships with other components within that same system (and potentially with other systems). Dealing with systems is frequently called software architecture, and the practitioners are called architects.

While all software engineers will work on components at some point in their career, not all software engineers will work with systems. Understanding systems is a very different skillset than understanding components. It’s the difference between knowing how to recognize and replace a broken screw versus putting together an engine from its component parts. Without a high-level understanding of how the system works, there is no way to complete the task.

On any given team, you typically find the lead is the one who is working at a systems level while everyone else is working at component level. Software architects live almost completely in the realm of systems, something that the best architects struggle with because the component builders that have all the fun (read: get to actually code!).

What’s not important

Notice to this point I haven’t actually talked about programming languages at all. As I’ve stated before, the programming language that you use is inconsequential. Whether you’re working with C, Java, HTML, CSS, or JavaScript, your role will still fall into line with what I’ve discussed above. You will be a maintainer of the component or system or you’ll be a developer of a component or a system. The actual tools that you use for the job depend very much on the component and on the system.

Those who say that all software engineers should be able to implement quicksort from memory or be able to set up a server on their own are completely misguided. These are tasks based very much on the role that the engineer is filling, which in turn is based on the components and systems that she works with. It has absolutely nothing to do with whether she is a software engineer or not.

I also heard from some people that you shouldn’t be considered a software engineer and unless you had formal training in computer science. I disagree with this assessment. First and foremost, colleges and universities teach only the very basics. Perhaps with the exception of those in postgraduate or PhD programs, the things that you learn in a computer science program are not the things that you end up using on the job in your career. Further, there are a large number of skills that are very important for software engineers that are still not yet taught in colleges.

HTML, CSS, and JavaScript are rarely taught in college. NoSQL databases are never taught. Web application architecture is never taught. In my career, I’ve used very little of what I learned in my college computer science program. The skills for which I have been hired are things that I taught myself over the years. A lot of front-end engineers are in the exact same boat. Because the skills that we possess aren’t taught in school, we have to teach ourselves. That doesn’t make us any less software engineers than anyone else. It just makes us different.


Software engineers are those people who are paid to write code. The two main functions of the software engineer are maintenance and development, and both of those can take place within components or systems. The nature of those components and systems is what defines the type of software engineer one is. It doesn’t matter what sort of tools are programming languages you use, as long as you are fulfilling these roles and writing code, you are a software engineer.


  1. Joe

    I have two issues with your definition of Software Engineer.
    1. You don't need to pull in a paycheck to be a Software Engineer (although if you are doing the work of a Software Engineer, you definitely deserve compensation for your time and effort).
    2. To be a Software Engineer, you need to be involved in more than just writing code. At the very least you need to be involved in the design and architecture of the code you are writing, as well as preliminary testing.

    Also... if anybody is looking for a college to go to for Software Engineering, are interested in web development, and there isn't an entire class dedicated to Web Applications that includes teaching architecture, start looking for other colleges. RIT is one great option to look at (or at least was... not sure how badly the switch from Quarters to Semesters is going to impact the SE and CS courses).

  2. Nicholas C. Zakas

    @Joe - I'm afraid I need to disagree with both of your issues. First, this post is about careers, and careers mean being paid for what you do. If you're not being paid for what you do, then you're a hobbyist and that's a completely different thing. Second, there is nothing about being a software engineer that requires you to be involved in the design and architecture at all. In fact, I would say that the majority of software engineers are not necessarily involved in those at all. There's an entire industry that cropped up around that called outsourcing. You hand over all of the design architecture, and an army of software engineers goes to work implementing.

    And it certainly would be nice if every kid who wanted to get involved in front-end engineering could simply switch colleges. Unfortunately, geographic and financial restrictions usually get in the way of that. I'm glad to know that RIT is moving into today's world, but the majority of colleges out there are still very far behind.

  3. Dusty

    This isn't about Web Developer vs Software Engineer, but rather "Developer vs Engineer"...

    If you spend your time developing software, you're a Software Developer.

    If you spend your time engineering software, you're a Software Engineer.

    If you don't understand the difference, then it's obvious that you have no idea what a Software Engineer actually does.

  4. Nicholas C. Zakas

    @Dusty - You're making a pedantic distinction there. There is no difference between developer and engineer; they are effectively synonyms in our industry. From Merriam Webster, the definition of develop:

    to create or produce especially by deliberate effort over time <develop new ways of doing business> <develop software> (source)

    And now for engineer (verb):

    1: to lay out, construct, or manage as an engineer <engineer a bridge>
    2 : to contrive or plan out usually with more or less subtle skill and craft <engineer a business deal> (source)

    The definitions are so close that there is no way you can say one thing is to develop and the other is to engineer. You're trying to make a distinction, most likely, between people who do one type of software engineering and people who do another type.

  5. kid

    I think that with you (Zakas) coming from Yahoo, which is primarily a web company, they are able to use the noun/verb/term 'engineer' much easier. I have discussed this with several folks that I work with and just about all of them disagree with you. An engineer is someone who went to engineering school, there is a major cost associated with that and it is a VERY hard program to get through. No they will not teach you everything you will need at a job in computer programming (source control for example) but you will need to go through LOTS of math/physics, which in turn leads to a different type of computer programmer than me who specializes in front-end development. The computer engineers here call me a designer, or an artist, but I also have a degree in Multi-Media with emphasis in computer graphics not engineering.

    Most importantly, I think, is the fact that I work for the US Army in a Chem-Bio Defense program surrounded by lots of folks with various engineering degrees and licenses. These folks here are not going to let me get away with calling myself an engineer like Yahoo does. To the folks I work with, that would be like a nurse calling themselves a medical doctor, the nurse simply does not have the educational requirements, the experience, or the license to be considered an MD and furthermore, it would be very upsetting to the MDs if a nurse did call themselves a doctor to clients and customers.

    For example, this is from Wikipedia...


    In many countries, engineering tasks such as the design of bridges, electric power plants, industrial equipment, machine design and chemical plants, must be approved by a licensed professional engineer. Most commonly titled Professional Engineer is a license to practice and is indicated with the use of post-nominal letters; PE or P.Eng. These are common in North America, European Engineer (Eur Ing) in Europe...

    In the United States, licensure is generally attainable through combination of education, pre-examination (Fundamentals of Engineering exam), examination (Professional Engineering Exam),[18] and engineering experience (typically in the area of 5+ years). Each state tests and licenses Professional Engineers.

    Surely you can see how folks who have went through all of that would not appreciate me calling myself an engineer. However, if I were working at Yahoo or a web company, there might not be anyone who went through that sort of program, so there is no one to object to calling everyone engineers.

    Even at Yahoo though, I suspect there are some folks who went to engineering school. If so and you know them, what do they think about Yahoo using the term so widely? Does it bother them? Do they agree with your position?

  6. kid


    Prior to the mid-1960s, software practitioners called themselves computer programmers or software developers, regardless of their actual jobs. Many people prefer to call themselves software developer and programmer, because most widely agree what these terms mean, while software engineer is still being debated. A prominent computing scientist, E. W. Dijkstra, wrote in a paper that the coining of the term software engineer was not useful since it was an inappropriate analogy, "The existence of the mere term has been the base of a number of extremely shallow—and false—analogies, which just confuse the issue...Computers are such exceptional gadgets that there is good reason to assume that most analogies with other disciplines are too shallow to be of any positive value, are even so shallow that they are only confusing."[

  7. kid

    I think my analogy of MD vs. nurses falls into Dijkstra's concept of an extremely shallow and inappropriate analogy.

  8. Bill

    I develop software professionally, which means I get paid to create useful stuff for people that are attempting to address a problem. I do engineer solutions, design components and develop software. While I can get behind the VERB definition of what it is to engineer something ie using ones knowledge and skills to create a solution, there is a HUGE distinction between engineering(verb) a solution and being an Engineer(noun). Even the person providing the definition missed the point. As an example, I know basic first aid, I can do emergency sutures, cpr and of course clean minor wounds and apply bandages, so while I can be said to be doctoring someone that is hurt, I can in no sane framework EVER say I am a doctor.

    While it can be argued, through self learning, experience and the benefit of many studies that I currently know far more than I would just graduating from a computer science curriculae, and I am capable of engineering solutions to problems that I am faced with in the software world, I can in no way ever claim the title of Engineer.

    While calling us Software Engineers, does lend a certain amount of prestige to our craft, and certainly is probably more descriptive of the challenges we face in crafting solutions to our customers needs, the simple fact is the title is misleading in that there is no Engineering school for software developers. Please note how that was phrased, when one goes to an Engineering school one goes to an Engineering school OF something, or sometime FOR something (Architect, Electrical, Mechanical, Nuclear etc..).

    Engineer is a credentialed title, from an accredited school of Engineering (Noun, NOT verb). So, while the definitions of the verbs, engineering and developing are very similar in concept and end result, the titles are NOT. At best the term is descriptive of effort, and possibly expertise... a euphemism, a nicety, but no, none of us are Engineers, merely developers that engineer solutions...

  9. Warren Gaebel

    Hi, Nicholas.

    I learn so much from you, Stoyan, Douglas, and Steve. Your articles are essential for ALL web developers and engineers. However, I think you might be off base in this article.

    In many jurisdictions, the title "engineer" is legislated to have a specific meaning. It is reserved only for those who are licensed by the professional body appointed by the government. For example, here in Ontario (Canada), the Ontario Society of Professional Engineers decides who is allowed to be called an "engineer." I'm sure your jurisdiction will have a similar body.

    Engineering associations usually require a particular education, which includes engineering principles. Sadly, the typical developer does not have that background.

    P.S. - I enjoyed your previous two articles. I think they are destined to become classics.

  10. Nicholas C. Zakas

    @Kid - Seems like you should write your own blog post about this. :-) Just to respond to a few of your comments:

    The very first engineers didn't go to school for engineering because they were the first ones. They were the ones who set up the engineering schools so that everyone else can get their degrees and certifications. We are still at the beginning of software engineering, which is why it is very underrepresented in colleges, especially as it relates to web technologies. Saying that you have to earn the title of software engineer by spending a bunch of money to go through some program is silly. There are numerous certifications available for various software practices, but none of them guarantee that you are able to do a good job when you're through. In fact, the best software engineers I know G not have any such certifications, and many have degrees in other areas.

    I also don't really care what other types of engineers think. I don't know their jobs anymore than I know my jobs. If they get upset about someone being called a software engineer then they probably have too much time on their hands to think about such small details.

    I cannot and will not speak for any of my former colleagues. I will say that nobody rolled their eyes when anybody who was introduced as a software engineer. Yes there are people who went to school for computer science (myself being one of them), and I never experienced any one looking down on someone else for not having done so.

    I also think the analogy of doctors versus nurses is ridiculous. Each group goes through a very different training regimen tailored specifically for what they will experience on the job. The difference between doctors and nurses might as well be the difference between tailors and dentists.

  11. Nicholas C. Zakas

    @Bill - I don't know what definition of engineer you're talking about. I haven't seen anything that says engineer is a credentialed title or has to come from some sort of school. Saying that you engineer solutions but you aren't an engineer seems downright silly to me.

  12. Nicholas C. Zakas

    @Warren - You only cite one example in Canada, if you're going to claim that this is true in many jurisdictions, I would expect there to be more examples. It is also not so cut and dried in Canada as you make it sound: http://www.cips.ca/softeng

    If anyone who works professionally writing code feels uncomfortable calling themselves a software engineer, then by all means, don't do it. But as far as I'm concerned, all such people are software engineers whether they call themselves that are not.

    Professional organizations such as the engineering organizations you mentioned work more in a basis of exclusion than anything else. They seek to keep people out of the industry rather than to welcome people in by placing roadblocks in the way. While I think such organizations are useful for professions where failure to adhere to strict guidelines can result in injury or death, I think it's not at all necessary for what we do.

  13. HuntBao

    Hi, Nicholas, I've translated your excellent article:http://www.nczonline.net/bl..., into Chinese. Thanks for that great insight about engineers.

    Chinese Translation: http://www.cnblogs.com/hunt...

  14. Ahmed

    Software development is not like building a bridge – where the materials, laws of physics and chemistry, labor times etc have all been experienced and practiced thousands of times, can be accurately predicted and correctly planned for, then managed.

    “Software development is and always will be somewhat experimental. The actual software construction isn’t necessarily experimental, but its conception is. And this is where our focus ought to be. It’s where our focus always ought to have been.”

    If we are writing software, it’s because we’re trying to do something that hasn’t been done before or is different in some way from what already exists, otherwise we’ll purchase the existing software. We are building a solution to a problem – to create value of some kind.

    If we’re doing something that hasn’t been done before – either with new technologies, new rules, new performance criteria or whatever it is that makes it unique – then we are doing “research and development” – experimentation. It is not as if a blueprint for a house is given and the construction team comes in to build it as they’ve done 1000 other houses in the same community. Software “architecture” doesn’t work that way. There is never a replicate – because it’s not physical.

  15. Nicholas C. Zakas

    @Ahmed - When using a quote, you need to cite it otherwise it doesn't have any value to the conversation. :-) And it's fundamentally untrue that all software development is doing something completely new. There are very few people are actually doing completely new things. The majority of software engineers are doing very similar things over and over again. That's part of what makes it a mundane job at times.

  16. Steve

    Well, Nicholas, I for one agree and understand what you have written. :)

    Nice work as always!

  17. Mohsen

    In my language "engineering" means working with geometry problems. Reason behind it is "engineer" in past was referring to architects that had to do lots of math and geometry calculation to build something like this.
    But now we call mechanical specialist engineers, because they do the math calculation and use engineering process to find a solution. I think software engineers are people who do the math and use an engineering process. Just being able to write code that works is not enough. An engineer should know concept of engineering.

  18. steve

    You have a typo (replace our with are):


    Software engineers are those people who are paid to write code. The two main functions of the software engineer our maintenance and development, and both of those can take place within components or systems.

    You can delete this comment I just wanted to give you a heads up!

  19. Aaditya Kumar

    I like to present my thoughts on "Software Engineer" & "Web Developer".

    I am from India, where 30% Engineers are Software Engineers, tough only 10% out of them are Computer Science Major & hence comfortable writing code (i hope so!).

    When you say, you are a Software Engineer, its your designation in an organizational hierarchy.
    But when you say, you are a Web Developer, its your "Role Description" or "Job Description". Its more about what you actually does as an Engineer.

    Now lets not get into the conversation about difference between "Developer" & "Engineer". Its pretty clear from the definition, Development is one of the part of Engineering.

    Finally, the way i see it is like, both the terms "Software Engineer" & "Web Developer" should not be compared to each other. As, a Web Developer can be a Software Engineer, Senior Software Engineer, anything in the organizational hierarchy.

    I would also like to say a designation of "Web Developer" is definitely wrong. It should be "Software Engineer" or even better "Front End Engineer" / "Senior Front End Engineer". The latter one expresses both the job description and organizational hierarchy.

    @Everybody Any thought?

  20. Nicholas C. Zakas

    @Aaditya - I'm not sure the point you're trying to make. Software engineer is a job description. Your role in an organizational hierarchy relates to a level such as senior or principal.

Understanding JavaScript Promises E-book Cover

Demystify JavaScript promises with the e-book that explains not just concepts, but also real-world uses of promises.

Download the Free E-book!

The community edition of Understanding JavaScript Promises is a free download that arrives in minutes.