I’ve been working in software for 23 years, and I spend a lot of time reading and doing trial and error. I repeatedly created new Zend Framework (PHP) projects in the early days because I wouldn’t say I liked the directory structure.
I also did a lot of dry design. My favourite activity in the evening was taking a sheet of paper and drawing diagrams of how different components interact. I spent 10 times more on practice than I did on reading.
That’s why I hear I’m good at designing systems; I have always been doing it.
The nature of soft skills
Soft means the skills are personal; it’s about how you do things, not what.
Communication is a great example. Everyone communicates; the difference is in the style. Some people are better than others, and it heavily depends on context—you communicate differently with your parents than in the office.
As a teenager, I hung out with my friend when my mother called me. I was speaking with my friend in the standard Polish dialect. The second I picked up the phone, I switched to Silesian, a regional language used in Southern Poland. I wouldn’t have known that if my friend hadn’t made fun of it for the next hour.
Another way of describing Soft Skills is the inability to measure them. It’s nearly impossible to objectively test someone’s soft abilities because of the number of personal and external factors involved. Someone can be a great communicator but fail to present it in the interview process because of their stress and anxiety.
Software Design is a lot like this.
The Software Design skill
How do you decide if the software design is good?
You can say the code is readable. I’ll show you the assembly I wrote for microcontrollers as a teenager. It gave me good grades at school.
You can say it follows good code practices. I’ve seen a company with a codebase beyond help (independently proven by a consulting agency) sell for over £600M, making many people rich.
You can say it’s any code that works. I’ll show you the army developers fighting their way through ancient monoliths. They are frustrated, burned out, and feel stuck in their careers.
You can say it’s using TDD. I’ll show you the number of startups that failed while using it. Does it mean that great code leads to failure?
I could go on with examples forever. The answer changes with each person you ask. Some trends signal good practices, but each one can be invalidated by adding more context or being proven right at the same time.
Software Design has a lot of characteristics of Soft Skills. It heavily depends on context. The judgement of the result depends entirely on the judge's experience. The value of design can also be heavily outweighed by external factors.
Software Design is a Soft skill.
What does it mean for you?
1. You learn by doing
You can learn how a particular design works, but the real value lies in the implementation. You can only learn it by doing and making mistakes. You can speed up your learning by mentors and listening to stories about other’s successes and failures.
2. You focus on context
The best design fits the circumstances. Learn more about business, psychology, and leadership. Understanding the company and people around the software you build will give you more insight than another design pattern.
3. Your skills are your toolbox
You won’t use a hammer for screws or a screwdriver for nails. You may have to if all you have is one of them. Think about your skillset as options added to the repertoire of solutions you can create.
There is never a single good answer
I realised that any time I’m right and wrong at the same time.
Every solution I have ever made was made to the best of my abilities and understanding. It has never been perfect because there were more details that I learned later in the process. It taught me always to expect to be partially wrong and compensate for it.
How would this approach work for you? Would you be less frustrated with “bad design”? Would it overall improve the software you create for your clients and employers?
Respect the context, and it will reward you. The context is king.
Do things like C4 Mode, Structurizr help you with explaining the Software context to different groups?