Software is for today. Learning to be a great software engineer is forever
School is one thing. Education is another — Austin Kleon — Steal Like an Artist: 10 Things Nobody Told You About Being Creative
Writing code is one thing, learning to be a software engineer is another.
You only really learn to drive a car once you have passed your test and drive regularly. Being a skilful driver is more than being able to steer the car without crashing, knowing the theory. It’s being able to navigate all the situations and scenarios you will encounter on the road and dealing with all the crazy lunatics on the road.
Being a software developer and creating software is like driving a car but thousand times more complex and with twice as many lunatics.
Software is what developers create, the skills, experience, and knowledge is what developers get. Software development skills are how you build quality software and deliver software projects.
Doing your job as a developer and creating software is one thing, but to progress your career, you need to learn the fundamentals of software development.
The education of developers is more than just writing code. The code you write, the technical skills are not a solid foundation for a career because in 5/10 years’ time you will need different technical skills.
You create the software needed on the project because this is what the customer and the company you work for are paying for. A developer’s value is based on their skills, knowledge and experience. A developer needs to make sure they are learning, improving and becoming a better software developer.
Ideally, you will do both simultaneously, but it’s not always possible, it’s the developer who needs to make sure this happens.
When you are feeling too comfortable as a developer, it’s time to consider moving on to something new.
Software development is a skill you never master
Software developers are always students of software development and whenever you think you know what you are doing, it will punch you in the face. Good developers are humble because software development crushes overconfidence with embarrassing mistakes.
You cannot avoid mistakes, problems and disasters. Therefore, you need to be humble to acknowledge mistakes and need a team to help you find and fix them.
When you start as a developer, you focus on creating code to meet the requirements. I used to think being a developer was just writing code.
Software development has many other aspects to it, from design, architecture, unit testing to DevOps and ALM. Gathering requirements and clarifying assumption.
There are many best practices such as SOLID principles, DRY (Don’t repeat yourself), KISS, and others.
The best practices and fundamental skills have long-term benefits. This makes them hard for junior developers to understand because there is no initial benefit.
Well-named code, designed to be easily tested, isn’t first draft code. It does more than work. It’s built to be easy to read, understand and change.
I worked on legacy code where there was a 2000 line method. The method acted like a state machine and controlled the status of cases. It was a nightmare to change because if you change a line, it might break anything code below it.
One change could affect hundreds of lines of code and it was almost impossible to test. A simple change of code could take a week to do and test.
A separate piece of code had terrible naming and used a variable that was the 13th month. Reading the code, I couldn’t understand what the 13th month was, it made no sense.
I had to work out that the 13th month was a variable to store values that were passed between the 1st and 2nd year of a car for servicing purposes.
Experience is valuable because by working with bad code and seeing the problems it causes, it motivates you to not make these mistakes in the future.
Each software project creates unique software for the unique requirements. It’s built on software engineering fundamentals. Quality development is done with good processes, best practices, DevOps, and code reviews.
You need to make sure your best practices are not out of date and be open to updating them. There will be new tools, software and technology that requires you to update best practices.
Lead developers need a vision of how every aspect of the software development process should run. You need to be humble and open to updating your development processes.
Technology changes but software development stays the same
Technology evolves with new languages, services, tools, and best practices.
There are fundamental software engineering skills that developers need to master that will be useful no matter the technology.
- Naming (underrated but the key to simple and readable code)
- Designing Code (simple design, not complex)
- Design Patterns
- Unit Testing
- Soft Skills
- Development best practices
- Agile Development
- Bug Fixing
These core skills are the foundation of software development. You cannot write great code if you don’t know what great code looks like and understand why it’s great. The flip side is you need to know what bad code looks like so you can afford it and understand why that code is bad.
Junior developers won’t stop writing low-quality code if they are not coached or don’t realize the code will create future problems. Bad code works now but creates problems in the future. Bad code is like mistakes. You cannot avoid a mistake if you don’t acknowledge you made a mistake.
Cowboy developers don’t understand the best practices of software development or the benefits. If you don’t understand the benefits of an approach, you won’t use it.
Working on software projects using skills, and knowledge you already have is like running on a treadmill. You put lots of effort in but go nowhere.
Gaining experience on skills you already has limited value because it adds more time to that skill on your CV.
Valuable experience is fresh situations where you learn new knowledge and skills you can take to future projects.
Good developers learn to understand not just create software. Understanding helps you create software in the future, avoid problems, and have a better understanding of how software development works.
The best investment you can make in yourself and your education as a software developer. Learning outside of software development will make you better at software development because a lot of software development is problem solving with people.
“Spend each day trying to be a little wiser than you were when you woke up. Discharge your duties faithfully and well. Systematically you get ahead, but not necessarily in fast spurts. Interesting, you build discipline by preparing for fast spurts. Slug it out one inch at a time, day by day. At the end of the day — if you live long enough — most people get what they deserve.” Charlie Munger
As a software developer, you want to suck less each day, reduce mistakes and swap bad code for good code. Improve as a software developer every day, then life will get easier as your skills, knowledge, and experience grow.
Software development is a team sport, so the more effectively you can communicate and work with other humans, the better.
All the big problems when creating software are caused by people and solved by people.
Effective communication, persuasion, and collaboration are core skills that are worth investing in.
I used to present demos and progress from a team I was a scrum master for. My scrum team was doing excellent work and making good progress but the customer wasn’t sure about the team or me.
I got some feedback from a manager who explained I lead with the bugs and negative information and the positive points until the end leaving. It was like using a megaphone with bad news and whispering good news. This gave the perception that I and the team weren’t doing a good job.
Perception is reality.
Since then I have worked a lot on presentation, and communication. You don’t have long to communicate; you need to make it count.
All projects, promotions, and other important decisions are all made by people. You need to build relationships and influence them.
You want to know more about software development when you go to sleep than when you woke up.
Improving isn’t about making tremendous leaps but continuous improvement and consistently learning.
Other developers are a great source of knowledge and make learning easier and enjoyable. Use your fellow developers to learn from, copy their successes and avoid their mistakes.