Since I failed to write something last week, here are the last two weeks, combined:
To begin with, I find the book extremely interesting and motivating. The authors talk of programming as a craft, even an art, to some extent. You get the feeling that you, as a programmer (or to-be-programmer) are part of something bigger, that stretches back to the first mathematicians. There are beautiful metaphors („the spirit, that lives in the computer„), and interesting quotes („I think that it’s extraordinarily important that we in computer science keep fun in computing...“, Alan Perlis). Fun is the word. ☺
The first chapter teaches us about „Building Abstractions with Procedures“. So we tackled a lot with procedures, the processes they generate, and their orders of growth. The little downside is that only with procedures you cannot make very interesting examples and exercises (with a few exceptions, mentioned below), so there is lots of mathematics in the first chapter. Not to be considered as a bad thing, but it gets pretty tedious after a while.
A few years ago I participated in another SICP study group, although we didn’t label ourself with such fancy names back then. ☺ The experience there was quite different. First, we had a teacher, who was profound in Scheme and in programming in general. Second, he had composed lectures, and guide us carefully through each one. Third, we had diverse backgrounds and hadn’t attained courses in university-level mathematics, which is somewhat required for the material. So our teacher swapped some of the examples and exercises in favour of more intelligible ones.
This time all the participants have studied Computer Science, or Informatics, so we all have some understanding of Calculus, Numerical Analysis, Abstract Algebra, etc. We are going through each exercise, be it some mathematical proof, or some other task, that does not require coding. Also, we are moving very fast through the material, because we are able to understand most of it on our own. The approach is different from my last experience, but I feel that it works equally well for me.
Anyway, here are some things, that I found interesting during the last two weeks:
- Ackerman’s function (ex. 1.10)! We still can’t think of a real-world application of this beast (except as an example in the courses on Computability and Complexity, of course ☺)
- Invariant quantity (ex. 1.16). Actually, I can’t recall the last time I used this technique somewhere (if I ever used it anywhere), except in the previous course on SICP. It was very contenting to find the solution for this one, although I’m ashamed to admit that it took me nearly an hour. ☺
- You can find the n-th Fibonacci number in logarithmic number of steps (ex. 1.19). This is awesome! Alas, I already knew it and couldn’t experience the same bedazzlement once again. ☺
- It’s very fun to tackle with the order of evaluation of arguments (ex. 1.5, 1.6 and 1.20). You can see that in normal order evaluation some procedures work as expected, while in applicative order they fall into infinite recursion. Yet, functions with a constant space complexity can become functions with linear space complexity, if they are evaluated in normal order. Awesome! ☺
- Fermat test and Carmichael’s numbers. (ex. 1.27) Curious stuff from Number theory.
- Higher-order functions are very fun. (ex. 1.32, 1.33). I enjoyed watching how tedious sums and products become simple one-liners.
- You can do miracles with Unicode! 😃
Aside from the fun and curious stuff, I also encountered some not-so-funny issues, which have nothing to do with the book, but more to do with me:
- Time management. I encounter difficulties with this since high-school. So as of yesterday I started using the Pomodoro Technique. For now, I just strive to develop the habit of focusing on some task (like this post) for 25 minutes and tracking the number of pomodoros, which is fun and contenting, so I think this will help me. Also, I am finally stimulated to stop staring at my screen every 25 minutes, to stand up and stretch a little. This is bliss! ☺
- My written English is not very good, which is normal, since I don’t practice it very much. These posts are a chance to do it, and that is the reason I’m writing in English. The lack of experience takes it’s toll. First, I spend most of the time trying to remember (or find) specific words. I’m through my fourth pomodoro for this post, which is too many, I fear. Second, I don’t want to imagine what my style will look to some more profound than me. I probably look like some archaic, snobbish illiterate. I’m pretty decent writer in my native language, so such thoughts are almost painful. But everything will get better with time.
- Talking of style, I must do something for the commit messages in GitHub. „Add solution for exercise X.“ is not very helping, especially when I browse the repository to recall the interesting exercises. I will try to redact them as soon as possible.
- I also didn’t manage to finish all exercises, I actually skipped few of them. This will also be corrected as soon as possible.
- Stefan set an example by using test-driven approach in his solutions. I still can’t find the time and motivation to do the same, but this is on my TODO list, too.
- I also felt the need to take notes while I’m doing the exercises, not days after that. Point taken.
There may be other things that I can’t remember now, so I may redact this post in a few days.
All in all, there are many benefits from the study group – both technical (abstract concepts, fun facts, etc.) and personal (self-improvement, meeting new people, exchanging ideas and so on). I’m eager to see what will come next!