This is a very powerful message. I've been trying for three years now to recapture the feeling that sucked me into computer science. It was an introductory CS course, and the assignment was to draw a scene using Python's turtle graphics module. The idea I had was to draw cube structures in one-point perspective, as I had long done on graph paper. This was in ignorance of how the entire field of computer graphics worked, and so my method was laughable in its simplicity. Analogous to Feynman and the tap water curve, I suppose; I was immensely proud of the final result[0].
That very week I switched my major from physics to computer science. The code I wrote then was truly, truly awful[1], but the feeling it brought the first time a line of cubes was correctly drawn was incredible. I, and only I had made it do that.
I've not felt that way again. Programming contests bring only the feeling of excelling in competition. Algorithm textbooks bring only the short-lived satisfaction of having a magic trick explained to you. Now it seems any time I research a new project I'm drowned in best-practice recommendations and intense fear of writing my own extensive library when a tested, vetted, and fully functional copy exists elsewhere.
What to do? I would do anything to recapture that feeling.
My advice? Write personal projects where you can tell people to go to hell ;) Let me elaborate for a second though: when I work on a personal project, if I want to implement a functionality and there's a library that does it, I write it myself anyway. If I need functionality and I don't really want to write it, I look for a library that does it.
Personal projects give you freedoms that professional ones can't. If your personal project isn't quite as stable because you rolled your own middleware in Node instead of using something that's already built, you can tell people to go to hell. These are projects that exist first to let you explore, interact, and build. Perhaps they exist second to provide utility to you. Only as a distant third do they exist to provide utility to others.
Now, that isn't to say that such a project can't or won't evolve into a professional one, or that you won't decide to make utility to others a higher goal. At that point, you'll have to see about revisiting some of your early decisions. But to me, what keeps things fun in that context is exactly that: creating something for me and no one else. Because then there are no rules and no constraints: just a canvas, a paintbrush, and paint.
Side projects... I hit ten years with my business and felt dragged down supporting boring issues and features I didn't feel like working on.
This year is different though. I've done a new project every month and amazingly the code seems to make its way back into the real product. This month I unintentionally worked on my main product for fun...but not features that customers have been asking for. Instead, the guilty pleasures like making the admin interface twice as fast. Long time customers were really excited to hear the change.
The most fun computer science related projects I've found are (1) learning new languages and (2) writing new languages.
For (1), I picked up the book Seven Languages in Seven Weeks[0] and learned to write (really basic) Ruby, Io, Erlang, Prolog, Scala, Clojure and Haskell. I didn't write anything great, but it was a lot of fun to play with new ideas.
For (2) I decided a couple of weeks ago to implement my own Lisp[1]. I know almost nothing about Lisp and so I'm making a lot of mistakes and re-inventing the wheel a lot, but having a language whose syntax or semantics is changeable on a whim is just so much fun. Want a syntax for function literals? You can add it. Always thought that hashmaps should be a special case of functions? You can add that too. I can't recommend this enough as a way to rekindle your interest in computer science. I'm going to work on the language in my spare time for a couple more weeks, and then try to write a compiler for it. I've never written a compiler before (I was a math major, not computer science). I have no idea how you do it. But I'm pretty certain it's going to be fun.
It is not a coincidence that the article was written by a Nobel price winning scientist. To be successful in science you to be in this creative mode of operation all the time. Even if you are solving a "real" problem (the kind you get funded to solve), your inspiration for doing so needs to come from all over the place.
I am most probably wrong, but maybe Computer Science, like Physics has gone past the fast growth phase, which is the most exciting period to work on any subject. Everyone is optimistic and excited, unexpected things happen that hold you pinned to your computer/equations/microscope.
Comments
This is a very powerful message. I've been trying for three years now to recapture the feeling that sucked me into computer science. It was an introductory CS course, and the assignment was to draw a scene using Python's turtle graphics module. The idea I had was to draw cube structures in one-point perspective, as I had long done on graph paper. This was in ignorance of how the entire field of computer graphics worked, and so my method was laughable in its simplicity. Analogous to Feynman and the tap water curve, I suppose; I was immensely proud of the final result[0].
That very week I switched my major from physics to computer science. The code I wrote then was truly, truly awful[1], but the feeling it brought the first time a line of cubes was correctly drawn was incredible. I, and only I had made it do that.
I've not felt that way again. Programming contests bring only the feeling of excelling in competition. Algorithm textbooks bring only the short-lived satisfaction of having a magic trick explained to you. Now it seems any time I research a new project I'm drowned in best-practice recommendations and intense fear of writing my own extensive library when a tested, vetted, and fully functional copy exists elsewhere.
What to do? I would do anything to recapture that feeling.
[0] http://i.imgur.com/wih35.png (find the tetris pieces!)
[1]* https://github.com/ahelwer/UofC/blob/master/cpsc217/as3/grap...
* If you want to run the script, you'll need the modified turtle graphics module found in the same github directory.
My advice? Write personal projects where you can tell people to go to hell ;) Let me elaborate for a second though: when I work on a personal project, if I want to implement a functionality and there's a library that does it, I write it myself anyway. If I need functionality and I don't really want to write it, I look for a library that does it.
Personal projects give you freedoms that professional ones can't. If your personal project isn't quite as stable because you rolled your own middleware in Node instead of using something that's already built, you can tell people to go to hell. These are projects that exist first to let you explore, interact, and build. Perhaps they exist second to provide utility to you. Only as a distant third do they exist to provide utility to others.
Now, that isn't to say that such a project can't or won't evolve into a professional one, or that you won't decide to make utility to others a higher goal. At that point, you'll have to see about revisiting some of your early decisions. But to me, what keeps things fun in that context is exactly that: creating something for me and no one else. Because then there are no rules and no constraints: just a canvas, a paintbrush, and paint.
Side projects... I hit ten years with my business and felt dragged down supporting boring issues and features I didn't feel like working on.
This year is different though. I've done a new project every month and amazingly the code seems to make its way back into the real product. This month I unintentionally worked on my main product for fun...but not features that customers have been asking for. Instead, the guilty pleasures like making the admin interface twice as fast. Long time customers were really excited to hear the change.
The most fun computer science related projects I've found are (1) learning new languages and (2) writing new languages.
For (1), I picked up the book Seven Languages in Seven Weeks[0] and learned to write (really basic) Ruby, Io, Erlang, Prolog, Scala, Clojure and Haskell. I didn't write anything great, but it was a lot of fun to play with new ideas.
For (2) I decided a couple of weeks ago to implement my own Lisp[1]. I know almost nothing about Lisp and so I'm making a lot of mistakes and re-inventing the wheel a lot, but having a language whose syntax or semantics is changeable on a whim is just so much fun. Want a syntax for function literals? You can add it. Always thought that hashmaps should be a special case of functions? You can add that too. I can't recommend this enough as a way to rekindle your interest in computer science. I'm going to work on the language in my spare time for a couple more weeks, and then try to write a compiler for it. I've never written a compiler before (I was a math major, not computer science). I have no idea how you do it. But I'm pretty certain it's going to be fun.
[0] http://www.amazon.co.uk/Seven-Languages-Weeks-Programming-Pr...
[1]https://github.com/chris-taylor/Haskeme
My advice would be to enroll in graduate school.
It is not a coincidence that the article was written by a Nobel price winning scientist. To be successful in science you to be in this creative mode of operation all the time. Even if you are solving a "real" problem (the kind you get funded to solve), your inspiration for doing so needs to come from all over the place.
I am most probably wrong, but maybe Computer Science, like Physics has gone past the fast growth phase, which is the most exciting period to work on any subject. Everyone is optimistic and excited, unexpected things happen that hold you pinned to your computer/equations/microscope.
Physics is still exciting. It's just different areas of physics than earlier.
Here's a good "play with turtles" chapter in an online textbook if anyone is interested: http://www.greenteapress.com/thinkpython/html/book005.html
Did porting your project to github mess up the formatting, or did you actually use 8-space tabs?! Because I just threw up in my mouth a little bit.
Have you talked to any of your professors about research? (I'm assuming you're still an undergrad.)