Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Choose Your Battles and Make Your Peace

DZone's Guide to

Choose Your Battles and Make Your Peace

We all want to be that developer whose an expert in all languages and frameworks. Unfortunately, this isn't possible for most of us.

· Agile Zone ·
Free Resource

You've been hearing a lot about agile software development, get started with the eBook: Agile Product Development from 321 Gang

Not too long ago, I was really excited to learn Angular 2, play with node, learn everything there is to know about Java, do courses on anything from HTML to CSS to akka. What I learned from all of this (apart from lots and lots of tech) is that there are so many frameworks, ways of doing, opinions, and utilities that it can become completely overwhelming. This is especially true in the JavaScript world.

So, what have I learned in about thirteen years of software development? You either need to specialize, or you need to choose your battles very carefully. In either case, make peace with the fact that you won't know everything or become an expert in everything.

Writing Diverse Projects

Our small (I mean two-man) team is tasked with writing diverse projects. One day you need to write a Java service with WebSockets on WAS Liberty, the next day you need to provide a JavaScript UI or assist the content (website) team to get a static homepage updated.

Our team also supports other teams with IBM Websphere (Portal, WCM, Liberty), we have upwards of 60 projects on our plate, and with most of our new projects comes the opportunity to experience and learn new technology. This means you don't have the time to get experienced with all of the more modern frameworks and advanced tools.

Coping With Cognitive Load

So, how do you cope with this cognitive load and still get stuff out the door? You simplify.

Think of software frameworks, utilities, and languages as tools in a toolbox. Chances are you'll know how to operate a screwdriver or spanner, and maybe be OK with a power drill, but not so much with the CNC milling machine. So, first see if the screwdriver won't do the job, then look further if it doesn't. Don't try and weld everything if screwing it together is quite sufficient.

To relate this back to software development, make sure you or your team understand the basics properly. That is, spend your time with vanilla JavaScript (e.g. ES2015 and earlier), CSS and HTML if you mostly work on web projects, or Java, C#, JavaScript (etc.) for server side. Then, at least know or do the tutorials of a variety of sizes of tools.

For example, learn what jQuery can provide, then learn what Angular or React adds to this. For server-side development, learn what JEE 7 adds to the box vs standard Java, or maybe have a look at Apache projects. Make sure you understand caching tools, storage options (e.g. caching, DB), communication and API options (REST, SOAP, Websocket, async messaging).

Then, when you need to work on a project that requires a certain set of features (yes, technology supports features, you don't hammer features to fit a technology) you pick the simplest set of tools that will provide the desired outcome. Remember: simplicity, maintainability, easy testing, fit-for-purpose.

Shoot for Specialist or Jack of all Trades, not Polymath 

In summary, if you don't have the opportunity to specialize in a certain language and its supporting frameworks, or if your projects are very diverse, it is important to know a set of software tools of varying sizes (depth of features or abstraction), know the basic tools really well and be able to focus on resolving problems/building features/delivering value instead of punting the latest framework.

Download the free agile tools checklist from 321 Gang. This guide will help you choose the right agile tools to position your team for success. 

Topics:
software development ,agile ,devlife ,specialization

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}