It's all about the concepts!
You want to be a great developer, a software engineer that can write code in multiple languages, a person that knows how to use Rails, Django, all or most of spring projects and Hibernate, you know ruby, python, Scala, java, javascript and all the universe of javascript libraries and frameworks and you call yourself a software engineer, but you can’t understand the story that your customer is telling you, so you can translate that to software and modelling the problem to inform and communicate to other engineers what to do and how to solve the customer problem. Well, if you recognised yourself in this description you may feel, sometimes, an empty space inside of you like a dark space of fear and regret of having not learned the concepts behind the practice. Or you just know you need more theoretic study.
Let me be clear, I am not judging anyone and I don’t have an opinion about what is the best path to success in programming, I just found out that programming concepts are getting more and more forgotten and this is not just my or your fault.
If you are like me, you felt, at some point of your life, the desire to know how things work in a computer and how those programs you used to use were made. I started wonder that in 1995 and at that point I discovered some basic languages that made me possible to create real simple stuff, but I was delighted. Years later I was already creating websites and doing programming courses, but no one open my eyes for the inimaginable power of the concepts behind the languages.
Even when I was graduating, the university didn’t care so much about going deep into concepts like object oriented, design patterns, or how to extract information from conversations and understand the requirements and build models about it and understand domains and contexts. And it took me years into programming to realize that I was relegating this important part in detriment of just learn the programming language.
But learning a language like Java, without going deep into object oriented design made me write procedural code in an object oriented language. I was luck then, because I had mentors, people who saw my hunger for knowledge and put me into the right direction.
I was all about understanding concepts before languages or both together. Things like design patterns and why they are important (tip: Do not just record patterns in your head, try to understand the problems they are trying to solve), object oriented design, refactoring techniques and how to apply it, the basics of a good programmer like naming things, short and conscise(when possible :) ) functions, single responsibility, all the SOLID principles and a bunch of other topics put me aside from other developers and soon made me evolve faster, simply because it became easier to understand other languages, because I knew the concept already. See, I didn’t mention functional programming because it was not hype back then.
Today you don’t have excuses to learn more in depth about programming concepts. Don’t be the guy who thinks MVC is the best pattern for solve any problem and Domain Driven Design is just applied in huge enterprise applications. The knowledge at your dispose today is infinitely bigger than it was when I began to program. (I am not as old as you may think).
There are a great collections of books that help with that, some of those are:
- GOOS — Growing Object Oriented Software with Tests, Clean Code,
- Working Effectively With Legacy Code,
- Design Patterns — Elements of Reusable Software,
- DDD — Domain Driven Design,
- Implementing Domain Driven Design,
- Test Driven Development
But there are much more!
As soon as you grasp the concepts of a language you will see that test driven development is the most important tool to force you to follow code design decisions. I think that, maybe, is the most important one because test driven code has two bigger benefits for me:
- Is reliable and it will bring more and more confidence as the time goes by.
- It forces some design decisions and make possible for you to see other hidden concepts in your logic or flow of thought.
But you cannot enjoy all the good things a TDD approach can give you if you don’t know what it is a good objected oriented or functional design. If you can’t understand what your customer (could be your boss) is saying and you can’t extract information from conversations and translate that to models, if you don’t know what makes a good class or function and you don’t understand polymorphism for instance. If you don’t know that and much more, regarding concepts, TDD will not help you. There is no silver bullet or blue pill, only the damm red pill that you will take, whether you like it or not.
So, if you are starting right now or you want to start and you want to use my advice I would say to you:
- Start by understand the basics of the language you want to learn.
- Try to create real simple but useful applications
- As soon as you realize that you understand the basics of the language, try to jump into the concepts. Keep in mind that concepts are harder to learn than languages and maybe, you will need to read and read again. You will feel like you will never be able to apply that or learn, but you will. Eventually you will see that you are thinking diferently than you were before and the more you read the more you will introspect that knowledge.
- Do some project. Try to apply the language, concepts and frameworks in a project. There is no better way to do it.
Learn the basics of a programming language is easy. The most difficult part is to create reusable and understandable code. But this is the path that we are all walking together and will continue for a long time. See you soon devs.
If you want to follow my life story you can follow me:
- Youtube: Youtube Channel(In Portuguese)
- Twitter: @thramosal
- Instagram: @thiagoramosal
Hope you have an awesome life as a developers.