Ask HN: What is the best technology to learn right now?
Hi All,<p>I have built a few websites using various CMSs like Drupal and Joomla. Now I want to learn building something from scratch.<p>I am PhD in Electrical Engineering and can do basic programming in several programming/scripting languages including C, Matlab, Perl/Shell scripts etc.<p>Given my background what would be a good stack to learn for me ? Is it Python + Javascript or node.js or ruby on rails or something else ? Pardon my ignorance if I am just throwing some random names out there ?
69 comments
[ 2.9 ms ] story [ 145 ms ] threadHave you thought at all about Go (http://golang.org)? It's very similar to C with a great concurrency model. It works well for web servers and, for the most part, makes you work from the bottom up.
This is the right question.
I'm guessing from reading your question, that you want to build websites without using Drupal/Joomla underneath? (Rather than, say, build mobile apps or robots or hardware?)
Firstly, decide what you want those websites to so - then ask yourself if you _really_ want to build all the bits Drupal/Jooma give you to start with – the answer to that is not often "Yes – I want to implement a CMS from scratch!" (though sometimes it is as a learning tool, if you want to run a website, building on a whole bunch of other people's work - particularly leveraging their past security mistakes - is almost _always_ worthwhile.)
If you can articulate clearly what you want the website to do - it'll be much easier for people to recommend "a good stack" for that task. If your website idea is for a web interface to MatLab, the answers will be quite different than if your idea requires a Hadoop cluster running on a petabyte of data.
While learning that, learn a tool like RabbitMQ.
... unless you found Perl to be difficult to maintain, and C difficult to debug and monstrously low-level and segfault-prone for doing simple things like calling web APIs. When I first learned Python back in the day, even though I was a pretty decent C++ programmer and shell scripter, I found my internal "gumption" towards simple programming tasks increased tremendously, because I knew I could bang something out in Python and just have it work, as opposed to being sucked down into a debugging quagmire.
One could argue that C and Perl don't solve anything that isn't already handled by ASM.
Myself, I really don't enjoy reimplementing something I've done already just for the sake of learning a new language. I'd much rather expand my capabilities, hence my comment.
> One could argue that C and Perl don't solve anything that isn't already handled by ASM.
Which, as you hopefully see now, is not at all what I said.
I grew-up with wire-wrap DIP 74LS chips with 5 V logic.
I hooked-up TIP120 power transistors for controlling stepper motors.
I built an 8051 with external RAM and ROM. I programmed it. I made serial port code on the PC end.
------
I got a taste of more modern 2001 microcontrollers. I still got DIP I could wire-wrap. EEPROM, pretty fancy.
I dealt with $2.00 or less chips. I think I sized-down to $1.67 variations in quantities of perhaps 10,000, so it mattered.
In 1993, I made an ISA d-2-a a-2-d computer card for my 486. That was fun.
I'm no longer employable in electrical engineering -- I'm not interested, mostly, partly because I cannot connect my heart's joy -- my operating system -- to hardware. Sad.
Cannot wirewrap, maybe.
I guess you use a premade hobby kit with Linux. Doesn't interest me. I've already scratch all my itches. I thought DSP was neat at one point, then figured-out it's boring, pretty quick, for example.
1 - https://www.coursera.org/course/progfun 2 - https://www.coursera.org/course/reactive
There's also http://www.braveclojure.com which is still a work in progress but it's good for diving in.
[1]: http://shop.oreilly.com/product/0636920013754.do [2]: http://joyofclojure.com
I'd definitely suggest using Linux, installing Clojure + Leiningen2, and getting familiar with the REPL. Also, getting Clojure Programming by Chad Emerick, et.al, is a solid first step to at least getting some things started.
Learning Clojure is like any other language: if you want to really dive in, you have to think of a project to get started in and take it step-by-step. I have not written algorithms or done scripting with Clojure, so I don't know how that stuff would work out. I feel there are better languages for that kind of stuff.
http://cemerick.com/2012/05/02/starting-clojure/ http://clojure-doc.org/ http://clojure.org/cheatsheet
and (source <thing>) have been great resources.
(OTOH Python is still the slowest language around... http://benchmarksgame.alioth.debian.org/u32/benchmark.php?te...).
you have mentioned that you have some experience in drupal ,and if you want to stay in the web dev, I suggest you to learn Symfony2 Framework ( PHP) , MySQL ( or any RDBMS ) + JS ( Jquery, Angular etc ).
My suggestion would be to go with any one of many stacks, learn the basics like MVC on server and the client, working with HTTP, writing usable html and css, responsive sites, Working with ORMs, SQL and NoSQL db etc.
Then once you've learnt the basics, learning the another, framework, stack or language becomes quite easy because the basics pretty much remain the same.
In regards to mobile there are only 2 choices either Android Java or iOS Objective-C . Neither one is better than the other right now, So if you own a Mac you can learn either, if you don't, well the choice is obvious. (PS: Windows mobile, BB are okay, I personally don't recommend)
If you are looking for more conclusive help.
Learn node.js if you already know javascript, because you don't need to learn 2 languages while building a site.
But don't limit yourself with that, once you get decent with node, try to do python + django or ruby on rails in the side.
And then you can probably move on to go-lang or a Jvm Language.
Be sure to use at least one SQL and NoSQL db.
PS: (Personal Opinion) For the love of god stop using PHP.
Personally I moved from PHP CMS's (years ago now) straight into Python / Django and loved it, but I still kick myself for never mastering Ruby on Rails, as my experience has lead me to discover there are 5 Rails gigs for every Django gig, and being a Rails dev pays quite well these days.
If you build a solid foundation in Javascript and RoR you open yourself to a ton of opportunities, and you'll be able to adapt pretty quickly to any of the new tech on the horizon
I realize now that's not what you were asking for, but you might want to consider it anyway. If you have a PhD in EE, you should have sufficient math skills.
Learning how to build a web application from scratch is not an easy undertaking. Certainly there is the actual task of learning how to program from the ground up that is challenging but I will warn you of the more subtle challenges you will face. Existing packages, libraries, frameworks and more are there to help you but can be a crutch. Understanding the trade-offs of writing your own library verse using a preexisting library is important. The second problem is knowing how to parse information you find online. People learn new things and love to share those things online all the time. Tutorials and screen casts will likely be plentiful, but beware that there may be holes in what you are learning. A fantastic example would be a basic tutorial on storing information to a database--it likely will not show you how to sanitize the data. In my opinion learning how to build solid web applications should then follow a basic formula to overcome these challenges: Learn the basics of web programming, pick up a framework, and then seek knowledge where needed.
Stay away from a framework in the beginning. Rails, Django, and other popular frameworks are absolutely essential tools for building web applications but they abstract a lot of the little things. Not understanding the little things can make debugging tricky. It can also lead to security flaws in your code. A good example of the little things includes parsing form input, interacting with a database, and routing traffic to its intended destination. Having an astute understanding of the building blocks will help you architect, debug, and develop solid web applications.
Once you are comfortable with the basics and could build a complex web application without the help of a framework you are paradoxically ready to use one. I suggest that your first framework be one that is highly popular so you can find tutorials and help as needed. Rails or Django are fantastic to pick up. Since you understand the basics you can then focus on using the best practices that these frameworks declare in their documentation to build a web application that can scale and is secure. You will not need to handle what will now be the mundane task of parsing form input or interacting with the database.
Now that you are comfortable using a framework you can seek more relevant knowledge that is applicable to what you want to do. Perhaps you are hoping to build a web application that shows real time updates for game scores and so you look into advanced AJAX techniques (or web sockets) for feeding the data to the user in a lively manner. Maybe you want to tackle something truly challenging such as converting m4a formatted files into mp3 formatted files. Programming really gets fun once you start tackling challenges that aren't quite as well documented. From here you will find the material more advanced, but with a solid understanding of the basics and a good framework to keep the basics out of your way you will be able to commit the mental capacity required to tackle the more challenging tasks.
In the end my advice is to have fun and work hard. Don't skip the basics, but understand that they are not the end point in programming. It is similar to learning calculus in mathematics. If you do not have a solid understanding of algebra you will struggle more than you need to. Build trivial things. Re-invent the wheel. This is how to best learn.
Best of luck!
TLDR: Pick a language, learn it, and then find a relevant framework and learn how to wield it.
If you're interested in something like working at a startup... having advanced knowledge of Elasticsearch would make you a pretty desirable candidate.
I hope... >.<
If your goal is to become a programmer, I will advise you that regardless of the language or path you choose, you are in for at least a 1-2 year learning process in which you will learn a language, an accompanying toolset, and the basic set of skills required to debug and architect large, complex programs. You will also be learning a lot of terminology, which is indispensable for what I believe to be the main skill involved in programming, which is knowing how to Google things.
To answer your question directly: From my vantage point, the puck appears to be skating in two directions. Golang is a rapidly growing language developed by Google, and is considered to be one of the best amalgamations of features from modern programming languages. I highly recommend it. It has only been out for four years, so I can't speak to how approachable it is to a newcomer, but if your goal is to learn a language that will not become obsolete in 5-10 years, I think Golang is a good bet to make.
In the other corner, there seems to be a growing community about a language called Clojure. It is a little complicated to explain Clojure's appeal to non-programmers, so be warned that exploring Clojure is slightly "off the beaten path" compared to many "mainsream" programming languages like Java, Python, or Ruby.
In short, there is a language called Lisp which is highly regarded in the elite programming community as the best way to write software. In his seminal essay "Beating the Averages" [1], Paul Graham offers several compelling arguments as to why Lisp-based langauges (and programmers) are superior to other forms of programming. Since I am not a Lisp developer, I recommend reading his article, since I would probably butcher any attempt to explain its merits against other popular languages. Anyway, Clojure is a modern implementation of Lisp, has an incredible community, and appears to be gaining a lot of traction. Given your background, starting with Clojure might make a lot of sense. Rich Hickey (the creator of Clojure) is an incredibly influential figure in programming circles.
Finally, unless your goal is to write mobile applications, a rudimentary knowledge of HTML, CSS, and Javascript is required to be able to produce anything in our web-based world.
If you have any more questions, feel free to email me (my email is in my profile). I enjoy helping people navigate the confusing jungle of modern programming education, and I can point you in the right direction depending on what your goals and work ethic are.
[1] http://www.paulgraham.com/avg.html
Ruby, JS, Perl, etc. can't really touch this. There are all sorts of "flavor of the moment" languages right now on HN but at the end of the day, if you want a mature, workhorse language that's easy to learn, has a lot of good libraries, and has a great community around it, choose Python.
Most modern dynamic programming languages owe a debt to Perl, and the modern web certainly does. It has a variety of modern frameworks: Catalyst Dancer Mason Maypole Mojolicious Cyclone 3
I'd say Catalyst and Mojolicious are the one's I've heard about most.
Perl may not be considered as cool as Python by some, and there are reasons you can criticize it, but it's not any of the reasons you gave.
By "flavor of the moment", I was not referring to Perl, but rather to all the "compiles-to-JS" type stuff.
Merely comparing package repository sizes is not any indicator of quality or future prospects. Once you're beyond a few tends of thousands of packages, the bases are basically covered.
The biggest ding against Perl is the readability and maintainability. For scientific and data analytics oriented code, generally written by non-programmers who do not understand good software development process, Perl is frequently way too much rope.
Coolness has nothing to do with Python's popularity. (Unlike e.g. Rails which soared to popularity as a "Non-Java" way to do web apps, and then became a bit of a victim of its own success.) The scientific Python people I know all moved to Python from Matlab, C, and Perl because it made them more productive.
http://numba.pydata.org/
With a PhD in Electrical Engineering, I'd think you could go far in the growing hardware market.
I think the key in selecting a technology to learn 'right now', you need to consider when you'll want to use this technology for.
The way I (kinda) do it, is to not look at languages specifically, but what I want to do with them, and how I can leverage what I already know.
For example, recently I've wanted to start playing with hardware (RaspberryPi and Arduino). But I didn't just jump in and start learning C, I looked at what I already know (javascript/ruby/etc.) and am looking at how I can leverage that in this new technology.
I've also got an interest in algorithms and data, I've done some work with parse-trees in Ruby and have tried umpteen times to get to using the Stanford Parser with Java, but it normally ends with me curled in a ball sobbing, so now I'm doing the Coursera class in Scala (how often do you get to learn a language from the creator of that language).
I learned RoR, not because it was popular that day, but because I was working on a project I knew I would be passing on to another team to manage long-term, they had some RoR experience, and the structure of an RoR project meant I knew would lead them to easily understand how to manage it without much knowledge transfer.
So, to me, the best technology to learn is the one where you match your interests, and your existing knowledge to become an expert in what should be a growing field. One thing to consider there (of course) is where that technology will land you in 1-5 years.
My favorite stack for the last year or two has been CoffeeScript (and now ToffeeScript which is even better) and Node.js with good old ExpressJS.
I also think AngularJS is probably the best starting point for many web applications these days. So actually most of your efforts would be with AngularJS since the front end is often going to be much more complex than the back end.
The most convenient way to store data I think is in JSON files or with MongoDB or RethinkDB. Or maybe better take a look at a CRUD framework like https://npmjs.org/package/auto-crud . Again, 'from scratch' is a relative term and actually the farther you stay away from that the better probably. But of course no one, including me, can learn everything, so you have to pick a set of tools and become comfortable with them and that is subjective.
Node has the most advantageous module/package system out there (npm) with the support for semantic versioning and the sheer number of packages available in the registry (more than 41,000 at the moment).