How to Onboard Software Engineers
blog.fogcreek.com
blog.fogcreek.com
On the topic of on-boarding -- super important to get right! The idea of making your people the best they can be is lost, I think, on our generation. My grandfather-in-law was a mechanical engineer at Chrysler back in the day when they had a special school they ran to train their new recruits. When he started he had no idea of how cars worked but they picked him up from school and gave him the training he needed to become an important figure in their company.
Focusing on hiring the best because hiring someone mediocre will damage your business is negative thinking that can kill your on-boarding, and thus your culture and business. I've worked at places with terrible on-boarding and it was a fight just to get some direction and support for your work. Getting the attention of management was something you wanted to avoid which led to people becoming complacent about their work and its quality.
Great article. On-boarding is important to get right.
https://www.youtube.com/watch?v=kNke_4WOWAU
https://speakerdeck.com/pycon2015/kate-heddleston-how-our-en...
edit: found it (I think) http://www.theverge.com/2015/3/21/8270585/twitter-gender-dis...
The notion has less been lost and more been re-evaluated in a new context.
They started it, employees would be fools to not leave when the wind is blowing in that direction.
If the market rate for an engineer is (making up numbers) 35% higher than it was in 2010, each engineer better be making at least 1.35 times what they were five years ago. Probably more, considering they're likely better at what they do than they were five years ago.
Lots of employers seem to be OK with the churn of young developers. Pay the below market rates until they develop enough skills and confidence to demand something better, replace those people with new grads and retain the people willing to work for below average salary.
The trick is to make companies where money isn't the only motivation for working there, because those kinds of companies will always lose in the talent wars anyway.
Wrong. I've done it because it's the easiest way to actually get paid what you're worth.
Its crazy, as on some systems that I have worked on it has taken me 6 months to get fully up to speed (not that I wasn't productive before then, just a lot slower). Rather than pay 10% more, they will let employees leave and pick up the tab for a new person learning the system.
1. Let's evaluate to see whether the new developer is good enough, so we can fire fast if our expectations are not met.
2. Let's figure out how to help this developer achieve his/her maximum potential for adding value to the organization. If for some reason the developer is unwilling or unable to develop to a level that makes a positive contribution, then we consider separating.
I find the second approach much healthier for the employee and the organization.
And lastly, reaffirm that you've done 1 to 3 and communicate clearly that those are the expectations before you fire the person for being pretty much dead weight.
You can't figure out how a lot of people will work until they actually start a job.
The meat of the essay comes down to this quote:
Business and life are built upon successful mediocrity; and victory comes to companies, not through the employment of brilliant men, but through knowing how to get the most out of ordinary folks.
Your grandfather-in-law is the perfect example of something I wish we'd see more of today.
1: https://en.m.wikisource.org/wiki/Why_I_Never_Hire_Brilliant_...
None of my projects are at the point where you can just "vagrant up and go", but the next-best thing has been READMEs in the relevant repositories with exact lists of "Type this, type this, type this, type this. You now have a fully-working system running on localhost and you should be able to type this to get a full green test suite. If you can type this and it does not come out green, fixing that is more important than anything Patrick is doing right now."
Here's, for example, what we have for getting someone up and running on Appointment Reminder (in preparation for me soon no longer being the engineer who keeps all of that system in my head): https://gist.github.com/patio11/a0b1063c5d33b5748da6 Feel free to steal ideas in terms of level of detail or useful things to include. (A lot of the magic is in the rake commands like "setup_site", which take care of "All that crufty configuration stuff which you would otherwise need a senior engineer to do for you prior to actually seeing the page render correctly on localhost:3000.")
Quick hack which helped us on making sure this guide was actually accurate: we had two engineers coming into the project at the same time. I wrote down everything I thought they needed to know. Engineer #1 implemented to the document I had written, filled in the blank spots where he needed to ask questions, and then we committed the readme. Engineer #2 then had to do it off the readme without asking me any questions. Given that he was actually able to do this, we have high confidence that there is not at the moment anything rattling around in my head which is absolutely required to get up-and-running and documented nowhere else.
Writing such a script is significantly more time consuming than writing a README, and for it to be worth the effort, it should be expected to save a fairly high multiple of the time it takes to write, debug and support. For GitHub, that multiple is definitely very high, for Patrick, it might not even be greater than one. YMMV.
New developers day 1: vagrant up; vagrant ssh; cd /path/to/app/on/vm; ./build-dev
And they're ready to go.
https://twitter.com/alister_b/status/636563590288437248 - 29/ If I start work and have to spend 3 days just getting the dev site running locally - we know the live site is also a pile of crap
There's a plenty more of along similar lines about recruiting, interviewing, and the working environment - both for people, and the code.
When I'm done, I'm putting them all together in a blog post with some extra thoughts as well.
Things like "I know most people do this, but we are expecting to swap this feature out in two months so that's why it's put together like that so just roll with it and spend a few extra minutes manually testing before you ship it." or "Employee X is in the middle of refactoring all of this but is putting out a fire for the next couple weeks. If you need to do something here get in touch with him and what you want to do and he'll either walk you through it or apply the fix himself".
Unfortunately the personality type of a 10x developer is often not going to be like your 1-2x developer. Pointing them to some documentation and walking away often will lead to an unsuccessful onboarding. This may be preferable if you are actively testing out the new hire and really want fully independent developers, but if you are not knee deep in talent some verbal onboarding can work wonders.
It worked extremely well!
I think the key to make it successful is to have the feedback of someone actually working through it, finding the pitfalls or shortcomings, and correcting as they go. I know I tend to "just figure it" out but I've been in plenty of places with little to absolutely no documentation. It behooves me that if someone did take the time to document something, I should honestly take the time to "pay it forward" by keeping it current as I work through it. It's also far too easy to let this learned skill stagnate when you aren't required to document anything so absolutely no one does it.
I worked for one company for a month. From the get go they had 100+ staff but no onboarding. Nobody knew how to set up the development environment or even get the application working on the company laptop. Nobody could show me how to VPN to client sites or show me how the software worked. I was meant to support it...
I was in my manager's office every day letting her know hey I really need assistance here, nobody seems to have time, nothing is working, I'm not learning anything and this needs to improve.
She'd tell staff to assist and they just wouldn't. And rinse wash repeat the next day.
A month in we are in a meeting and some difficult software issue comes up and it's assigned to me to fix. I mention that I don't have it running, don't know how to use it, have no method of finding who the customer contacts are to call them and will sound stupid not understanding anything, but also haven't been shown how to connect in. That I'm happy to shadow someone else and learn it.
It felt shameful but I knew it was the right thing, I had a year of extensive help desk experience under my belt including programming and other development, bug fixing, accounting, you name it, I was even team lead. I was used to dealing with multi million dollar clients and had no qualms about doing so... but this place was dysfunctional.
Anyway the boss stared me in the face in the meeting and called me a liar, to shut up and get to work. I was stunned. I repeated myself and she turned to my coworkers who claimed they had "showed me everything". I hadn't spent more than 5 minutes with them in the entire month and had been in her office every day. She told me to start pulling my weight and stop lying.
I walked very calmly to the office printed out a resignation and left my keys and walked out the door. I didn't get paid (a funny side effect of walking out of a job) and the move left me penniless and ALMOST homeless.
Luckily I got a job just in the nick of time shortly after, at twice the pay, and being treated like a human being. I removed that place off my resume and rarely discuss it because it's so humiliating.
I still remember the recruiter calling me screaming how unprofessional I was - he only cared about his lost bonus. I explained I was extremely professional but that after being humiliated and called a liar in a meeting and having none of the promised training, or anything remotely capable of making me a functional employee, there was no recovery.
Now I take onboarding very seriously.
What. The. Fuck. You are a less violent person than I am. Glad it worked out.
I, personally, would have taken the lower road and continued coasting there to pay my rent while I searched for a new job. If a company isn't invested in you, why should you be invested in the company?
I.e. it's possible to continue to do your job within normal parameters while still looking for the next thing. Defining this as ethically dubious gives too much power to employers, IMHO.
Wait, you didn't get paid for the time you had been their? I'm pretty sure that is a violation of labor law, at least in any state in the US.
In California, at least, enforcement is vigorous. Once a client tried to stiff me on a couple months' wages on the grounds that they didn't have the money. I paid a lawyer to write them a short note, in which he explained the 7 kinds of hell that would rain down upon from the state government, and that by law wages come before pretty much any other claims on whatever assets they had. A check for the full amount was promptly overnighted to me and that was the end of it.
I found out the hard way that Colorado law doesn't protect you at all. Even better, if you sue to get your back pay you can't recover the legal costs even if you win.
It's vigorous in Virginia as well: the state has a unit with totally humorless employees who've heard it all and are highly motivated and competent at helping you squeeze your back wages out of your deadbeat ex-employer. Or so was my experience in 1997 which I and 12 or so other employees of a startup resigned one day due to devil investors.
Others have noted sqldba might have been a contractor, but it sure sounds like he was being treated as an employee. That can be addressed by reporting it to the IRS: https://en.wikipedia.org/wiki/Misclassification_of_employees...
I'm glad you did though! That's how it should be. :)
State enforcement doesn't seem to be involved in your case -- you went self-service with a direct lawsuit in court.
If you want State enforcement, you file a wage claim with the Department of Industrial Relations, Division of Labor Standards Enforcement.
In this case though (when I followed up with accounting) they confirmed they wanted to step on my neck.
Even now the entire situation seems utterly surreal. I've been through a few companies since then and never had any problem, I'm the likeable hard working quiet person. I guess they just really didn't like me!
Anyway I remember walking out of that office in tears and feeling that no matter what happened I could cling onto whatever self worth I still had. I didn't know how bad it was about to become. But I came out okay in the end :-)
They would probably fire you immediately anyway and you would get paid.
You have misstated the law. If you sign an employment contract that requires two weeks notice from either party to terminate, then you work a week and quit without working the two week notice period your employer is not required to pay you for the notice period, they absolutely must pay you for the week you did work. Similarly if an employer tells you not to work the notice period they are still obliged to pay you for it.
I understand your confusion as the wording the clauses about withholding pay on notices is somewhat unclear and takes a pretty close reading to understand
Anyway, I found out later by searching public records that this company had been sued in small claims a number of times and lost just that year. The moral of the story is to look up future potential employers' court records like you'd do a background check on a potential girl/boyfriend. Wait people don't do that to potential girl/boyfriends?
Felt amazing but I was also super broke.
Heddleston's point about having less-senior people do the mentoring is especially apt. While I've received support from everyone in the team, the most helpful person has actually been an intern with only a few years of programming experience under his belt. While I have over a decade more general programming experience than he has, he knows a lot more about the specific domain, and has been an excellent teacher. I feel that this arrangement has been beneficial for both of us—as I've gained domain knowledge, he's gained confidence and depth in his own knowledge.
I think that a big part of this is not setting expectations too high—no matter how senior the new employee is. While I have a fair amount of experience, the expectation in my new position—both from me and from the team—is that it will take me a while to get up to speed,(especially given the complexity inherent to the role), even though I'm not coming in as a junior dev. Therefore, I don't feel the need to pretend that I'm an expert in something that I'm not, and there's no ego hit when I'm being mentored by someone who is technically my junior.
In my city, it seems like most everyone is looking for senior devs—to the point that they leave positions unfilled for months rather than hiring someone they don't consider senior enough. This is madness, and damaging to the industry as a whole. We need to focus more on efficiently developing talent, and Heddleston seems to have some great ideas for doing so.
Would love to find some examples of great cultural onboarding where it's not just the "what" of the work that a new hire learns, but also the why and how, to avoid implicit assumptions and biases from day one...
Does anyone actually work as a QA for documentation? I've been in many projects where "just read the docs" or "go read this doc", and... nearly always it's out of date, or missing key information (like who wrote it, who to contact for access to systems in the document, etc) or so scantily written as to be useless.
Saying "I wrote docs" but having them be abysmal seems to be the norm. People now accept that having unit tests for code is a thing (not always done, but at least a thing) - is there an equivalent for documentation?
Rather than have separate documentation, the paradigm is completely different. Source code generation is interspersed with the abstract flow of thoughts that one usually has while developing.
This style of coding seems to be natural to me, as many algorithms are a set of discrete steps in an abstract sense. Implementing concrete steps and then describing their abstract counterparts seems sort of backwards to me.
"Here's Jim. He's our Widgitsoft guy. He's the only one who works on Widgitsoft. The system is entirely undocumented because Jim knows everything. Yeah, development has been slower than expected lately. Yeah, it would be nice if we could bring on a contractor when necessary, but getting to that point would be a lot of work, and we'll always have Jim."
So that's why your first project here is going to be writing up some stuff so that it's easier to bring future people on board!
Has "get started on a new project by first writing up the documentation" actually worked for anyone in either a company or an Open Source project? If so, I would really like to know how because I keep hearing this advice but I suspect it comes from people who've never done it.
Putting yourself in the mind of a reader is really hard. And documentation, which is necessarily duplicative, can easily become out of date. So yeah, I think novices are often the best people to write novice-targeted documentation, because they understand the reader's needs quite well.
Personally, though, I'd be a little embarrassed to assign a new arrival that if there were absolutely nothing. I think the process is a lot easier if they have some starting point for the docs, even if it's just some headings and bullet points. I'd also sit nearby and give them strict instructions to stop me at any point they were confused so that I could get them back on track. But I think it's a pretty good task on arrival.
This is a good insight: the strategy does work if they have something to work through and a fallback if they are confused.
So it just floated around and new hires basically started with the PDF all over again.
I setup Vagrant, wrote provisioning scripts, wrote a README, and checked it in after I had figured everything out.
The next employee to join was setup in a day instead of 2 weeks. It worked out great for me.
To be honest, it was a kind of frustrating onboarding experience, but it definitely met the team's goals with a minimum of disruption to people who were shipping features.
Everything in that situation came down to documentation and I spent my first couple of days just chasing down the "correct" IT person to setup all of my accounts (company network, version control, bug tracking software, customer network, remote access, email - each required a different person and I had to ask around to find out who they all were). I commented that having one IT person who can handle everything would be ideal; but I had to settle for creating a list of "who to contact for what". This still shaved days off the next person's lead time.
Simple stuff like having a development machine ready to go (installing Visual Studio, an Office suite, etc) when the new person arrives really makes a difference. There was a learning curve w/r/t the actual system but the new person didn't have to switch gears between hunting people down, installing a myriad of in-house software with which they have no familiarity, and other general "drinking from the firehose".
I took some stabs at making the firehose drinking not as overwhelming; but I didn't do as well as I wanted.
The organization's attitude mattered, in retrospect. Bringing on new people took a significant amount of time (still does but it's better) and everyone did what they could to help me document the process. I imagine if the organization had not been incentivized to help me, then I would have failed and "first write the documentation" would not have worked at all.
I have never seen a wikki stay 100% in sync with the real world. But make people edit the wikki as part of using it, and things change.
I originally thought that I was just unlucky, but when I asked around I found that I had an above average experience, at least among people near me who started recently. Unlike many other folks, I was actually able to get a username/alias, a computer, and an office. I don’t know what folks without a username do since they can’t even start clicking through the necessary EULAs to get permissions to do stuff, let alone do any actual work.
I’m not sure how it is in other parts of the company, but if you imagine that it’s similar and do some back of the envelope math on how many people get onboarded and how much losing a month (or more) of time costs, it comes out to N million dollars for a non-trivial N. And that’s just the direct cost of the really trivial stuff. It’s hard to calculate the cost of the higher level stuff that’s mentioned in the article, but I suspect that’s even more expensive.
You remove the risk of subtle differences between developers pc's
if your only developing standalone apps I could see it but Microsoft doesn't develop windows or office that way.
Or do you mean that the devs all still have individual copies of the source tree, but they do all their work by remoting in to some big monster server and building/testing there? That sounds.... um.... ungodly slow. Though I suppose if you are talking about webdev, perhaps there is no build step, so it might not suck quite as much...?
It sounds like a very different world, and I'm struggling to understand what you mean.
I never worked on Windows or Office, but I did work in devdiv for a while, and at that time Microsoft certainly did develop Visual Studio in the traditional way. There were build farms, to be sure, but they were used for occasional checkpoint builds and for testing. For daily work, we ran the ol' edit/compile/link/run/crash cycle locally, on our own dev machines.
All you need to set up a new user is a bog standard pc and a new account set up on the server.
Its a lot easier to keep dev test and live identical than 20 or so developers pc's
And even when we did local development (oracle forms) all the code was checked in to a central server which was used to produce a daily build.
How do you think IBM mainframe development is done?
I come from a personal computing background, where it really doesn't make sense to talk about "developing on exactly the same hardware it's going to run on" because you cannot know in advance what that is going to be. The kind of thing you are talking about makes even less sense in the embedded world, where cross-compilation is the rule and the target machines are likely not capable of self-hosting a toolchain at all.
Obviously this is quite subjective, and depends a lot on what type of development you are doing.
If one person accidentally saves a file that has a syntax error or something, does it crash the server for everyone?
What tools do you use for development?
I've been learning to interviewing potential hires. One of the questions I ask is, "Do you have any questions for us?" The questions can tell a lot about the prospective hire.
Turn this around: "What is your onboarding process?" is a great question from prospective hires.
This past year, having taken a number of short-term contracts at small teams, I've learned the hard way how to survive getting thrown into the deep end. You have to get really aggressive about communication, especially on a remote team. A lot of expectations can get lost. It's possible to survive and thrive without a good on-boarding process, but you have to step up and assume that responsibility yourself.
This isn't everyone's thing, and often feels like straying into rude, invasive behavior -- and from the startup's perspective, you lose a lot of great people too -- so asking this question will give the prospective hire an idea of whether they are getting set up for failure. Even an honest answer from the potential employer, "We don't have one, we are very busy and everything is really chaotic here" will tell you a lot about expectations (for both parties) within the first couple weeks of starting work.
And obviously, if the potential employer gives some BS in lieu of a straight answer, why waste time joining?
Kind of crazy...
More broadly, I think people consistently underestimate how much you can get done with a very small team at a startup and, simultaneously, underestimate how many engineers it is possible to throw at a single product.
It is a relatively simple website that allows you to search apartment listings - essentially a very pretty CRUD app.
What are the rest doing?
So assuming at least 5 people per team thats already 25 people ... why is it so hard to understand that building anything at scale involves lots of man power?
So I heard you like x.
How did you get started with x?
Tell us a few things about x.
In addition to those things, could you tell us something more about x?
Is there anything else you want to say about x?
But very interesting nevertheless! :)