Posted June 23rd, 2015 by adminguy
This question on programmers.SE
reminded me of an interview I had conducted several years back. The person I was interviewing had spend the past three years working on a fairly large project which used, what were then, state of the art technologies like JSF, EJB, Web Services, AJAX, etc. Unfortunately his work involved a very specific part of the system which only needed Core Java skills. So in three years of working on the project he did not get an opportunity to really understand the wider technologies the system employed.
I have seen several resumes where people put cutting edge keywords simply because the system they worked on used them, even when they did not work on those parts directly and had little to no knowledge about them. I was glad this person did not misrepresent himself, and was very honest about the technologies the system used and the technologies he was intimate with. It turned out he had a lot of passion to learn but did get a chance to get familiar with the wider system because of an overwhelming work schedule. We hired him for his passion and the pro-activeness he showed in learning as much as he could despite the limitations the work and schedules assigned to him.
It's not uncommon for developers to get pigeonholed into working on a small part of a large system, without getting an opportunity to expand their skills to the entire stack. Sometimes developers don't learn because of apathy, but very often work schedules can get so overwhelming that there is little energy left to learn at the end of the day. I can't talk much about apathy, but all is not lost if you are in a situation where you cannot expand your knowledge because of a very demanding work schedule. There are several things you can do within the set of current limitation to grow your understanding of the field and overcome the risk of stagnating your career.
Grow deep roots
Work and knowledge requires both depth as well as breadth, and knowledge in one field is often transferable to other areas. Your breadth in the current project may be limited, but your depth need not be. So even when your entire work involves just one specific module and there is absolutely no time to learn anything else, you can still expand your knowledge by going deeper into what you are already working with.
If you are constantly curious and always peeking under the hoods of the code and libraries you are working with, you will soon cultivate deep expertise in those technologies, which will help you learn other things when the time comes. Programmers often find that learning a second programming language is easier than the first, and learning the third is easier than the second. This is because software development is full of common transferable concepts. For example once you get a good grasp of concurrency in Java, you will find it fairly easy to understand how it works in C#. Once you understand the fundamentals and limitations of concurrency in Java, you will understand the problem functional programming languages like Scala attempt to solve. Your lack of exposure to C# and Scala doesn't matter. Just by deeply understanding concurrency in Java you are already prepping your mind to understand C# and Scala, rather quickly, when you need to.
So grow deep roots in what you are working with. Your knowledge will make it easier to learn other things when the time comes. and will also work in your favor when you present yourself for the next job interview.
Understand the field
Your tasks and deadlines may not give you an opportunity to work on the larger system with all all those juicy technologies, but that shouldn't prevent you from talking with people working on those parts. Talk to them. Understand how those technologies work. Understand why they are used. Understand how they are used.
You don't need extra time to learn from colleagues. You can do it over lunch or at the water cooler. Ask questions. Lots of them. Most people will he very happy to oblige, as long as you don't mess with their schedules. Not only is this a great way to learn, but also a great way to demonstrate your passion for the broader field in which you are working.
Train your mind
Software is like a giant machine with moving parts. There are certain patterns (often common sense) which keep the machine well greased and functional, and certain patterns which cause things to break. Then there are ways to zero in and identify bugs and there are effective ways to fix them. There are elegant ways of writing code and then there are ways which are so horrible that I won't even talk about them. There are ways to break down a large problem and there are smart ways of doing simple things. All these skills are common regardless of which technology you are working with and constitute what I call essential mind training for programmers. You don't have to put in additional hours after work to train your mind, all you have to do is keep your eyes open and be aware of the code you are working with.
After death and taxes, the only other guarantee we have in this world are software bugs. Even if you are working with a specific module, be assured that you will be fixing plenty of bugs. Fixing bugs is great training for the programmer's mind. Become an expert at finding what is wrong. Ask yourself how you can get to a bug even faster. Develop an intuition for where the problem might be hiding. You will soon find yourself guessing the origin of a bug simply by reading the bug report. This is a very important skill to have. While you work on the bug, ask yourself how the bug could have been avoided by writing better code. Can you spot any patterns in the code that is buggy? Most likely you will.
Training your mind is something you can always do, regardless of any other limitations. One you have trained your mind to function like an expert developer, you will be able to learn and work with new technologies at a very rapid pace. Remember - even though technologies change, the fundamentals of problem solving remain fairly constant. If you can't learn anything else, become an ace problem solver.
As they say - every cloud has a silver lining. If you are caught in the cloud of narrow work and demanding deadlines which make it impossible to acquire skills beyond the small area of your work, use the cloud itself learn things you would not otherwise have considered worth learning.