Big tech companies are fiercely competing for talent, primarily experienced veterans. Angel and seed funding for tech startups in the NY metro area has also intensified over the past year, leading to more small companies seeking first through fiftieth employees.
The trend for tech company growth is happening throughout the nation, from startup capitals like Silicon Valley, NY, and Boston to smaller tech hubs like Boulder and Portland. There simply aren't enough experienced engineers to go around. Likewise many startups are getting angel and seed funding as more investors scramble to gain ownership of nascent businesses.
Yet rabid investors and competitive hiring aren't changing the nature of the job or startup market. The vast majority of applicants to attractive positions in startups or BigCos are rejected. Graduating from a top school used to be enough of an edge to scale the HR barrier and land that first technical interview, but graduates have become a commodity. Fail to give the approved answer and your application goes into the reject bin.
Advanced network programming and architectures can be learned on the job, through open source contributions, or with self guided projects outside of the classroom. There are more web docs and screen casts in your preferred language for your favorite framework than you have time to study. In addition code bases are changing so rapidly that interfaces and frameworks you learn today drastically evolve in just a few months. If the frameworks are not adapting to the shifting technology landscape^ they face obsolescence against attractive alternatives. Fortunately there's a big push in modern programming languages towards more human readable forms. Structure, syntax, and relationships go a long way to abstracting away details of complex object hierarchies**.
Specialization plus years of experience are on just about every job description. Job seekers which don't have several years of professionally scaling and optimizing relational (SQL) or document databases (Mongo, Redis, and Couch), or designing front end user interfaces for large successful sites need not apply. There are difficulties for even sharp companies which offer unique sample problems* on their job application landing pages, with no known optimal solution. A little research shows a handful of the best heuristic answers and I'm confident the folks in charge of hiring don't want urls to open source git repos.
I'll wrap up on a lighter note. Here's a blast from the past and my favorite rejection, the Rejected videos by Don Hertzfeldt that the post image was taken from.
*= I enjoy the challenging thought and implementation puzzles that people come up. Dropbox has a fun one with algorithm and code for squeezing as many rectangles into a container as possible (2d packing)
^= changing protocols (oauth, http, pubhubsubbub) require periodic interface updates. Utilizing cutting edge cloud services and hosts require knowledge of both their interface, features and limitations (read/write access times on virtual systems). For example datastore on the google app engine requires background processes to perform migrations, and disk access on shared file systems can be a serious bottleneck and rationale for running on bare metal physical systems.
virtual LibCreatedObject * MyEyes( const LibArray< LibObjectType *> &my_list) const
Compare this to more elegant alternatives:
or for folks that are against polluting global namespace
var my_eyes = function(my_list)
where my_list has been declared earlier and object_types have been added to it. This looser organization requires more careful checking, but it's shocking how much line noise is removed and a blessing in how it makes the act of coding more enjoyable.
Static type systems require rigid attention to class definitions, while dynamic languages focus more on methods and interfaces.