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.
Also, I think tools are converging in the most important areas. So eventually it will not matter much which tools you use.
I've been on teams where everybody understands how a compiler is built & when you'd want to write one, why & when performance matters, how Lisp idioms can translate to C++, when you might want to machine-learn a model and why you might want to do it manually first, and many other basic CS concepts. The difference is night & day from teams that are filled with people who just follow a tutorial and copy/paste examples from StackOverflow. In general, I've found that a team moves at the pace of the slowest member of the team - fill a team with 1 smart guy and 9 folks who just follow their leads and you might as well have just hired the 1 smart guy.
Whether that justifies hiring internationally and issuing visa waivers, I'm not sure, but good people sure are hard to find regardless of industry.
It equivocates on whether by "exceptional" and "short" we mean absolute standards or relative ones. If we use relative terms, "exceptional" (say, the top 1%) people are by definition in short (only 1% of the total) supply.
Of course, 1% of a large population can still be quite substantial.
Why would Indian accountants be experts with U.S. accounting practices and tax laws? Would they be amazing at dealing with customers and auditors? What makes you say they'd be more cost effective than American accountants?
Why would European cab drivers be more effective than American cab drivers? If you put one of those crazy taxi drivers from Eastern Europe here he'd get arrested within hours. Would they provide better customer service when they don't even speak English?
Where as for Engineers, good engineers from China and India are just as good at their subject as anyone and culture barrier is not really a big concern when you are dealing with pure technology, so of course it makes sense to hire top engineers from other countries.
If the foreign engineers are really that good then why do most of them do low level work with low status positions for 70k/year? Sounds like poor use of the "best and brightest" to me...
I never said foreign engineers are better, I said top ones are just as good as top ones here. Most of them work in low level positions for 70k a year but that's true for most American engineers as well. Cost would obviously play a big role for jobs of those level.
But I was replying to the comment about exceptional talent, not the overall job market.
What makes you think they WOULDN'T be as good? I've casually worked with some top tier Engineers from Baidu and Alibaba before this job and I'd say they'd have no problem landing a good position at Google or Facebook any day.
Why are they willing to do that? Because H1-Bs are scarce.
Why is it scarce? Because a lot of Americans have decided that H1-Bs should be limited, because they fear foreign workers coming over and working for less money.
Of course it is not like that. Software engineers from India or China are on average as good as the ones in the US. If something could make a difference is education. Now, if engineers in the US are not as good the ones coming from Asia, the country should do something to fix this issues first by paying more and educating them in a superior way.