- 25 Dec, 2025 *
Since I’m purposefully avoiding the topic of Christmas, I thought instead of exploring why I’m alone on a family holiday I would do what I normally do when I don’t want to doomscroll or focus on my own problems and turn to the stack of books I’m currently working through.
Previously, I mentioned that I had to overcome some seriously limiting math anxiety in order to fully appreciate what I was learning in C and SICP. Because of my poor mental health as a child, I missed out on the appreciation of mathematics as a language for describing the universe; for me, it was an exercise in torture. My unwellness in fifth grade set me back several years, and I don’t know as I ever managed to catch back up with my peers. I struggled with math all through high school, and when I …
- 25 Dec, 2025 *
Since I’m purposefully avoiding the topic of Christmas, I thought instead of exploring why I’m alone on a family holiday I would do what I normally do when I don’t want to doomscroll or focus on my own problems and turn to the stack of books I’m currently working through.
Previously, I mentioned that I had to overcome some seriously limiting math anxiety in order to fully appreciate what I was learning in C and SICP. Because of my poor mental health as a child, I missed out on the appreciation of mathematics as a language for describing the universe; for me, it was an exercise in torture. My unwellness in fifth grade set me back several years, and I don’t know as I ever managed to catch back up with my peers. I struggled with math all through high school, and when I reached university, I avoided mathematics as much as possible.
For context, I’m working through the following books right now:
- Structure and Interpretation of Computer Programs (Abelson and Sussman)
- From Mathematics to General Programming (Stepanov and Rose)
- Beginning C++ through Game Programming (Dawson)
- Think Like a Programmer (Spraul)
Working through these four books in tandem, I’ve noticed something interesting.
The most recent chapter in Dawson concerned vectors and how to use them to iterate over elements in an array, while Spraul has been using scalar and non-scalar arrays to demonstrate how to solve problems. I finished Chapter 7 in Stepanov and Rose yesterday, and saw how one could take the Egyptian multiplication algorithm and generalize the algorithm so that it can be used on any semigroup, monoid, or group.
In a section on naming principles, Stepanov complained that C++ violates a rule of naming in that there is an older, more established name for vectors in mathematics, while C++ uses the word ‘vector’ when it’s really referring to a dynamic array. Neither Dawson nor Spraul mentioned that vectors have a different meaning in mathematics than in the Standard Template Library.
It seems like pedantry, at first, but after thinking about it for a bit I came to the conclusion that these authors are teaching from fundamentally different premises about what programming even is.
There are three different philosophies in the stack I’m currently working towards: programming as applied mathematics (Stepanov and Rose), programming as a computational process (SICP), and programming as practical problem-solving (Dawson, Spraul.) Those three philosophies affect how the author presents information and how much he assumes about the cognitive capabilities of the reader. SICP is one of the most difficult books I’ve ever read, and I frequently find myself putting it down so I can look up a lecture on a specific mathematics topic before coming back with a better understanding of what it is the authors are saying.
The concrete examples in Dawson and Spraul (Hangman in Dawson, arrays in Spraul) are helping me to build intuition for problem-solving, while the mathematical abstractions in Stepanov are bringing me towards a clearer understanding of how to structure my own programs. In SICP, everything is process-oriented. The invisible wall in my brain between data as objects and data as functions is slowly coming down thanks to the lectures in CS61A. All of those books are forming pillars for my knowledge base.
As a self-taught programmer, I’m going to have to get used to conflicting advice in the literature. Experts disagree on naming principles and others don’t address the conflict at all; Dawson and Spraul rarely quote mathematics in their work, possibly because they’re aware the reader is coming to programming fairly fresh, while mathematics is the basis of Stepanov and SICP.
That conflict is helping me to approach programming from multiple angles, and I feel like every chapter I read in one book helps to support what I’m learning in another. It’s exciting. Definitely motivates me to sit down the next day and review my notes and try to build on what I was learning the day before. I think if I was just working on one book at a time, I wouldn’t be getting a well-rounded appreciation for the intricacies of programming or the elegance of mathematical operations. It’s the same reason I studied computer architecture and started learning assembly language while I was studying C; I want to know why things work, not just how to get them to work.
So having an array (hah) of books to work through, I’m able to take pieces of what I learned in one section and apply it to another section in a different book. It may be taking me longer to get to where I want to go than if I worked through the books sequentially, but I think it’s deepening my understanding.