Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: Where to start?
12 points by myvii on May 27, 2013 | hide | past | web | favorite | 15 comments
TLDR: My main question is, how do you start learning/working with 'modern' programming languages/practices/tools.

I am in my late 20's and a developer for a few years. The problem is I'm a Coldfusion developer. I have these ideas that I want to create, but I don't want to write them in Coldfusion. I would like to use something like Ruby, Python, Go, or even Scala. I've taken Coursera courses on Ruby and Scala. I do understand them enough to go through the courses, but it's hard to grok the environment.

I've been a Windows guy, and just recently bought a Macbook, hoping it would push me into learning the environment. But in reality it's been a bit of culture shock. I get confused using all of these tools. I tried setting up my machine with Boxen, until I couldn't figure out the error it was throwing and got frustrated and reinstalled. I think this is the third time I've reinstalled OSX.

Homebrew, ZSH (and oh-my-zsh), Puppet/Chef, Vagrant, Rails, Gems, Rake, rvm, rbenv, Node, npm, Angular/Ember/Backbone, virtualenv, pip, etc, etc. Even things like git, setting up ssh/certificates, and just generally command-line things are intimidating.

I get that a lot of people just intuitively know these now, because they 'grew up' with them, so to speak. But to someone just trying to get into it's incredibly overwhelming.

Things like TDD are foreign to me too. I understand it at a high-level, but actually writing tests is hard for me.

I know things well enough to know that I should use it, but not enough to know how to use it.

I want to write software, but I don't want to write bad software. I definitely suffer from analysis-paralysis. If I don't know that I'm doing it right, I find it hard to start. One of my ideas is something related to bitcoin, so I know that it will be attempted to be hacked. That brings a whole new aspect in hardening servers, writing secure code, auditing, etc.

I'm just at my wit's end. Maybe you all could point me in the right direction.

You might benefit a lot from just watching how Unix-based developers work. Screencasts are a really good way to do that. You can learn a lot from just watching and following a long. Just re-type things verbatim at first - while you're getting comfortable. Do not copy/paste at all. If you're doing web projects then don't even think about anything other than Ruby or Python. Try them both out, pick whichever one seems more comfortable. Don't sweat it.

This is a really good idea. I think it would help a lot. Do you know of any good screencasts?

As an avid collector of links, I know of these paid sites:

[1] https://www.destroyallsoftware.com/screencasts - Seems more advanced than an intro course.

[2] http://www.letscodejavascript.com/ - Looks good, but for javascript. It does look like it's better geared toward beginners.

[3] https://peepcode.com/ - Has play-by-play's, but it's quite expensive.

> [2] http://www.letscodejavascript.com/ - Looks good, but for javascript. It does look like it's better geared toward beginners.

Author of letscodejavascript.com here. The series is intended for professional developers, so I don't spend any time on "this is the command line, this is a variable," but we do build an application from scratch. It's very much the immersion approach, and we cover a lot of things OP is wondering about (command line, Node, npm, Git, TDD). It could well be a good fit.


Taking it a step further, if you're able to find a friend or a willing mentor, pair program for a couple sessions to get the flow of things. You'll get into it quicker, will be able to ask complex questions and get solid answers, and probably have some fun along the way.

And both the easiest and hardest way to learn a language or framework is to put yourself (or have someone else put you) up against a deadline. Urgency is a good thing.

Don't sweat the nitty-gritty when you're just starting out. You'll get to that stuff when you need to. You can always refactor in better code. And that refactoring will encourage you by showing how much better you've gotten.

EDIT: Meant to mention the great http://railscasts.com. Together with the pairing I mentioned above, RC really got me up to speed on Ruby / Rails - came from a generalist C#/PHP/JS background a few years back.

I think you should find a resource that will guide you step-by-step along the way and teach you modern software engineering concepts, not just language syntax. A lot of tutorials out there today simply focus on syntax and eschew the bigger picture, which is critical for fully understanding what your doing.

If your at least somewhat familiar with object-oriented programming concepts already, I would highly recommend the following course: https://courses.edx.org/courses/BerkeleyX/CS169.1x/2013_Spri...

It deals with modern programming practices in the ruby/rails environment. I'm working through it myself and it's already answered a lot of questions that I've had about most of the tools you mention and how they work. It has specific sections on BDD and TDD also, among other relevant topics.

If you need some more general background first, take an introductory computer science course. I would recommend CS106A Programming Methodology from Stanford, which is a good pre-requisite course for the one listed above.

All of these courses are free.

A few years back, I jumped into what I thought was a design position at a local web company. I was wrong.

I was then forced to learn JavaScript. I watched Douglass Crockford's Good Parts, and also listened to quite a bit of a Python podcast called Python Osmosis. I went from very basic/naive JavaScript on my own to a world where using VMs, SSH, Git, JavaScript, hand-rolled CMS's, and fast turnarounds were an everyday thing.

What did I learn? Forced immersion is the best way to learn. Don't allow yourself an "out", but allow yourself space.

There's a lot of ways to manage this path. I'll outline a few.

- Find a mentor - while this seems daunting, there are a lot of people who are itching to teach. It works best if there is a formal agreement (and even a pay-based relationship) for an allotted amount of time with some concrete goals.

- Start a project - Doesn't matter really what it is, because when you are making something, it is allowed to evolve. Decide a problem you want to tackle, and tackle it. Doesn't matter if this is reinventing the wheel, because you are learning how people built wheels; however, it always helps to try to solve things that haven't been solved before, so that you do it "the hard way" - this helps with retention and future problem solving abilities.

- Get an internship - build a relationship with an agency that is willing to pay you something to hack on stuff, and let you make mistakes. There are a lot of agencies with space on their teams that will be open to this.

Overall, the most important thing is to be diligent and remember that everyone else is learning constantly, too. Just because someone you know writes great tests doesn't mean they know testing. They learn every day. Jump into the fast moving river, and you'll quickly learn to swim, or get out of the river.

I realize this is a very common set of answers, so here are a few more concrete things you could do.

- Go through http://railstutorial.org/

- Learn Git (this taught me all of the more important unix commands for my everyday work)

- Check out Coursera courses, like this one: https://www.coursera.org/course/digitalmedia or this one: https://www.coursera.org/course/posa (two very different courses, both very informative)

- If you aren't keen on Coursera, check out Udacity

- Get a VM running so you don't have to worry about the damage you might cause running sudo stuff. This is very big; if you are intimidated because you don't want to cause damage to your machine, build a sandbox first. (Assuming you can set up a VM. If not, check something like this out: http://www.linuxtoday.com/infrastructure/2011010701239RVLFSW)

Start with smaller projects, something simple based on either what you already know, or an existing lesson/blog/book. Then adjust it a little bit, work iteratively, towards the new stuff.

It's really easy to get lost in the big picture of what you want to do versus what you can do. Try not to do that. Just work on smaller bits involving the new stuff, falling back to what you already know at times, and keep at it. If there's a way you can do ColdFusion with Ruby/Python/whatever, go for it.

If you haven't seen it yet, Zed Shaw's Learn Code The Hard Way[1] series does a good job of getting you to use the right tools for the environment. Which is something I see frequently ignored by these sort of online lesson plans... it's not the languages themselves that are difficult to learn, but getting accustomed to the tools to use them, and the best practices.

[1] - http://learncodethehardway.org

I was in your exact position a few years ago.

The problem here seems to be that you're relatively new to Unix. The trick is to be humble. Don't work with Boxen, ZSH, vagrant, or any of those exotic tools. They won't make sense until you roughly understand the *nix model.

Instead, start with the basics. As in start from scratch. Teach yourself to use OSX the same way you might teach your mother to use a PC. You absolutely need to grasp the basics before you can progress.

After that, work on your command-line fu. Force yourself to use the terminal for all the simple stuff. Learn to write simple Bash scripts.

Then, pick a language and try developing scripts with it. Use your new-found command-line skills to set up your development environment. I personally chose Python - it's really newbie-friendly.

After that, it's just a matter of practice. Trust me, you will get there eventually :)

If there is one skill you should focus on above all else its refactoring. With that in mind, just start and expect to rewrite as you learn.

As for specific tools, I too only recently picked up a mac and while it was a bit painful at the start there is plenty of instructions out there for getting your environment set up.

Good luck!

I'd almost recommend staying with Coldfusion. If you're good with it, you can spend all of your time shipping apps instead of spending all of your time learning. Still learn on the side, but don't try to learn a bunch of languages and have nothing to show.

I was frustrated at finding a beginning to end tutorial when I was trying to learn rails and ruby. I finally found it with Michael Hartl's book/online guide. http://ruby.railstutorial.org/

Thanks! I forgot about that site. I was looking at it before, but was waiting for a Rails 4 update. It looks like a Rails 4 version of it was just recently put out, so I'll definitely go through it.

Not in reference to railstutorial.org, but I think the hard part about finding resources online is that it's hard to determine if it's still a good resource or outdated. This one looks good though!

You sound like you're trying to learn several things at once. How do you e.g. expect to successfully learn a technique like TDD, if you constantly have peculiarities of a new OS getting in the way?

Try to absorb new things one at a time, and then expand onward.

For commandline proficiency, i think you will benefit quite a bit from the software carpentry website: http://software-carpentry.org/4_0/shell/index.html

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact