# Learning the Deep Magic

Followup to: Programming is the closest thing to magic

Well, classes are starting next week at DigiPen. I'm a freshman this year, finally out on my own from high school. There are around 120 people in my freshman class, which is awesome, and I'm getting to know some people.

What degree did I choose? Computer Engineering. "But that's a school to teach you video game programming! Why didn't you go to MIT or some other fancy school renowned for engineering?" Well, I was asking myself a similar question a few days ago. I knew I answered it several months ago when I initially applied, but I forgot the answer. So I've re-derived it and I'm posting it here so I don't forget.

When I was younger, I wanted to be a neurologist. I had played and loved Life and Death 2: The Brain, I had studied a little neuroscience, learned a little about the brain, learned a little about how brain surgeons work. (Sadly I have forgotten pretty much all of this, but I do plan on checking out a giant neuroscience book at the school library in the coming week or so.)

Then my friend and I talked about making websites, and we are both huge fans of Nintendo video games. He went off and made a dinky site in a WYSIWYG editor to host cheat codes. Now at this time, I was becoming more of a computer person by my own. I was touch-typing, my brain was increasingly bored with school, and websites just sounded cool. A separate online friend even offered me a subdomain, which I took.

My friend's launching of his site spurred me into motivation to learn HTML. I tried a WYSIWYG editor, and hated it. Instead I started off very simply: studying table-tag code from my online friend's "Under Construction" page. I asked him about it, and he was helpful. Eventually I found an awesome HTML tutorial, and started learning how a basic document was formed and the various tags I could use.

I'm not going to link you to version 1 of my site even though it still exists in limbo on a free hosting provider. It's just terrible. But at the time, I was pretty proud of myself for accomplishing my own web page, without using weak-minded tools that abstract away understanding itself. The current version (and likely final, as I have no reason to further fill the site with content), is located here. I use it now as just a primary domain; this site is really a subdomain of it.

Anyway, I found joy in understanding what HTML actually is. Over time I progressed and learned CSS and XHTML and div-power. But the real game-changer was when I learned my first programming language, PHP. My previously mentioned online friend knew some PHP, and wrote a quick script for me showing me its power. I could put my header stuff in one file, my footer stuff in another, and just put the content files on the server instead of full HTML files. And I could call it all from just the index page, but each page had its own unique link! This primary function of PHP--being able to modify one file and change the entire site--inspired me to learn the full language. My friend recommended Larry Ullman's PHP and MySQL book, and that's the only PHP book I'll recommend to anyone now. I read fast, and learned fast. I struggled with the for() loop at first, because of its weird syntax, but I got the hang of this "programming" business. I stayed away from serious MySQL for a long time because I never felt like I needed it, but that knowledge came eventually.

High school arrived, I was pretty good at PHP and programming in general. I took the AP Computer Science course my sophomore year, which taught Java, and excelled. The class taught CS concepts somewhat frequently through means of graphics programming in applets. I believe one of the first assignments was to create something like this. (Hint: there are no curved lines in that.) Prior to this I had looked at a variety of other languages, but I didn't really "get" them, especially this "object oriented programming" business. Learning Java forced me to understand OOP, and so during the year I again looked at Python.

My programming practices were poor at the time. I liked using a plain text editor called EditPad and because of laziness didn't like to indent my code, or if I did it would only be one space. (Now I do two spaces.) I resisted Python at first, because of its forced indentation, but it grew on me. Since then I've only learned more Python, now I explore libraries. Always I'm fascinated at what kinds of things I can do with the language; it's the only true way to do OOP.

I received a free copy of Larry Ullman's C programming book (which is very good) and read it; I learned the basics of C++ over 11th and 12th grades at high school (11th I was in the class first semester, 12th I was a TA and nothing was really new). I don't mind these languages, but I still prefer high level ones. I've played with Perl, touched some Ruby, and glanced at a score of other languages I don't remember half of. Always I've gone back to Python: it's my dearest language. PHP has a place in my mind because it's my first, and because it's so useful for web development (I can't get on board with Django), but Python is my favorite. To those who say it's too slow, I point them to psyco, or to embedding C, or to the new project Unladen Swallow.

Over the past while I've learned Scheme. The syntax isn't very hard to learn, but it does require a Zen-like transformation of your attitude toward programming to truly appreciate it I think, at least if you're coming from C-like languages (in structure). Needless to say, combined with Python, I've felt like I've done loads of magic. I stand by my assertions about magic in the previous post, namely that with higher level languages you get to do more magic itself.

But there's still some deeper, darker magic that few programmers now dare to tread. I think the fact that there's only 5 Computer Engineering students in my Freshman class compared to the numerous Real Time Interactive Simulation ones neatly shows this. This deeper magic is the hardware. It's the interfacing between hardware and software. Every magician uses it by necessity, but not many understand it. I've always thought this about fantasy novels where the wizard must use a staff: the staff channels the raw, destructive, black-box magic into something they can understand. I've theorized that a wizard without a staff, who uses the raw magic, would be far more powerful.

So you would think that, since I have thus far specialized in high level coding, and in high abstractions, that I too would shy away from this deep magic. I'll admit it's somewhat frightening: I'm used to being good at computer stuff, but in the realm of hardware I'm a complete beginner. I've never even soldered anything before. But this is deep magic I feel like I need to learn. It's the magic at the heart of every electronic device out there, not just the magic of web apps or video games. If I learn it, then every other form of magic is open to me. Reach the source, and the whole river is then available to drift down.

I'll also show some of my own hubris here. I'm fairly confident that I can learn the higher level simulation and graphics programming on my own, and there are numerous books. All you need is a computer powerful enough to run the programs. Hardware, on the other hand, can be expensive, especially if you don't know what you're doing. Just bought a circuit board, eh? Whoops, you fried it. DigiPen has the electronics there for me to learn with, and will provide me with electronics that I personally want to tinker with. GPS? Sure. LCD screen? Yeah. Just so long as its a reasonable price.

Another feeling I get about the software side of the game industry is that in the industry, as a programmer you're going to be hired to program. It would be very rare for your own ideas to actually make it into a game, as many companies usually have planned projects for some years in advance. If I end up in the game industry programming things, I think my best option may be the independent developer road. Of course if I make friends with good artists and 3D modelers that's a huge plus, but it's not too complicated to make, say, an iPhone game, and if you toss out values such as "usefulness of product" you can make a farting application that sells like hotcakes.

The hardware though, again, I don't feel like I could learn on my own. I didn't even have legos when I was a kid, I haven't had school-chances or funding to mess with robots. I have done very minimal AI, but it could hardly be called AI. (I would love to learn tons of AI stuff, and that might end up being my path with respect to the software side of hardware applications such as robots.)

I believe people should challenge themselves. I could have gone to the University of Utah, and sailed through their Computer Science program, but why? I understand that students are paying out their asses for college: I'm in a huge student loan mess right now I'm not expecting to pay off this half of the century. When MIT releases all their course info online for free, you know you're no longer paying for the information itself. Information is becoming more free all the time. So ask yourself what are you paying for? There is one definite: the degree title. But there's another thing you're paying for if you're going to any decent school: you've hired the school to teach you the information because it's hard to learn on your own. If you're going to a decent school, you're paying for a network of people to help you out later in life. If you're going to a decent school, you're paying for awesome professors to help you in every way imaginable to understand the material.

This is why I've chosen DigiPen, and also why I've chosen the Computer Engineering degree. I hope I can look back on this post in the future and remember, because it's always a horrible feeling to have if you feel you've made a huge mistake which you can't fix. So wrapping up, I'll leave a message to future-me: forget about money, forget about the difficulty, forget about not being totally awesome and fast at everything. All you must do is win in this game you've put yourself into. You know the rules, you can bend the rules, but your goal should only be to win. Come out of this in four years educated with something you couldn't learn on your own, come out with a degree, come out with a sizable group of acquaintances with many talents, and you will have won. After that, and only after that, you can enter new games, and worry about winning them.

Addendum: I recently wrote a 240-word (the limit was 250) essay about my academic/career goals, and submitted it with a scholarship application form. Here it is:

If there's one sentence that can describe my current goals, it is this: "I know where I'm going, but I don't know where I'll end up." I love knowledge and I am particularly fond of computer programming; the field of computers is vast and continues to satisfy my curiosity. Currently I am in a Computer Engineering degree, with focus on video game technologies.

But to what end will my learning carry me? I do not fully know, and I think this is a good thing. Too often people trap themselves in their dreams--they succumb to the sunk cost fallacy and continue to strive toward a fruitless goal, when to others the futility is clear. This is telling in the construction market, given the current economy: people went to a trade school and learned solely construction, but now there is little demand for their skills. Those that complimented this goal with a different field, for example business, have more options available to them and hurt less.

Which brings me back to why I'm in Computer Engineering. Many of my peers are in a specialized degree focused strictly on programming video games, whereas in my degree that's only part of it. I also learn how to build robotics, work with circuits, and do low-level programming not strictly related to games. Right now, I want to do video game work, but when I graduate, I don't want to be limited to just that.

#### Posted on 2009-09-04 by Jach

Tags: college, personal, programming

LaTeX allowed in comments, use $\\...\\$\$ to wrap inline and $$...$$ to wrap blocks.