Of course, any time we do anything we "train" ourselves in it and get better at it, but if this was the only training one had, it would be what Grove discourages and refers to as "the customer paying the tuition."
So, clearly, Grove refers to actual, explicit training that is not simply learning on the job. He never goes into detail about how to do this; I assume because it's such an obvious, in-grained thing in all other disciplines that it needs no details.
Yet I've never seen it done in software engineering. So how does your organisation do it? Why do you think it works? What have you tried that didn't work?
Have you decided not to do it? Why?
The next day, and throughout the first week, give them deeper dives into individual systems. Every time you do this start from the overview again, so they're reminded. Always keep it a conversation, go back to different parts when the engineer asks questions that show they haven't understood something you've gone over before. This is normal as you're unloading a lot of knowledge you've built over time. Make sure you keep focused on the mission of sharing knowledge and do not let yourself get lost into too many side chats about how your pet peeves are never prioritised to be fixed and how you hate technical debt - this is not the time.
Once they've setup their company emails and whatever your HR demands, start by giving them a simple task and leave them on their own with the expectation that they will reach out once blocked. Check if they're blocked yourself multiple times during the day. A new dev might be reluctant to reach out for fear of being perceived as too junior. Let them know this is not a concern, the concern is to ramp them up as soon as possible and questions are the best way to do it.
Remember to ask them about the pace, how they're feeling, what they're struggling with or if they're eager for more. Some people will prefer a few more days reading docs, others prefer to jump in to the work straight away. I've seen both approaches work and try to adjust myself to the way the person likes to work best.
Increasingly give them more complex tasks, have them pair with other engineers. Remember that not only you're onboarding them on the systems, you're onboarding them to the people. Make sure their work is throughly reviewed, take your time to explain why things are done in certain ways, take all oportunities to give further back context.
As time goes on, apply a similar playbook to give them extra duties, complex issues to solve, more permissions, etc.
PS: Grove's book is great, definitely recommend it
Code review is training. Do you consider training one of the primary purposes of code review? In my experience, different teams are highly variable on this. But avoiding bike shedding, explaining context and knowledge without dictating direction, and asking good questions shares knowledge and makes everyone improve.
Postmortems are training. Learning what went wrong and what could be done better next time is close to the definition of training.
Performance / peer reviews (when done well - a rarity) are training - they are a time to step back and think at a higher level about where there's room for improvement and what to concentrate on. Andy Grove explicitly talks about performance reviews as training: "giving reviews is the single most important form of task-relevant feedback"
If your definition of training only includes classrooms, learning budgets, conferences, etc than I encourage you to broaden your view as to what constitutes training. If these venues help you learn, then I hope your organization supports you access them. But don't mistake their absence or their low prominence for a lack of training with an organization
1) Training isn't a separate exercise from doing the work. We learn in this job, forever. Whether it is a new tech, a new codebase, or simply improving our skills, all coders learn almost every day. We all look back at our code from a year ago and realize how much we have grown.
2) When worrying about "the customer paying the tuition", coders aren't the problem. That concept is more a problem when a new tech comes out, and all the consulting firms will send you expensive consultants to implement it for you - clearly, they have no experience either, so you are paying full rates for their learning curve.
Now that I write it out, it seems like the key difference is whether you are creating tech, or consuming tech. Training applies to consumption, but creation is a completely different process.
"Enablement" is encouraged and provided liberally. There are pros and cons about Red Hat just as every company, but this is the first place I've been where I felt like I was the bottle neck in advancement. At past companies I had to buy my own books, build my own labs, etc. Red Hat provides a RHLS subscription for free to employees, which comes with labs and such (if you work for a company that gives RHLS subs to employees, you are really shorting yourself if you don't take it. It's amazing how many companies I work with as a consultant have available/purchased subs but no employees wanting to use them). There are also internal/partner resources as well. There is enough training available for free to employees/partners that you will never consume it all.
I don’t try to hold them back.
I was also able to send a team member to SF earlier this year for a week to a ML bootcamp.
And last year, I got a few members from multiple teams to attend a 3 day state security con.
Beyond that, I do try to be a mentor, and try to engage by answering why we do what we do and the historical context of how we got there.
I guess I also have some informal documents that are part of a curriculum, but there is no official single source of truth.
- weekly training sessions where devs share experience and what they've learned or organize workshops for each other
- book clubs where a group of people discuss a technical book/paper they're reading together chapter by chapter
- regular hackathons (I count them as learning) every 3 months where you can play with whatever tech you want
- I buy them practically anything they want in terms of education and encourage them to do it on our 1:1s
- the usual pairing of juniors and seniors for mentorship
- a #learn channel on slack where people post interesting new things related to our tech stack or insights
I don't know how others feel, but please don't overload me with more company info than needed. I almost certainly don't remember it. Let me fit in and find it in my own after the initial high level overview.
I think for large and complex domains, it allows us a competitive advantage as our developer costs stay lower due to rapid onboarding and rapid growth of individuals. Very quickly our team members rise to the average skill of the whole team. We're a small team, and yet stay very effective as an aggregate over long time spans. Also the quality of the codebase stays extremely high, with very high test coverage and a robust CI process.
I consider pairing as another tool in the shed for dealing with large complex domains just like strong static typing, a good type system with union types and no nulls, static analysis, and unit testing. These are all impossible see if they impact productivity because software productivity is unmeasurable. However, I'd want all of them as competitive advantages in a large and complex domain. Plenty of people reasonably debate their value, but many domains aren't complex enough to warrant the extra costs.
I'd expect that if we were doing standard CRUD work, it would be overkill vs just throwing more bodies at the problem, but CRUD is a relatively small part of our product (large bank financial analysis and workflow)
We also do:
- reading clubs
- weekly 10% self-directed and dedicated research time
- additional research time with sign-off from a lead
We do pair programming for many years, it works pretty well in terms of training. The best part is you don't have to pull your hair off to come up with a perfect training plan (which most of the time does not very work as expected). You can consider skill is somewhat infectious, and then by pairing and switching pairs, the skill will naturally spread across the team in a passive manner.
If your project cannot afford pair programming, maybe you can exchange the training budget with just pairing with graduates or make it only happens in the onboarding period.
My two cents.
When there is a question, we give the answer, but also try to give the more context as possible , with a link to a document or slack conversation.
[1] https://erickhun.com/posts/sharing-knowledge-in-a-remote-tea...
This isn't true AFAICT, we reinforce our method and knowledge - if that's wrong/limited then we reinforce a poor ability; I suspect that makes it harder to learn an improvement later. As I age I find I fall in to old habits even when I know better ways, the older way feels 'natural'.
Practice makes permanent not perfect.
This is the only company that I’ve received real training from in a ~15 year career
(I have had a few small 1 day or less internal courses.. “negotiations”, “leading people” etc)
- Senior developers teaching juniors.
- Encouraging internal talks for whatever topic.
- Good internal documentation about processes, tools, and things to know in general.
- Dedicated time for research only, before starting to implement in unknown domains.