Traditional schooling teaches us that there is a start and an end to learning. To learn something is finite — you study it, and then it has been learned. You receive grades, from 0–100%, which indicate to what extent you were successful in said learning.
Software engineering could not be more opposite. There is a start to learning it, but this start will look different for every person and come at a different point in life. There is certainly no end. You are never “done” with learning about software engineering. You will, hopefully, be gaining little nuggets of knowledge and experience every day, and be more additive in your work because of this. But you will never be done. You will never know everything.
This is why I say that learning software engineering is a lifelong journey. It is education in its purest form — not for the sake of completion, or a percentage point, but with the sole intention of improving yourself and what you bring to your surroundings. That’s a pretty amazing thing when you think about it.
This is the case for several reasons, most of which have to do with the fact that our world is ever changing.
Software is Always Changing
The rapidly changing landscape of software engineering is reason enough to treat your learning as an ongoing and never ending process. You may be a remarkable engineer today, but try not learning anything new for the next 5 years and then looking for a new job. The technologies, languages, frameworks, and tooling used will all have changed and you will have been left in the dust.
Needs are Always Changing
Your team’s and company’s needs will be changing in a much more immediate and tangible way than software as a whole, based on changing goals, priorities, customer demands, and all of the other factors that go into determining the day-to-day operations of a team. If you only know exactly what’s in front of you, you won’t be able to keep up with these changes. Only through continuously exposing yourself to new ideas can you ensure that you will continue to have the right tools in your toolkit as new needs arise and new problems need solving.
The wider your breadth of knowledge and deeper your understanding of your core technologies, the better equipped you will be to make informed decisions and suggestions.
You are Always Changing
Possibly most importantly, you are always changing, and what interests you today may not be what interests you tomorrow. One of the most incredible things about being a software engineer, in my opinion, is the feeling that there are endless opportunities — there are so many different rabbit holes to go down, and so many different avenues to choose from. I’m sure there are more than I even know of.
Do yourself the favour of not becoming complacent in what you are currently doing. Complacency is boring, and you won’t know what you’re missing out on. This isn’t a “grass is always greener” thing — I’m not saying you should always be looking for something that you like more. But through continually exposing yourself to new areas, you will see the work in front of you through a new lens. You will be able to approach it from original angles, and have additional tricks up your sleeve for troubleshooting when bugs pop up.
Perfection is a Fallacy
Lastly, the thing you have been hearing your entire life — there is no such thing as “perfect”, and code is no exception. Your code will never be perfect, but you do have a duty to write better code today than you did yesterday, and to incrementally improve the code that you have written.
To the original point that we are not working on a graded system, you will never get a 100%. But the user experience and impact of your software is predicated on the quality of your code. So while you will never produce 100% bugless code that works absolutely perfectly all of the time, you should always be working to decrease the presence and impact that these issues have on your end user. And you do this by — you guessed it — bettering yourself as an engineer through learning, learning, learning.
I always try to encourage people not to get caught up so much even in what they are learning, but just to ensure that they are. Some of my go-to’s in my own journey are software engineering books, Udemy, and Medium. I find myself constantly stumbling upon new concepts, reading through brand new approaches to problems I have faced, and trying to comprehend concepts that don’t seem to click in the moment, but inevitably pop up in my coding life in the next two weeks, adding the context and clarity I needed to understand.