There’s something fascinating about working in different fields: eventually, you realize how what you do in one enriches the others, and vice versa.
Right now I’m working on a project based on MEAN, which is also helping me lay the foundations for an R&D project at the company I work for, scheduled for 2015 and 2016. This project involves an incident detection and diagnosis system for the deployment of four million smart meters, together with a national electricity distribution company. Big data with Hadoop, cloud deployment with Azure, analyzing and using that data, and a service layer for third-party systems to consume will be the project’s essential parts—and the technologies we’ll be diving into over the coming months.
What can guarantee that we’ll succeed in this new project, given that some of the technologies we’ll use are relatively new to us?
If you think you know technology X very well, what makes you think you’ll be able to get the most out of a completely different one? Does it guarantee you’ll succeed with a new stack for a project whose nature has nothing to do with what you’ve done so far?
For a project manager, that’s a risk that needs serious consideration.
A software developer or team can succeed in any project only if they firmly uphold a set of development principles and methods that can be applied to any kind of technology.
So, although specific skills have value, I always think twice when I hear statements like “I’m an expert in C#,” “advanced SQL Server administration skills,” or “front-end developer with AngularJS”—the kinds of things I see on every résumé that comes my way (and, why not, on my own until a few years ago). All of that is great, but it isn’t enough…
If you master a set of principles, you’ll be good and successful in any software project, regardless of the technologies used.
To me, the ideal résumé for a professional software developer would include statements like these:
- Active participation in the following projects:…
- Expert in design patterns and anti-patterns.
- Experience with agile approaches to software projects.
- Knowledge of design principles such as dependency injection, inversion of control, DRY, KISS, SoC, and many more.
- Development with continuous integration and full unit and integration test coverage.
- Experience analyzing code quality.
- Comfortable with code refactoring and clean-code development.
- Expert in creating maintainable, evolvable code.
- Proficient in scalable software architectures.
- Knowledge of usability principles for user interfaces.
- And so on.
These are just examples, but all these skills matter much more than mastering any particular technology. The techniques, principles, and methods needed to produce quality software can be applied with any language, operating system, framework, or development environment.
Any developer who masters these subjects will continue to apply them when starting to work with any new technology.
Alongside a positive attitude toward work and a willingness to collaborate, I’d add statements like “My most recent technical reading includes…”, “Over the past year, I’ve attended events such as…”, or “I contribute to blog X,” and so on. Though perhaps that’s asking too much.
I know it’s difficult when many companies ask for “expert Java programmers,” for example, without realizing that any reasonably experienced developer can get up to speed with Java after a couple of weeks of study and two or three good books. That alone doesn’t mean they’ll do a good job. They will do a good job if they’re used to applying all the principles above with any other technology. Whether project managers understand these distinctions is another matter…
In a sense, all of the above is like the grammar and spelling you need to write a good novel, where knowing how to write one word after another is the equivalent of knowing technology X well.
Can you simply write, even with a good vocabulary, if you don’t understand the grammar that lets you produce quality work?