I ‘m beginning this series, as extracts of notes from some of the best comp science classes i have ever witnessed, recorded by MIT.
However i will be emphasizing only the points which struck me, after 10 years of experience as worth remembering again, that I feel the industry might do well to never forget . I will try to leave out the details, like the data structures, recursive techniques and such, which most people are likely know. I would highly recommend you to access the full text or videos, if you feel that you missed out any of your comp classes or have never listened to comparable masters explaining this art.
My aim is to capture the pearls of wisdom that i might pickup listening to this class all over again. This is part 1 of such notes and this is the reason why i felt i ought to do it.
What is Computer Science
Computer Science is not about computers in the same sense, that geometry is not really about surveying instruments. But when geometry was created in ancient Egypt, it really was about surveys and instruments, in the same way computer science started off with computers in the twentieth century.
What computer science is really about is
1. Formalizing intuitions about process ie “How to” knowledge
eg How to compute sqrt vs “what is sqrt”
eg How to draw triangle vs “what is a triangle”
So whats so hard about this? Real issues of computer science is not about telling people how to do stuff. That would be too easy. Real problems come when we try to build very very large systems that performs these processes. Real problems arise with these systems that have programs that are too big to fit in any one person’s head. Therefore,
2. Computer science, is also, all about techniques to control complexity of large systems.
Abstract Characteristic (vs other engineering disciplines)
The components we use in computer science are asbtract, like an array or a hash. Unlike other disciplines that also deal with complexity the difference here is that the complexity comp science face is not physical in nature. They do not face the physical realities of real world like in the case of other engineering fields. Leakage, resisitace, heating, drag and such physical issues does not dog computer science. Rather what ails it, are the constraints of human mind in holding and keeping track of big programs.
In this sense computer science is an abstract form of engineering and therefore its most important tools are tools for abstraction, that aid human understanding and kill complexity. This is what comp science is mostly all about.
What are the techniques for controlling complexity
- Black-Box Methods
- Conventional Interfaces
- Large Scale System Integration Metaphors
- New Languages
Black Box Techniques
Refers to making something and building a box about it such that it can be used without knowledge of its internals much like an IC chip. You want to suppress details so that you can build bigger boxes that use this.
You can also use black box techniques to express generality. eg A routine add might be able to add numbers, vectors, signals etc.
Are agreed upon ways of plugging things together.
These are operations that all kinds of “abstracts” might support eg +
Help you control complexity by dempahsizing certain aspects of the complexty and emphasizing others eg SQL emphasizes only the data modification part and hides everything else
Learning a language is like learning chess it just takes 2 minutes but learning the implications takes a lifetime.
Framework for evaluating and understanding Languages
If we view languages in the context of tools in reducing complexity, it immediately becomes clear that a new language is not all about how many lines of code to do the next cool thing. Rather they should be evaluated in terms of
- What are the tools for abstractions it provides
- What are the primitives that it provides
- What are the ways of combining these primitives
My thoughts : The idea of computer science as only about tools to control complexity is not too well imbibed into the many minds (including my iniitial years) i have come across in my decade of experience. Rather, computers are all about “coding” or Java or C++ and networking. If code is viewed and reviewed from this angle alone, much of the issues that plague the industry would have been non existent.
In these lectures everything that follows is a function of this characterisitc, of ways to reduce complexity, evident in the way languages are evalauted. I’m excited to take the new (rather old) take on all other topics in the following series and will be posting the follow up posts on the same.