You are having your first project. In the beginning, you know almost nothing about programming languages, business domain, development process, efficient practices and other good things. In the beginning, you know almost nothing about political games, external factors, progress reporting, human stupidity, fear of mistake, boredom and other bad things. You can’t do your job effectively. Suddenly, in 10 years, you are becoming a great software developer. Or you are buried by mediocrity and never ride the wave. Why? What should you do to advance or just survive?
I think one of the most important factors is perpetual, passionate learning. Learning is the most important thing that drives software development forward. Learning is the most important thing that drives you, as an individual, forward. It drives your team, as a group of people, forward.
source: Ashiro's LabZone
I believe, learning is a key attribute of a good software development process. Process that empowers learning will work, process that impedes learning will fail.
Basically there are three levels of learning. First, you learn as a person. Then you learn as a group of people. Finally, you learn as a whole organization. This post focuses on personal learning.
I have my own vision about software development. Most likely it comes from my personal background and products I’ve worked on (all of them web-based).
Software developers solve problems. To solve a problem in a cool way, you need to be a multi-skilled professional with quite solid knowledge from as many related disciplines as possible. Only this will give you a complete vision of the best possible solution.
Deep Specialization vs. Broad Knowledge
We are stepping on a slippery ground of deep specialization vs. broad knowledge. My belief is that at the current stage broad knowledge is better. Why? I can provide some analogies that prove nothing, but still are interesting.
Software development is a young discipline. It has its own properties that are not fully understood by most people. You can’t apply mass-production to software development so far, since you can’t formalize it enough. You can’t write a product specification, create design and generate complete application from UML diagrams (yes, I am aware about Model-Driven Development, but it is not even close to mass-production).
Look, there are so many related topics, from psychology to programming languages, from ToC to pair programming. There is no best way to write software so far. If you can’t apply mass-production to software development, you can’t do it efficiently with people who have a very narrow specialization. You can’t put it on a conveyer.
Let’s take science and look back 300 years ago. We will see that many discoveries were made by generalists. Let’s check Wikipedia.
- Isaac Newton: physicist, mathematician, astronomer, natural philosopher, alchemist, and theologian.
- Galileo Galilei: physicist, mathematician, astronomer and philosopher
- Christiaan Huygens: mathematician, astronomer, physicist, horologist, and writer of early science fiction
- René Descartes: philosopher, mathematician, physicist, and writer
It was common 200-300 years ago. In modern science you can’t discover anything without deep specialization. There are people with broad knowledge, but it is quite rare these days. More often you will find people like:
- Barton Zwiebach: string theorist
- Max Tegmark: cosmologist.
- David Joseph Bohm: quantum physicist
There are rare exceptions for sure, like this one:
- Stephen Wolfram (born 1959): physicist, software developer, mathematician, author and businessman.
What is the point? Software development is obviously neither a science nor a ‘tangible’ industry, so all such analogies don’t prove anything. But I think software development now is somewhere in 17th century compared to science and in 19th century compared to usual industry.
With this in mind, a team of generalists with some specializations can create a better software than a team of highly specialized people. It is not obvious and we need to evaluate this assertion. I can throw some arguments:
- Architecture. Developer may know nothing about testability. As a result he creates a hard-to-test solution. High specialization can lead to local optimizations, but weak overall architecture. If no one understands how does it work as a whole — it’s a bad sign.
- Fragility. A highly specialized team will hardly pass a “bus test”. If one of the key persons is hit by a bus, development will stop.
A Multi-skilled Software Developer
I believe in multi-skilled software developers. The right question to ask is “how much skills should I have and how deep?” It really depends, but here are the skills/domains/attributes every great web developer should have. The list is sorted by priority and I put hours that should be spent on formal education:
- Curiosity and passion
- Self-reflection / problem solving
- User Experience (1000 hrs)
- Programming (OOP/OOD, tools, practices, etc.) (8,000 hrs)
- Testing (200 hrs)
- “Sense of beauty” (Graphic design, visualization, etc.) (200 hrs)
I insist that these skills are very important for any really great web developer, but they may vary depending on software development type. I expect questions like “Why the hell you put User Experience before Programming?” The reason is that UX is an important part of problem solving. It is more important than implementation itself. UX gives developer the right perspective and makes a strong impact on software solutions. Without UX you can beautifully implement a crappy solution, and 90% of all existing software is exactly like that. IT's crappy, unusable and bloated with unnecessary features.
Great developer should have a “sense of beauty”. It’s hard to formalize, but in general he should be able to say “this button is ugly” and “this menu is beautiful”. “Sense of beauty” is a very important property, it affects everything: visual design, documentation, architecture, source code. Everything. You can (and should) train it.
In the next post I will share my vision on Learning as a Team.