My thoughts on various programming languages
I hate all the languages. Once, I tried to make my own language, but I couldn't figure out what language to do it in, so I never started.
Most of the time, you don't have any choice of what language to work in. Whatever language I'm using, I've learned to appreciate both its strengths and weaknesses.
JavaPeople who like Java like typing. I mean: actually hitting keys on the keyboard. You have to keep repeating yourself over and over.
The whole java system was designed by an insane person whose answer to everything is to use a Design Pattern. If you see design patterns as a way of working around problems in the language, you will see that Java has many.
On the other hand, the folks at Sun really put the work in to make Java a specification that works on embedded platforms, so we're stuck with it there. I wouldn't really trust Python or C to run my desktop on my phone.
Also, what's with all those folders? I have to use Eclipse, against my will, because it knows how to jump around all those 1000 character path names. Would it really hurt anybody if I kept the 10 objects in my application in the same folder?
CC is precise. When I write something in C, and it is done, I know that it will work. It's like painting a masterpiece with a single-hair brush. Having to code in that level of detail is a different mindset. When you sit down to write something in C, you have to plan it out before you start. Otherwise it's a lot of work to change it later.
If you have enough experience, memory leaks are rare. It's second nature -- malloc/free come in pairs. You can't forget one. It would be like forgetting to flush or turn off the lights. You just do it.
That being said, if you're going to paint a house, you don't want to be using a fine brush. You want huge rollers. If I'm writing a whole application, or a system, I would avoid C if I can.
It is difficult to make large changes to a C program. When I'm working on an algorithm, and I know that the first cut won't be right, often I will code in python first and then translate it into C by hand when it's done.
C++It's C with a string class. And arrays and lists and heaps of queues to implement whatever you desire. A word for the wise: don't try to make your own templates. It's too hard. Aside from that, C++ makes C better, and you can write some very nice software in C++. The extra features make it scale up to larger systems with only moderate difficulty, as long as everyone follows the same conventions.
Coffeescript is nice. When you have to write tonnes of code, coffeescript will make you at least 25% faster. You can see that many more lines on the screen at once.
node.jsI wanted to like it. I think I gave it a good go. It's the callbacks that got me. I just know that someday, for whatever reason, one of those callbacks isn't going to happen and then my app is going to be stalled waiting forever. That's no way to live.
Also, nearly nothing is built in. But if you have to do X, there are always a dozen modules to choose from that do the same thing. Which do you choose? Which will get support if you have problems?
ScalaScala is a functional, typed language that compiles to JVM code.
I learned Scala on the job. Yup, a startup was actually using it for their production system, and I joined them fairly late.
This allowed me to see the ugly side of Scala: Type inference. Types are inferred to the extreme. Everything has a type, but figuring out what that type is means checking different files several levels back. And Scala inherits Java's folder insanity, so it means delving into several levels of folders to find the right file to lookup the type.
In short, Scala was great -- for the original developers. Newcomers had a long learning curve to learn the existing code.
ErlangErlang is also one that I wanted to love. I really tried. It is a beautiful functional language that lets you make wonderful little modules that communicate in precise ways, and your system can run for 10 years because it can deal with unexpected problems, restart what's needed, and keep going.
Unfortunately it's baroque. Development seems to have stopped at about the time that Berkeley invented sockets. Almost nothing needed in the modern era is included. Why is it so much work to make a simple web service?
GoGo is easy to learn, even for newcomers. It uses language concepts from 40 years ago to build a robust, asynchronous system, and lets you code it as if it were synchronous. You can write 1000 threads that work together safely in Go without your brain hurting.
It still needs some work in library support. When I want to do X, which library should I use -- the one on github from 2011 or the one from 2013 that is half finished? One is linked to from the official pages, but it the official pages don't seem all that up to date. Sigh, I guess I'll have to write my own...
PythonThere's a library for everything in python, and if you use Linux it's usually clear which is the top one, because it's installable with one command.
If you have to do some number crunching or scientific computing you will be well-served by choosing Python.
Strings can be both text and data in python, so you have to learn about text encodings early on.
Python 3 Python 3 shares many characteristics with python, though it is a different language. Since it's newer its not supported as much. I want to use it, but there's always that one library I need that only has python 2 support.
Exploring sound with WaveletsHere's a program to create scalograms of sound files.
VP trees: A data structure for finding stuff fastLet's say you have millions of pictures of faces tagged with names. Given a new photo, how do you find the name of person that the photo most resembles?
In the cases I mentioned, each record has hundreds or thousands of elements: the pixels in a photo, or patterns in a sound snippet, or web usage data. These records can be regarded as points in high dimensional space. When you look at a points in space, they tend to form clusters, and you can infer a lot by looking at ones nearby.