6 ms·
Ask HN: What should I learn?
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.
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.
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.
Emphasis on relevancy.
Bonus question: Give me a project to work on with this technology. Something doable, but time consuming.
- sbe 16y agoErlang or OCaml. Build an AMQP stack.
- angrycoder 16y agoWrite one or more non trivial projects a language you already 'know'. It will be far more beneficial.
- Jun8 16y agoThis 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.
- Natural2190 16y agoThank you, this is exactly the kind of input I was looking for.
- dunstad 16y agoFor learning Javascript, I used http://eloquentjavascript.net/ http://eloquentjavascript.net/ It's really thorough, and if you get stuck somewhere you can email the author for help.
- smithbits 16y ago"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.
- cema 16y agoThat's the good parts, not the goof parts, heh. I second the recommendation, but I think it should be the second Javascript book read after the latest edition of Javascript (The Definite Guide, by Flanagan). JQuery follows.
- paulgb 16y agoHadoop: 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).
- Aaronontheweb 16y agoAlthough I am not a Hadoop guy myself, this is still excellent advice. Learning an emerging technology that's starting to gain traction in the workplace is a good way to distinguish yourself among your peers when you start competing for jobs and a great way to add to your repitoir.
- eru 16y agoWhy 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 16y agoTotally agreed. I was actually originally going to recommend Haskell and R in the comment but decided to stick with one technology.
- imack 16y agoI'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 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 16y agoI 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)
- Aaronontheweb 16y agoContinue 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#.
- tkahn6 16y agoIt 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 16y agoAlso 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.)
- projectileboy 16y agoOnce 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-lasting-value.html http://softwareboy.blogspot.com/2009/10/learning-things-of-l...
- lincolnq 16y agoGood 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.
- imp 16y agoI 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.
- mquander 16y agoIf 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 http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx
- deleted 16y ago[deleted]
- Tichy 16y agoApart 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.
- Kilimanjaro 16y agoLearn Javascript. Not just learn it, master it. Then learn jquery, scriptaculous, prototype and exjs Bonus point for node.js
- clark-kent 16y agoTry building something useful to you, then learn the language and tools best suited for it.
- silentbicycle 16y agoWhat 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.
- marram 16y agoI 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 16y agoI have found http://www.pythonchallenge.com/ http://www.pythonchallenge.com/ to be extremely helpful in learning python.
- cheald 16y agoLearn 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.
- adbge 16y agoI 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.
- aymeric 16y agoLike 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/ http://aymeric.gaurat.net/index.php/2010/my-frustrations/
- c00p3r 16y agoTry 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.
- known 16y agoTry to obtain expertise on a domain.
- warrenwilkinson 16y agoLearn 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.