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!
There is one huge caveat. Sometimes it is so boring that I often daydream of attempting trephination on myself.
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.
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.
Truly this is the darkest timeline.
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.
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.
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!
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.
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.
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! :)
> 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.
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 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.
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.
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.
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.
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.
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'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.
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.
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:
TestServlet.java
/******************************************************************************/
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;
@Override
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) {
System.err.println(e.getClass().getName());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
resp.getWriter().print("<html><body>Hi there!</body></html>");
} catch(Exception e) {
System.err.println(e.getClass().getName());
}
}
}
/******************************************************************************/
And then... web.xml
<!-- ####################################################################### -->
<?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">
<servlet>
<servlet-name>main</servlet-name>
<servlet-class>com.example.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<!-- ####################################################################### -->
This will compile and run on Apache Tomcat, if you compile and deploy as a ROOT.war file.