When you talk to accomplished programmers, it's no shock to hear they began programming at a very young age. Unfortunately, I was not the same way and did not grow up programming. I was much more into hardware during my childhood. I learned how to solder, read and write circuit schematics and build small projects. For my 7th grade science fair project I built a so-called breadboard robot built around a BASIC Stamp II microcontroller. However, you can only do so much hardware until you need to know something about software. It was then that I first got my hands on programming, years after I had tinkered with my dad's IBM DOS box and then my sisters' 25MHz Macintosh Centris 650 in 1993. I had to. The robot wasn't going to find its way out of a maze without any instructions.
Thanks to Anonymous for suggesting this article via Skribit, and to the readers that voted heavily on it over the last few days.
All I had for reference with a massive, verbose PBASIC programming book that came with the microcontroller. That didn't work so well. Fortunately, I got to know one of the managers at a local electronics store and he introduced me to some of the Basic programming language foundations, from gosub to interfacing with the microcontroller's I/O registers. I went to the state level for that science fair but my robot didn't do much other than move sporadically.
My CS History
It wasn't until the end of high school when I took a computer science course that I touched programming again. It was Java and the teacher introduced us to the teaching-friendly BlueJ IDE. That same year I had a period where I would hang out with that teacher in the library and go and fix computers (remove spyware) from various teachers' computers when summoned.
During that same time I had an idea to make a website allowing visitors to customize computers that I would build and ship. This was when I first got involved with HTML and used Dreamweaver - often on that same teacher's Titanium PowerBook G4 when he was off running errands. The site never really launched but I implemented a photo uploader that somehow found its way all over the tubes and people began using my server for image hosting. I had to shut that down after it used several hundred gigabytes of bandwidth.
Fast forward to the summer after my freshman year at college. Along with a friend in my dormitory, I decided to create a wiki website compiling all sorts of computer modification information. For the years prior, I was very much into building, modifying and overclocking computers, had won numerous LAN party PC building competitions and had worked my first job building computers in an unairconditioned warehouse in Texas and installing them at schools for 7 an hour. (It was around the time that LGA775 first started being used by Intel so I was pretty psyched about playing with those machines.)
My friend and I created TheModWiki.org, began writing articles about computer modifications and spread the word. It was through tinkering with this project that I was exposed to PHP with MediaWiki, as well as Linux systems administration. It was also around this time that several friends in my dormitory got me hooked on Linux and I began using Gentoo Linux with Fluxbox exclusively for about a year.
That friend wanted to start a blog and began researching a few content management systems. I was equally curious and decided to install WordPress on my then-new Mac Mini G4. I liked WordPress and ended up buying PaulStamatiou.com and began hosting this blog from my dorm. Fast forward a year later and I was quite proficient at CSS and XHTML from endlessly modifying my WordPress theme.
Of course, my college major is heavily involved with computer science so I have been subjected to a range of courses like the following:
- CS1371 (MATLAB/Java)
- CS1322 (Java)
- CS2260 (C)
- CS2340 (SmallTalk)
- LCC2700 (misc esoteric languages)
- LCC3710 (Actionscript)
- LCC3705 (PHP/MySQL/JS/AJAX)
- CS3750 (User Interface Design)
- CS4660 (Educational Technology)
- CS4803CJ (Computational Journalism with PHP & MySQL for some projects)
- CS4803doc (Design of Online Communities)
Among those, I learned the most about programming in the Information Design course LCC3705. There were only about 8 students in the class and it was taught by a graduate student from CMU, as I'm assuming Georgia Tech could not find a professor familiar enough with PHP, MySQL and AJAX to teach the class. It was a great class and very laidback. We learned a bit of PHP, tried it out on our own and then left. That class had a longer project at the end of the semester that I got into quite readily. I built a "party finder" application of sorts that used a PHP library for Google Maps and allowed users to create, share parties and find parties near them. It would subsequently load machine-tagged images from the parties from Flickr using their API and publish microformats data for each party.
The only images I could find of that project.
From what I learned there, I wrote a few guides:
- How To: Code Your First Web App, Part 1
- How To: Code Your First Web App, Part 2
- How To: Code Your First Web App, Part 3
I wouldn't recommend those articles anymore as you're probably better off building a web app with an MVC framework but it's a decent beginner's guide to tying together simple PHP and MySQL.
So that was a bit about my computer science and tech background, but how do I learn about computer science topics now? For the past ~11 months I have been involved with Skribit, where we use Ruby on Rails. It's my first experience coding collaboratively using version control (SVN in our case) and an MVC framework. I'm still very far from being proficient at Ruby on Rails development but I can usually hack something together over time.
I watch and learn, then write. I spend time tracing code and seeing what each line of code does. I use Firebug to debug things on the front-end and prod about for performance issues with TuneUp. I also bug Calvin with Ruby questions from time to time. And of course, I Google anything and everything. Errno 1041? Google. NoMethodError? Google.
How I Suggest You Get Started Coding
Becoming good at programming lots of practice and inevitably lots of failures. There's no way around this, it just takes time. But that doesn't mean it has to be drab and boring. I can look back at most things I've done and say that the reason I started them was my own curiosity. I was curious about WordPress, so I started a blog. I was curious about how computers worked, so I built my own. Curiosity may have killed the cat but it's a way of life in the tech world.
First off, know your environment. Make things easy on yourself and just get a Mac/use Linux, or become a slave to Cygwin in Windows.
- Get to know the Unix filesystem.
- Learn vim basics.
- Find a text editor you feel comfortable with.
- Tinker with FTP.
- Learn how to use SSH.
- Install LAMP and setup your own blog, preferably on a web host. Doing so will introduce you to the basics of DNS, PHP, MySQL databases (try phpMyAdmin), firewalls, the Apache web server and more.
Find out what you're interested in and something you want to build. Build it by learning along the way with trial and error and..
- Read programming blogs and App Jet's Absolute Beginner's Guide to Programming on the Web.
- Read How To Become A Hacker.
- Learn about open source and read The Cathedral and the Bazaar.
- Check out Why's Poignant Guide to Ruby.
- Read Hacker News, Reddit Programming and DZone regularly.
- Look at code from open source projects and see how it works. Change something and see if it still works.
- Read Software Engineering for Internet Applications.
- Hang out with smart CS people (easy to find at nerdy schools). Ask questions.
- Buy a bookshelf full of technical reference books.
After about ten years you should be able to call yourself a programmer.
How did/are you learn(ing) to code? What's your specialty?