Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: What should I learn next?
37 points by enduu on Sept 18, 2013 | hide | past | favorite | 48 comments
For the better part of the last 2 years I've been freelancing part-time as a Wordpress developer, focused mainly on building custom themes and modifying existing plugins. Naturally, this meant PHP was the thing to learn, since I was already familiar with HTML/CSS, and 99% of the time, a bit of jQuery on the side was just enough to get the job done. However, after taking a break for a couple of months in order to focus solely on school, I've realised something pretty scary: I actually suck at programming. What I mean by this, is not that I can't code ( I've pretty much learned programming by myself and am passionate about it ), but the fact that this entire time I've been half-assing it, and now I find myself in a place where I'm not really good at anything. I mean, I know a little bit of C that I picked up in school ( although no OOP ), enough PHP in order to be able to write simple functions that hook into Wordpress, a little bit of Ruby I picked up while building a Rails app, and although I am pretty good with HTML/CSS I'm definitely not up to date with the latest technologies.

So now, after graduating high school and making the decision to get into full-time freelancing, I'm faced with the following dilemma: What would be the the best thing to learn next? I am interested in web development ( although it's not excluded I'm going to learn iOS dev. too sometime in the future ), and after a lot of research I still have no idea what's the right way to go. Foe example, I know I could get serious about learning Rails ( or Django, for that matter ), but then from what I've been reading more recently, javascript ( and javascript-based MVC frameworks ) are the next big thing, and that's what I should focus on.

I know this is a pretty subjective matter, but I'm hoping there are some general guidelines which will help me make the best decision. Thank you!

Postgres. Get a book by Joe Celko (SQL for Smarties, for instance) and really learn relational databases. They're not going anywhere. Any job you take, you can bet there's a relational database back there somewhere. Postgres is free and will surprise you less than any other. If you're very good at SQL, you will write a lot less code in the middle tier to post-process data on the way out. You won't be hindered by a lack of OO understanding--in fact, it may benefit you since you won't face the O/R impedance mismatch. Once you're good at SQL you'll be a lot less worried about other things in the backend, and the declarative nature will help you reason better. It will pay dividends no matter what step you take after that.

Don't forget that PostgreSQL has a comprehensive online manual that includes, among other things, a complete SQL reference: http://www.postgresql.org/docs/9.3/static/index.html

I'm going to agree, as a Sr Database Architect, that once you have these skills and some experience under your belt you will never want for jobs.

There is one huge caveat. Sometimes it is so boring that I often daydream of attempting trephination on myself.

But man do you guys make a killing. Holy astronomical salaries batman!

But the hard stuff is actually scaling, optimizing and administrating databases, not the SQL stuff right? I mean, sure optimizing SQL queries is important, but I find stuff like sharding, making sure the CPU load doesn't get too high, partitioning, archiving, and scheduling autovaccuum jobs the hardest part about databases. Joins and group bys? Piece of cake in comparison.

That still falls under the expertise of a database architect.

> Any job you take, you can bet there's a relational database back there somewhere.

My experience is a little different:

- Current job: Mongo

- Previous job: Mongo with a custom REST wrapper / ElasticSearch

- Previous job: AppEngine Data Store

- Previous Job before that: SQL only ever accessed with Django ORM

Not that one shouldn't learn SQL if needed, I just don't think it's a mandatory part of modern web apps like it once was.

I don't think it's mandatory either, but I think this person would benefit along many axes, not just work-related.

Came to post the same thing. Don't get too hung up on the actual database, just learn SQL and relational databases. It's something you will use over and over again, even if it's just to peek into the back end to see what your framework, ORM, etc actually did with the data.

I'm going to be really generic here and say:

1. Learn a high-level OOP language. Java, C#, etc.

2. Learn a functional language. Haskell, Lisp, ...

3. Learn an imperative language. Such as C.

4. Learn an "in between". e.g. SQL.

5. Look for outliers. e.g. Aspect oriented programming, Eiffel (DBC).

Basically learn the different paradigms around programming and the common data types that span almost all languages. Learn when and where to apply those paradigms and the strength of each. Knowing those things will help you adjust to the future fairly well.

I'll give you an example of that in action. I learned some Common Lisp in my spare time. I then went on to use C# in 2000. So when Monads were eventually introduced in C#, I knew how and when to use them. My other colleagues at that time, their eyes glazed over for the most part. What was this new fangled contraption? It wasn't new at all, it was old school.

Knowing specific frameworks inside and out can be advantageous, but can also lead to a very narrow vision. If you make yourself well rounded, it leads to a very flexible skill set. You see something and you say "oh, that's just like X" and you dive in. I know you want to be a web development bad ass. But a lot of the knowledge to make you one is outside of the web.

Then, if you're feeling frisky, dive into hardware.

Whilst learning these languages, don't just learn the syntax.

Get some good books on algorithms and data structures. Learn these really well and then study the languages to find out you can implement them.

Each language will lend itself to certain structures. Learn them.

You just reminded me of something I left out - patterns and anti-patterns. Knowing those might be just as valuable because then you can recognize and adapt quickly. For example MVC is basically the same across all platforms, with minor differences.

Build something with no connection to the web whatsoever, eg. a platforming game that outputs ascii to the console, or a spellchecking engine, an emulator, or whatever. Make several versions of it, trying out radically different ways of conceptualising the problem in code. This stuff can sound intimidating if you've only done webdev, but it isn't at all as hard as it might seem.

Having a broader experience of the world of software will give you a wider range of skills and a wiser perspective on the web stuff that pays the bills these days. You'll be able to look at some horrible design and say "duh, that should be a finite state machine" and presto you've just wiped out a whole load of complexity.

Webdev is sort of a ghetto, the more "outside" knowledge you can bring to it, the more effective and the more employable you will ultimately be.

EDIT: also, become an automated testing deity ASAP. Just do it. You'll wonder how people can code without it.

how do you become an automated testing deity? Any recommended resources?

I think you'd most quickly benefit from http://learnpythonthehardway.org/ or http://ruby.learncodethehardway.org/

It sounds like you haven't really moved much beyond googling for code snippets to solve specific problems. Work through one of the above books so you pick up some vocabulary and get introduced to a range of concepts.

A lot of the other comments are overly ambitious with their suggestions. Start small and learn Ruby or Python. I recommend staying away from frameworks such as Rails because of the high overhead of required knowledge that won't really benefit you as a programmer in general.

I completely agree, most people I've ever encountered asking "What to learn next" don't really understand what they think they know. There are 100 different directions you can go from if you actually had a decent understanding of php/html/css; exploring the PHP source code, learning more about the network protocols that http/https requests operate on top of, web application security and security in general, browser implementation of css rendering/javascript engines/sandboxing, all of these things are natural extensions of web development, and are really just the tip of the iceberg.

Personally, for me, it's been JavaScript. I started freelancing with PHP. The second to last freelance project I had was Java backend with AngularJS frontend, and the tricky bits were all in the frontend. Now I've been working freelance for the same company on several projects since June, doing 100% JavaScript; mostly frontend, with bits and pieces of nodejs, grunt and so on for tooling.

To get off to a good start I suggest learning how encapsulation and modules are done in JavaScript (e.g. prototype, the module pattern, possibly also node's exports or something like requirejs). This will allow you to actually build large JavaScript projects without them turning into a Frankenstein's "everything in a single file in jQuery's document.ready" monster.

Try to focus on learning the language and its features and not get lost in DOM-land (use libraries or your framework of choice for manipulating the DOM unless you have a very good reason not to).

Learn all about how to read and manipulate data using XmlHttpRequests, web services, REST, JSON and so on. This will be invaluable for any projects that have third party dependencies, which will be most of them these days.

Spend a little time learning about which frameworks are better for rich desktop-style browser apps (hint: probably the bigger ones, like Angular or Ember), and which are more suited to lightweight apps that will also run nicely in mobile or other embedded devices (hint: probably the smaller ones, like Backbone).

Polish your jQuery knowledge. It will be popular and useful for a long time yet, and it's a big library with lots of extremely handy functions and features.

Maybe pick up other useful "utility" libraries like underscore.

Finally, if you're interested in driving code quality and keeping clients happy and regressions at bay, I suggest you look into automated unit and integration testing. Again here there are large, complicated tools like karma and smaller, lightweight "test logic only" libs like jasmine. If you're like me, you will get lots of enjoyment and satisfaction figuring out how to wire up node, grunt, jshint, phantomjs and (your test lib of choice) to get a single command build/deploy/test script. If you're likely to work in a team, get that script running in a CI server for bonus points.

If you have any questions hit me up on davedx@gmail.com, happy to help! :)

I'm doing this right now - evaluating Angular vs Ember, then picking one to focus on learning well.

> probably the bigger ones, like Angular or Ember), and which are more suited to lightweight apps that will also run nicely in mobile or other embedded devices (hint: probably the smaller ones, like Backbone

Is it inadvisable to use Angular/Ember for mobile? I hadn't heard this before.

Honestly, get a job. What has taught me most about programming is having new problems to solve that required new skills, techniques and tools. The best way to "fund" your development is to find someone who will pay you to solve their problems.

I started out of school doin front-end, then the next project I started with frontend and then had to learn Django. Job after that was all Django/frontend. Then, Django to Rails. Now im doing Node/Go/hardware/etc. Each job paid me to learn new languages, adopt new techniques and find better ways to solve problems.

I'd hop on Craigslist or one of the millions of freelance sites and contact a few potential jobs that you think you can pull off but would require you to learn a bit. It may seem a bit haphazard compared to a more academic approach but it will be more of a realistic growth curve compared to the realities of the freelance world.

Also, side projects are a great way to experiment.

Think of it as "job driven development".

If you have the financial resources to do it, I'd recommend spending some time exploring other parts of business and computer science. There are some really great free resources out there for learning (coursera, udacity, etc.). The reason I say that is that having some solid fundamentals will give you more flexibility in terms of what you can do, and it'll also let you try some other potential career paths on for size.

If you can spend a couple of years at the start building breadth in your skill base, you'll be able to gracefully adapt to changes in your lifestyle, the online market situation, and other things that come up. I know a couple of guys who jumped in full bore kind of like it sounds like you're talking about, and they eventually found themselves pigeonholed into a single career for their whole lives, because as life went on their obligations accumulated to the point where they could no longer afford the interruption in income that a career change would mean (because they would have to learn basically everything over again). So, if you can keep your expenses minimal and pay them with your freelancing work, I'd say just try to get some foundational business management and computer science knowledge under your belt.

As far as what tech/language/etc will give you the best bang for the buck in today's freelancing market I have no idea. Regardless of that though, I'd say that learning Internet marketing seems like the most important thing you can do to ensure success. This is something I failed to understand at the start and I'm paying for it now.

Get serious about learning Rails, then get serious about learning EmberJS. If you are good at both of those you will be in a great place when it comes to building web apps.

Looking for "the next big thing" is a crap shoot.

If what you want is all the consulting work you could ever possibly do, then learning more PHP will get you that. Stick with Wordpress and/or pick up Symfony, CodeIgniter, just about anything except Zend (and for the love of all things holy, do NOT go anywhere near Magento if you value your sanity).

If you're OK working a bit harder to find gigs but likely making more from them when you do (and facing less competition), Ruby/Rails or Python/Django would be good choices. You could go for more obscure languages and frameworks, but at that point you may have a hard time selling your services.

Starting with iOS (or Android) is also something to consider. People often don't realize that, when you get into full-stack web development, you have to be proficient with many technologies and software packages just to get a site working, tested, and deployed. While you'll likely end up having to expand into more than just ObjectiveC or Java fairly quickly when you work with mobile (don't get stuck in the PhoneGap/Appcelerator rut), a basic mobile app on either platform will be simpler to build and manage than a basic dynamic website.

Ok first of all, holy crap, I can't believe this actually hit the front page, definitely wasn't expecting that. Thanks again for all the input, I couldn't have asked for more.

Ultimately, I'm still not 100% sure, but after going through all the comments a couple of times, I think I've finally made up my mind. For the next month / couple of months, I'm going to slowly get back into freelancing while giving PHP a serious go. Although PHP may not be my first choice, I realise now this is actually the right one since WP development is going to be my main source of income for the next 6-12 months, so I need to get really good at it. Aside from that, I plan on sharpening my front-end skills and trying out a couple of other stuff as well such as SASS and Git.

After I feel I'm comfortable enough with PHP, I plan on trying out the Laravel framework, and see if I actually like it as much as Rails. Either way, I'm definitely going to learn Ruby as well ( I've already finished "Learn to Program" by Chris Pine some time ago ), and eventually spend less time on WP in order to finally master Rails. In the end, I'm hoping to give up WP entirely and work only on RoR projects ( either my own or by freelancing ).

I know a couple of you guys were suggesting that I should focus on things which are not related to web development at all, and I see your point, but honestly I simply can't get excited about that stuff at all. Maybe later on I'm going to feel different about it, but for now I'm focusing solely on web development.

Also, regarding SQL, that's something I may've left out in my original post, but fortunately I am pretty familiar with MySQL, I even studied it in school.

I think you should first explore Computer Science in general. You should start with a good programming language, a high-level, beginner-friendly, very web-favored one. Pick Ruby or Python. Then grab courses on Algorithms, Databases, Computer Networks and an other area you wanna explore. You don't need to complete them, but just get a feel of what they have in store for you. Make sure you write some code as part of the Algorithms course.

Web development is not just using frameworks. There is real Computer Science involved for building and maintaining any substantially complex web-app. Apart from this, there will almost certainly be domain-specific knowledge required for a complex web-app.

If you get a hang of programming, and love the CS concepts you are trying to learn, you can then build a career path accordingly (may be college?). If you are dis-inclined, then you can get to learn Rails/Django, and keep free-lancing.

I think at the age you are in, you should not miss out on getting a chance to learn some serious CS.

As someone in what feels like your exact same boat—though a bit older— I'd say just pick one. It makes the most sense to me, personally, to pick Python or Ruby or PHP (Laravel or similar) and learn how to actually program. I think choosing this path will introduce you all sorts of other stuff — rest, user input, security, modern front-end tools like LESS, etc.

Even sticking with WordPress could yield a good result for you. WordPress and PHP are constantly criticized for a number of different reasons, but the reality remains: WordPress and PHP occupy a huge chunk of a huge market.

I've personally identified this to be one of my biggest failings — not being able to actually program. At first I thought it was about language, and so I tried PHP (about 100 different times), I tried Ruby a few times, Python, and finally, JS. It turns out that all of these languages require the exact same thing — they require you to think like a programmer.

The furthest I got with it was with Ruby. I went through the entire Ruby course at Codecademy, read a lot of the Bastards Book of Ruby (fantastic), and even used Ruby to get through some Project Euler projects. By the end of a few good months of moderate input, I was absolutely still not a programmer, but I felt like I was beginning to think more like one.

So that's one piece of advice — if you want to learn to program, I think you actually need to decide on a language/framework and settle in and learn how to program. Learn how to think like a programmer, which is to say that it isn't about syntax and how each language does things slightly differently, but rather, is about process and patters and abstraction.

The other piece of advice is to be careful with freelancing. Paying the bills and learning to code don't necessarily go hand in hand. Spending 4 nights a week writing a WordPress theme for a client project really won't make you a better programmer. If I've learned anything, it's this. I've made some great supplemental money doing freelance work and I've learned a ton about WordPress, but I often think about the time I've put into it, and wonder what if I'd put that same time into learning and working on projects to further my ability to actually program.

And finally, the last piece of advice — try stuff out. Try JS, Python, Ruby, WordPress, Drupal, try setting up a VPS at Linode. Try everything you can to get sense of what feels right. I think that will help with your decision as well.

Good luck!

I have a couple friends that are trying to learn how to program and they are constantly bouncing from java to python to javascript to whatever else, and it really does them no good because they never sit long enough to learn the fundamentals of programming, just the basics of that given language. You really do have to work with one language for awhile and get comfortable with that language/environment and how to use it to solve problems. Once you get decent at this, then bouncing to the language du-jour is easier, more enjoyable, and you take away a lot more from it ('oh wow cool, in language X I had to do this, this, this and that, with language Y I just have to do this!')

Solid advice. It's taken me years of bouncing around just like that, but it's finally sinking in. =)

It doesn't sound like you have mastered any one particular language. I would recommend pursuing one of the ones you have some experience in (Rails, PHP, or JavaScript) and making projects from scratch. Being able to build an entire application or utility from nothing and understanding all the parts is a great skill to have. I would not recommend learning any particular framework (web or otherwise) except as a tool to gain mastery of a language. Frameworks are scaffolding to allow you to use your understanding of a language to effectively build your idea into working models, they should not be treated as the be-all-end-all of a language. Limiting your learning to jQuery or Rails instead of trying to learn JavaScript or Ruby themselves will not get you the mastery you need to grow as a developer.

Python, because it's easy to learn and it's super versatile. I don't code Python full time any more, but I still find a way to use it on a fairly regular basis. It's a very handy thing to have in your tool belt, regardless of what you wind up doing in the long term, and there's a lot of literature related to learning programming that's taught with Python. Python is probably the most average language you can find, which is why it works well for your stated purpose of having a more solid foundation. Although it's not the best tool for most jobs, it sounds like you don't entirely know what you want to do, and Python is an adequate tool for a lot of different things; it can expose you to a variety of programming environments.

I was in the same boat as you, and I swore I was going to learn Rails - and just 'go w/ it' -so I built an app in Rails..but when it came time to deploy -- my host only supported a specific version of Ruby -- and I wasn't about to pay $50 a month to host a hobby so to speak...

Then I decided I was going to try and duplicate it in php --which php is extremely ugly--UNLESS you're laravel. I found laravel which I am getting pretty darn good at, and I absolutely love it! It's Rails for php and has taught me GOOD design principles for php(instead of spaghetti code, like how to use namespacing and build my own packages, and their's a strong community for it -- I highly recommend going to #laravel on freenode(irc) -- for help when you need it.

Think of a project, pick the tools, and start building. If you don't stop until it is done you will learn something.

I just did this with ruby and sinatra. When it was all done I ended up learning ruby, sinatra, javascript, jquery, redis, passenger, rack, haml, and how to edit gems in github.

Best of luck.

I would study whatever you will study about programming plus study how to persuade people by using your writing or your speech. Study classic rhetoric (Greek) and modern persuasion techniques. This is very important to your success in business and in live. Learn how to make people do what you want them to do. This will help you when you are in a meeting with colleagues, when you are selling your software, even when you are designing your website. By learning how to persuade you will learn more about yourself and learn about the others.

If you want to learn computer science more thoroughly, why don't you take a university-level course? You can continue freelancing to pay your way through it. That would give you broad-ranging skills and a good qualification to present to clients/employers.

I'm not sure if this is the best option for you, but then I'd be curious why that's not your first choice. Since you have a clear understanding of what you need, you can pick a course that fits you and ignore the bullshit that comes with it.

The next big thing will be the next flop. I'd advise you to learn one of the good old things, like python.

I too see JS growing to be an all around general purpose language, and it is definitely a good one to learn to break away from the standard class based languages. The book Javascript - The Good Parts is a great and explains the power and weaknesses of Javascript.

As crazy as it sounds, I too can see that as having a good probability of happening. I'm a C/C++ coder and I picked JS up from the book JavaScript the Good Parts and thought "Hey this is pretty neat actually".

But I think there are a lot of people like me who are more Java/C/C++/C# systems programmer type of people who haphazardly learned JS without _really_ learning it because the syntax looked all too familar. Kinda ignored JS as something HTML scripters play with and now we're in this situation where it's the "de facto" language of the web. I can't help but think there will always be this underlying hatred towards the language from this crowd because it's so bad in many respects and a recollection of how bad and slow it was in the 90's.

> I too see JS growing to be an all around general purpose language

Truly this is the darkest timeline.

Doomsday ;)


I learned C at school and self-taught myself enough PHP and JS to do web development. I understand programming logic and OOP pretty well. Now I'm reading Code Complete by Steve McConnell to gain a better perspective on software engineering.

Drupal. You already know wordpress, but with wordpress a fixed rate for a basic site runs $600, premium site $1800-$2000. There are premium+ sites that you get contract work for. But I've never heard of a boondoggle-scale Wordpress site. With Drupal that's all there is, boondoggle rates. I've never seen fixed rate sites done with Drupal, and there's a reason for that I suppose.

This cracked me up. But seriously, if you know some PHP and want to quickly be able to work on larger projects, Drupal is a great idea.

We just moved away from Drupal (to CakePHP) for our admin panel over the last couple of years. "Boondoggle" is an apt word.

Whatever you do, pick one and OWN it.

If you went play framework w/ Scala it would be pretty hard to avoid learning some OO and you could also learn some functional stuff. You've got enough background to get over the initial hump, now start writing "interesting" stuff not just yet another CRUD app.

You seem to have a database sized hole... The hard part about databases isn't the syntax, or peculiarities of specific DBs, or even optimization tricks to make things faster, but design. What is normalization? Why/When would you want it? What tasks need a relational design, or not... Even if you never pivot into being a DBA it helps alot to at least minimally speak a DBAs language when you write a CRUD app talking to his DB.

Programming as in slinging code syntax stuff, or higher level design? Might want to crawl inside algorithms for awhile with Knuth and other books. Much like learning Algebra its not like you'll ever use it, its more to discipline the mind to figure out other complicated stuff. You should really google for and spend a lot of time at "project euler" if you're trying to learn higher level programming. Many of the PE problems aimed at turning you into a better mathematician can be hacked on brute force-ish to make you a better programmer. As a hint the first problem you're not "supposed to" brute force add those together, you're "supposed to" figure out the easy formula. But writing the brute force adder is none the less an interesting experience if you've never done it before in your language of choice. (edited to add, buy and read and "do" the entire "little schemer" series, or at least the first book)

I don't know if this would make you more employable, but in terms of extending your greater computer-ish knowledge you could do worse than some embedded stuff. Get an Arduino and some shields and some servos and some sensors and make it do something really well. You claimed to know a little bit of C so here's something fun to do with it.

You also seem to have an OS sized hole in your list of experience so some systems programming type experience might be interesting. Get a couple free machines (castoffs) and figure out how to use Puppet to make them jump thru hoops. Since you have a cluster, there's a lot of fun you can have learning how clustering/replication tech works and scales. Don't worry about using old junk computers, there's absolutely no difference between clustering on new big iron and on a free junkpile P3 other than the new stuff is faster. Make your own DB host and a bunch of front ends and see what happens. Maybe try a cluster of DB hosts and FEs talking to the DBs. Much like the DB thing you may never become a sysadmin but learning to speak their language will help even if you stick to webdev work.

Where do you find clients?

Using Eclipse to bootstrap into Java represents a pretty reasonable and comfortable environment to wade into.

Go to: http://www.eclipse.org/downloads/

Download the Java EE version. Create a project with a class named Main.java in a package like "com.example.test".

In the class:

  public static void main(String[] args) {
      if (args != null && args.length > 0) { 
          for (int i = 0;i < args.length;i++) {
              System.out.println("Hi there!");
      } else System.out.println("Hello.");
Hey, presto! You're a Java programmer. Try compiling and running it.

To get your feet wet with web programming, here's some quick and dirty bare bones code:

  package com.example.test;

  import java.io.IOException;

  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;

  public class TestServlet extends HttpServlet {

	  private static final long serialVersionUID = 1L;
	  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		  try {
			  resp.getWriter().print("<html><body>Hello. <form action=\"\" method=\"POST\"><button>Hey!</button></form></body></html>");
		  } catch(Exception e) {
	  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		  try {
			  resp.getWriter().print("<html><body>Hi there!</body></html>");
		  } catch(Exception e) {
And then...

  <!-- ####################################################################### -->
  <?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <!-- ####################################################################### -->
This will compile and run on Apache Tomcat, if you compile and deploy as a ROOT.war file.

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