The Philosophy of Computer Science, Part I September 23, 2005
Todd and I recently had a discussion where I described to him everything that I was working on currently, and my "dumb" system mentioned in the "Your Site Rules!" section. I had brought up my Philosophy of Computer Science. I couldn't explain it in such a good way though, so I will attempt to now.
I am a learner. When I'm done learning something, I go and learn more. I am not exceptionally brilliant, but apparently (or seemingly) I'm capable of absorbing huge amounts of data though. I take as long as the next person to learn something, but it sticks. My brain tends to tie things together logically, instead of memorizing something outright. So that I can remember small amounts of facts and deduce the outcome using them. I'm sure a lot of people do this. There are some that will memorize everything, but us lucky ones who can remember less but seem to memorize more, make more room in our brains for other small tidbits of information, making us seem exceptionally brilliant.
However, calculating an outcome each time you have to recall it is somewhat inefficient. It's very inefficient. When someone asks you how old you are, you don't calculate "well, I was born in 1979 and it's 2005, that makes me 26" every time... You just know that you're 26 or whatever age you happen to be. Or you lie to get into a bar or because you look younger than you are :)
Someone recently asked me "Why do you learn so many technologies, when you can be an absolute expert at one?" To me, this is an invalid perception of what I do. I don't learn any specific language. I spend a lot of time using Java instead of what I use for work, C# and .NET. When I was in college, the classes that I had made me realize the answer to this question. Not the "Programming Language Paradigms" class, or the "Organization of Programming Languages" class... these were Computer Science classes. I learned the answer to this question in my Philosophy classes. I took quite a few. My favorite one was "Logic". It made everything clear to me.
Computer science isn't "using computers to achieve a task". It's a connection of objects. Either different computers, different technologies, different objects in an Object Oriented Programming Language... different ideas with their own logic, connected together in a way that they all work as one beautiful system. Why I don't learn one specific language or technology is because you are then stuck in that technology. I happened to take jobs in only .NET in the past, so now I'm only able to get .NET jobs, which is part of why I don't learn one technology, but not the only or even most significant one. It's pretty insignificant, actually.
With many technologies in Computer Science, and by technology I mean anything in Computer Science, I find it more important to know what they do, rather than how they do it. Ok, here's an analogy. You learn how to use chainsaws, you don't learn how to use one specific chainsaw. By learning how to use chainsaws, as opposed to one specific chainsaw, you can use any chainsaw. Why should technologies be any different. Writing a website, or using sockets to connect to the internet, or zipping up files, or using a printer, or writing graphics libraries, or using rule engines, or a scripting language, etc. Knowing what something does is much more important than knowing how to use one of those things. Memorizing one language is bad, unlike my "I'm 26" analogy. Being able to deduct this information, based off of that little fact that you store (it's a programming language), is huge. So, when someone says "This is a programming language", I immediately know that it will contain features like input and output (I/O), ways to connect to the internet, something for printing, ways to create objects and inherit from them, interfaces, basic objects like ints, longs, floats, Strings, etc, a mechanism for threading and synchronizing data access, etc. It's a programming language, it's gotta have this stuff, and logically, I can deduce that. So, now all I have to do is sit down with a reference and a text editor, and I can write a program using that language that was introduced to me 3 minutes ago. As I said though, this isn't only to do with programming languages. Tell me what a technology does, I'll show you how to use it in a programming language. I will need a reference, but it just makes sense to me that you call certain functions in a certain order with certain parameters, and it works. Nothing more, nothing less.
So, this is my philosophy of Computer Science, Part I. I'll have more soon.