“Maybe you should get a CS degree...”
I got this reply to one of my previous posts—which was basically a rant about how Java affects nowadays programmers.
Well, do I need a CS degree? Let's think. I mentioned in that post (or somewhere else) that I've been programming for the last 15 years. Giving I'm 28, that might seem huge. (Looks like it isn't just me—there are others who think that learning programming takes 10 years). Here's my story.
I first touched a computer when I was seven. It was an “HC-85”, the Romanian clone of the Z80-based “Sinclair ZX Spectrum”. During communism it was the best you could get.
Being a kid, I was mainly playing games, but however, I was also playing with BASIC and LOGO. I was lucky with my father... oh so lucky! My father is a teacher of maths and computer science at a high school in our town. I will talk a lot about him here.
The very next year (so I was 8) I joined a computer club—it was basically
a the only place in our town where children could get to learn computers at that time. (No, there were no computers in schools). This club was free (all payed by the government) and, yearly, there was a national programming contest where the best kids from each club in the country were competing. Two years later I went to my first such contest and I earned 3rd place.
At that club I met Alexandru Costin of InterAKT (he's about 3 years older than me). You might have heard of him—he's a successful man now; he had a fairly big company which was bought by Adobe. It worths mentioning that my father was his teacher during his 4 high school years.
I remember Alex too went to that contest (and many others). I don't remember what he earned though.
I went to a few other national contests, but somehow to me that first one mattered the most. I think I still have the prize (it was a gigantic lantern); and my parents definitely kept the diploma somewhere. :-)
Well. Later I went to more advanced languages, such as "BETA BASIC", Pascal (HP4TM — I think this is it, but I'm not sure), Z80 assembly. I remember I was an expert writing double-speed tape code loaders. :-) I think this was one of the primary ways to do copy protection—using a non-standard speed to read the bits from the tape ensured that it could only be read with my loader. I even managed to stuck the whole subrutine in a REM declaration in BASIC code—it was totally incomprehensible for anyone to look into.
You might think that loading code from tape is old-school and an useless idea nowadays, but you know what? Modern modems that can send/retrieve data through an analogical phone line use that exact same idea. The first time I connected to the Internet (using a 486) I was stunned about how much similar is the sound to what was on my tapes for Z80.
In the high school, my father was my teacher of maths and computer science. He's quite a tough guy; he was criticized by many for being rough with his students (to his defense, I swear that those students he was rough with fully deserved this treatment; this includes me). He always preferred to produce few great students, rather than 30 mediocre students.
We were always at least one year ahead competition. My father taught us Pascal, while others were doing BASIC. My father taught us assembly language, while others were still doing BASIC. My father taught us C++ while others were doing Pascal.
His biggest obsession at that time were big numbers. I never understood why and I actually criticized him for spending way too much time on this problem, but: he made a program that computed 10000! (that's the factorial of ten thousand), in a matter of seconds, on a 486 DX4, 100MHz. Got that? I forgot how many digits did the result have—something like over 30000 digits anyway; it can be computed with some logarithm formula that I forgot.
He was also obsessed with prime numbers and had programs that ran amazingly fast; in fact I'm not sure anyone has beat him on this yet. He should really make all this work public.
He invented a few ideas that are common nowadays—such as using base 256 to represent big numbers. All solutions that were taught in school were using base 10 and represent the number as an array of digits. This sucked—imagine the great performance boost when you work with a base that's native to the CPU!
He taught us all this. No other teacher I know of has been working on real problems in class—they were all like "int numbers; do qsort on them". That's not a real problem. You never need an algorithm to sort 10 numbers. Another great thing about him was the fact that he linked maths with computer science. These are regarded as disconnected things in our education system, which is plain wrong.
A consequence of all this is that most students from different high schools were weaker than us.
I know I'm supposed to talk about myself, not my father, but hear this (and you can quote me): “tell me who your teacher is, and I'll tell you who you are”. I'll get back in a moment, now let's continue with myself.
My first big project
When I was 14 (during my first year of high school) I implemented an “American Poker II” game (similar to this one). You know, the one you see on big consoles in bars; some people are wasting a lot of money with these games. I did too, until I coded it—I realized how easy it was to make the machine cheat the gambler.
I actually made a few money by selling the game to a few addicted gamblers, colleagues of mine. They wanted it “for training”, so they actually win when they play on real consoles. I told them “you know, my game doesn't cheat; but I could easily make it do so” :-)
This project also earned first prize in a national contest initiated by my father and organized at our high school. Coincidentally, a few years later many high schools in the country “invented” such a contest.
The next years
That game was my last project on the Z80 architecture. We had our revolution, we were no longer communists, so real technology enters our country. We afforded our own PC a lot later, but I studied at my high school (where we had a 286, then a 386, etc.). During the summer holiday, my father managed to get the school computer at our home—because he was working on real stuff where a computer was needed, such as managing the admission exams, or creating the teachers' and students' time table.
Yes he's damn good about this too; his time table program does an optimal job. He is in charge with creating the time table at our high school for about 20 years and very, very few people complain about it.
During my end years in high school, my preoccupations started to diverge from my father's. I was learning protected mode assembly (I was using Watcom C++ and DOS4GW), then I moved to Borland C++ 5 where I was building Windows applications. In an attempt to help our high school with the admission exams, I created a pretty solid application to manage this—with a nice GUI, with print and print preview, etc. I was 17. This application earned second place at our yearly contest.
If I remember correctly, the first prize was accorded to a project created by Alexandru Costin and Bogdan Râpă (both of InterAKT); it was a voice recognition bullshit that I never understood (and never fulfilled its promise anyway)—but it was drawing nice graphs. >-)
When I finished high school, I was already thinking about myself as a C++ wizard. I (thought I) knew everything possible about this language. Meanwhile, a lot others were still doing Pascal. There were a few computer science teachers in our school, but except my father, none of them knew C, let alone C++. One of them actually came to me to help him with some problems.
Finally, let's go to college. The admission was based on a solid exam which had two parts: one math exam, one programming exam. For the programming exam you were required to give the solution in Pascal. So I started looking at Pascal again (having not using it for 2 years at least). Boy it look so weak compared to C.
Anyway, I join the college. During first year (when I was a conscious student) I was remarked by a lot of teachers for knowing things that no one else did. I was a wizard in x86 assembly. I was a wizard in C/C++. Some teachers even agreed I can miss classes because I proved there was nothing I could learn there. It was around that time when I realized what a great job had my father done with us! We knew all essentials and we knew how to learn by ourselves!
One infamous class was Visual C++. I never understood why was I required to learn MFC (by that time I was already a fanatical Linux user). So the teacher asks us to build a drawing application in VC++ and MFC. I say “look, I don't even have Windows on my computer; can I build this thing with GTK+ and Linux”? The answer was “no; we are learning MFC here so that's what you must use”.
Finally, I built my application with MFC (it's still available here) and got an A, but my belief in the education system started to erode. The next year, the MFC class has been removed from the curriculum. It was gone! I learned it for nothing—anyone agrees now that no sane people use MFC. Meanwhile, GTK+ is still there—but I was forbidden to use it for passing that class.
You see, it was such a big difference from high school! In the high school I was learning useful stuff that I loved—and I was free to use any tool I want to solve a problem. My father did not ever impose “curriculum” restrictions on us. We were ahead many other students. In the college, though, we were all required to do the same things. I don't know, I simply didn't fit.
One year later I got employed and that's about the end of my college experience.
Irony of our education system
To put pieces together, now, let me tell you a funny story. My father is not allowed to teach computer science! That's according to the law. Why? Because the CS degree that he has taken 30 years ago, is no longer regarded as a computer science degree. With the communism fall, a lot of rules have changed.
Indeed, 30 years is a lot of time. My father did not learn C++ in college. He learned it by himself. Except for the solid theory, nothing he knows now could have been taught in a college 30 years ago. But theory changes so rarely—and all other things can be learned as you go!
It was indeed more biased to math than to computers, but that's only because those were the times—a computer was as big as the whole laboratory! He sometimes quoted a smart man whose name I forgot: “if you get a math degree, you will be able to do anything else!”.
So according to the law, my father now has two options: either quit teaching computer science, or do it for half the standard salary (which is anyway miserably low)! That's amazing, I'm telling you, I can't understand why people even send their children to school.
My father wrote 3 books on programming; he wrote countless articles to the math gazette and to “GInfo” (a gazette on programming). He produced a few great students, and others are on the way. Yet, according to the fucking law, he can't teach programming. That's the country I live in.
He sent a memorial to the Ministry of Education. He didn't get any reply the first time, so he decided to send one again after about a year. The second one got a reply within a few months, and the reply was negative—all his work in this field is not recognized, because, well, he doesn't have a recognized computer science degree. The sad truth is that he does have a computer science degree, but laws have changed in between.
The fate of a student
Romanian education is in a vicious circle. The salaries of teachers are miserably low—so naturally, great students (which are very rare) chose to work in some other field rather than education. So, those who chose to become professors are the weak ones. They produce weak students; this, consequently, results in even weaker teachers. Meanwhile, great teachers are not allowed to teach.
After the communism fall, our education system is changing every year—teachers are confused, as well as students, as to how things will go.
For example, when I started college it was supposed to take 4 years + an optional year for master. Now it takes 3 years + one for master.
Another example is that MFC class. It was obviously useless, but I had to take it. Now it's not there anymore.
[ Politics: Microsoft has sponsored a few of our laboratories. We have great computers, but we're required to run Windows on them. We're also required to teach students MFC, .NET and other Microsoft technologies; in those modern laboratories we're not allowed to run Linux, Java, nor anything else that competes with Windows. We're controlled by those people who give us money—which naturally lowers the level of expertise we can get. ]
And the most horrendous thing: there are no more admission exams! You can join the college based solely on the grades you took in high school. This sucks because: (1) as a former communist country, corruption is still at high levels here and (2) in high school you learn very general things, while the college is supposed to be very specific.
I had to learn biology in high school, even though I've got nothing to do with it during my two years of college (and during the rest of my life for that matter). However, my 10 years old biology grade could now influence the fact that I am or not admitted to a computer science college!
If I wanted to join a computer science college right now, I would compete with guys that knew that their high school grades will help. I didn't know that—because during my high school time, there were no such rules. My high school grades are low—I never knew I'd have any advantage if they were high.
Whole generations of students have been sacrificed in Romania for the purpose of “reforming and modernizing our education system”. The result? Now we suck. During communism, we didn't.
All this results in more confusion and even less interest. I sometimes feel that someone intentionally tries to imbecilize the Romanian nation.
I have many former colleagues that did have the patience to waste 4 years to finish their degree. Many of them are working for software companies, but most of them have pretty low wages. Others, however, left country to go to Italy for seasonal work. Others are cab drivers.
And none of my former colleagues (well, no one that I know of) produced anything interesting in a computer-related field. By contrast, however, some of the most intelligent programmers I know are self-taught and did not have the patience to finish a CS degree.
It doesn't really matter if you have a CS degree—it's not something to decide how the rest of your life goes. What matters, for any kind of job, is determination and a sense of happiness doing it. I'm happy programming and perhaps the greatest thing that my father taught me is how to learn by myself. I do programming for a living and I'm not complaining about how much I earn. I also can tell you, with no shame, that I'm one of the best DHTML programmers nowadays. (Yes, I'm even better than my father. Such a great teacher he is!). And this is the platform of the momentum. When it will change, I will adapt—because I have the power to adapt.
So do I need it?
Tell me, honestly, if you have read all this: do I need a computer science degree?