views:

115

answers:

4

Our company has recently hired a large enough amount of new programmers that our old method of one-on-one ad-hoc "hey new guy who already knows how to program, let's get in a room and I'll explain some of the basics of our large codebase" isn't going to scale. My plan is to get new and newish employees in a room for a week to bring them up to speed as much as possible.

I'm basically looking for a book that talks generically about how to effectively train new software development hires. I've done it successfully in this format at past companies, but I'm thinking that reading through a good book about the subject might have me thinking about the issue in a new way. Any book suggestions?

+1  A: 

pragmatic thinking an learning or herding cats might help you on your task

Nikolaus Gradwohl
+2  A: 

With "fresh" newbie programmers, good books to be given to the team to take home, read and discuss include

  1. Code Complete.
  2. Pragmatic Programmer - Journeyman to Master

Having the team write unit tests is another good way to get them to contribute early. Feathers' wonderful Working Effectively with legacy code is one that I have had some success with (depending on your code base)

Vinil
A: 

I'm basically looking for a book that talks generically about how to effectively train new software development hires.

If I am reading this correctly, you are looking for a book about teaching and team building.

What I have found over the years is that the "soft skills" are much harder for technical people to grasp, for managers to teach, and to build into a team...especially when the team is made up of nerds. Over the next 3 to 5 to 10 years, it will be much more important for your team to be effective at collaboration, than it is to get everyone ramped on the code in the next few weeks/months. I am thinking about topics like: conflict resolution, team building & conflict resolution (when there are a bunch of 'old timers' and a bunch of 'new comers' avoid conflicts and NIH can be tough...this training should be for everyone), creative problem solving (how to effectively brainstorm new ideas or solutions...again everyone benefits from this), effective project management (when you ask for a status, or an estimate, are you sure that they know what you are expecting), and so on.

By comparison, "hard skills" are relatively straightforward to teach and build. I gave my basic approach to learning a new code base in another answer. Hopefully your outline for the technical training will look similar to this:

http://stackoverflow.com/questions/2747427/training-new-employees-on-undocumented-code/2747706#2747706

semiuseless
A: 

If I were to do a week long training class (and I wish I could), I would approach it something like this:

Day 1 – this is the day when we show them where everything is located, train them on how we do things, this is how we do source code, this is how we do a the build, this is how we do code review, this is how we deploy, etc. This day will also include any personal policies they need to know (how to fill out a timesheet, how to request leave, etc.) It may also involve time to fill out any HR related forms, introduce them to key people etc.

Day 2– introduction to the application. Start with discussing what the application does and the business rules. Discuss the design and make sure to explain why things were done that way if known. Developers can do a better job of maintaining and adding new functionality if they understand the whys as well as the hows. Do some exercises in a training version of the application to get them familiar with techniques commonly used in the system. Do a code review after each exercise and make sure you hit them for not doing TDD if you do that. Make sure you look at how they added their code to the source control system and documented their time properly if you change time by project. Give them some purposely bad requirements to encourage them to question the requirements or push them back if they don’t make sense.

Day 3 – introduction to the database - show them where the database is and go through the structure including foreign keys and other constraints. Show them how you want database code written, is it dynamically generated (discuss SQL injection and avoiding it if so), do you require the use of stored procs or ORMS? Show how you commit changes to the data structure to your source control. Go over database naming standards and formatting standards if you have them. Go through a basic tutorial on joins, where clauses, aggregate functions. Have them create some simple to complex SQL code (using the tool of choice – ORM, stored proc, dynamic SQL) and then code review it. Again check to make sure that they properly committed the code to your source control and that they used the appropriate tool and most especially that they got the correct expected results. Then give them a requirements change and have them change the existing SQL code to meet the new requirement.

Day 4 back to the application for a more advanced look at things now that they are familiar with the basics of the database. Do exercises all day to debug bad code, to make changes based on requirements. Make sure to show them how to refactor. Make the exercises progressively harder. If you have multiple applications hitting the same db, do some exercises where changes to one will break the code for the other.

Day 5 morning– cover more advanced database concepts in the morning – talk about performance tuning and debugging. Have them run the profiler that you use and examine the execution plain (or Explain in Mysql I think).

Day 5 afternoon – cover teamwork concepts – who are the go to people for different things, what is the expectation when refactoring someone else’s code, how and when to discuss your ideas for changes to the system (and when not to), how to write a spec if need be, how to ask users questions about the spec, etc.

As you go along through the week, if some people are clearly much more advanced, have some very advanced stuff to give them as exercises instead of the easy stuff so they won’t be bored. If you identify some people who seem out of their depth, note that as well and schedule them for more personalized study the next week. If at all possible have every one pair program the first week at least, the least strong may need more intervention to get up to speed. If you have some who clearly are not getting it, give them a list of exactly what you expect them to be able to do before they can work on code and then have them prove to you they can do those things (and I mean do them in front of you not give you a completed exercise that possibly someone else did) before you let them loose on your code base. If they aren’t up-to-speed fairly quickly (and I’m talking basic skills here not advanced ones), then get rid of them quickly as well. By moving the course back and forth between basic skills and how we do business here and why we have made the choices we have, I think even the more advanced programmers will appreciate the intro. Especially if they get to strut their stuff on some hard exercises when the standard ones are too easy. Also consider getting some to help the less proficient learn. Just monitor to make sure they are helping the other person, not doing the exercise for them.

HLGEM