
Ask HN: Where to start? - myvii
TLDR: My main question is, how do you start learning/working with 'modern' programming languages/practices/tools.<p>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.<p>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.<p>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.<p>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.<p>Things like TDD are foreign to me too. I understand it at a high-level, but actually writing tests is hard for me.<p>I know things well enough to know that I should use it, but not enough to know how to use it.<p>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.<p>I'm just at my wit's end. Maybe you all could point me in the right direction.
======
staunch
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.

~~~
myvii
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.

~~~
jdlshore
> [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.

------
kyoung18
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...](https://courses.edx.org/courses/BerkeleyX/CS169.1x/2013_Spring/info)

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.

------
jcutrell
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.

~~~
jcutrell
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>)

------
nglevin
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>

------
yen223
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 :)

------
brd
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!

------
t0
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.

------
rcavezza
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/>

~~~
myvii
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!

------
styts
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.

------
mailshanx
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>

