Things I Learned to Become a Senior Software Engineer
neilkakkar.com
neilkakkar.com
I'd guess at the poster not quite realising this themselves. It certainly used to be the case that the many fresh new graduates we recruited annually took quite some time to learn how much they didn't know.
On the other hand, that was the dotcom era. The number of people writing software simply exploded, as did the available technologies. The entire traditional way of doing things was simply obsoleted, multiple times over. A 21 year old Finnish student had released an operating system that contravened the textbooks and went on to change the world. A 21 year old dropout invented the entire genre of 3D video games. The largest software company in the world was run by a Harvard dropout. It was really impossible to overstate the extent to which credentials were meaningless and results were everything in the dotcom era. And that still affects the culture today.
> between 6-8 years to become a senior engineer
If you follow that timeline, there would be plenty of people who were millionaires and on their second or third startup board before reaching "senior".
Now, not everybody is a Gates or a Carmack or a Torvalds, although the industry has not quite adapted to this fact and still tries to hire as if they were. But we have to recognise that the timescales are simply very different from mechanical engineering, and that the industry is still very much being disrupted from below.
Oh, and none of those prodigies are millenials.
What does being a successful entrepreneur have to do with being a senior engineer?
Have worked as both PM and developer and now run my own very small software company
A) two years senior engineer is like one of those consulting companies where everyone in 2 years becomes DIRECTOR
B) In two years most new programmers have not even gotten their heads out of their asses
C) You should refer to Outliers
10,000 hours to master a task
And to that add
10,000 hours to make your first masterpiece
D) Even if you have managed to get 10,000+ hours of coding experience in high school and college and somehow become a very good programmer (which less than 3% of CS grads do)
it will still take you 6 to 10 years to get another 10,000 hours of working on masterpieces and making really good software that you can ship and make money from
E) a title like 'Senior Software Engineer' should be reserved for someone who has MADE and SHIPPED and GENERATED MONEY from a very good piece of software or some software product
F) Personally, I would think any company handing out Senior Software Engineer titles after 2 years is a joke
Between all the places my friends and college mates and I have worked (Microsoft, Google, Amazon, Facebook, Oracle, etc. etc) I can't think of any place that handed out Senior Software Engineer like it was candy
Even very, very good programmers had to EARN IT
Not all software is made to make money.
There is a more convincing argument that saving time is a motivator in a significant proportion of software either directly or indirectly; but honestly that ugly assumption of monetary motivation in everything of value is quite alienating to some of us - even in something as benign (?) as a discussion here.
Your description of a senior engineer is not a job one person should be doing. If you’re trying to get a senior engineer to figure out how to make something, support it, deploy it, and monetize it, you’re going to get half assed work on every front.
Beyond all that, the ranking of senior should be more company scale specific. A senior engineer at FAANG needs to be able to scale infinity and build things that never break. A senior engineer at a 30 person company needs to build quickly and AB test features rapidly. Ultimately, “software engineer” is far too broad. It doesn’t really embed much knowledge beyond “knows how to code”.
Easy - until some other metric comes along to reliably replace it
It's a useful rule-of-thumb
It's not an absolute, and, had you bothered to read Outliers, you'd know that
But it's more fun to sit back and armchair quarterback others via anecdote, right?
Someone with 2 years experience in web development has been working in the industry for 10% of the entire time the industry has existed. If they've got a 3 year degree and a few years building things before that as a kid, they might have been making web stuff for 50% of the time anyone in the industry has been working in it.
"Time served" as a measure of experience doesn't really work in an industry that's as new as the web, nor does it work in an industry where the barrier to making a website is knowing how to open Notepad.exe.
Really good people could definitely make senior level by the time they've been working professionally for 2 years.
However, there are aspects of a senior engineer role that are not commonly learned in school or by hacking on hobby projects. How do you effectively lead a project? How do you balance requirements? How do you say no to stakeholders? How do you balance time vs quality?
All engineers need to be good at the technical side of the job. But as you rise in seniority, the job includes more and more judgement calls. Those judgement calls require years of experience.
Moving someone up to a senior role is giving them the opportunity to take on more responsibility and develop their skills. Very few people are promoted to a senior role already knowing how to manage a team well or how to balance requirements. The expectation is that they've shown an aptitude and potential in a mid-level role, and that they'll learn those skills after they're promoted in to the new role.
Promoting someone to senior isn't a reward for already doing everything a senior does. If you treat people that way, and give mid-level people the responsibilities of senior roles without the pay or title, then they will leave very quickly to get jobs where they do the work of a senior with the pay and title of a senior.
There’s more to it than that. If you’ve had a chance to work under someone who knows how to do the job (or someone who doesn’t, but you can see other groups that work well) then you have some idea how to do the job.
It’s similar to programming, or any other job: you write good code and bad, and learn which causes more problems; you read good code and bad and learn from it which of your own practices are good and which are not.
You don’t understand what was in your textbook until you see it in the real world. All that takes time.
A "senior" doesn't have to be able to lead a team (though they should probably learn)
If they're going the team-lead path, that's great
But it's not (and never should be) a "requirement" to be "senior"
A 10x junior engineer should be paid a lot - more than most senior engineers if everything is fair. But the rockstar junior engineer would still benefit from mentorship and someone to help them avoid some of the mistakes that we have all made.
If you look at Google, there are terminal levels that employees can reach and stay. That doesn't mean that there is a mass exodus of talent because employees want an inflated level somewhere else. They are well compensated for their work - they just don't get a new level every couple years.
In any case, it is absolutely possible to have significant domain expertise in software engineering two years out of school. When you're seeing results of the things you build within minutes, you can pick up experience quickly. I agree that you still have a lot to learn, and I did, but I was meaningfully capable of providing technical leadership two years out of school.
Is there an online test or something where you can "gauge" what tier you'd end up in a bigger company that has tiers like that? I'm not convinced I'd end up anywhere at the top because I lack things like knowledge about compilers or algorithms, things I just don't need to know in my day job.
[EDIT] Here's a slightly more detailed example from Thumbtack: https://docs.google.com/spreadsheets/d/15ACBs-crUHnqf1wANUQw... They can get much more complex than this though at the really big tech companies.
Being a senior engineer at Facebook where your responsible for making sure Cat memes load more quickly, and a senior engineer for an industrial control systems company making weapons guidance systems are totally different levels of responsibility. But, job titles are often transferable and should be better regulated across the industry.
this strikes me as an unnecessarily rude dismissal of the difficulty of engineering at scale
this might sound crazy, but some people are actually just good at their jobs and will, naturally, progress quicker than others.
If FB goes down, people waste less time online[0], if a guidance system fails people may die.
[0] yes, of course there are people whose livelihood depends on cat memes, but I'm making a generic example.
Goes down yes, but what about a data breach? What if, for example, the location of a woman is mistakenly exposed to a abusive partner?
In my view the distinction between a senior software engineer and not is the ability to see how both human and software systems interact and find failure modes that others may miss.
by definition it's not true, and any sequence of thoughts that lead you to that conclusion are wrong, period.
Hey now, don’t underestimate the technical challenges inherent in weaponizing misinformation at scale.
There is so much that you can't learn from books. Reading Mythical Man Month does not make you Fred Brooks, reading Shoe Dog does not make you Phil Knight, nor does reading a medium article on event driven systems make you ready to implement one.
Imagine that the college of surgery acted in the same way, a surgical trainee who has worked for a few years and reads a lot may feel comfortable taking the lead in a surgery, but will be out of their depth the moment things deviate from normal. I spoke to a surgeon about this once, and he described how he taught a particular procedure. At one point he has his student reach in to the body, with the explaination that 'it should feel like this'. No book can substitute that experience.
> I think for someone who dedicates the time towards mastery, 2 years will take him/her very far.
You might get very good at a particular niche in 2 years. You will not have learned the lessons you learn when you go back to a five year old project yet and make changes. You will not have the breadth of experience from having worked intimately with dozens of teams in different languages, cultural expectations, and business domains.
Honestly, the more I learn, the more I know I don’t know. As an example, last year I had an opportunity to work on robotic control systems. I dusted off my calculus and linear algebra skills from way back, implemented calculations that ran in under 1ms, and has a ton of fun doing it. Could I have explained a Jacobian before starting that project? Not likely! Do I use it in other stuff now too? Definitely.
Sure
> After a University degree, you only really know what page in your textbook to turn to when you recognise a problem.
No.
My first job during college was to create an iOS app for a researcher (an extensive multimedia questionnaire). What I did: take Hegarthy's course, and understand it. After that, I simply could create the app by thinking logically. I didn't refer back to the course while I created the app.
My first job out of college was upgrading some Java CRUD app. I had the fortune of teaching at a coding bootcamp (as I self-taught NodeJS and then taught it). That NodeJS experience, including with having familiarity with the Java syntax was enough to edit files for a Spring Boot application. Simply by reading the code, I understood what happened and how they wanted me to design things.
No textbook required.
> don’t harm someone with your shitty design.
It's possible that might've happened.
On a side note, I don’t agree with bootcamps as they don’t teach the core principles of computer engineering and software design. Coding is just a skill, and you need some fundamental knowledge behind it in order to execute it safely and robustly.
> On a side note, I don’t agree with bootcamps as they don’t teach the core principles of computer engineering and software design.
I did both. I studied CS and happened to work as a teacher at a coding bootcamp while studying CS.
> Coding is just a skill, and you need some fundamental knowledge behind it in order to execute it safely and robustly.
Emphasis mine.
I disagree with this. I've seen many experienced software engineers knowing nothing about how to hack (important for safe code execution), I've had a couple of courses in it and did some hackthebox.eu after that. So I know as much about hacking as I know about software engineering, I'm a junior in both cases. Nevertheless, I am the one that finds major security vulnerabilities in the code of the company I work for.
A lot of security issues isn't fundamental as the "fundamentals" are things like: "look for configuration errors" or "look for hardware bugs that hardware vendors haven't looked deeply enough yet" or "look for a place where humans are careless" (e.g. the suidbash vulnerability is an example of the last one). That's a lot fuzzier and vague than CS fundamentals.
People I consider senior software engineers have a can-do-anything vibe about them. They have a wide range of skills in the field, and have that T-shaped experience profile: there's some area they seem to know everything about, and then they somehow are able to say something sensible about a whole lot of other areas. For instance I worked with a guy who wrote financial exchanges but could also write a modern front-end, understood how kubernetes worked, and knew a fair bit about databases. You couldn't throw out a term that he couldn't place (X is a language / framework / pattern / OSS project), and you couldn't come up with a problem that he didn't know the closest well-known adjacency for.
That's a vague outline of what I think a senior dev is.
To get there is a long story. I think you need the good fortune of not being siloed in something very specific or superficial. That might even include having the "good fortune" of being forced to change jobs a few times. You also need some luck in your personal life to be able to explore a bunch of stuff in your own time, plus some funds (probably less relevant today where everything is an online service).
I'd call this "not junior". To me, "senior" would be the person leading a small multi-person effort or doing the hand-holding of junior engineers.
and if you can find: POSITION CLASSIFICATION STANDARD FOR ELECTRICAL ENGINEERING SERIES, GS-0850 ELECTRONICS ENGINEERING SERIES, GS-0855 TS-3 February 1971 It has good information on what level engineers are working.
I think you have the correct frame of reference, senior level positions are those who are used to handling projects/questions without guidance from others (although most senior folks are willing to ask questions to learn)
I feel I can do anything as well, because if I can't then I will simply find a way to learn it, because to me it's not a question of whether I'm capable of learning it but how fast I'm capable of learning it. So I'd be careful with that vibe as a heuristic ;-)
i.e. how far along are you in the progression of... - being given clearly defined tasks - self-guided work on feature level - self-guided work on project level - self-guided work on team level - self-guided work across teams etc.
This is my definition. Can I assign the PROBLEM, "important customer ABC has some kind of weird bug, talk to Nav in Tech Support" and know that problem is now off my plate. They'll usually solve it or come back with a hot fix recommendation. Worse case, they come back with a "we can't figure it out, we need more eyes on this".
The important part is this: the problem is now something I don't need to worry about.
If I need to follow up, they're not a senior developer. They're a junior with skills.
Meanwhile, you can also absolutely spend five years not working on anything that needs to scale (by being at a company/team that can't execute, by building prototypes instead of products, etc.) and not have a sense of how to do better.
That just means you weren't valuing the right things.
At the end of the day, that's what it's about. It's not about "technique A should have been used instead of technique B", it's more about what you value. It matters because those values will inform both your decisions and your actions.
For example, someone who values performance will not write slow code. Someone who values productivity will write slow code. Someone who values stability may or may not write slow code and may or may not be productive, but their systems won't arbitrarily go down.
* Resistant to future change
* Won’t scale past x units
* Prone to operational issues
* Exposes us to liability or compliance risk
* Increases ongoing maintenance costs
Any large initiative to replace "crap" should map to specific product quality attributes that stakeholders and leadership buy in to, and ultimately be justifiable back to COGS or churn mitigation. In this way, objectively, a system can be $10M better because it e.g. closes $10M in customer tickets.
My guess is that they overcorrect on the previous system designers mistakes, because they too have only had that one experience and this is their first time building a new one.
And the cycle repeats in another 5 years when a new group of fresh grads have to take over/rebuild the current new system.
I hate being ageist in any direction, but experience actually do take time, and only older people have been younger, never the reverse. The hard part is recognizing what is unique to a generation and what is commonality.
Or you can tell me I was wrong in 10 years.
But what "senior engineer" means varies from company to company. So it becomes a loose term.
In pretty much all companies those were just called "software engineers". Seniority requires decision making and longterm leadership skills, not just implementation work.
What I want out of a senior engineer is dedication to a coherent whole.
Building mental models is great, but you need to have used a few times in different context, to really appreciate when and how they were the most appropriate.
The experience of handling multi-years projects (and getting back to them after a few years too) has no equivalent.
You can read as much as you like, nothing beats experience, which you will get after years and years in the job.
True, the employee can now leverage the job title for more compensation, with their current and potential employers, but the onus is on the employee to negotiate, and in the meantime the employer gets the benefits. (Note that “benefits” does not mean that the employee suddenly becomes better than they are, it means that a known-quantity employee continues to do satisfactory work for the company for a time, at an acceptable price.)
Author may not realize how much more there is to learn than he already knows, but we all kind of have that problem, just at different scales, am I right? He's doing all the right things, learning the right lessons, and is on track to be senior whether he has that title at work or not.
One meta-goal of the post was to figure out how I can grow further. Are there things on top of your mind which I should be exploring next?
Rereading my post it may have came off as a bit of a backhanded compliment and wasn't intended as such. Terrific post. I think it will help a lot of people.
Now, it is easy to start giving "tips", but I think nothing replace good old learning on your own mistakes. Thus, the only tip I can give is to be reflective and honest with yourself to be able to learn and grow.
There are "seniors" who make $60,000 per year. No joke. And there are seniors who make $140,000 per year (in a rather low cost area.)
The PHBs have figured out that we are vain and can be lured by shiny titles. We shouldn't go out of our way to make it easier on them.
Software engineer is a working class profession. Lusting after title plumage hurts us.
"There was only so much I could do to improve my coding skills. Most blogs epousing techniques to write cleaner code, repeating yourself, not repeating yourself, etc. are micro-optimisations. Almost none of them would make me instantly impactful."
I do expect a Senior Software Engineer to be good in programming. Because mastering programming is, what you do due working with it every day. The basics should just be.
Doesn't matter how impactful those are. Your role is to sure look left and right, but the road you are on is becoming an expert in what you are doing.
And generally speaking about the Senior title: I think from reading it, he does look in the right directions and it could be that he is already there but for me, Seniority become a thing not after understanding all of that stuff but actually incorporating it in a way that it became second nature and honestly, it took me years and a handful of core experiences along the way. But who am i to determine his seniority through a blog? :)
It was (is?) more about distinguishing fresh grads from other hires, and much less about significant experience or seniority within the tech ("R&D") organisation.
I'm always astounded by what people imagine a 10x developer is, especially some one who calls themselves a senior developer.
Hint, they aren't a lone wolf who writes 10 times as much code as the rest of the team, doesn't deign to sit in scrum planning sessions and creates chaos with every pull request they self approve. Maybe those people CALL themselves a 10x developer ...
A 10x developer IS a force multiplier. Every 10x developer I've worked with wrote easy to use APIs and Frameworks that made every other developer on the team much more productive. A 10x developer is a senior developer on steroids; they do everything this author thinks a senior developer does and more.
If programming were really engineering, you would need 20 years to be Senior. A Senior Engineer keeps the organization from making disastrous mistakes and unnecessarily complicated designs.
Since the title was squatted, actually-senior programmers are being called Principal Engineers. Do not make the mistake of calling yourself a "Principle Engineer".
Senior: Second or third job change.
Staff: That one person who has been at the company forever.
Principal: We're an enormous engineering org and need to have a treadmill so we don't lose our people but can't just give them payrises. Most titles also have multiple levels.
If I give a solid junior a clear spec, wireframes, guidance on tools and mentorship then they should make progress according to the spec. If what I assign to a junior engineer is impossible to implement or useless to the product, that’s on me.
A senior should be able to succeed with much higher level / vaguely specified tasks. Like, here’s the client. Here’s the team. Go figure out for yourself how you can add the most value. A good senior should be able to figure out if there’s resources or skills the team is missing, and solve what needs solving in order to make the project successful. Sometimes this is non-technical - like raising issues with the client, organising to hire another UX person, etc. A senior should be resourceful.
You can frame the same thing in terms of responsibility scope. A junior is responsible for the assigned task (as the task is described). A senior/principal is responsible for the project being successful or the company’s software meeting the needs of the business.
Senior/staff/principal/etc to me mean beyond vague locations on that junior-to-senior+ engineer resourcefulness axis. I don’t think there’s any agreed upon definitions across the industry. (Though google, microsoft, etc all have their own internal working definitions)
In simple terms, Sr. usually is an understanding that you are on your own. Do not expect any one else to tell you how or what to do. Also, the ones without Sr. title may become your responsibililty.
Though debatable, it has nothing to do with your technical skill set or experience.
I've also seen the title of "senior" in one organization being wildly different to a "senior" in another organization within the same company. For example, for some reason, the "API dev team" had insanely high bar whereas the "submodule X team" had seniors left and right, quality-wise nowhere near seniors from the "API dev team".
This all has led me to believe getting promoted is simply about renegotiating your salary with the company, and has very little to do with your actual skill. It has more to do with who's your direct manager, and what is your relationship with him/her.
Personal and anecdotal experience only of course.
In details, I see it this way:
No-prefix: focuses on the here and now with little responsibilities about long term strategy/cooperation with other teams.
Senior: he/she can be/is a TL. Sets the direction for the team and thinks about medium/long term strategy/shape of the code base. Also, they tend to be the liaison between the team they are under and other teams, but in a tactical/ad-hoc way.
Staff: Like senior, but more on the strategic side of things (i.e. longer term planning).
Principal: Usually the TLM/uber TL for a working group (few teams). Can also be a director for a working group.
As pointed out by other replies, It is subjective and also company-dependent. In startups these levels tend to be compressed, in FAANG companies there's a distinct increase of responsibilities with each title.
I think it's up to the company whether you're Senior, Ninja, Shaman or Necromant Developer
One good source I found is gov.uk site: https://www.gov.uk/guidance/software-developer
But, surprised that all the discussions are about this, instead of the content.
"habits of mind", "tools of thought", "force multiplier", "superpowers" "embrace fear" etc. reads straight out from a Tim Ferris-like self-help book targetting millennials than anything a senior engineer would write.
I read your last year's post - that one was much more useful and insightful. So +1 (upvote) to more of those.
Appreciate the writing. I wonder if everyone is senior at Bloomberg then how does the pay raise work?
Not only have I seen my own natural tendency to overvalue new technologies irrationally, I've seen it in most of my colleagues as well. Stepping back and carefully weighing the pros and cons of new technologies is an excellent way of preventing neophilia from moving a project in the wrong direction.
But now you are working on 1 project namesake and hearing about all projects, resolving issues getting into sudden meetings and knowing requirement was understood differently and thinking about what sort of risk should be raised for this project. Then you get to a discussion with a architect on whats a microservice, he tells you a microservice can process bulk data(millions) and can run up to 20-30 mins and discussion ends like oh I was thinking microservice is like a simple unit of work and finishes off in few milliseconds to less than few seconds. Sorry I am a mainframer we caught this as it crossed our thresholds in UAT and you need to raise risk if you want this go live. (Level of risk that has good visibility to management).
Wrote an automation tool 6-7 years back for myself and let others know of it and prepared good documentation and made it part KT and now present time, saying to people not to use my tool as I am going to decommission it as there are other standard tools available to do the same thing and people pinging "please don't decom it, can you rename it and let it run, as it's easier and proven repeatedly it's error free".
Suddemly a dev contact, pings you saying I have a problem with this REXX code. You look at the code and sort of gives you thought, this comment looks like I wrote it. But I never wrote something for this application or person before and asking few more questions, you come to know that my code was used as a model in lot many places as it was easier to generate test data with it. Credit for initial work was never given few years back but looking at how many people are using gives a feeling wow.
Always seeing celebrities talking about their movies on TV. Given me the thought, how come nobody is interviewing programmers and asking what was hard for them to program and state of mind they had when programming a piece of code. What gets them to the flow state.... It would be fun to know.
Ancient? Graybeard? Hallowed?
As a cynical answer: many companies seem to think that more that 6-7 years of engineering experience is at best a waste of money and at worst counterproductive
If you can make senior in 2, irrelevance should be right about 5 years in.
I've seen the following structure at several orgs:
engineer -> senior -> lead -> staff/principal -> distinguished
At google and FB, senior is considered L5/E5 which requires atleast 5 yoe.
but it looks like bloomberg doesn't have a mid level and only have junior/senior.
https://www.levels.fyi/?compare=Bloomberg,Google,Facebook,Mi...
1. Open an index.html, include a javascript file and write an alert or console log.
2. Create your own company.
3. Title yourself as a senior software engineer.
Joke aside, during my career I've met several senior software engineers that are anything but and several "normal devs" that are a lot better than most people who have the senior title, even in the same organisation.
I don't think titles has anything to do with knowledge, rather it does have a lot more to do with whatever position you're given and that position could be given to you for a number of reasons. This is what has lead me to my belief that titles are unnecessary cruft that takes focus away from other more meaningful endeavors.