Hiring Juniors22 Apr 2016
The "D" word
We have a diversity problem in the community, and that's been talked about quite a lot when it comes to tangible things like gender and race. A diversity of skill -- an intangible thing -- is also something we talk about struggling with.
When I started out as a Rails developer, I was tinkering around with the framework in my spare time, which I had a lot of because I was single and working casually at Coles and doing the odd spot of PHP/Rails freelancing.
I heard that there was a Ruby meetup happening in Adelaide and I caught the train into town and ran to the meetup because I was running very late.
When I got there, people asked what I did and I told them about Coles, PHP and Rails. They said "you don't need to work for Coles anymore" and three people gave me their business cards and said I should apply for a job. I applied for a job at SeaLink and was accepted.
At SeaLink, I got mentored by a team of "senior" Rails developers who had a whole bunch of patience for my 19-year-old antics. I am very thankful to them for the time that they spent mentoring me, as I believe it helped provide a foundation for a career that I've been doing for very close to 10 years.
There are plenty of juniors at the Melbourne Ruby Meetup. I know because I help run the Hack Night where a lot of them attend also. If a junior from this meetup was to tell you that they were actively looking for a job right now, would you hire them? Probably not. There seems to be quite an aversion to hiring juniors, and the main aversion is that juniors take up valuable shipping time with mentoring time instead.
In the early days, there was a lack of available talent and so companies had to hire whoever they could find. That's why I found it easy to get a Rails job back then. I think we have once again reached that point where there just isn't any talent to hire.
I've been having a lot of discussions recently in the Ruby community about why companies seem to be shying away from hiring juniors. Instead, these companies want to hire mid-to-senior developers and do not want to have apprentices who are learning alongside those mid-to-senior developers.
Lawyers, mechanics and plenty of other professions have apprenticeships, so why don't programmers? It's pretty strange. I think it's because those professions have had turnover in their companies enough to learn the lesson about training for the future. This is still a young community where most people have been doing it for less than 15 years. We need to think long term about this: who will look after our code when we're gone?
Let's look at why companies want to hire mid-seniors in the first place. At the companies I've worked at, we've wanted to hire a new mid-to-senior person because our workload has gotten to the point where it's exceeding our capacity. I figure that this is the same at other companies too. Like where I've worked -- and currently work -- you'll have people breathing down your neck asking when bugs are going to be fixed or new features are going to be developed.
To address this problem, you hire a new developer or rather: you try to hire a new developer. You want a mid-to-senior developer because they have the skills to instantly dive straight into your application with little-to-no guidance and they can start shipping code.
However: the trick is finding someone who's available at the moment. In this current climate, it's nearly impossible to hire a mid-to-senior Ruby developer to come work for your company. What typically happens is that developers get aggressively poached between companies.
Companies spend thousands of dollars on recruiters and lots of time posting to job boards, for often very little good return. Companies spend this money to hunt the elusive 10x Developer Rockstar Unicorns, but the Unicorns are no longer out grazing in the sunny meadows, readily available for capture. They're already working somewhere else and the conditions of where they work are extremely good.
We, as a community, have drained the talent pool dry.
We're out of freely available Rockstar Unicorns and so it's time that we started to grow our own.
Companies are addicted to hiring the top 5% or 10% of developers and ignoring the rest. There is a lot of great talent in the remaining group of developers, just waiting to be mentored. If they got that mentorship, we would be able to bolster our community's best and brightest. What if the next person your company mentored went on to become your next CTO? What if they went on to be that "10x engineer" who can help out anyone on the team with anything? I really believe companies are missing out on great talent by completely ignoring it when it is non-obvious.
Too many companies are focussing on the short-term goals of shipping code, rather than the long-term growth of their teams.
Companies hiring the best-of-the-best -- the people with proven great track records -- and getting them to build what is essentially CRUD applications which do, at best, a fancy version of string concatenation.
If we speak in terms of hiring piano players: you're hiring the Chopins, Bachs, Liszts, and getting them to play Mary Had A Little Lamb.
You do not need to hire senior developers. You need to hire developers of any skill level, mentor them and grow them into the next great bunch of developers. Give these people a chance and train them on real world applications that real people are using. These could be the next great people that your company needs and you are not giving them the opportunity.
You might be thinking: what do we (as a company) get out of this? I think that's backwards. The thinking should be "we have earned so much from the community, and now it's time to give back". If you invest in the long term health of the community, it will pay dividends. In the long run, you will have an active talent pool of developers who will be able to maintain your application. In the short term, you'll be bolstering your team's productivity with fresh talent.
You may think that you need to hire these best-of-the-best badasses because your application is a large unmaintable behemoth monolith and only the badasses can understand it. That you need seniors to navigate the spaghetti that is your legacy code. That may indeed be the case. But in every monolith, there is a tiny bit of functionality that a non-senior developer can work on improving along with their skills, when that non-senior is paired with a senior developer.
It's OK to hire non-senior developers to work on real live production code. We've done it at Marketplacer and we're still in business. Your company will not go down in flames because you hire a junior.
Yes, it's risky. Initially the cost of the employee is greater than what they provide for the company. But with the right fostering, they can grow into the best asset your company has ever had.
Julia Claven has a great graph for this:
When the junior is initially hired, their dollar value to the company is less than the output they produce. With good mentoring, they can get the other end of the graph where their value to the company outweighs their salary.
There is an initial productivity hit -- that's true -- but that plateaus out within 6 months if you do it right. At the end of it, rather than having one developer, you have two developers. Even if the junior is half as productive as the senior, then it's still a 1.5x growth in the productivity of your team.
At Marketplacer we've hired juniors within the last year that I would consider to be very productive members of the team, and they're great people to work with to boot. We would've missed out on these people if we didn't invest the time in hiring and mentoring them and instead focussed on only hiring seniors who had existing Rails app development experience.
You might be thinking "but what if they leave"? That's a risk you take with any hire of any skill level. If people are leaving your company, you should be reflecting on why they're leaving in the first place. Was it really them, or was it your company? Does your company have a culture that someone would want to leave? Is your company focussed on building a culture that people want to stay in, or are they only interested in shipping code?
Where can you find those juniors to start with? Well, let's start with Code Academies. Not any particular one -- although Turing is my favourite. Code Academies solve part of this lack of mentoring problem.
Unfortunately, due to our senior hiring addiction, we're not hiring these fresh faces. The code academies produce great talent, and we're not picking it up. These people are left to struggle for months at a time in developing their skills before they can even get a look in at a company. I've spoken to many juniors in that position.
Not all of these graduates have the time to spend doing that skill development, as they often have full time jobs or other responsibilities to take care of. Thankfully, they get a lot of assistance from their code academies after they've graduated. Well, at least the good code academies do that.
I would love to see companies breaking their addiction to seniors and more actively hiring from these code academies. More companies need to make mentorship / apprenticeship a part of what they do. The students that graduate from code academies are eager to learn and are, in my experience, very highly motivated.
There are definitely juniors who have that same kind of eagerness-to-learn and motivation who have never been to a code academy. These people have learned by themselves and by being mentored by people in the community. I can think of at least 5, perhaps even 10, of these people who would make great hires in a company's mentorship / apprenticeship program.
If I were in charge of hiring at Marketplacer, I would hire a motivated junior, pay them a wage well enough to live off and mentor them.
Asim Aslam (@chuhnk) had a good tweet about this too:
When hiring remember that someone once gave you an opportunity when you didn't have the experience. Hire smart raw talent and mentor them.— Asim Aslam (@chuhnk) April 14, 2016
There's a great book I encourage you all to read: it's called The Talent Code. As the subtitle says "Greatness isn't born. It's grown." The book covers how skills of all varieties are grown in sports, music and plenty of other areas. All the industries that are covered in the book have active mentorship and apprenticeship programs. Yet, this is not cared about in the programming community for reasons mentioned earlier: we're still quite a young community.
I'll let you in on the secret that's in that book: for anyone to get better at anything, they need to practice the hell out of it. How do we expect to have seniors to hire if we're not hiring juniors and letting them improve their skills by practicing on real world applications?
So many people are talking about mentoring and hiring juniors. Let's start doing it.
Now that I've (hopefully) convinced you to hire a junior developer, you might be wondering what you do once you have one.
I help run the Melbourne Ruby Hack Night and it's a judgement-free environment where anyone and everyone can bring along a Ruby project and work on it. Some people are even there for the first time learning about Ruby itself, which is great to see. These Hack Nights work because these new developers feel safe and welcome and that no question is too "dumb" to ask.
You can start mentoring at your company by fostering that Hack Night-esque environment. It should be OK to put up your hand and ask a question about anything. If the questioner is getting eyerolls, sighs, or other passive aggressive signals from someone else, then that's not the kind of environment where a junior is going to learn.
A great way to build that kind of fostering environment is to encourage pair programming. Pairing with juniors on small tasks initially is a great way to build up their confidence. When I've been mentoring juniors, the number one thing that I find that they're lacking isn't the skill, but the confidence. They know the answer, but they aren't sure if it's the right answer. They question if they're using the right syntax or even if they should be writing the code that particular way. When a senior pairs with a junior, they can encourage them to try out things and learn from the things that they try. If the junior gets it wrong, the senior can ensure them that it's OK to get things wrong and to guide them back on track. Pairing is the quickest way to upskill a junior and I can highly, highly recommend it.
I paired daily with some developers when I worked at GetUp and in a few months time they were confident Rails developers who could find their way easily around that Rails application. I've done the same at other companies too and each time I've seen great professional growth in the juniors that I've mentored. One of the best feelings in the world is when a junior says "Ahhh, I understand!".
Pairing also helps reinforce your own knowledge. If you can't explain something to someone clearly, then you do not understand it well enough yourself. Pairing is helpful to the junior because they get knowledge out of it, but it's also helpful to the senior: they learn how to share what's in their brain with other people in a clearer fashion.
What should you pair with your junior on? Well, Lydia Guarino has some good tweets about that.
5) For junior devs, a good guideline for scope is something that can be completed in 2-3 days. You want to keep your feedback loop short.— Lydia Guarino (@lydiaguarino) April 13, 2016
5) Tasks with scope of more than 3 days are tasks that are not defined well enough. Break them down further.— Lydia Guarino (@lydiaguarino) April 13, 2016
I agree with both of these. Juniors thrive best when they're given quick wins. You want that nice tight feedback loop to keep their confidence growing. Every time they "win" at code, their confidence gets that little bit more boosted.
Once they've built up a bit of confidence, you can let them go solo on a task. There isn't a set timeframe for when this happens; it's all about how confident the junior is with their own abilities.
Let them loose on something small and make it clear that they can ask any questions about what they're doing and that there is no wrong way of doing it. Once they're done, get them to submit their work in a pull request -- you might have to teach them what one is first -- and then sit together and review it.
Sitting together is important here because "why are you doing this?" written in text has no emotion, compared to it spoken with body language. Juniors may interpret a "why are you doing this?" comment as aggressive like "UGH! Why are you doing this?".
Focussing on in-person communication helps establish a rapport between the developers much better than text-based communication ever will.
If a junior has made a mistake in the pull request then you can discuss it with them and correct the mistake. This way, that mistake will never make it to a live production environment.
Code review also allows the senior to assess how well the junior has been doing on the tasks they've been given. If they're doing well on a 2-day task, then it's probably going to be OK to give them a 4-day task too. If not, then some more mentoring may be required.
Ultimately, your mentorship should be about making the junior feel welcome and safe within your team. In fact, this should be what's happening with everyone in your team. Google ran a project that they called "Project Aristotle", wherein they attempted to find how to build effective teams. They interviewed hundreds of their own employees and they came up with 5 things:
The #1 item on this list is "Psychological safety": "Team members feel safe to take risks and be vulnerable in front of each other."
Google is not special. They're made up of people just like your company is made up of people. You should keep this in mind when mentoring your juniors, and working with other people in your team.