Software job descriptions and roles are filled with a bunch of noise. They span front-end technologies and frameworks, back-end technologies and frameworks, sometimes they mention types or styles of programming, sometimes they mention certain tooling related to something specific, and they sprinkle in some cloud terminology for fun. Am I qualified? Do I need to know web development to get a job? What is full-stack? It is very confusing.
While I don't think we will see all this confusion go away, I want to provide you with my view of the world based on my experiences. I think seeing through my perspective can help you better categorize potential roles and what they might be about. Additionally, for those that really do not know what is out there, I hope this helps you choose where you may want to start.
What makes this complex is these things change based on industry, level, company size, amongst other things. The smaller a company you join the more responsibilities and roles you might have. If you join a very large corporation you might be more focused on a smaller set of responsibilities. Every piece of software is unique but I think that a lot of them share common characteristics and roles you might find.
At the highest level I break down software development into three buckets:
Roles that you interact with as an engineer, may not start out as (but could), and you could always transition to
- project management and BA's
Mostly programming but involves other things depending on specialization.
- Systems Programming
- Data Engineering
- Data Science
- Proprietary Software
Full-time programming that doesn't fit any of the specializations. Still tons of fun and awesome
Does this cover everything? No, for sure I missed things. The strangest part is honestly it's hard to box in anyone one person/role. Most likely, you could find yourself doing a little of many of these while focusing primarily on one area. That is totally normal for me. Check out this abstract piece of art:
Similar to this but thinking of your role or career as a blank canvas - I doubt your canvas will be solidly one color. Could it? yea. But my opinion is most people do a mix of a lot of things or move around during their career. Your canvas might end up more like this piece of art? There are a million variations and they are all great. No one way is better for your career.
I break all these down below to help inform you. The point isn't to divide us or say X is greater than Y. I am creating this so you can better understand what's out there. Selfishly, I wish I had this when I started. I had no idea about the programming world and no one to explain it to me.
Roles on a team that are not what I think of as junior/starting engineering but you could transition to if they interest you:
- You will not program here
- You often encounter lots of mention of Agile, Scrum, PMP, etc. All software management related.
- I highlight this because the best people in this role understand software and I have seen people successfully transition to these roles if they decide that is their passion.
- If you can straddle the technical/business gap you provide a lot of value. You can explain technical concepts and ideas and sell them to the business. You can also take what the business wants and communicate effectively with the engineering team to get these changes planned and implemented.
- You definitely will program here however not all the time
- You will be focused on testing
- This may sound boring but there are a lot of engineering problems in this layer and interesting things to work on
- You must love quality and details etc.
- Communication and attention to detail are very important in this role.
- You must understand software and its components well.
- I have seen some people recommend this as a way to get in the door and transition to full-time software engineering (My thought here is I don't know and wherever you think you are going to start be direct and ask about a move like this)
- I have seen entry-level/junior jobs as a developer in test so I misspoke
- I have also seen software engineers transition to this and be very successful
- Not much if any programming here
- Most of what they produce is wireframes or mock-ups that demonstrate flows/interactions
- A lot of focus on the user and how they interact with the software.
- There is specific training for these types of individuals and if you only know engineering it might take some work to retrain for this area.
- These roles are vital to ensure what your building is going to work for the clients/consumers.
- As an engineer /power user of most tooling you forget how people interact with your site and what might be confusing
- Sometimes gets grouped with UX
- Similar? skillset but focused more on the look and feel of the site
- Produces static assets for sites/software in the proper format
- Strong background in graphic design
- Strong CSS skills and can publish style guides or work on styling for the site
- Sometimes programming in front-end technologies but usually programming is not their main task.
- Strong programming skills
- Strong computer/software security skills
- Strong knowledge of Linux / DevOps
- This role varies wildly because there are so many things it could mean
- Some roles only do audits, some work specifically administering certain tools, some do penetration testing, others focus solely on say identity and access management.
- this area is extremely large and hard to summarize
- This is another umbrella term that can mean a million things
- Some programming is typically involved in the glue code that customizes existing products
- Strong knowledge of Linux helps
- Containers/ VMs/ and friends
- Kubernetes might pop up
- Knowledge of one or more cloud providers (Azure/Aws/GCP top 3)
- You might work more in system programming rather than web programming
- Ultimately idea is using code/templates to automate infrastructure
- Strong troubleshooting skills needed
- However I always see a need an area for native mobile development
- This is all external observation but I see some people who only do ios/swift and some who only do android however I also see a lot of people that love mobile and go between the two
Entire focus on programming related to systems ugh my definition sucks here is Wikipedia
System programming (or systems programming) is the activity of programming system software. The primary distinguishing characteristic of systems programming when compared to application programming is that application programming aims to produce software which provides services to the user (e.g. word processor), whereas systems programming aims to produce software which provides services to the computer hardware (e.g. disk defragmenter). It requires a greater degree of hardware awareness.
languages (c and its variants, go, rust, I'm sure others)
- This is an umbrella term as well but I see a whole group of programmers that are focused on moving data/ consuming data/ analyzing data that is separate from everything else.
- General DB knowledge is good but typically a lot of different frameworks and tools used based on needs
- Some of this is done and could be in proprietary software like data visualization software (this is an entire career field)
- Some of this could be all in Hadoop / Spark looking to move data around
- Another umbrella term. Tons of hype and buzz wordiness so be careful but there is a lot of opportunities here
- AI/ML live here
- specialized knowledge necessary
- a lot of training options and from what I see even degree programs
- Definitely programming but focused on this world
- This is an umbrella term to represent tooling and software that one could spend a lifetime administering and doing some type of programming
- Mainly Salesforce comes to mind but I know others exist
- Very specialized in that you need inherent knowledge about the software and how it works to use it/customize it/ extend it
- Lots of certifications available here to help you learn
- Lots of math
- very specialized
- some roles overlap in this world like UX/designers/project managers/QA
- Unity, Unreal fit in here.
- I like to define the Front-End as everything from the API layer upwards
- Other technologies exist thought for what it is worth
- The front end technologies and frameworks seem to evolve at a faster pace than the back-end so a lot of constant learning
- Usually I see this role share responsibilities from other areas (design/UX/QA) and it just depends on the role
- I like to define this as everything from the API on down
- Tons of language options, frameworks, it really depends on the place you end up and what their 'stack' is
- Usually I see this role share responsibilities from other areas (DevOps/QA/Front-End) again it all depends
- Produce services / APIs/contracts for consumers
- There is a lot of interesting software that lurks in this area that doesn't provide services to the web but perhaps deals with moving data around or keeping things in synch.
- Interacts with data layers / involved with potentially many persistence/caching technologies
- This term is ambiguous and everyone defines it differently. Its not my favorite term because of this and if you see a use that confuses or if someone asks you if you are full-stack or you see it used in a description my best advice is to ask for clarity.
- I think of it as someone that does work in both the back end and front end
- These could be separate languages/ the same languages/ etc
- You could use a framework that assists in doing it all in one and maybe that to whoever is full-stack
- It's quite hard these days to know everything well - I have no doubts you could for your particular solution but I think that's why there are specializations these days.
- Ultimately, find what you like - if you like doing front end and back end work that's awesome and find roles that let you do both
- Some places will have separate teams for these two and you won't be able to concurrently do both. Some places will let you.
One last thing. You don't need to pick exactly one 'thing'. In fact, I think saying you will only do 'x' without trying at least some other stuff is hazardous very early in your career. Even if you do pick an 'x' remember you learned 'x' and you can learn z,y,q, etc. You are never stuck and can always work on moving around. It might take some work and you might have to ramp up on other things or change employers to find something different but that is ok! All of these areas are fun, 'good', and could be a career. It's most important you are happy with your work.
If you liked this article, check out:
What do you think? Do you still have any confusion? Let me know on Twitter and follow me there for more development, programming, and general software engineering content.