Skip to main content

Generalist vs Specialist - Implications for Engineering teams

how to mix generalists and specialists in one team?
In my previous post I looked at a very superficial level at the distinctions between being a Generalist and being a Specialist, and laid my own cards on the table: a lifelong Generalist in more than just technology skills.

Today, let's go a little deeper, into what makes a Generalist or a Specialist and how they mix together in a software engineering team.

There is a place - there is a need, even - on a software team for both the Generalist and the Specialist. Whether you are wired to go ever-deeper in your expertise and specialization or to go intermediate-deep on any given topic but apply that same depth across a wider breadth, you have a role to play.

And we need each other; there are both strengths and weaknesses, pro's and cons, advantages and disadvantages in each approach. A need to balance each other,

The Specialist's Deep Expertise

I used to work with a fellow who was a lifelong fan of the Toronto Maple Leafs hockey team. Not just a fan, a fanatic. But his fanaticism expressed itself in his love of the lore and the history, not in the outward expressions of the super-fan. You were unlikely to see him go any further than a jersey or a hat - no face-painting or street-dancing for him. But you were also unlikely to ever win an argument with him about the facts, figures and trivia of the team. He knew who was their main goalie in 1958 (Johnnie Bower) and could think through and answer questions about how many times they lost the Stanley Cup final (9 times).

The depth of his expertise on the history of the Toronto Maple Leafs always astounded me. (Of course, as a much less-knowledgeable fan of the Montreal Canadiens, I could not figure out WHY he had that expertise!)

A Specialist in the tech world likewise develops an amazing depth of skill, expertise and experience in one or a small number of technologies or domains. They might know the finer points of tuning a database; or be expert in cyber-security or have extensive and deep experience with AWS services and architectures.

Like my Maple Leafs fan friend, some of their knowledge will be at their fingertips: the benefits and subtle differences of each type of load balancer, for example. Other times, their expert, specialist knowledge will give them the ability to quickly think through a problem from different angles and pull the most critical facts together.

That makes them most valuable when facing the knottiest, most difficult, most technically complex challenges. Call this their greatest strength.

Some of the strengths of the Specialist are

  • Deep expertise and ability to solve the hardest problems
  • Quick recognition of patterns and solutions
  • Authoritative presence with trusted guidance and mentorship
  • Attuned to subtle or nuanced scenarios, failures and optimizations

Of course, it is not all honey and roses for the Specialist. The cliched critique is that they miss the forest for the trees, so focused on the finer details that they miss the wider picture.

Some disadvantages of a Specialist include

  •  Narrow focus, overlooking implications beyond their domain
  •  Bus-factor of one, when the team becomes too reliant on the specialist
  • Boxing in - specialists can struggle to shift between different types of work or different tech stacks 

The specialist's advantage isn't merely knowing more facts. It is having developed an intuition about the problem space through repeated exposure.

The Generalist's Broad View

A generalist, like me, will not have the exceptional depth in a particular technology or domain that the specialist does. Instead, they will bring a working knowledge of a wider range of technologies, disciplines, domains, components.

Think of the solutions architect, able to draw on a knowledge of networking, storage, compute, security, optimization, cost and other factors in designing a robust and resilient solution. Full disclosure, I am a certified AWS Solutions Architect (Associate-level).

A Full-stack developer also tends in the generalist direction, moving easily between front, middle and back tiers of a system. Although they can become very specialized in the particular stack through which they move.

Some strengths of us generalists include:

  • Ability to adapt to and move between different technologies or roles
  • See and actively connect work and concepts across boundaries, be they system, technical, architectural or organizational
  • Versatile in playing many different roles, wearing many different hats when needed
  • Bring ideas and solutions from one domain into another 

But as with the specialist, these advantages come with trade-offs, like:

  • Solutions will be more shallow and may miss important complexities or edge cases
  • Broader responsibilities lead to increased context-switching and reduced concentration
  • Challenges maintaining even intermediate depth across ever-growing fields

We generalists show our value in problems across components, tiers, organizational or other boundaries. Where a specialist can fine-tune the database query or back-end algorithms to address a performance problem, when it is caused by a larger end-to-end inefficiency, the generalist will be better placed to solve it.

Or in the face of ambiguity or not-fully-defined problems, which the specialist might send back as needing more work on the Product side, the generalist is well-placed to work with Product to define and decompose the problem.

Team Management Challenges

Given the reality of people with different interests, experiences, expertise and career goals, two challenges of managing real-world software engineering teams occur to me.

First is finding the right balance.

A team filled with only specialists will have phenomenal abilities to solve very complex technical challenges within the bounds of their expertise, but struggle once they must reach beyond those edges. A team of only generalists may excel at delivering routine features and fixes but struggle when the deeper and more vexing problems arise. 

Some blend of the two seems, on the surface, the right answer to team construction. In my experience, the specifics of exactly what that blend and balance looks like varies, depending on the context of the organization, problem domain and nature of the challenges ahead.

A startup might benefit from having more generalists, maximizing flexibility and ability to adapt rapidly to changing inputs to deliver end-to-end solutions.

An infrastructure or platform team would need more specialists with strong understandings of their systems.

An R&D team might demand even higher levels of specialization, to push the envelope of what is possible in the domain.

A product-driven team, especially an environment with sometimes-fluid requirements, would be more successful with a more generalist-heavy balance.

These are obviously sweeping statements; your mileage may differ in your specific context. A startup in the field of cryptography or cyber-security would need much deeper specialization than my generic statement earlier.

The second team management challenge is how to avoid accidental specialization. 

You know the tendency of both managers and teams: the Dev who built feature X is the one who gets assigned the next hundred tweaks and fixes to that feature. After all, they know it best, they will finish the task faster and better than someone else.

Basically:

  • The Engineer gains expertise in a feature
  • More related work is assigned to that engineer
  • Others have fewer opportunities to learn
  • The engineer becomes the local specialist

A series of perfectly rational manager decisions made sense in the short term. But ultimately lead to a more fragile team, dependent on the expert.

The challenge is how to foster a healthy team with local expertise alongside adequate knowledge-sharing and generalized knowledge. It will require the manager to deliberately accept some short-term inefficiency, whether through pairing, rotation, or cross-training.

TL-DR 

Specialists bring depth, understanding difficult problems and their subtle consequences.

Generalists bring breadth, connecting disciplines, navigating ambiguity, and crossing boundaries.

A specialist's initiative may identify an opportunity nobody else understands. 

A generalist's initiative may recognize a problem spanning multiple systems.  

A specialist's diligence may catch a subtle technical flaw.

A generalist's diligence may uncover a failure at an integration boundary. 

To create and foster an  effective software engineering team, we cannot choose one model exclusively, but must find the right mix for our specific context.

 

 

 

 

Popular posts from this blog

Trigger Windows Scheduled Task from Remote Computer via Jenkins

One thing I love about working in Information Technology is the opportunity - the NEED - to constantly learn new things. If a week goes by in which I have not looked up something on StackOverflow or other message boards, I start lobbying my team for more challenges. This week, I learned the power of running " SCHTASKS.exe " from a command-line script for a remote server in a Microsoft Windows environment. If you don't know Schtasks, you can read up on it here: https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx In a nutshell, it is the command-line interface for the Windows Task Scheduler, and allows you (or a system administrator) to create, change, run, query, terminate, and delete scheduled tasks on a work-station, either the local one or a remote one. Not all of the features are available in older versions. In my scenario below, this was relevant as the local computer will be a Windows 8 machine, and the remote server is, shall we ...

Abort a Git Merge or Cherry-Pick

Recently a colleague of mine used the Git Cherry-pick feature to bring one of their commits from one branch of our repository to another. They hit a somewhat complex merge conflict and, in trying to resolve all of the conflicts in the file, they got confused about what needed to be done. They came to see me with the question: can they cancel their cherry-pick and partial merge, and start over? The answer is Yes: it is possible to abort a merge or a cherry-pick Git operation. Most of the time it is not needed; with a little work and human intelligence, the merge conflicts can be resolved without too much trouble. But sometimes, in cases like my colleague faced, a more complex merge winds up confusing the developer, and they want to go back and start over. If you use git from the command-line, it’s as simple as: git cherry-pick --abort or git reset --merge On my team, about a quarter of us use Git from the command line, but most - like my colleague in this story -...

How to do Git Rebase in Eclipse

This is an abbreviated version of a fuller post about Git Rebase in Eclipse. See the longer one here : One side-effect of merging Git branches is that it leaves a Merge commit. This can create a history view something like: The clutter of parallel lines shows the life spans of those local branches, and extra commits (nine in the above screen-shot, marked by the green arrows icon). Check out this extreme-case history:  http://agentdero.cachefly.net/unethicalblogger.com/images/branch_madness.jpeg Merge Commits show all the gory details of how the code base evolved. For some teams, that’s what they want or need, all the time. Others may find it unnecessarily long and cluttered. They prefer the history to tell the bigger story, and not dwell on tiny details like every trivial Merge-commit. Git Rebase offers us 2 benefits over Git Merge: First, Rebase allows us to clean up a set of local commits before pushing them to the shared, central repository. For ...

Updating Oracle javapath symlinks on Windows

A Java-based application on my Windows 10 machine recently started prompting me to upgrade my version of Java. Since I wanted to control it myself, I declined the app's offer to upgrade for me, and downloaded and installed the latest Java 8 from Oracle. In my case, Java 1.8.0_171, 64-bit version. The upgrade went fine. But when I launched the app, it again said I needed to upgrade. Why was it still looking at the old location? I made the change using Settings, to change the JAVA_HOME environment variable to point to the location of the new upgrade. But no change, the app still insisted that I needed to upgrade. A little research into the app's execution path showed that it was using c:\ProgramData\Oracle\Java\javapath to find Java. When I looked in that folder, I found symbolic links to my old Java installation. Normally, this hidden bit of information gets updated automatically in the upgrade or installation process. I have read of cases where, when downg...

Git Reset in Eclipse

Using Git and the Eclipse IDE, you have a series of commits in your branch history, but need to back up to an earlier version. The Git Reset feature is a powerful tool with just a whiff of danger, and is accessible with just a couple clicks in Eclipse. In Eclipse, switch to the History view. In my example it shows a series of 3 changes, 3 separate committed versions of the Person file. After commit 6d5ef3e, the HEAD (shown), Index, and Working Directory all have the same version, Person 3.0.