My dad could fix anything. He worked as a mechanic in the mines of the Iron Range where I grew up and spent his days keeping the trucks and shovels running. Then he would come home and fix things around the house: the toilet that wouldn’t flush, the door to the kitchen cabinet that wouldn’t close quite right, the automatic transmission on mom’s goddamn car. And if he couldn’t find them, he had a handful of half-finished projects to choose from out in the barn at any given time. Growing up around a guy like that, you develop an appreciation for those who seem capable of handling whatever comes - within a certain context, at least.

Fast forward thirty years or so, and I’m still useless when it comes to fixing things around the house. A lot of other things have changed though. The amount of information continues to grow exponentially - more than doubling every two years, say some - and knowledge workers continue to further specialize, assigned ever narrower responsibilities. The hero for these times, the most coveted asset for most IT organizations is the elusive full-stack developer. But when the vast majority of recruiters and managers are being rewarded based on how well they match the skills or keywords in a resumé to a job description prepared by someone else, you get…

Yertle sez: I can haz Railz n CoffeeScript, plz?

The goal is to have developers who can work intelligently and autonomously on a production application, and in the case of early-stage startups and one-man shops, that’s not just a goal but an imperative. Just ticking off the client-side and server-side scripting boxes is not enough. A real full-stack developer needs better depth and better breadth.

Nouns: stack depth

Developers are often treated as a commodity, measured and weighed based on the set of skills they can claim proficiency in. But this is a false economy that starts with those who trade in “development resources” and adopted up by the developers themselves who combine it with the already present narcissism of small differences to create a pecking order. Hip & new beats tried & true.

Real full stack developers can do more than write code. They have an understanding of the technical environment and business context into which they are sending their code.

  • Infrastructure: networks, operating systems, storage and backups, web servers, database administration, cloud services
  • Web application frameworks: Ruby on Rails, Django, J2EE, .Net, Node.js
  • Client-side scripting: Javascript and all its various flavors, ActionScript if you must
  • User interface implementation: HTML5, CSS, Sass
  • User interface design: information architecture, interaction design, user experience, graphic design
  • Marketing, analysis: analytics, reporting, A/B testing, SEO
  • Industry knowledge: domain knowledge

This is only the view from 10,000 feet. In reality, every one of these areas is a fractal - a stack of stacks. The closer you look, the more you see that each subdivision is a universe of its own, and attaining mastery in any of one these disciplines is a career-long process - probably not achievable for someone with “4+ years of industry experience”. Realistically, you’re looking for someone who can claim guru status in one or two of these layers with familiarity in all or most of the others.

Stack definitions depend on contextual factors like platform and organization. One person working solo on a product for a thin vertical is going to have different needs than a manager hiring into an IT organization with hundreds of staffers, and the technologies and activities required to build a product for the App Store or integrate with a lot of black-box enterprise applications will look very different.

Verbs: stack breadth

Unless you’re a college professor or Malcolm Gladwell, you’re probably not being paid to sit around knowing things. All the skills in the world won’t yield a return unless they’re applied, so my stack includes a wide range of verbs that work as modifiers to describe what’s being done in each of the layers.

  • Making verbs: code, program, hack, develop, configure, implement, deploy
  • Planning verbs: design, draw, sketch, architect, arrange, conceive
  • Controlling verbs: manage, conduct, supervise
  • Supporting verbs: secure, lock down, support, test, write, document, mentor

While the differences between some of these words are subtle, there are differences. As a developer, I know when I’m programming and when I’m hacking, and I expect that someone using either of those terms knows it as well. Verb choices must be based on shared understanding as well as identifiable experiences. Having read a lot about people who have made things does not make you a maker.

Verbs should be muscular. One of the weakest words that I see repeated over and over in this context is “provide”. (“Use” and “manage” are also contenders.) It might mean “solve a problem” or “be responsible for”, but there’s usually no way of knowing based on the context.

Verbs are best when delivered without qualification. Austere use of language breeds clarity and understanding, even if it requires referring to the dictionary now and then.

What’s in your stack?

I’m not responsible for hiring anyone right now, but I am always looking to improve my skills, and I’m always doing so with an ideal in mind that describes the kind of full stack developer I’d like to be.

Does your stack look like mine? How would you rate your capabilities in each of these areas? Are there any disciplines or areas that I’ve simply missed?