doodle dabbles

One question that can often come up in your career is the benefits of being a generalist (a jack of all trades) or to really specialize in a particular technology. I think this is a question that doesn’t just plague technologists, but people in other fields as well.

I’ve been tackling this question lately. I’ve been a generalist for many years, giving me a chance to dive into technologies as varied as PHP (early career), Java, C#/ASP.NET, Ruby/Rails, iOS, and Javascript (Ember.js).

This ability has served me really well in past projects where I’ve worked with a number of smaller companies where you have multiple responsibilities requiring proficiency across multiple technologies.

There are upsides and downsides to generalization. The upside is you are always learning new ideas if you keep an eye out. As with natural languages, knowing many technologies helps you learn new technologies even faster. This can be especially helpful when your toolbox of skills doesn’t have the right tool for a particular problem. The downsides are that you can reach a limit of how deeply you delve into an ecosystem if you are in and out of that world.

There are many benefits in specialization. You get a chance to deeply understand a subject and forge new ground in that discipline, which can be truly rewarding. But there are risks as well. If you pick a technology that eventually fizzles out, you could be stuck. You also run the risk of running into a smaller variety of problems, bringing down your possible creativity when solving problems that aren’t a good fit for the technology you specialize in (like doing systems programming in Ruby).

But after some introspection lately, I’ve come to a surprising realization — to generalize or specialize is not mutually exclusive. I think a good balance for someone like me could be to specialize in a set of concepts or class of problems, yet generalize with technology implementation of solutions for those problems.

One example is web performance. Optimizing for front-end web performance can involve optimizing downloads, concatenating scripts, and also thinking what to load in optimizing the user experience. But whether you’re applying those concepts to Apache or nginx, or Ruby on Rails or ASP.NET MVC, you are still accomplishing the same goal, but with different technologies. The real value is in knowing what solutions to apply. Once you know what you’re looking for, it’s easier to find out how to do that particular task in a particular technology. Specializing in this problem set requires knowledge of upcoming solutions like the adoption roadmap for HTTP/2, and optimizations to reduce SSL overhead.

Another example is architecting for High Availability. Yes you can get highly specialized in this industry depending on the stack (knowing the difference between MongoDB Replica Sets vs SQL Server AlwaysOn), but knowing the pros and cons of each can help people make decisions.

Of course, there are some technologies that pair well with some industries. A lot of big data work uses the JVM (Hadoop, Spark), a lot of web frameworks tend to shy towards dynamic languages like Ruby and Python. Systems programming has tended to follow a C/C++ route, although lately is seeing an influx of dynamic language developers thanks to languages like Go and Rust.

But I think there can be great value in specializing in how to solve a class of problems, but knowing how to solve them in a handful of different, yet common stacks.

As a source of tech support for my family and friends, I grew frustrated over the years watching them feel fearful of technology. I never thought my loved ones would truly feel independent when it came to using computers. I was a skeptic.

When my cousin, a liberal arts major, got a Mac based on my recommendation (the first of many experiments where I’d use my loved ones as guinea pigs) and tech support questions all but disappeared, I started paying attention.

When my brother, a History major who loves jokes about Henry Kissinger, bought an iPod and had been using it regularly without ever asking me what he should buy or how he should set it up, I was impressed.

When my wife, a conservation journalist, made a professionally looking hard-bound photo album of our wedding, I was delighted.

When my uncle setup email on an iPhone without any guidance from me, the first time he ever used it, I was thrilled.

And finally, when my aunt easily learned how to text on a hand-me-down iPhone after years of staying away from cell phones, I was no longer surprised.

None of these people have any interest in being technologists. They don’t talk about clock speeds, Anti-Virus, or defragging. They talk about reading, planting virtual crops, and enjoying movies and spider solitaire in bed.

All my life, I never understood what it was like to be a fan of anything like a band or a sports team. But watching the people I love enrich their lives in small ways with technology without needing my help, I became a fan.

Thank you Steve for inspiring us, by example, to build technology that disappears as it delights.