William Vincent


| Home | Blog | Projects | Contact |

<- blog-index

Why I'm Learning C


I want to be a better programmer

As a programmer who has spent most of my time working with JavaScript and frameworks in that ecosystem. I have begun to realize that I have a major blind spot and weakness that I need to address, understanding code. Give me a high level language and libraries to resolve problems as they pop up and I can compose the code that others have written into a working application. However, without those tools at my disposal, I end up spinning my wheels and not knowing how to proceed. This is a skill issue, and it is a weakness that I am working to overcome. Learning C is the first step I am taking with the intent of skilling up as a programmer. I chose C as this first step due to how it directly addresses the core aspects of my approach and understanding of programming.

I want to force myself to think differently

There are two areas that I think I can use to address the problem listed above. The first is to learn to approach problems without reaching for a library as my initial solution. The second is related to the first, to work outside of an abstraction layer.

Libraries are fantastic, they allow programmers to move quickly and avoid the duplication of effort, there is no reason to reinvent the wheel for every application. However, this level of simplicity (at least in my experience) comes at the cost of a deep understanding of how those problems are actually solved. This is a fundamental problem as a novice programmer, it allows writing code that you do not actually understand. If you understand a problem at a deep level you can make a choice, do you use external code and allow your project to depend on that code, or do you implement a solution directly and avoid additional points of failure. If you do not understand the problem deeply, if you are incapable of designing a solution directly, you have no choice but to apply increasing levels of dependencies to your project.

Abstractions are also fantastic, at some level they are also necessary. The human brain is simply not capable of understanding enough content simultaneously to effectively work with a sufficiently complex code base. Again, if you have a deep understanding of the underlying problem, abstractions are a choice. They allow a developer to grab a section of behavior and hide it in an interface that facilitates working with more complicated behaviors. In order to work with that abstraction effectively, particularly in niche use cases, you must have a strong understanding of the problem being solved and how the abstraction addresses that problem. As a new developer, that is the core of the problem, we (or at least I) do not have a strong enough understanding of either the problem or the abstracted solution, to permit an effective use of many abstractions.

Due to its lack of a robust standard library and a "do it yourself" ethos to the language. I believe that taking the time to learn C and build a few projects in it, will directly address the two problems I am seeing and give me the opportunity to better myself as a developer. I want to deepen my understanding of code and give myself the opportunity to make a choice of using a library or engaging with abstractions.