Ask HN: How do you define a junior developer?
For a web development position that requires basic knowledge of HTML, CSS, JavaScript companies can easily find junior developers, people with little to none experience in programming. But for system programming, how can you define a junior? Is it a person with experience as a programmer in other languages (say Ruby) but little to none experience in the language of the offer (say C++)? Or can someone without any programming experience at all find a job as a C++, Scala, Swift, Go developer?
67 comments
[ 2.8 ms ] story [ 165 ms ] threadPersonnally, I see a Junior whatever as someone who has some theoric knowledge about the whatever but did not have the time to apply it yet.
I don't know how to categorize the next case: A group side project. The work is challenged, but it is difficult to prove.
Without supervision:
* can they be trusted to take a story and turn it into a list of one or more problems which are solvable and sensible to solve?
* given a list of problems, can they be trusted to select appropriate tools for solving each problem in a sane manner?
* given a problem and an approach, can they be trusted to fill in an implementation?
If you can't answer any of these questions with a firm "yes", they're definitely a junior.
There is a traditional boundary. System programming is programming at a lower level, code meant for consumption by other software, and never directly used by an end user, while application programming is meant for consumption directly by an end user. Think "game engine's network stack" versus "text editor (that isn't Emacs)".
It's possible to work as a very junior system programmer with no prior programming experience. Everyone has to start somewhere. I've put such people to work doing everything from debugging problems with some data structure implementation to debugging thorny concurrency issues. Generally I take the view that a person is no longer junior when he has had sufficient experience that he can do more than bug fixing in more than one sub-domain of system programming. That wouldn't mean he or she is necessarily senior at that point.
It is often thought of as a prediction about what level of contribution is expected, but that's basically a farce. In every organization I've seen that makes distinctions between junior and senior developers, the only thing different between them is that senior developers are paid more. They don't do more, manage more, design with more foresight, or anything like that.
The exception is that developers who are brand new to a job function as junior engineers until they get calibrated and learn some parts of the codebase in which they can be effective. But this is just as true for a brand new senior dev with 10 years experience in your company's primary domain application as it is for a kid straight out of a bachelor's program whose only prior work experience has been theoretical REUs or something.
Basically, it's just a status tool.
I would expect a senior engineer to come into a new job and be able to propose the design a new service very quickly - its API, architecture, datastores (including sharding, replication, active-active multi-master designs, ...), DR strategy, how it fits into the ecosystem, how to scale it to thousands of QPS, etc.
The problem is that titles get inflated and can't be relied on as much as we would hope.
Personally I say a senior engineer is one who solves problems by the most appropriate means. Maybe he fixes a "bug", maybe he/she knows enough about the problem domain, the use cases, the dependencies, the history and changes the documentation instead. Maybe he/she tells a junior engineer "figure out how to scale that" and uses experience to know what part of the system really needs to scale. And so on and so on. A senior engineer spends little time coding and lots of time mentoring.
Are you an implementer, a solver or a finder?
An implementer is someone who gets given a task and does it. That's a definition of a junior.
Middle of the range is a problem solver. You give someone a high level problem and they solve it.
A senior is a problem finder. They tell you problems before you even know they're a problem.
This guy puts it much better than me: https://rkoutnik.com/2016/04/21/implementers-solvers-and-fin...
Requires Supervision <-- +-> Provides Supervision
Creates Systems that are Resistant to Change <-- +-> Resolves Technical Debt
Looks for "easy wins" <-- +-> Seeks to understand tradeoffs
Capitulates easily to PMs/etc. (usually to the detriment of the business) <-- +-> Demands cogent plans from business concerns
Is always right <-- +-> Fosters discussion and examination of practices (especially their own) by the whole team
Easily dazzled by new things (libraries, etc.) <-- +-> Carefully weighs benefits and drawbacks of potential tools and practices
Easily frightened by new things (libraries, etc.) <-- +-> Carefully weighs benefits and drawbacks of potential tools and practices
So, in a sense yeah - the Senior is still "looking for a win", so-to-speak but in a deeper zen-state where they realize "There are no wins: only tradeoffs".
In the end, you're making a smart vs. wise distinction, and the two are neither independent nor opposed.
Perhaps fixes the problem in front of them vs. thinks about the problem in context (with the context getting bigger and hairier with more experience).
The questions should change, to be sure, but they shouldn't diminish unless we're not throwing progressively more complex tasks at them.
* Junior developer - Will not produce much business value if left alone, and may produce nothing at all. Requires supervision.
* Intermediate developer - Will produce something if left alone, but not necessarily what the business most needs. Needs minimal supervision, but defined goals.
* Senior developer - Will produce immediate business value if completely ignored.
The domain and language don't matter for these, really. A Senior Go developer is going to produce immediate business value if you suddenly throw him/her into a Lisp team, too. Just slower.
When someone is considering hiring you, this is more or less what they're thinking about. It's not "do you know Scala," it's "are you going to make us more money than you cost." It's just hard to prove, for either side, so we talk about past experience instead.
If they did not work with exactly the tools and programming languages / libraries of the job that is described in the job offer at hand, their performance ends up more in the junior part of the scale and it will cost you dearly. I really had to learn that the hard way with several hires.
This seems to be the exact opposite of what the OP said, is it not?
Clarifying edit: It seems like you're saying that you need to have worked with a certain tech-stack for 10 years to be considered a senior developer, whereas the OP seems to be advocating that a "senior developer" will be able to handle any tech stack you throw at them in a reasonable amount of time. Their knowledge of the tech stack may impact their speed at first, but not the quality of the result.
If left undirected, they will still move tech and be productive, but not necessarily in the direction the company wants to go.
This is what people here like to believe. But I don't think it is really true. A kid straight out of college can generate immediate business value if he/she can set up an online shopping cart in Php to give a business an online presence. I am pretty sure that the same kid can code up any business requirement of most of the local organisations that does not need to scale much or work with great reliability.
Also, it is not true that a junior dev requires supervision. Anyone with sufficient motivation and an internet connection can figure stuff out by themselves. I mean, they can get things done, even if in a fantastically stupid fashion.
What sets us apart from the senior developers as pointed out by the CTO of my company seems to be experience in writing good, scalable code. More often than not this means adhering to best practices, linting and testing extensively and many other things that in general come with experience.
Mostly, "Junior Developer" means "we want a developer but don't want to pay market rates".
I mostly agree with this definition, though I don't know who would hire someone that can't produce any business value. Hell, why bother with a CS degree if your employer is going to teach you how to do everything?
IMO, there's no excuse to have a blank resume when you graduate. Someone goes through a 4-year CS program and has no side projects? No part-time jobs, no research, no internships, no contracts, no silly hacks or anything to show for the past 4 years other than a diploma? If there's a business that profits from re-re-rewriting bubble sort I'd love to hear about them.
There are probably better ways of answering the question, but I think all those position descriptions are asking is "can you actually do things that ?"
* Junior developer - Will produce some value with guidance, probably not much if left alone. Code will be terrible if left alone.
* Intermediate developer - Will produce value if left alone, but will write code in a way to just "make it work"
* Senior developer - Will produce value if left alone, but will write code considering the long term implications of whats been done. Is it maintanable? Is it easy to read? Is it easy to extend?
I get triggered when people confuse Entry & Junior developers:
Entry - Cant be trusted on their own - need hand holding.
Junior - Can be trusted on their own - like a slow mid-level developer - might need to check their code a bit after but generally know what they are doing with a little input from more senior developers in the team.
A junior programmer is someone who has never learned from a serious mistake they've made while programming professionally. A junior programmer is someone who thinks they should be senior thanks to the Dunning-Kruger Effect ("Hey, I was an honors student at this great college!"). A junior programmer is someone who can't usefully mentor anyone else. A junior programmer is someone who is not aware of the downstream impacts of their decisions, and is not aware that they're not aware of it.
So junior engineers aren't given responsibility, because they might break something.
I was lucky. The first time I was given real responsibility, I broke something badly (which turned out to be an actual OS bug, but that's another story). It was a learning experience - in large part, because I had to learn why things broke in production, but not in development. That lesson sticks with me to this day, 20+ years later.
This is a perfect summary of working at corporations
Junior: requires supervision.
Mid: individual contributor: can take stuff and get it done.
Senior: goes beyond their own individual code, more involvement in larger project (process, architecture, people, client, ...)
Junior developers almost always only know about concrete things they worked on previously. They typically have a hard time talking about anything other than implementation details.
Assessing seniority by just number of years of experience, or knowing a hot technology doesn't make one a senior developer. A solid Aptitude + Attitude towards software development will make you a stronger developer, and that will also help you pick up any new tools, needed to get the job done!
Good Luck!
They follow all the rules they were taught in school, like 'never ever use goto in C', until their first code review by a senior developer, who shows them that 'goto err' is much easier to understand than writing your cleanup block before every single return statement.
Senior developer: can use a computer to solve business problems.
Instead of spending one second fretting about the exact useless definition of "junior", take a look at the candidate, their background, aptitudes and aspirations, their personality, your team, what the job actually requires, what you're willing to pay, and also what responsibility your org is willing to take on to train next-generation professionals. If you do that, it won't matter what "junior or senior or level X" means. The goal is to fit the right person to the right job.
People with little or no experience in programming I wouldn't call junior developers, but perhaps apprentices.
Soft skills required for senior: help teammates help themselves by documenting and/or improving the development process and providing constructive criticism/best practice advice.