Learning to Program — Journey to Proficiency

I created my first website in 1998, during the days of Geocities, Tripod and and Angelfire. For more than a decade after that, I learned many marketable skills thanks to the culture of open source and sharing in the hacker community.

One skill that I never really learned was computer programming. Still, as a freelance web developer I was able to offer services such as SEO, Design/HTML/CSS, databases, deployment, troubleshooting and back-end development using open source PHP apps like Wordpress. It is surprising how much one can do without knowing too much about software development.

For many years I had the realization that I could be “dangerous” once I learned to program. The desire was there but my focus was on higher priorities - my formal education (science degree and then an education degree) and my freelance work.

A unique opportunity to learn programming presented itself during the fall of 2012. Top quality university computer science courses were made available through Coursera. These courses started me on a journey into the software development world.

The Dreyfus model of skill acquisition is a good way of modelling my journey. The model suggests that learners go through five distinct stages when acquiring new skills.

Novice Stage - “OMG my computer knows math”

Learn to Program: The Fundamentals and An Introduction to Interactive Programming with Python were instrumental in taking me from novice to advanced beginner. The courses were perfect for novices because instructions were clear, rules/recipes were given, there was close monitoring (deadlines for assignments, marks, quizzes, a lot of interactivity with the teachers). The coding environment was simple to set up.

I learned fundamentals: how programs work, memory, variables, built-in functions, types, defining functions, flow (conditionals, loops), mutability, etc.

Code School (Try Ruby & Try Git) and Codecademy (Python, Ruby and Javascript tracks) were great places to get practice and apply the rules/recipes that I learned to other contexts. At this stage, getting acquainted with any other programming language became easy because patterns started to emerge. I realized that the rules and recipes that I learned can also be applied to other contexts. It became just a matter of learning syntax differences.

Advanced Beginner Stage - “Getting out of the sandbox”

To go to the next stage I needed to get out of the “sandbox” so to speak and get experience dealing with “real world” situations. The first chapter of Michael Hartel’s Rails Tutorial book was a good start because I was taught to install RVM/Ruby/Rails and use the terminal and Git to deploy a Rails app to Heroku. Next I completed the Rails for Zombies Redux course but I insisted on creating a “real app” and not just being content with the online exercises. To add authentication and authorization to the app I followed the screen casts from Railscasts. I also completed the jQuery Air course (now Try jQuery) to get some practice with Javascript.

At this point I felt excited but pretty confused as well. There was a lot of stuff that I didn’t understand. Still I built my first app (twitter clone) with authentication and authorization and a dash of Javascript so I started to feel competent.

Competent Stage - “Time to dive into the details”

Work was a bit overwhelming at this point in the year; I had 30-40 students and we were preparing for the Ministry of Education inspection. So Christmas was a much needed break; I got two weeks to relax and complete some Code School courses. I completed Ruby courses (Rails for Zombies 2, Ruby Bits, Rails Best Practices), Git Real, and JS courses (Coffeescript, jQuery Captain’s Log, Anatomy of Backbone).

In January I signed up and completed CS169.1 (Saas course from edX) and Introduction to Databases (Stanford’s class2go). A big picture started to form, relationships became clear and some misconceptions were replaced with solid understanding. However, rules started to pile up so it was pivotal that I start to organize knowledge and form patterns that are easier to remember.

In order to build a better conceptual model of software development, I found it necessary to get more practice and learn more real world programming concepts (such as BDD/TDD). So I completed the following:

I took the time to learn more about the Ruby environment (Rack, Rake, RubyGems, Bundler) a few weeks ago, which helped me form connections. I used this knowledge to play around with the Jekyll and Sinatra gems.

At this point, I feel that Ruby makes more sense, now that I have a better understanding of OOP, metaprogramming, and the Ruby object model. BDD also makes more sense; I am able to write a Cucumber feature and use it to write Rspec specs and Ruby code. The past week or two, I took some time off to review/learn HTML5/CSS3, Mobile First Design, Responsive Design, and Sass/Compass thanks to Code School and some books.

It’s hard to say whether I am a “competent” developer at this point but I certainly know a great deal about the whole development stack and I have years of experience in web design/development. At any rate I will feel more “competent” once I organize my notes because they will help me form a framework around my skills/knowledge.

The real test of competency will be building a unique app from scratch. Fortunately, I already have a freelance project to work on that fits the bill. Voix Visuelle (long-term client) is an artists’ center that has requested a Rails app to automate art submissions. I will be working closely with my wife, Paula Franzini, to complete this project, as she is the technical liaison.

Proficient Stage - “Harder than it looks”

The software development knowledge and skills that I possess come almost exclusively from self-directed learning. For this reason, I felt that a formal approach (HackerYou’s Summer Academy) will help patch up some rough spots. The HackerYou program will be great because I am taking two months off (less work, less distractions) to really be immersed in software development. The program will be an opportunity to meet people who are in a similar situation and hopefully reciprocate some knowledge/skills/experiences.

I’m looking forward to a lot of practice this summer to build my intuition (knowledge and experience to tap into). To reach “proficient” status I will need to keep practicing and learning concepts such as:

  • OOP design concepts, more metaprogramming, Ruby object model
  • Best practices: scalability, maintainability, BDD/TDD, monitoring, performance tuning
  • SASS / multitenancy
  • Unix, VMs, VPS, AWS, Chef/Capistrano
  • Teamwork: Deploy app as team, continuous integration, collaborate with Git
  • Hacker Culture: open source, sharing/exchange of info, community/collaboration

Expert Stage - “10 years later?”

This will hopefully come with time, lots of passion and lots of hard work.