The Learning Conundrum
When I started working in information technology professionally in 1989, things were pretty easy in terms of choosing a direction to head into. At least in my area (South Florida), you went into one of the following areas:
- Network and systems management
- Database administration
- Software development
- Project management-related tasks (including QA work)
ColdFusion was my technology of choice and it too lasted me nearly ten years.
I took the software development route and for a very long time, it was easy to choose a programming language that you could base your career on. In my case, I started with Clipper (a dBase-based compiler) and eventually branched into client-server development using PowerBuilder, the latter being my goto tool for almost five years.
There's a reason I'm telling you all of this.
The Hamster Wheel
I've been very fortunate to have chosen technologies that have had great longevity but of recent, I've noticed a dramatic change in the industry. The maturation of web development has led to an explosion of new tools that aim to help manage the complex process of building today's sophisticated websites and apps. This is actually a very good thing since for a long time, web development was like the wild west. The formalization of patterns, processes and best practices is certainly a positive thing and will invariably help to build substantially more stable systems.
And a lot of this explosion has been driven by the ease of access to sophisticated programming languages and tools, many offered for free via the open source community. This has enabled developers to rethink the way things should be built and empowered them to build amazing tooling.
This empowerment, though, can be a double-edged sword for the developer community as it feels like we're on a hamster wheel with no brakes that allow us to stop and take things in. It's a bit of a perpetual learning cycle where in many cases, not staying on top of the latest development trends can put you incredibly behind in terms of current development practices. I know I've felt it more than once and in talking with my peers, it seems to be a pervasive feeling.
The Evolution of Learning
I think it's fair to say that software developers have one of the most complex jobs in the world.
You'll hear constantly from others that our field is one of constant learning and that is so true. Developers are rockstars nowadays and it's because we work on cutting edge stuff that makes a tangible impact on large communities of people. And those communities are demanding more information via easier user experiences across multiple form factors. I think it's fair to say that software developers have one of the most complex jobs in the world. So constantly learning isn't a choice anymore; it's a requirement.
Which is why I was mentioning my career path to-date. I think it mimics that of a lot of my peers, where we could comfortably depend on knowing some "thing" for "x" number of years before we had to begin to retrain ourselves. If you're in the web development world, that's no longer the case and in my opinion, a career limiting move. I'm not saying that you need to go off and learn every new library that comes out. Honestly, I think many of the libs and tools being pushed out:
- Are meant to scratch a very specific itch
- Replicate an existing tool and offers little additional value
- Are meant to satisfy someone's ego in a "look at what I built" type of thing
But there is a clear rationale for staying on top of emerging technologies especially when you see your peers chatting about them. And to be clear, I don't define peers narrowly as those I work with. I look closely at people on Twitter, Facebook, Google+, blogs and forums to gauge where their thinking is at. If you're not doing the same, you're doing yourself and your career a disservice.
As you get older (yes I'm touching on age), for most, "time" becomes the biggest limiting factor to staying current. I can attest to this as at age 45 with a ton of family commitments, I have to be extremely regimented in order to dedicate the necessary learning "time" while ensuring I dedicate "time" to my family (which is my number one priority). And I'm confident I'm not alone in this conundrum. I think back to when I was in my 20s and used to write for print magazines (you guys remember those right?) and my colleagues would ask, "How do you have time to do that?". Well, it has come full circle and I find myself asking my 20-something developer friends the same thing.
The thing I've learned is that I can't compare myself to a 20-something because our priorities in most cases are different. A young buck will invariably have more time to focus on the newest stuff allowing him or her to tinker away and even build that next great tool. And that is awesome and I remember those days myself!
As you progress in your career though, it's important not to be lulled into complacency and develop a plan that will allow you to stay up-to-date by being selective of not only the technologies you choose but also the goals you plan on achieving.
Choices, Choices, Choices
As you look at the technologies that are currently available, it's easy to become overwhelmed at where to start, much less what to choose. I empathize with you and you are certainly not alone. Part of the problem is that as developers, we're naturally curious about new technology. I like to call it the "moth to a flame" syndrome:
- Oh look, there's a new lib to mimic web components! (flutter, flutter, flutter)
- This influencer just released this new preprocessor! (flutter, flutter, flutter)
- Oh my god, here's the 4th SaaS that offers real-time backend services! (flutter, flutter, flutter)
The list could go on and on. What I'm trying to get at is that at times, we suffer from attention deficit and try to rationalize it by thinking it will immediately solve a non-existent or future problem for us. In essence, we're technology hoarders doing a "just in case". In reality, it's important to sit back and determine what you're trying to accomplish and how the current suite of tools solve your problems based on where you want to head to.
Part of the problem is that as developers, we're naturally curious about new technology.
For example, I've heard so many developers say that they want to learn iOS only to find that they have no real plans for building an iOS app. If you have the time to do that for fun, more power to you but if you don't, that's time that should be spent learning things that are actually important.
For example, if you're a front-end web developer and that's what you plan on being for some time, I'm of the thinking that ensuring you're up-to-speed on things such as AMD, ES6, Sass and Yeoman is far more important than diving into IPTables, ActiveRecord, WebView or Amazon EC2. Before everyone loses their minds because of what I just said, let's be clear, if you can manage to learn all of these things (for example, a full-stack developer), more power to you because it will make you more valuable.
What I'm trying to convey is that instead of allowing yourself to become overwhelmed with the thought of learning "the full stack", narrow down the scope into easier to manage goals. Determine where your career focus is, pinpoint a handful of key technologies you should be up-to-speed on, and focus on those in order for you to stay relevant within your career focus.
The front-end developer tract, for example, is involved enough and staying current will keep you busy for a long time. Lou Lazaris wrote a post back in 2011 titled "Skills for Front-end Developers" and in many cases he's spot on. If you look at his list, he's specifically targeted front-end technologies that are important to that role. It reinforces my thinking that it's better to narrow down the scope of what you're learning into manageable chunks within the role you're in. But it's also important to filter down lists like these even further. Do I think that CoffeeScript is critical to my success as a front-end dev? Absolutely not, which is why I've purposely not dedicated time to it.
Again, I'm not advocating not learning as much as you can. Despite me clearly being on the front-end side of things, I'm currently working on learning Ruby and Rails because I'd like to learn a new server-side stack to round out my skills. For me, it means sacrificing learning how to use something like Yeoman but I've taken the time to determine the value proposition of going down this route and I think it's worthwhile for me.
Learning comes in different styles. I learn best by:
- Reading a book (a real one with actual paper pages)
- Typing in code examples and seeing results
- Having a mentor I can ask questions from
Others prefer to simply dive into something and learn by the school of hard knocks. Whichever way you learn, having good resources available is a critical part of the equation.
More and more, I've been leaning towards online courses because they've matured to a point where in many cases they're comparable in quality to their onsite brethren. They also afford the flexibility of allowing you to do things on your own schedule (almost always) and to focus on the technologies that are important to you.
In my case, I recently signed up for One Month Rails which offered me the following:
- Flexibility: I participate on my schedule without the pressure of having to sacrifice enormous amounts of my personal time
- Affordability: It's
$49$99 and seems to be well-structured for the price.
- Mentorship: I can contact the course creator directly and have the support of their community
Regardless of what learning options are available, if you don't set aside some dedicated learning time, it's all irrelevant.
I see this as a jumpstart opportunity that will be complemented by sites like Nettuts+ and Tuts+ Premium as well as books and my community contacts. But ultimately, the flexibility and pace of the course is what I feel will allow me to learn something new in a timely manner. Cost is certainly a factor which you need to weigh versus the anticipated learning benefit and resulting updated skill.
The fact that there are so many online learning options available (many of them free) makes it substantially easier to keep your skill-set current, especially if you're methodical about what you want to learn (for example, don't be a moth).
But you need to carve out the time to learn. Regardless of what learning options are available, if you don't set aside some dedicated learning time, it's all irrelevant. I've personally found that spending one to two hours, two to three times a week immediately after work seems to work well because my mind is still in developer mode. I recently chatted with a friend who finds it better to wake up very early (6am) and focus on learning during the first few hours of the morning before starting work. That way, he's fresh and focused, free of distractions or concerns about his job.
My good friend and badass developer Joe McCann offered this great feedback:
"The one bit of knowledge I'll add is that the number one thing I learned studying philosophy in college was not what I was learning, but how I in fact learn things. Truly understanding how one learns, understands, etc. is key to learning a new skill or enhancing current ones.
If someone learns by reading a book or writing down notecards or hearing it via lectures, all of these are available to use now online. It's a matter of understanding how you learn and then going and seeking the proper medium to do so."
It goes without saying that I think Nettuts+ and the various Envato properties offer some of the best online learning options around. In addition, here are a couple of learning sites I've used and recommend:
- Codeacademy: Learn JS, Ruby, Python and more via their interactive site
- Ember 101: Ryan Florence did a bangup job creating screencasts that walk you through the process of learning Ember
- Why's Poignant Guide to Ruby: The style takes some getting used to but it's definitely a great resource for learning Ruby
- Egghead.io: Focused almost exclusively on AngularJS and recommended by a lot of community members
- The Ruby on Rails Tutorial: This is the goto tutorial for anyone just starting off with Rails development
If you want something a little more structured and hardcore, a new trend are onsite bootcamps where you will invest a considerable amount of time learning how to use the newest technologies. Just note that many of these require you to move to where the bootcamp is being held and commit full-time to it for a number of weeks. Also, these courses are pricey running into the thousands of dollars in exchange for the more personal learning experience. I've personally participated in the Bloc.io bootcamp but didn't require moving. While I wasn't able to finish it due to time constraints, I would recommend it. Here are some of the bootcamps that have received a lot of positive press:
- Bloc.io: Well structured course that will run you through up-to-date technolgies and provide you with online mentorship via email, chat or voice. Doesn't require you to move.
- Hacker School: Based in New York, it's a three month onsite bootcamp where you'll work full-time learning programming skills in Ruby and Python
- The Starter League: Onsite in Chicago, IL and partnered with 37signals (makers of Basecamp) to enhance their learning experience.
The site BootCamper has been aggregating a list of the various bootcamps that are available and providing information about them in a searchable fashion.
The main thing is to keep learning and do it at a manageable pace and in a thoughtful manner.
I've been wanting to write something like this for awhile. It's a bit self-serving since it helped me jot down feelings I've had about being overwhelmed with the hamster wheel of learning. Over time, I've been looking at ways to ensure I'm staying on top of things while not burning myself out and I've come to realize that it's impossible to stay on top of everything, even in my own niche. There's just too many devs building too many cools things and not enough "time".
So I've resolved to focus on things that are timely and relevant but may not be bleeding edge and the newest cool toy. I find this to be a much more manageable way of learning for me. And I also think it's important to revisit the tried and true stuff that may not be the latest model car but may have some great surprises for you under the hood. I look back to Jeff Atwood's great post "Why Ruby?" where he discusses his choice for using Ruby to build Discourse and specifically touches on Ruby's maturity and lack of coolness.
The main thing is to keep learning and to do it at a manageable pace and in a thoughtful manner. Really give thought to where you're heading in your career, outline the key things you should be good at within that scope and work towards developing a plan to tackle staying current. There are plenty of flames out there and you don't need to flap your wings to every one of them.
I'd love to learn more from you guys how you stay up-to-date so please be sure to offer your suggestions in the comments.