

Ask HN: What should I learn? - Natural2190

Hi guys, I'm a freshman computer science major currently at work for a development company.  My question is simple.  I have a lot of time here to spare, and reading random internet articles, while enjoyable, is not as fruitful as I'd like it to be.<p>I want to learn a new language or API, but there is obviously a lot of different technologies out there with varying degrees of relevance.<p>So-- what should I learn?  I have experience only in Java, C++, and C#, but I'm willing to learn anything.  Preferably not something that I'm going to learn in school.<p>Emphasis on relevancy.<p>Bonus question:  Give me a project to work on with this technology.  Something doable, but time consuming.
======
Jun8
This is the mother of open-ended questions. There are many questions like this
on Stackoverflow, be sure to check those answers, too.

Deciding on what to learn is hard, however, deciding on which one to choose
from a list of things is much easier. The important aspects are (in order of
importance IMO): (i) How does this help with my bottom line, i.e. will knowing
this technology earn me money (ii) How "sexy" is it, is in on the bleeding
edge, when I list this on my resume, will it catch the eye? (iii) How's the
community, are they helpful, do they answer newbie questions? (iv) How's the
documentation? (v) Is this a dead-end thing, or will it lead me into learning
new things?

If I had to name just _one_ thing, I would say Javascript. It used to be that
"real men don't use Javascript", but the latest prominence of web apps is
changing that. Also JS has gained a lot of respect for its advanced notions. I
would recommend : JavaScript The Goof Parts, it's an easy read. Learn JQuery
(and node.js for advanced stuff)

I would add Google web toolkit to the tool bag. This way, you can build
complex apps with your Java knowledge, without being a JavaScript guru.

Learn a mobile platform. My personal choice is Android. iPhone has better
potential but is kind of saturated. And it's Java, so you don't have to learn
Objective C.

Why not Processing? It's extremely easy to pick up, has tons of interesting
tutorials/demos and is easily lends itself to creating mind-blowing
visualizations in a short time.

I would also start learning a offbeat thing, something that will raise
eyebrows while reading your resume and will make it stand out. Could be scheme
(learning it know, awesome!), clojure (runs on the JVM), Lua (has always got a
life of its own but getting more coverage lately, can run on Android), or if
you want to really go all the way, Forth. These will probably not earn you
money but will expand your mind.

You can also look into getting your feet dirty with hardware. For years, I've
been afraid to do this (I absolutely hate hardware stuff) but Arduiono or the
Beagle Board are great.

And one final thing: Learn git! That's where all the good stuff is.

~~~
smithbits
"And one final thing: Learn git!"

Can't stress that one enough. Really any source code control system will do,
but make sure you know one well. It was the biggest thing missing from my CS
degree. And it's handy to have a solid understanding of regular expressions
and SQL, but learn source code control first.

------
imack
I'd suggest find something you want to make before the specific technology to
use it. Think of something you want to make (web app, something for iphone,
whatever) then figure out the best tools to make it. It will make the scope of
"what to learn" to be a lot narrower and allows you to do some analysis about
what to use that's tethered to something real. It would be nice if your
project was "something people want", but the key thing is that you find it
interesting enough that you have a lot of intrinsic motivation to work on it.

In my case, I didn't make my latest side-project (<http://laughlitm.us>)
because I wanted to learn Rails and the Twitter API, I wanted to make
something for my friends and I to share funny tweets. From there, questions
weren't "what should I learn?", they were more "what framework can I use to
get this up and running the fastest?" and "what DB or cache should I use to
store this specific data type?". I learned a lot doing it and it never once
felt like work. I also had a lot more to show for it than doing a bunch of
examples from a "learning rails" book.

~~~
smwhreyebelong
I second that. I have found that I learn things faster (and they 'stick'
better) when I work on something that I find interesting/cool.

The other benefit of working on it is that you really relate to the problem
you are trying to solve (since you will be the first user) and you might end
up creating a viable product for a niche. There are tons of startups that
started this way (one example is hotmail, where the founders needed a way to
access their email from multiple locations)

------
Kilimanjaro
Learn Javascript. Not just learn it, master it.

Then learn jquery, scriptaculous, prototype and exjs

Bonus point for node.js

------
paulgb
Hadoop: designing MapReduce jobs is fun once it "clicks" for you. Hadoop
Streaming is a good way to get started because it's an incredibly simple
interface that uses stdin/stdout. Increasingly more companies are using it,
from the big guys (Facebook, Yahoo) to startups (PowerSet pre-acquisition,
LastFM, FlightCaster). Most schools don't teach it yet, so if you're willing
to learn something in your free time it's a great way to get ahead of the
competition for jobs too (not that that's the only reason to learn it).

~~~
eru
Why stay on the surface with MapReduce? You might as well dive into functional
programming, and see the greater patterns behind these things.

Having some concrete experience with frameworks like Hadoop is still immensely
useful, of course.

~~~
paulgb
Totally agreed. I was actually originally going to recommend Haskell and R in
the comment but decided to stick with one technology.

------
mquander
If you don't want to study a whole new language or giant textbook, you might
get some intellectual mileage from checking out the Reactive Extensions for
.NET, which is an extremely slick implementation of functional reactive
programming in C#, and implementing some simple applications like a game or
two with it.

If you don't know anything about FRP, you might find it somewhat mind-
expanding. It focuses on treating input as a continuous, manipulable stream of
events. It integrates rather elegantly with C#'s functional libraries and
interfaces.

(This is assuming you have a fair amount of experience with C#, or else you'll
probably spend more time learning the language than FRP.)

<http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx>

------
projectileboy
Once upon a time I tried answering the same question for myself; you might (or
might not) find this interesting

[http://softwareboy.blogspot.com/2009/10/learning-things-
of-l...](http://softwareboy.blogspot.com/2009/10/learning-things-of-lasting-
value.html)

~~~
lincolnq
Good stuff.

I would agree with learning the implementation of a UNIX, but not for the
reason you gave (ubiquity). Instead, learn it because of the philosophies
about software design it created, and which developers (often) live by today:
do the simplest thing that could possibly work; create small parts that do one
thing and one thing only; favor simplicity over correctness.

Also because it will give you insight into C, and vice versa.

------
marram
I would suggest Python. It is easy to learn and can be used in many different
projects including web apps.

You can then use your new skill and build web apps on Google App Engine. It's
great because you won't have to worry about the non-so-fun bits, like
configuring servers.

~~~
hyde
I have found <http://www.pythonchallenge.com/> to be extremely helpful in
learning python.

------
Aaronontheweb
Continue working with C# and find some decent open source .NET projects to
work on, like RestSharp (generic REST wrapper library) or BlogEngine.NET, or
work with some of the .NET APIs you aren't familiar with yet.

I'm in the process of teaching myself WPF (Windows Presentation Foundation)
for making Silverlight web-apps and desktop apps and it's really quite fun;
what's not to like about being able to hammer out a slick-looking desktop app
in a matter of minutes? Plus with WPF you're forced to learn how to implement
parallelism and event-driven programming which are both good experiences that
have tremendous real-world value even if you don't end up taking a job some
day where you need to use .NET or C#.

------
aymeric
Like someone already mentioned, I would focus on developing something useful.
For you or for someone you know. I went through the exercise of listing my
current frustrations to find what I should be working on on my blog (link at
the end of my comment)

The challenges you will face during the development of a real life application
will help you learn much quicker. Which language you will choose depends on
your preferred OS, your inclination towards Open source, if you want to
maximize your wages, etc..

Link to the blog post about the frustrations exercise:
<http://aymeric.gaurat.net/index.php/2010/my-frustrations/>

------
silentbicycle
What are your interests? Yeah, besides programming. Do you play guitar? Are
you a baseball stats geek? Do you like math puzzles? Pick a problem aligned
with your other interests, and go for it. Whether you do this in a language
you already know or a new language / framework / etc. is your call, but
challenge yourself.

Your interest will keep you going through the slow parts, whereas if you're
just learning tech for its own sake, you might just start learning something
else as soon as it gets hard. That can _feel_ like progress, but doesn't
usually add up until you stick with things for longer.

------
imp
I usually find it easier to start with a project I want to build, and then
learn whatever it takes to make it happen. There's so much to learn that it
really is a personal preference.

------
adbge
I asked myself the same thing a week ago and decided that I'd like to master
Emacs. You should think about the process that you use to write code and how
you can refine that process.

I'd suggest you look into learning a scripting language. Simple scripts can
make your whole life a lot easier. Something like Perl or Ruby would be a good
addition to your coding arsenal.

------
warrenwilkinson
Learn whatever looks fun to you. When it stops being fun, repeat process.

I recommend Forth at least for the ideas. It's interesting because its a
language that avoids needing a lexer, parser, or optimizer. It has the most
beautiful ideas I've seen since I found Lisp.

------
angrycoder
Write one or more non trivial projects a language you already 'know'. It will
be far more beneficial.

------
cheald
Learn a scripting language. Java, C++, and C# are great tools, but a command
of scripting languages will serve you well. Perl, Python, and Ruby are the
perennial favorites - I prefer Ruby, personally - but there are tons of
others, like Lua or Javascript.

------
clark-kent
Try building something useful to you, then learn the language and tools best
suited for it.

------
Tichy
Apart from what others said, I guess you can't do much wrong by starting with
Structure and Interpretation of Computer Programs by Abelson and Sussman,
which is also available for free.

------
sbe
Erlang or OCaml.

Build an AMQP stack.

------
known
Try to obtain expertise on a _domain_.

------
tkahn6
It seems like you want something more concrete than abstract to work on, but
if you want something that is very challenging and rewarding studying The Art
of Computer Programming Vol. 1 is something you should consider.

Depending on the program you're in, you might get this material from your CS
program but judging from comments here on HN about the quality of CS programs
in most schools, you won't.

~~~
eru
Also Okasaki's "Purely Functional Data Structures" book is a nice and meaty
thing to read. (Though I have to admit that of course it's much easier to read
than The Art of Computer programming--at least judged by the metric that I
actually read Okasaki's book, but wouldn't read tAoC just for fun.)

------
c00p3r
Try to learn WHY some particular technologies exists and popular. Try to
understand the Ruby's style (describing, rather than coding) and the Python's
way (simplicity, clarity, readability). Try to realize bloatedness,
meaningless syntax fluff and limitations of Java (NIO2 is just a spec). The
approach to C programming of Linus (once again clarity and readability), and
then compare it to FreeBSD and OpenBSD projects. Look at webkit, chromium, qt
and try too figure out which sub-set of C++ is portable and safe to use, and
when it a right tool. Read the source code of nginx, varnish, openssh, sqlite,
v8 or whatever you like.

