1. Take a set of requirements, and first identify those reqs for any underspecified elements, or elements where the underlying tech would limit the functionality.
2. Implement the reqs according to the now agreed upon spec
3. Provide adequate documentation and tests for the new implementation.
4. Perhaps most importantly, and rarely, implement the reqs in a manner where the code is not brittle (some small req change doesn't require a huge overhaul) and where other developers can quickly get into and understand the code.
That is, even if you don't need a rock star programmer, if your code base is going to live on for more than the life of the person originally writing it you are going to find that people who can fulfill this role are quite rare.
I think 1, 2, and 4, requires lots of real world experience in addition to training.
> The time and effort they spend in interviewing could be very well spent on teaching best practices to new employees
Assuming that just teaching best practices is all that is required, which I strongly disagree with, a lot of companies (especially startups) don't have the time or the resources to burn on extensive training. The marketplace is fiercely competitive, and they typically need people on the ground right away.
> the software industry in the US invests closing to nothing in training
Many large tech organizations (Google, Microsoft, etc.) invest a huge amount in training. The time it takes for a new hire at Google to get productive is usually about 6 months to a year. All still, they have a high hiring bar that focuses on very strong fundamentals. (They also work very closely with universities and colleges on direction, curriculum, and funding.)
"The marketplace is fiercely competitive, and they typically need people on the ground right away."
" The time it takes for a new hire at Google to get productive is usually about 6 months to a year."
It cannot be both ways as you please. Either these companies are investing in training or not. If they are, then things like requirements gathering, creating specs, and providing tests should not be something difficult to do. This is a very important part of the job, but is not a part that requires super-intelligence.
Everything points to the fact that these companies do not invest in training and are just trying to select a small number of people out of a large pool.
They don't. It's kinda disingenuous to pick phrases out of context to make a point.
But let me clarify anyway:
- smaller companies typically cannot afford to train, they need people on the ground right away.
- larger companies typically do train. Almost every large company I've worked with has dedicated training groups, programs, and staff.
- experience is more valuable than training, which almost all companies filter for
You first point proves what I'm saying. Your second point is doubtful, because large companies are the ones that spend the most time in useless interviewing. The training you're eluding to is tool training, which is essential in a place like Google where the programer has to spend most of his time working on closed technology.
Also, saying that companies filter for experience is not correct. Interviews at most tech companies (especially the large ones) is done to eliminate large numbers of people based on the solution of narrow-minded programming questions. These questions rarely correlate with experience, in fact most people that are just out of college can do so well or better in these questions than an experienced engineer.
Instead, employers - even technical people who interview you - play buzzword bingo, indicating that you would have been better off spewing new frameworks into your codebase unnecessarily. The personal incentives for a programmer are completely misaligned with the actual interests of the business.
The approach that would incentivize this behavior would involve giving raises to people who write the sort of code you want to see, but instead raises often come from dazzling strangers who don't know the long-term consequences of your code (ie, getting a higher offer and asking for a raise).
From my limited experience, competent is getting harder to find. I go into a JavaScript SPA almost daily. I'm not a big JavaScript guy, but I grok functional programming and the language. I constantly see things that make me go, "Huh?" This isn't that they're doing advanced JavaScript things. It's that they are doing it wrong (one person used a regular for loop to side-effect create a new array). These poor practices add up in general, and specifically in an AngularJS app where you've got to accept a layer of magic in the view binding.
Hopefully we get better at competent, especially in dynamic, mostly typeless languages such as JavaScript.