One important element of my lofty goal to become a better coder, is filling in the gaps of my theoretical and conceptual understanding of programming. Or in other words: dive into Computer Science!
MIT has an unbelievable amount of equally unbelievaby high-quality education material online accessible for the whole world and completely for free. I’ve been using the SICP book (free online version), and the other MIT 6.001 Study materials (notes and Videos of the original classes from 1986 from the Sussman and Abelson, the authors of the SICP book themselves).
1986? Isn’t this stuff completely dated? I hear you ask
Not at all. The underlying concepts and principles are just as valid today as they were then. In fact, this material is recommended and appears on top-10 Computer Science resource lists time and time again. This is what I like about it so far:
- It uses LISP. I like LISP because itś based on the beautiful and elegant lambda calculus, because it may be the most powerful programming language in existence (read Paul Graham‘s the Blub paradox for a wonderfully lucid elaboration on this point), and because it has simple syntax. I’m actually using the LISP-based Racket.
- It emphasizes abstraction. Functional, Data Types, anything you find yourself repeatedly typing in, Meta linguistic
- It empathizes practicality and is not dogmatic. Abelson quote from a lecture “anyone who prescribes that [formal design process] has never actually built a large system”
- It emphasizes code modularity, separation of duties, maintainability
- It uses Wishful Thinking as a powerful design method
- It encourages you to step back and look at the big picture
- It is well written and well supported by the additional material (the lecture notes by themselves are pretty good already)
I’m about halfway now and have already learned so much useful and interesting stuff.
Extremely interesting topics so far are:
- data-directed programming, and logically following from that:
- a complete implementation of OOP using just lambdas (with message passing)
- the pros and cons of introducing assignment (in my past experience assignment was always the key mechanic, not even being discussed)
- How to write a language to solve a problem “LISP is not a very good language to solve problems, but it’s a great language to write languages to solve problems”
- The abstraction can be tough. Generally, this is a hard course
- No immediate use for LISP in the workplace. However, the general concepts should be easily transferable to other platforms
All in all, even though I’m only halfway now, I can really recommend this study material to any serious student of Computer Science.