Ask HN: When are you considered a “senior” programmer?

218 points by lollipop25 ↗ HN
I have been doing web development for as long as I remember. I get by with tools that are needed for the job. I don't fancy the new and shiny. I just get things done fast and done properly.

But I feel like I'm always a step behind the rest. There's this guy in the team knows how to operate Amazon, or this guy who that knows how to use Spring, or this guy that knows how to scaffold a Java app in minutes. Sure, I can write in the Java language but I don't know Spring by heart. I can build and run containers, but I don't know how to launch them in the cloud.

When is one considered to be a "senior" developer? Is there a means to measure where I am? How do I get there?

161 comments

[ 3.2 ms ] story [ 235 ms ] thread
It's a pretty arbitrary term, but based on what you've said, especially "I don't fancy the new and shiny. I just get things done fast and done properly", would be enough for me to label you a senior programmer.

Our industry is way too obsessed with fashion... sooner or later you realise that most of the "new" stuff is largely existing ideas re-hashed in a slightly different form. Senior programmers realise this and can pattern match to understand the role of various new technologies, and learn the details if and when necessary.

How do you get there? You already are, you just don't realise it yet.

> but based on what you've said, especially "I don't fancy the new and shiny. I just get things done fast and done properly", would be enough for me to label you a senior programmer.

I think that's wild speculation. That phrase could mean a number of things.

It could mean they engage in the industry, explore new technologies and make educated decisions which balance the risks associated with adopting new technologies and, in some cases, choose to use technologies that are fit for purpose but are not necessarily bleeding edge.

On the other hand it could mean they have failed to keep up with technological advancements and are using the wrong tools for the job, tools that can't deliver a modern web experience. He might be churning out shocking legacy code that someone else will have to clean up one day. Perhaps his employers are none the wiser and don't realize a different developer could deliver a better quality product in a much shorter time using the tools available today.

Given OP's examples of not knowing "Amazon" or Java Spring, both of which are ancient technology in web years, I would speculate the OP might fall into the latter category. Another strong indicator of this: OP has been doing web development "as long as [they] can remember". You'd think his coworkers or employers would have told him he was a senior developer if he hadn't figured it out himself.

Overall, insufficient information in the OP to make an assessment, but I would be very wary of pandering to someone's ego as it can do more harm than good.

"done properly" means not taking the shortest, technical-debt-laden path to success (amongst other things). It's a hallmark of a senior, in my opinion.

Also, why would you know Amazon operations stuff if your job duties don't expose it to you? The OP was saying 'operate Amazon', not 'use Amazon APIs'.

Both AWS and Spring have changed and grown a lot over the years. Spring Boot is pretty much a reinvention of the Spring developer experience and Spring 5 will be pushing reactive programming into the limelight.

Disclosure: I work for Pivotal. So do many members of the core Spring team.

"done properly" is very ambiguous and relative.

To the junior engineer, "done properly" might have a different meaning. A senior engineer should be able to explain in detail what "properly" means.

In my experience, it depends on what the criticality of the issue actually is, and whether it's an improvement or whether it corrects a defect. I'm reminded constantly that our job isn't to drink coffee and crap code, but that our work is done within the context of a larger organization. We may not like some of the compromises we make for our coworkers but we need them to do their jobs as much as they need us. To do something properly, it behooves us to consider their professional needs as much as our own.
It's mostly just a title on a business card and/or org chart.

Some times it's given to people instead of money.

Don't worry about the title. Worry about getting good at what you do, and an asset to your team and organization.

I would consider you a “senior” programmer? Mainly because you know that you do not know much. While a junior or intermediate programmer think they know everything. There are of course more to it, like when you are stuck on something; you ask the senior programmer, that will probably have solved it ten times in the past. Or if you want to know what the best method is to do this, you ask the senior programmer, that have done it hundreds of times and thus found out the optimal way, with all edge cases included. So I would say it's mostly about experience, and then expertise. Also, a senior programmer should have gone though at least two paradigm shifts.
I'm interested in this 'two-paradigm shifts' rubric. Could you elaborate?
Programming languages and best practices evolve. For example object oriented programming, functional programming, goto instructions, global variables, include files, module systems, classes, template languages, PHP, MVC, XML, JSON, unit tests, test driven development, Git, JavaScript frameworks, SQL, noSQL, sequential, asynchronous, multi-threaded, etc.
One aspect that would separate a 'senior' engineer from the rest would be initiative, leadership and mentoring ability. These are the engineers who go the extra mile to ensure that the team gets stuff done, and assistance and guidance is provided where required. A senior developer isn't just someone who knows a lot of stuff, but has a time-honed wisdom as well, which they can parlay into their leadership and mentoring duties.
I like your definition because it is timeless and rings true. The same definition will apply in 10 or 20 years time when there are new fads in development processes, programming languages etc.

I would add that the senior engineer has a mature approach to selecting/recommending tools and frameworks, based on what is most valuable for the business and the team, rather than was is cool, good for their career or whatever.

"selecting/recommending tools and frameworks, based on what is most valuable for the business and the team" This is so true, I would say it extends to style amongst other things also. Having worked seniors on teams who had to seemingly make problems "worthy" of their skill and time served. For example working on a large OO Monoliths where a senior started to add lots of "clever" functional code. When I started the question the reasoning behind it I got a lot of instant defensive flack off them because "it's a better way" and "I'm arguing against correctness" they didn't seem to want to understand that we had 50 mid level to junior devs who also had to support this who would require a lot of help to read or follow it, thus slowing the entire team. They didn't seem to care for the reasoning of it being better "for the team" to just carry on with the agreed OO standard.

It's not that I thought they were wrong in what they had to say, just there is an appropriate time and a place and being able to make that call is just as if not more important than the style of functionality being added. I find such seniors can be toxic at times. In essence there is more to being a senior than just being a great coder.

> For example working on a large OO Monoliths where a senior started to add lots of "clever" functional code.

Adding a simplier design with functional code is a good thing. If there is a mid level developer that can't follow the current state of the art, than he is not a good mid level developers. Also "good" junior developers have mostly zero problems in understanding more functional code. I mean you don't need to understand Applicative Functors to use map/flatMap.

I mean there is a line which you should not cross too fast when introducing functional stuff, however most people just don't even try to understand the simple stuff even that it is way more simple than most while/for loops.

You need to realize most mid- and junior programmers simply aren't good.
And that means they aren't good, not that the person using good practices isn't good.

If it is a business requirement that good developers must be slowed down for bad ones to catch up, then do it by encapsulation and mentoring. Not by decreeing that good developers must act exactly like bad ones.

If you're working on code that is logically shaped like a transformation or a stream, functional is so far superior to an OO approach it's not even funny. One person can accomplish what 10 people would struggle in OO to do if the solution is structured properly, because of the composability and modular testability benefits.
It appears worth noting to the people arguing for functional programming over OO in response to this, that this is about toxicity within the team and maturity of the developer. Not programming style in so much as I can read.

It should also be mentioned that responses similar to the examples have approx. no substance, detract from the quality of the conversation, provides no value to the team, and will likely only decrease mutual trust and respect.

Yes I have lived this recently, two devs competing for most clever code in an oo codebase, it was a spaghetti lava layer mess of styles, and one was the lead. Horrible experience.
Even better when they both leave and you inherit responsibility for the project!
Do you work at my company? This is what I experienced last year on a project being run by another team's lead developer. The system that was so poisoned with needless functional abstractions that the codebase was barely comprehensible (monoids, kleislis, higher-kinded types, dynamic types(!)). It's utter fucking rubbish. He practically mounts an invisible pulpit when he talks about why these abstractions and constructs are the "right way" and "the future." I don't know how he got "lead" in front of his title. Pretty much every junior in our group is more productive than he is.

The only consolation is that the system in question hasn't entered production yet, and probably won't for at least a year at the rate it's progressing.

In my experience, you can tell someone is ready for a senior developer role when they write good documentation without being asked. That shows that they understand their code, that they can explain what's happening, and they appreciate to requirement to communicate things to the rest of the team.
sometimes these title can be dangerous.
Why?
I don't know what parent was thinking of... but titles, to me, are dangerous because titles are not used the same between one organization and another, and expectations and assumptions as to the proficiency of individuals may not be met solely based on title alone. Titles can also be dangerous because people who are undeserving of them think they know everything... when in reality they don't know shit. Especially when someone is given a higher title in lieu of higher compensation, when the title may not even be deserved. I've seen "senior software engineers" that can't even write consistently styled code, full of off-by-one bugs, and other noob shit. And I've seen "junior developers" run circles around them. It's all subjective... Titles are bullshit, basically...
(comment deleted)
My first (programming) job I was a senior programmer. It was an academic institute, and it was basically so i could be put into a decent junior level pay bracket.

I didn't find it in any way harmful.

In my experience:

- you are technically competent

- can handle design aspects of full stack (backend, persistence, frontend)

- have enough credibility and confidence to say NO to business people

- you can lead a small team of developers (2 to 5 people)

> - have enough credibility and confidence to say NO to business people

This is the most important part. Other points you mention are about your skills and you can learn them. This one, however, is in major part about your reputation, which you need to earn.

Going a step further, I'd say you're a "Senior" as soon as people around you start to treat you as one. You can be very knowledgeable but that won't be enough if you can't prove to others that your knowledge is relevant and solid.

To me, it is about what they are able to create independently, and the value of the end product.

Senior people have made the right mistakes, wasted weeks of time, and know what to avoid, what to embrace, and what to ignore. A senior dev can understand the requirements and figure out what is important and deliver something without a lot of external input.

> Senior people have made the right mistakes

This really sums it up, almost every other answer could be seen as a consequence of this.

Do you have to make the right mistakes yourself?
It helps with getting the muscular memory in place.

You can learn from other people's mistakes, but the pain you feel yourself will make you never forget it.

I'm picky. For me that's an intermediate developer. What I want to see in a senior developer is that they make everybody else on the team more effective.

As I've gotten older, I've started to appreciate how much farther a good developer can go rather than just these things. I think the kinds of things you talk about are things that most people can accomplish in 5-10 years. But how do you differentiate between that and someone with 20-30 years of experience?

Because the industry has been expanding so fast, we have perpetually been in the situation where most programmers are younger. But I don't think it will be too long before you will see half your team having 20 years of experience. If you ask yourself, "How am I going to improve after I've worked 5-10 years" and "How much better can you get" I think it is instructive.

My experience has been that you can get a lot better, but that it's very hard to see the difference from the perspective of being a junior or intermediate developer.

I'm also agreeing with leadership and mentoring. Be able to make unbiased technical decisions, troubleshoot systems / apps and get up to speed on new projets independently fairly fast. Have confidence in what you do and don't ask about everything.

A solid general code understanding is also needed in my opinion. This includes things like using documentation over googling everything. If I pair with a senior and he types "golang how to do x" on every problem, I probably wouldn't consider him senior. (Not saying googling is bad. Just don't be a copy-paste-from-stackoverflow engineer)

With that, I also hate the term "senior engineer". I got friends with 3 years of work experience that are now "senior" because a company hired them under a senior position (basically more salary) and the companies after that just did the same because "well he already is a senior, right"? This also generates a strong in-balance inside the team with a hierarchy that shouldn't be there. I am usually advocating for getting rid of job titles and calling everyone just "Software Engineer"

I am now 6-7 years into my career and don't consider myself senior. When people in interviews ask me what my career goal is, I usually mention I want to be able to consider myself senior as the next step.

> Have confidence in what you do...

Heed your own advice. You might not like the current system of hierarchy, that's fine. And change it when/if you get the chance.

But in the meantime, don't abstain from senior positions (and salaries) that others get just because you don't like a concept. Play inside the system until you can change it.

> But in the meantime, don't abstain from senior positions (and salaries) that others get just because you don't like a concept. Play inside the system until you can change it.

Oh yeah, I don't. I am also applying on "senior" positions, but this is just my personal opinion on when I would consider someone / myself truly senior. Paycheck and job description aside.

(comment deleted)
(comment deleted)
I became a "senior" when my financial expectation were higher than the maximum salary of non-senior developer at a company that tried to hire me.

They were forced to offer me position of senior developer and no other company after that dared to offer me lower position.

When you begin to have "senior" moments when cutting code.
Engineer seniority has a lot of variance. Some do it based on years of experience, ranging from 5 to 10 years and that would differ from company to company.

In my understanding, a senior engineer is an engineer that can contribute without the need for technical supervision.

Now, not requiring supervision is different to leadership. A senior engineer is often an individual contributor, not necessarily a team technical leader.

When they have to pay you more than the junior devs. Note that isn't necessarily because of skills or knowledge.
In my experience a senior developer is someone with 10+ years of experience in architecture and development and a pretty vast amount of accumulated knowledge. There are exceptions of course, but this seems to be fairly standard in my market in the Midwest.
When you are valuable and ask for a raise but they cannot give the amount expected because it's already Q4 so they give you the senior title instead.

It can happen even with two years of experience.

> When you are valuable and ask for a raise but they cannot give the amount expected because it's already Q4 so they give you the senior title instead.

A misapplied case of carrot and stick; using the carrot to beat you down is not how it works!

Wait a sec, whats the significance of Q4? How do you think the timing works?
The budget has been consumed; business focused on making financial statements look good before being released to the public market for dissemination. At large corp scale, you'll experience shenanigans such as cancelling all flights/travel (unless it has C-level approval) even if it means a loss of potential future sales revenue / blocking entire teams who end up getting paid to sit there and do nothing until the quarter ends.
The other side of this is that departments with leftover budget will cast around wildly for anything plausible to spend it on, lest they have their budget slashed next year, "use it or lose it" style.

The company I work for has made more than a couple big sales in December from this phenomenon. Sometimes they never even deploy the software.

Trouble with salary raises are; you do effectively lose it because you can't take that raise back next year ;)
Q4 was just a convenient excuse to not pay someone more.
That's also my experience. "Senior" is little more than a random title in most companies I worked for. It can be someone in their early twenties who just happened to have worked for 2 years on one product, even if it's their first job. It's frustrating at first to join a new company as someone who is older and has many more years of experience, then you remind yourself it's just a random title and try not to get hung up over it. Like many symbols of status, it's a pretty empty shell.

If someone like Donald Knuth would be forced due to economic circumstances to join a trendy web start-up, he'd be a junior working under a twenty-something senior with little more than some Javascript and MongoDB knowledge. The whole thing's silly, really.

Anecdotally, I feel like this is how my older peers see me.

I've been working (professionally) in this industry since I was 16 years old, I got my first job as a junior after tinkering with computers since I was 8 years old. At the age of 23, I've found it very difficult to earn the respect of the people around me because of my age.

I have the title of senior developer because I've had experience working on scalability issues and complex service based infrastructures, but many of my peers who are my age and recently graduated university and are still in their first junior roles often act like I haven't earned it - despite me graduating with a part-time degree in software engineering (okay, it's not computer science, but I'm still glad I did it.)

My point is that while age is generally a good indicator of knowledge and ability, it's not the be-all-and-end-all.

I've been afraid of this. I've been working at a company for over 2 years. I'm 17, started here right after I turned 15. I've worked on many high profile projects. I've experienced a lot of respect, even with my age, but I don't want that to fade away in years to come.
You're probably going to encounter a lot of imposter syndrome imposed on you by the people around you - ignore it, you're just following a different track to the rest of your peer.
Don't worry about what others say or feel. You have an audience of two: yourself first and the man who writes your check.

If you are adding value, you're doing it right. You are either a cost center or a profit center. Be the profit center and you will never want for a job.

I'm almost 50 and still in the game. If I'm honest, I still worry from time to time about being irrelevant, but if I'm still adding value, and I am, then what the other IT people around me think doesn't matter. Add value, learn as you go, gain in wisdom and understanding and you will always be cash-flow positive.

Don't make the mistake that so many do that you have to be working on something cutting edge or popular. Those jobs are nice, but I've learned--at least for myself--that I prefer the maintenance jobs. I enjoy taking something and making it better, even if it's just a quick fix, like two lines of code. Own everything you do. Be proud of your work.

You're still young with plenty of time to get where you will be going. Don't be in a rush to "prove yourself" to anyone but yourself and the man writing your check. Don't listen to naysayers, don't get trapped in the mindset that only the new, darling languages are worth investing in. Good programming skills are not language specific. Learn what you can. Use the correct tool for the job. Don't be a method man. Be the profit center.

Curiosity: are you from US? Is software engineering seen as less valuable than computer science? I'm asking this because for me software engineering is a more complete discipline and would encompass pretty much everything computer science does.
I'm from the United Kingdom, where Software Engineering is seen as a lesser degree to Computer Science, in the same way that building CRUD applications is popularly seen as lesser than compiler design.
In the US, degree programs actually called "software engineering" are few and far between; most software engineers who are college educated have a computer science degree.

It's also worth noting that the term "software engineer" isn't regulated here, while other engineering titles are.

> term "software engineer" isn't regulated here, while other engineering titles are

No they aren't. Unlike in Canada, you can give yourself any title without actually having a license in that profession, as long as you aren't being fraudulent in your claim.

Sorry, sounds a bit like you're copping an attitude here. There's a lot more to software developement than any one or two things (scaling issues? complex infrastructures?). Don't be complacent and think because you've done X, you know all about Y and Z. I once worked with a guy who started with a company at age 16, did a lot of stuff, wrote a lot of code (went to work for amazon after that actually). Turned out a lot of the things he did, although valuable in the moment to make the sale, were terrible for the long term viability of the product. This kids unguided decisions literally set the company back years when growth took off, and the app couldn't scale, and security holes were gaping.

Just be wary of thinking you know it all, this applies to everyone, regardless of age or experience.

Gartner's Hype Cycle also applies to senior engineers. After 2 years of experience, you feel so much smarter than when you just started. You feel you've made it to senior.

But another 5 years later, you notice how little you really knew. You become really senior at 10+ years. Just like the hype cycle.

>>If someone like Donald Knuth would be forced due to economic circumstances to join a trendy web start-up, he'd be a junior working under a twenty-something senior with little more than some Javascript and MongoDB knowledge

To play devils advocate, why wouldn't Donald Knuth be the junior given that scenario? In that position he may actually know less relevant knowledge than the junior. I mean many startup/crud apps don't require advance algorithmic knowledge, more front end dev and ability to deliver relevant business value. I wouldn't expect that junior to join knuths team and be put in charge, why should we expect the reverse? Given time yes, If Knuth is more intelligent he could become better at startup relevant work, then he should be more "senior" not before.

This is why I leave Senior out of my resume for a previous position. Otherwise, someone might think I know what the hell I'm doing.
My personal definitions:

Junior: Can do it with guidance and/or clear and non-transitional specs

Developer: Takes the ball and runs with it. Can walk a customer through requirements gathering and make recommendations. Will help guide junior developers.

Senior Developer: Can architect a system well. Can communicate equally well between executives, salespeople, management, and end users. Can and will mentor lower level developers. Can explain concepts on the fly to lower level developers and walk them through the development process in terms they understand. Takes initiative at learning new technologies.

> Can walk a customer through requirements gathering and make recommendations

Well yeah, I can do that, but isn't that normally the business analyst's job?

It really depends on the size of the company and how sales are done.

Also, maybe it's more about understanding the product? Just a thought.

Change it to "can walk the business analyst through requirements generation etc"

(Yes, I am currently frustrated with our product management)

Not that they have to do it as part of their day-to-day, but that they can communicate well enough to do so if needed. It's a given that the development skills are there in my mind, but to go beyond "junior", I believe someone has to have a strong enough understanding of things that they can both communicate well and be able to recommend solutions rather than just implement them.

Just my personal opinion. Based on environment, this may or may not be a good gauge.

"Senior Developer: Can architect a system well."

How do you learn to do this?

Sorry for taking so long to answer.

Experience building and supporting them. This is really just a definition based on my own experience and environments.

Skill is knowing how to operate Amazon, "senior" is knowing when you probably shouldn't.
When you get just as snarky with your co-workers face-to-face as you would with people on the internet.

If you've been getting away with it, you're probably reaching a level of seniority that deserves a promotion.

I work at a major games company. For us, a "senior" is someone who can, on their own, design, implement, document and maintain a feature. An "intermediate" is someone who can do the above but with mentor help from a senior.

Above that, it depends what you want to do. If you fancy managing people, you can be a team/tech lead, or if you don't, then there is the title of "expert"(only a handful of programmers who worked here 10+ years have those).

I quite like that definition. It's based on the ability to independently deliver value.
When you learn Erlang.
Do you become a lead developer when you've mastered K?
Well usually companies have their own view on seniority, and it could include how many years you have been there, but for what its worth for me a senior developer is a person who has experience with all stages of application development, which should imply that she/he can: - design and understand client/server architecture, - write code using best practices that is clean and maintainable, - knows database design and programming - understands design patterns and knows how to not abuse them, - knows how to deploy application and has experience with CI. - knows how to write proper unit test.

To sum it up I will use .NET as an example, in my eyes when someone says I am a senior .NET developer I assume that she/he has: - used UMLs, - knows how to write proper OOP and understands SOLID, - can use MS SQL and some kind of ORM, - uses some of the testing frameworks (e.g. NUnit), - knows how to deploy application whether on IIS, or install it with ClickOnce for example. - know how to handle source versioning (TFS or whatever is your poison)

I probably missed a few things, but that's about it for me. If a senor doesn't have these skills I assume first that she/he has great knowledge of company business which would make her/him a valuable asset, or that she/he got lucky, or it's a crappy company :)

>- used UMLs

Like unified modeling language?

Yes, UML diagrams. One should be able to read and understand them.
How hard is that to learn though?

That seems like a fraction of the cost it takes you to learn OOP/SOLID/etc.

UML is pretty straight forward, and I rarely saw it being used in companies because of many reasons (spaghetti monster being the one :D), but I mentioned it because I'd expect that one showed now how to read them, since you will find them in literature (if you read any book on design patterns they are there).
And, Flying Spaghetti Monster be praised, know enough that designing a convoluted OOP hierarchy and diagramming out forests worth of UML diagrams is a terrible, terrible decision.
To me the senior title should be applied depending on the way you approach your role and not how you code.

As others have mentioned as a senior you can be left to implement changes without guidance, you will clean up issues as you come across them instead of leaving it to others, you suggest improvements, you make time to mentor and guide more junior members of the team, you know how to relate to muggles and you act like a team captain.

Knowing lots of different hosting environments and languages comes with experience. The approach you take to your role show's your all rounded skill set.