Conceptual Advice on Learning Ruby (So Far)April 01, 2014
I've been teaching myself to program for about 6 months now, and I just figured I'd mention my thoughts on what has been helpful, difficult, useful, etc. so far from a big picture perspective.
I started out just wanting to learn Rails to make cool web apps. I hadn't done programming of any kind (other than tinkering with HTML and CSS) so it was a scary decision to finally commit to learning a real programming language (Ruby). I tried a lot of the online interactive tutorials like codeschool, and while they were great as an introduction I would highly recommend a different approach.
The truth is that while initially I just wanted to learn Rails, I quickly ended up needing to understand more about Ruby to do the things I wanted, and that led to needing to understand more about computer science fundamentals. So my first piece of advice is:
1) If you really want to learn how to program start with some computer science fundamentals
MIT has something called Open CourseWare where they post lecture videos up for an entire course in addition to all of the assignments and exams. The professor does a fantastic job of explaining computer science fundamental concepts like assignment and recursion.
If you're just starting out (like me) learning to program can be pretty overwhelming, there's just a never-ending amount of things to learn (but that's part of what makes it so fun!). And if you're learning to program web apps there are so many things to keep track of. If you want to effectively program in Rails you need to learn Ruby, the Rails conventions, HTML, CSS, and Javascript, but then you also need to learn testing frameworks, a bit of SQL and some Git (or other version management), have an understanding of HTTP, know how to navigate/interact with the console (OSX and Linux) not to mention things like SASS and ERB and any GUI you may choose to use (Twitter Bootstrap, etc.). Sure some of these things are pretty simple, but it all adds up to so many things to learn and remember that it can make your head spin! So, my second piece of advice is:
2) Don't be afraid to bounce back and forth a bit while learning the different languages, conventions, etc.
It may seem like progress is slow, but they're all so interconnected that it's tough to pull them apart. Just keep working at expanding your knowledge of each of them as you need them and it'll all slowly start to fit together.
Which brings me to my next piece of advice:
3) Balance your time between working on projects, learning about concepts (books/tutorials/articles), and checking out good code
When I first started out I was spending all of my time reading books, watching lectures, doing tutorials and that's understandable because you need a certain amount of knowledge initially to be able to do anything. But all of these things were very abstract and conceptual. I learned the most, by far, when I decided I wanted to build my first web app and started applying them. Every day I would just decide I wanted to complete a specific task and keep working at it until it was done. Sometimes that meant spending hours on Stack Overflow or Google. Then after a while I was spending so much of my time working on the app that I wasn't really learning as much as I needed conceptually or improving the quality of my programming. Now that I understand some of the basics and am working on projects I'm looking for ways to improve the quality of my code and since I don't have many friends that program that means spending time on Github looking at well-coded projects. Like anything else, choosing how to allocate your time is a balancing act.
The next piece of advice is a big one for me:
4) Don't avoid learning things that seem too difficult
To be honest this is what kept me from diving into programming a long time ago, it just seemed too difficult, too intimidating. But now that I'm committed to learning it, I still have to avoid psyching myself out. In my experience this is something that people do a lot in their everyday lives and it's a very limiting process. It's easy to look at things like regular expressions or testing languages and say, "I'll learn that later" or even worse "I just don't use those," but I've started a process where every time I experience myself thinking that way, I make it a point to spend time learning that thing I'm intimidated by. The more I've forced myself to do this the more it has become habit, which has served me in my life in general as well.