Each of us no doubt at one time or another has given it a thought. At some point you come to a crossroad and you ask yourself a question. Should I dive deep into my favorite language or a framework and learn every little detail of it? Or should I rather expand my knowledge horizons and learn adjacent tools or technologies or even explore new languages and systems? It can get really confusing to find your way. There are so many arguments for and against. Even if you ask somebody for advice this won’t make the road clear to you, rather you get hints to a number of new pathways to complicate your choice.

Let’s talk closely about the arguments to support those alternatives.

Considering becoming a specialist, you’re likely thinking of turning into some sort of a guru who will know everything about some technology, framework or a product. Specialists are rare so you could potentially land a highly paid job in a company that can’t live without this expertise. Right? Well, theoretically yes, the logic is sound. The reality is of course much different from the theory. The truth is that most companies never reach with their projects that degree of size and sophistication which would require the guru level of expertise. The more of a specialist you position yourself, the narrower is the choice of places to go. Depending on the region where you live there might be none at all.

This is not to say that you shouldn’t learn your tools in depth and should stay superficial. Quite the opposite, learn what you need and beyond. This will increase your understanding of internal workings of your tools. You will write better code. You will find bugs more easily. You will be able to deal with nonstandard situations. You will know more ways to hit a nail with your hammer. But at some point you’ll have to stop digging and look around you. There are likely many other interesting and no less useful things to explore.

One more danger with the specialist approach is evident. In software field everything changes too quickly. New great languages and frameworks appear out of nowhere, shine as a bright star and fade out into nothingness. Tools become old, get replaced by new versions which in turn become old and finally obsolete. Everybody moves on. If you put your money on the wrong horse, if you invest all your time into learning one particular technology, you risk losing the bet if it doesn’t win.

Is the generalist approach inherently superior? The answer is usual: it depends. It has however strong benefits.

For once, it will expand your knowledge borders. You won’t be stuck in the ways a particular technology addresses a family of problems. Knowing a variety of technologies and tools gives you an option to compare possible solutions in every one of them and pick up the one that best fits your task. If we’re talking not about comparable or competing technologies, but about various skills that find their application within one project, it will give you an option to see a problem in various technology layers and analyze it at different abstraction levels. You can compare solution options and decide where and how to address the issue. Suppose, we’re talking about a classical n-tier application where there is a database, business logic level and the user interface. Should you be proficient in all of them, it’s much easier to solve a problem. Instead of optimizing to the end the application code you may look at a problem with a different eye and simply adjust the data model. Or should you better cache a response on the server? What about tweaking the user interface to avoid hitting the complex query multiple times? Or is it rather a conceptual problem so talking to the user might reveal they don’t actually need this thing? There you see. Being able to think in different terms gives you certain freedom of mind to find the most efficient and elegant solution.

But it goes further than that. Being skilled in various technologies makes your skill set more rounded. It effectively turns you into one-man-team. Self-sufficient, familiar with all aspects of the project, able to complete it alone with little or no outside assistance from specialists and gurus. It is already a basic requirement for web developers to have working knowledge of all integral parts of web projects. You have to know your framework, be familiar with some database and be able to create markup for the user interface. We have this and that data to collect and store? Here, I’ve designed the data model, created indexes, wrote the necessary queries and optimized the database for our specific scenario. We need an application to talk to the database? Wait a minute, here’s the code, user input, validation, business rules are implemented and data access layer is done. Fine. Where’s our bright and shiny user interface? It’s right there, your valid HTML and CSS. Would you like some Ajax stuff? Give me five minutes. Now, check it out.

Recognize yourself? You can do all that and more and you enjoy it. Or are you rather that type who has spend the whole life to become a database guru? Or are you a front-end developer proficient in HTML, CSS and semantic markup but you never worked with a database. What? You have fear of databases? No, they’re not that scary really, give it a try some time.

Don’t get me wrong here. I respect specialists and professionals very much. They can be very helpful with their deepest knowledge of the technology. Sometimes they can give you a solution you would never think of on your own. I’ve always felt small but at the same time enlightened after receiving a piece of advice from them. And I’m eternally grateful for that revelation and their time.

Even so, I realize that for the most part projects can be completed without this advanced knowledge. Not that we deliver low quality or create ugly hacks to patch the things we couldn’t work out. Not at all. We just didn’t have any major issues. Not in this project. Not in one before. Not in the one we completed last year. And we’re bald to say we do not expect them in our next project.

All right, you can’t be sure of that. But you know what? You can learn what you need on-demand. As they say, we will cross that bridge when we come to it. I have a book right there. When I feel I’m short of knowledge in some specific area I’ll read the needed chapters. Or I’ll simply google for an answer. These days you can find pretty much anything on the web. And it is fast. Often you find the answer more quickly than that hairy beardy guru guy from the desk in the corner will finish his cup of coffee and manage to come down to you.

Besides, the amount of knowledge and experience of other developers stored and shared through the means of the web is huge. You often stumble upon somebody’s writings that offer you revelations you may not even find in a two-thousand-page book. Yes, gurus also hang out online. The last time I was involved in some technical discussion, one senior guy from Microsoft appeared out of nowhere and brought us the unexpected but much needed enlightenment.

And if you’re thinking about your career options, then be relaxed. They can actually be better this way. There are lots of small and middle companies out there who have the need for a guy who can do many things. It’s not that they try to replace the whole development department with one multi-skilled individual to optimize costs. It is rather the fact that their projects can be done with just a handful of broadly skilled people. There are no untypical situations, unusual scenarios or border cases which only a guru could work out. In fact, these companies would have no suitable work to give to such a highly skilled individual. A guru would probably get bored to death in a month or so then leave. Here you come, a well-rounded software developer who can take care of many things. In fact, you could probably leave your daily job and go contracting or even open your own development shop now that you’ve familiarized yourself with all aspects of developing a product.

If I recall my early days in programming, my most interesting and at the same time depressive time was the beginning. I simply knew too little. I could write programs which worked but every now and then I was getting stuck in something I didn’t know. I’d like to store some data in a database but I have no experience with databases. XML would be good to store these settings but I never worked with it. Actually, hardware acceleration could give us a breakthrough here but I haven’t programmed for 3D yet. My custom network protocol? It’s so big and complex, how can I do that? Publish a web site? I only know a few HTML tags. It was difficult to complete anything then.

Now it brings much more of enjoyment to program when I can do many various things. More importantly, I can begin and complete things without constant assistance at every step. I can play my own game. GDI works too slow? I’ll make it over 3D. Yes, polygons, lighting and textures, they’ll all be there. Need to store and retrieve user input? I’ll put it in the database. Here, I designed a data model for that. Code actual application? Sure, right there, with all those layers, OOP and whatnot. Create a UI? Here you go, valid HTML, CSS, tableless design and semantic markup. This control is actually too big for its function, it might distract users. And to get to that option they have to click that button to open a dialogue. But they’re all likely to want to go there. Let’s put this feature directly on the main screen. Think usability. Somebody drew a bright red button close to out blue toolbar with a grey background around? It doesn’t actually look nice in our color scheme. Fix the design. Where do we stand if someone looks for these specific keywords in Google? Not high enough. Let’s put these keywords closer to the beginning of the page and remove unneeded keywords from the page title. We can do a little search engine optimization on our own.

It provides an immense satisfaction when you can do many things yourself. You develop a flexible architecture and write quality code. When you open a database, it’s all known and familiar. No need for a database expert. You can create a UI without this master front-end developer. You can even create a nice design and choose a color set without that expensive web design agency. No, it won’t win the design award. But it will look nice and it will be good enough. You can arrange the controls and structure of the menus so that the interface is easy and intuitive to your users. And yes, you can do it yourself, without those usability experts that will cost you half of the budget.

As long you love what you’re doing and striving at getting better, there is nothing you can’t master with will and dedication.

It is also my belief that a good developer should be skilled in various techniques. There is no good reason to be stuck in databases and ignore the application architecture. It’s not all about database performance you know. There is no excuse for a system developer to laugh at those “front-end programmers”. The end user won’t see your fancy memory allocation techniques. Just as it is not enough for an interface developer to stay in the darkness of how software works, what algorithms and data structures are used and how we could improve the efficiency of our queries. Or for a web programmer to cast off SEO and marketing aspects as unsubstantial. They’re not. And it is your job to develop with SEO in mind. Or for an applied programmer to create a crazy user interface which will scare off a normal user. No, thank you, please put off your classes, diagrams and design patterns for a while and think about usability of what you have done.

I’ve often felt sorry for developers who were stuck in their microcosm not willing to look outside or admit anything else matters.

Because you can’t do your best if you don’t see the big picture. And if you don’t then the whole work won’t be near as good as it could have been.