Before reading this post, I ask you to ignore your ego, just for a few moments. This text was not easy to write, and I think it will not be easy to read either. Please keep in mind that I do not want to offend anyone. However, I think it’s about time to talk seriously about our careers.
NOTE: This post was motivated by a discussion between friends, in a WhatsApp group, of a professional community in which I am a member.
By explicit request of those involved, I will not mention names. However, I was challenged to speak publicly with the same frankness I used in that group.
Take time and think! Are we
REALLY prepared to do the work we are doing?
My question has nothing to do with how much you know about that framework released last week. I’m not talking about microservices. I’m not talking about DDD. I’m not talking about that popular programming language. I’m not talking about that new database. I’m not talking about anything that usually makes you feel like an impostor.
When I talked about being prepared, I was talking about how much you know about basics!
Do you know how to analyze the complexity of an algorithm? If you do not know, how can you tell how it will behave in production with a volume of data higher than the one you are using in your tests? Will you be one of those developers who repeats “On my machine works”?
NOTE: In that private discussion, a friend argued that proper tools could help assess how much an algorithm has in quality. Unfortunately, they can not determine whether the algorithm chosen is the correct option to solve a problem or whether it will scale well.
Neither Resharper nor Sonarqube will tell you if your code scales poorly. In my experience, not even the QA tests are sufficient; after all, they do not reflect what is in production. In the end, a combination of experimentation and knowledge is needed.
The saddest thing is that if you do not know whether your code “scales” well, it probably does not scale.
How much do you know about data structures? Would you implement a hashtable? If you can not, what criteria do you have to choose from the various options available in a modern framework like .NET or Java?
NOTE: In that same discussion, the same friend suggested that “in the real world” people cannot implement data structures themselves. However, even so, these people are delivering code in production that meets the desires of the customers.
Are we even delivering the software we are paid to develop?
How much do you know about Computer Architecture? If you know little, how do you explain that “rounding problem” to your customers? What criteria do you use to optimize your code for the machine your code will run?
How much do you know about how your code runs? About how the memory that your code is using is allocated and deallocated? What criteria do you use to decide whether to create a class or a struct (specifically speaking C#)?
To know the fundamentals is the minimum (the fundamental) so that we can perform any function. So why do we often ignore the “fundamentals” in software development?
Studying the “basics of computer science” may not be your focus, or what you’ve been learning recently. Maybe because the people who influence you (your technical references) have not told you that’s important. Perhaps, because your boss does not have the conditions (even techniques) to evaluate you by how much you have mastered (really) what you are doing. However, that does not change the fact that it is difficult to build anything substantial without the “fundamentals” being well worked out.
NOTE: Ignoring the basics may even lead you to adopt all the world’s patterns and frameworks to deliver a CRUD. You may be doing this just because someone you know, and respect has hinted that this is the way.
In a good college, you learn the “fundamentals”. Unfortunately, many people repeat that the focus of undergraduate and graduate courses should be more “practical.” As with math, I want to believe that the problem is the approach, not the subject.
I’m not saying that formal education or certifications are the only way to learn the basics. Surely, anyone (I believe), with some discipline, can understand and learn anything. Anyway, without the requirement of a resume, the challenge turns out to be much more significant.
Uncle Bob said we are the new scribes (please watch this talk). We are! Software is swallowing up the world and we, who work with software, have real chances of playing a leading role. We can change society for better or for worse. There is so much in our hands.
The opportunities are enormous, the challenges too. We need to be professionals and develop professionals. We need real programmers with solid foundations. The risks are too high for us to be an egocentric class of paid amateurs.
NOTE: I do not own the truth. I’m very far from knowing everything. I know that even if I want to, I will never know everything. However, every day, almost thirty years ago (I began to write code at school), I try to learn the most important first.
If I offended you, I am truly sorry.