Saturday, January 9, 2016

Don't learn a new programming language (yet)

This post has been gestating for awhile and just as I finish it, look what appeared in my Quora feed:

https://www.quora.com/Ive-just-finished-learning-Java-What-is-the-next-programming-language-I-should-study-now

New software engineers often ask this sort of question. They've reached a level of competency in a first language and feel the need to broaden their skill-set and hireability.

There are many good reasons, and situations, to learn a new programming language. But I'll leave those to others. Instead, let's cover some reasons why this can be counter-productive for a junior engineer.

Reason #1 - It won't make you more attractive to employers

While general-purpose languages such as Java, JavaScript, C#, Python, and C++ are useful for a wide rang of applications, companies tend to use each for distinct application areas:
  • JavaScript for front-end web
  • Java for Android, 
  • Objective-C or Swift for iOS, 
  • Python, Node.js, Java, or C# for backend applications (more about this below)
And companies typically have separate teams developing different applications for efficient division of labor. Aside from small startups, different teams will usually handle development for front-end web, iOS, Android, backend services, analytics, and DevOps.

Also, a company's primary 'technology stack' often dictates the choice of language for backend applications - C# for Microsoft, Java for non-Microsoft enterprise space & big data, Node.js for highly-parallel applications, Python for analytics.

Your corporate employer is unlikely to spread your time between developing front-end web pages and Oracle api's or SQL queries.

Reason #2 - Because you can't be great at multiple languages

Sure there can be overlap of syntax and concepts between programming languages. But mastering the nuances of a language takes effort and continuous usage. Switching context always involves some ramp-up time to get back to full productivity.


Reason #3 - You need to learn the ecosystem, not just the language

This brings us to the most important reason. Professional software developers use a wide array of supporting technologies to accelerate their work and improve quality. These technologies make up a platform 'ecosystem' and differ considerably according to the application type. That is, .Net developers and iOS developers use very different ecosystems.

Mastering the ecosystem is essential for Junior developers to advance in seniority.

It's far beyond the scope of this post to detail the ecosystem for even one type of application. But every ecosystem has these high-level categories:

  • Platform SDK's - Languages are rarely used in isolation. Web developers need to know CSS and the HTML DOM, mobile developers need to know the iOS or Android SDK's, and so on. For example, maybe you know JavaScript and HTML, but what about WebGL, WebSockets, Canvas, and other advanced aspects of HTML5? 
  • Design Patterns - You know the language syntax, but have you learned the accepted approaches to common coding tasks? 
  • Cookbook - Besides abstract design patterns, consider getting familiar with solutions to specific real-world challenges you're likely to encounter in your chosen ecosystem.
  • Frameworks - aka libraries. Self-contained code with proven solutions for common tasks. Senior engineers are familiar with commonly used frameworks in their chosen platform and understand the tradeoffs to using them. Bonus points for contributing to an open-source framework or developing your own. 
  • Package/dependency management - Managing all those frameworks can be complicated and problematic, so each ecosystem has accepted approaches to solve this problem. You should know how to effectively use at least one. 
  • Debugging tools - Every developer makes mistakes. So each platform includes sophisticated tools for flagging potential issues, inspecting code, and finding the source of errors. While the concepts are universal, you should know the specifics of doing these in your chosen ecosystem.
  • Test tools - Cowboy coding is out and unit testing is essential for those serious about their craft. You should understand how to write solid test coverage in your chosen language. Once you've got that covered, move on to performance testing.
Rock on!