How Not Having a Computer Science Degree Makes Me a Good Programmer

I didn’t go to an engineering college. Looking back, I’m very glad that I didn’t. If I had gone to an engineering college in India, I would probably have dropped out very quickly.
This post is not about how engineering colleges waste 880,350 years of India’s youth every year. But if anyone teaching in an engineering college is reading this post, I would urge them to read “Teaching Tech Together” and think about their pedagogical approach to teaching adults. These days, people become adults (at least in learning psychology) even more quickly than before.
Being on my own has put me in a perpetual beginner’s mode. I’m always learning. I’m never sure about something. I often seek better ways of doing things. I keep reading the documentation. I keep reading tutorials. I keep building and rebuilding mental models.
I do not learn from textbooks. While textbooks may make things easier in some way, they also remove a lot of details from you. A language might have introduced a new feature with an accompanying blog post that includes details about alternate approaches they tried and why they chose the final one they chose. A textbook might not go into such details. A lot of that meta information is lost. A lot of my learning has come from comparing different approaches and learning why the differences matter.
I do not learn for a pen and paper exam. This is a universal mistake by higher education departments. Why on earth do we have pen and paper exams in professional fields like engineering and medicine? What good is being able to write 2 pages about a “wrapper class” or about “diabetic retinopathy” if I cannot use wrapper classes in my programs or prevent diabetic retinopathy in my patients, respectively? The way someone learns when they have to write about something is very different from the way they learn when they have to use something. It is the same as learning bicycling. In India, you can have a PhD in bicycling without knowing how to ride a bicycle. Because we do not evaluate tacit knowledge.
In being self-taught I evaluate myself. And that puts the learner me in a very difficult spot. The evaluator me knows exactly how much the learner me knows. And therefore, the learner me is forced to continuously plug holes in the knowledge framework. It is also a real-time, continuous formative assessment that I go through every day. Even before I open the code editor I know that I don’t know how to do something. A lot of my learning happens on my mobile phone browser when I’m traveling or eating.
Last day I was faced with the question, what is a good learning resource to start programming as an adult learner?
I thought about it for a while. As per teaching tech together, the mental models have to be built first. The problem with sending a learner with no background in programming to “learn x in y minutes” websites is that many of these courses do not approach it pedagogically either.
Then I thought, perhaps a pedagogical approach that happens online would utilize the instant feedback that learning programming through javascript can give in the browser. So I searched “learn programming through javascript” and reached on a course by Google. Interestingly, in the prerequisites of the course is a brilliant course called “Think Like a computer: the logic of programming“. This is a good start. (Although it starts with object oriented programming and I would love to see a similar course for functional programming. But of late I’ve been thinking OOP and FP are the same at some level and so it doesn’t matter).