Do you remember your first steps as a junior developer? Do you remember how you felt when you talked with experienced engineers? Do you remember what you said what you realized that commercial projects are way more complicated than those made in school? I do. It was more or less like „God, I suck… all these folks are just great. I hope someday I’ll be half as good as they. No… I WILL BE BETTER! And no one will have doubts about that.” Yes, I was sure that after reaching a certain level I would be master of the universe, who will be able to criticize everything and everyone. And you know what? The older I got, the more I thought that I suck. Do you feel the same?
In the beginning, let us consider why this is happening? In my opinion, this is because we do not realize that most of us specialize in one chosen field. For example, I feel solid in Web development, but some of you may feel same in the IoT or system programming. What would happen if I started to talk with you about, e.g. Linux? Well, I have some basic knowledge of the file system, message queues, and I know what the chmod command is. But this knowledge is very general and more specialized questions would just kill me. And that’s the whole problem. When we talk with experts about things that are not our specialty, we feel just inferior and ignorant like „damn, I should know that!”. The problem may occur even if we do have a lot to say. Imagine that you talk with your three friends about web development. One is a CSS master; another is an enthusiast of Docker; third knows everything about garbage collector, and you know a lot about design patterns. Now, when you start to talk about creating a web application, each of you will say something interesting about things related to his specialty. For instance „you don’t understand the difference between Gulp and SASS? Okay, let me explain that”, „do not use Finalize method in every C# object! That will promote all of them to generation 1 !”, „no Docker’s container are not equal to virtual machines” or „in your case, I would recommend using an abstract factory pattern.” After the conversation, we feel confused. On the one hand, we are glad that we explained what the abstract factory pattern is. On the contrary, we knew almost nothing about other topics. Note, however, that the other caller can feel the same way!
The second thing we must realize is that the more we learn, the more we realize how little we know. Do you remember you first web app? I do. I put the whole business logic in the controller; I created methods with 30 ifs inside; I didn’t use dependency injection etc. I was so proud of me because that worked like a charm. One day I read about SOLID and learned that the code should be written differently. Letter „D” means dependency inversion. What is that? What are an IoC and dependency injection? Autofac? I’ve never heard of that! Dependency Injection vs. Factory Pattern? What’s happening?! Do you understand what I mean? There’s always something new to discover. There’s always something to learn about. That’s the beauty of that job. We can learn something new every day! And it doesn’t mean that we suck.
Does learning everything at random make me a better programmer?
Some of you might say that we have always to learn new things, to be up to date in the industry. And that’s true! But remember, that if you don’t use some technology or library just don’t learn that because sooner or later you’ll forget how to use it and you’ll blame yourself for that. Do you really have to know the full specification of SASS if you’ve never styled your we app? Do you have to know what „sudo docker run -i -p 22 -p 8000:80” does if you’re not planning to use Docker in next two weeks? It’s better to learn a few facts about a new thing and treat them as a pointer in the future. For instance „Docker uses images to build containers. Containers include the application and all of its dependencies –but share the kernel with other containers, running as isolated processes in user space on the host operating system. Docker containers are not tied to any specific infrastructure: they run on any computer, on any infrastructure, and in any cloud. (source)” Now, when in the future you will be asked to prepare the production environment for your application, most likely you remember that once read about such a thing as Docker and it can help you in this task. Then you’ll sit down to documentation, pluralsight or youtube and start learning. Sounds reasonable?
In the end, I just want you to remember:
If you do not know something, it doesn’t mean that you suck. You suck if you learn everything, and know nothing.