This post is aimed for software developers, young or old, people who just got their first internship or seniors. The important thing is to be technical and have a career as a software developer (I am not entirely sure if I should also include system admins in this category, since their work doesn't directly deal with software, but with servers).
I am writing this post to start a conversation about careers in the tech industry. A lot of companies put some thought into coming up with career paths for their employees because they ask for them. I am getting from time to time this question from candidates during interviews, and I reached the conclusion that candidates often ask this because they want to be told what they can achieve. Where they are going. What ranks are called so that they can feel some kind of progression.
The first part of any tech career looks mostly the same: you start maybe with an internship or with an entry level position, after 2-3 years to get to a middle position. After 3ish more years you gain the senior title (the numbers might differ, depending on a lot of factors: in corporations the promotions come slower, and smaller companies tend to give out bigger and more prestigious role names easier, leading to job title inflation ).
The truth is that software developers don't think enough about the future, where they want to go and what kind of work they want to do in the future. As a developer, you are not going to write code forever. At some point you will have to outgrow that and start doing something else (technical or not) complementary to coding, if not replacing it completely.
Every company needs managers despite the fact that for some reason they are universally hated by developers. Each team needs to be managed, from things like keeping a clear priority list, having overview on the team dynamics and progression to implementing different processes to smoothen the work and reduce friction.
All these things are important, and only the people with prior technical experience can do this job to an acceptable level. Non-technical people can't manage technical people well. Probably an unpopular opinion, but that's what I think.
As a technical person, you know the hurdles of software development. You know that writing code is not easy. Even if a bug is trivial to fix, finding it takes a lot of time and sweat.
Non-technical people tend to under-estimate the complexity and the needs of the software development team. Why do they need extra servers? Can't they just run it on their machine? Why do they spend time writing code that doesn't directly translate in user facing features ?
A usual career path is getting promoted from a purely technical role such as senior developer to a combination of technical and management roles: lead developer, team lead, tech lead, etc. For a time, you will have to be the bridge between the management which is even higher up and you start to deal with non-technical people, while also keeping a foot in coding. But the responsibilities also change: you won't write code all the time, you will spend most of your time making sure everybody else does their job right. This means doing a lot of code reviews, helping people who get stuck, giving advice and training your colleagues.
The more experience you get, the less code you see and the more non-technical you get. This is a huge turn off for many. I have heard of cases of developers who got into management, only to step down a few months in because they realized they wanted to code more. They couldn't give up coding entirely, either because they figured out that managing is not for them or they wanted to pursue a more technical role.
Another viable career path is getting even more technical, but stepping from low-level code, data structures, classes and whatnot, to more high level system architecture: designing how systems work, thinking about the tech stack from both technical and organizational point of views and deciding the direction of projects.
Coding is the easiest part of building a software project. One of the harder parts is coming up with an architecture for the project, so that you don't limit yourself in the long term. Different projects have different requirements (cost control, scalability, security, etc) and based on those, the shape of the project will change drastically.
To do the best choices, you would need to have in-depth knowledge of all the areas of software development, know what technologies are out there and what their advantages and disadvantages are, and also have a business oriented mindset so that you keep the project on track of providing value. Things like costs (infrastructure and the cost of development), security, scalability lie in the back of your head 24/7, because bad choices will grind the project to a halt and will make the difference between a successful project and a total failure.
Working for a company isn't always the only choice. With a strong technical background and with the experience to prove it, you can always go the entrepreneurship route.
Building your own thing from scratch, using your skills gained over the years, is very rewarding (although riskier) and will put you in both positions from above.
This path comes in many shapes:
These three options kind of cover all the possible outcomes for a software engineer (except when they decide to leave the software development work entirely and pursue an entirely different career). Broad as they are, you should spend some time to think about what you want in the future from your career (if you did not do that until now). Working aimlessly will lead to frustrations down the road or will push you on a path where you will only chase meaningless things (eg. money and benefits) and end up dreading going to work.
That should not be your goal. Your goal should be to identify what is your passion and find a way to steer your career in that direction. Without a direction, you will let other steer your career for you and you might not like where you end up.