Ask HN: What are the best technologies you've worked with this year?

90 points by iamelgringo ↗ HN
What are the best shiny new technologies that you worked with this past year? I'm always interested in hearing about what others are working with, and loving.

edit I'd also love to hear what you love about it and why.

85 comments

[ 3.1 ms ] story [ 155 ms ] thread
Seaside
Seaside and Smalltalk are awesome. Sadly the last few months i had to resort to hideous creatures like telerik and asp.net to cobble up complex grids of some sorts. I wish there were more widgets for Seaside. Perhaps I'm missing a community site somewhere for these?
Not really. There is some out there but not much yet. More people creating those sorts of things are needed while the core seaside team concentrates on their job.
GAE: if you can reduce your problem to searching in a b-tree, you're in heaven.

GWT: code for the browser like it's 1984.

Tokyo Cabinet (key value storage: removed the "R" and "M" from "ORM", managed to get an object from disk to the client with the object being opaque to the server, cutting deserialization/serialization overhead down, implemented indexes to keep track of keys and got more of an idea of what MySQL does behind the scenes).
Isn't this similar to what berkley db does?

EDIT: Genuine curiosity, not trying to make a point.

Yup - I'm pretty sure I'vea heard Tokyo described as a "modern" BerkeleyDB implementation.
Cool, then I'll give it a look. Thanks.
It's from the artist who formerly brought you GDBM and NDBM.
though it was a disappointment of the year for me. performance degrades significantly after 2M of entries :(
(comment deleted)
(comment deleted)
Django :)
Ditto. I've been building web sites SO FAST. It's brilliantly designed.
I love this framework. A few year ago I started learning RoR but I hate the Ruby syntax. Django and Python is beautiful.
Redis. It's a very different kind of database - being able to perform 80,000 set or list operations a second enables a whole bunch of solutions to otherwise difficult problems (real time stats stuff, writing in to activity streams etc). SRANDMEMBER on its own is invaluable since picking a random item from a regular relational database using ORDER BY RAND() tends to kill it stone dead under load.
Haskell. I avoided it for the longest time because of the purely-functional-no-side-effects zealots. As it turns out, it is a surprisingly powerful and beautiful language, and you can get quite far without needing OO.

The paradigm wars will rage on, but in the meantime, the rest of us have a language that has a rich library set and a very rewarding programming experience. The usefulness of applicative monads, functors and typeclasses have convinced me that there's something much, much bigger out there with regards to these so-called design patterns, something that we have not even begun to explore and discover.

Clojure.

It's the first Lisp that, to me, is both fun _and_ practical.

Java libraries aren't as simple as the Python counterparts but the maturity of the JVM vs. Python VM kind of balances that out.

Do you recommend a good tutorial for someone who knows Python and wants to learn Clojure?
I'm not sure; I mostly just read the clojure.org website itself and looked stuff up on its index page and went from there.

I did buy Programming Clojure: while it offered nothing new with regard to what was available on clojure.org it was, nevertheless, a good introduction. However, it greatly helped to have experience in functional programming and other Lisps so I'm not sure how it fits to a Python programmer's experience.

What problem did you solve using it?

I've been studying Clojure and it seems to be impressive. But I have yet to see some really impressive open source software that was written in it.

Hmmm, nothing big here either but I was learning anyway so I didn't set the par too high. Since you asked, let me see:

A bunch of various throwaway programs or clones of small utilities I had already written in other languages. An utility to update metadata in my oggs, a command that finds similar files, a little solver to answer questions about a given set of different relations (I actually needed such a solver to make some decisions at work so I programmed myself one), bunch of other file/text based unixish tools. Conclusion: 1) Java's I/O APIs are from hell. 2) Clojure can do a lot in only a few words of code.

Some GTK applications via libjava-gnome-java. Works much better than AWT/Swing used in many sample applications, and is much Linux friendly. Lots of Java interop training there :) Will try out LWJGL soon, in an attempt to port a small OpenGL game to Clojure: the game is mostly about experimenting some gameplay ideas so the OpenGL implementation is rather straight-forward and anything but time-critical, thus, the OpenGL backend is great candidate for porting to a new language. I've already learned that Clojure is a great help in transforming my thoughts into code so I prefer to do any prototyping in it these days.

A simple gravity simulation: a friendly way for experimenting with parallel features and transactional memory, agents etc. as you have lots of dependent things moving independently, and I got to "optimize" some Clojure number-crunching as well. And there's ants.clj and other parallel sample programs already so I could compare myself to others.

An evolutionary algorithm aimed at the travelling salesman problem, one of the very first Clojure programs I wrote that introduced me nicely to basic data structures and abstractions in Clojure such as the ubiquitous seqs. I used Swing for the GUI -- crap.

A small Reddit clone. I actually wanted to prototype a few nice ideas I had with regard to news aggregators like HN and Reddit in general so it was mostly not about Clojure. But it offered me a very welcome chance to experiment maintaining global state in an efficient and functional way (server application), got to think about how would I create a live disk-backed database hopefully mostly in Clojure, wrote some basic html generator macros in Clojure, and got some taste of Java interop by hooking the thing up to Java's http server. Excellent project and still ongoing whenever I feel like it.

A simple attempt at Casino (the card game) AI. I probably wrote a sudoku solver too although the most recent I can recall was in Haskell. But I always write a sudoku solver in a new language so I probably did one in Clojure as well.

Oh, and a small layout library for GUIs. I have a thing for those. It's rather incomplete as it was one of the very first Clojure programs I ever wrote; I could rewrite it now and make it much more shorter, faster and idiomatic should I actually come up with a _need_ to have a layout library of my own :)

That's about it, more or less. Might have forgotten something.

Thanks for sharing.

I've been investing quite a bit of time into Clojure and to motivate me to go further I'd like to find some software (not code snippets) I can download and see the power Clojure provides (that other tools like Ruby or C don't) in a real application.

Similar to what Rails did for Ruby.

LLVM. It is a ridiculously well written and well documented codebase. The transformation/optimization framework is remarkable and surprisingly approachable. The compiler intermediate representation is easy to work with both in the emitted bitcode files and in llvm's internal data structures. I find it a joy to work with.

Its also cool due to all of the other great technologies that are taking advantage of it (Mono, Parrot, Adobe CS4, Apple)

I think once llvm and clang become mature enough, the FOSS community will completely supplant gcc with this technology.

Haskell and the Cocoa Touch framework (sadly, not yet in conjunction).

Haskell isn't really new, but it still is the best programming language I've worked with (yes, "best" is personal in this case). I don't think any other language allows me to write programs that are more concise.

The other thing that 2009 brought me was iPhone Development. Although I don't like Objective-C that much, the Cocoa Touch framework is excellent. Once you get a grip on it and on the design patterns your code tends to get very small, too.

With both these technologies I shared the same experience: at the start they look incomprehensible and working with them made me less productive. However, only after really learning them I started to full appreciate all the things.

What was the reason you didn't use haskell and cocoa touch together? Was it due to a particular deficiency of one of them? Difficulties combining them?
Local storage, canvas, mobile location and websockets/long polling. I'd been away from the frontend for quite some time (2006-2008, an epoch in web standards terms) and learning these tools was a big part of 2008/09.

While I'm not convinced of any flash-killer status, I've definitely seen/done enough to keep me interested.

CouchDB. A schema-less database just makes so much more sense for what I'm doing. (and it is extremely easy to use from python, due to couchdbkit).
opencl (if you've not heard of it, it's a way to program graphics cards - very like cuda, but cross-platform). we had some numerical code in matlab that was taking too long to run. i managed to get a speed-up of 80x by moving it to a gpu - and the gpu in question is not even the latest generation, but something we picked up on newegg for less than $200. and i suspect that's just for starters - i haven't even profiled it yet to see how to make it faster.

using opencl isn't that much harder than c. obviously you need to understand a little about how gpus work, and there are all the same issues about allocating memory, segmentation faults, etc. but the compiler and runtime are quite solid, and the docs more than adequate. now that i am past the worst of the learning curve i'm looking around for more slow code, because it's an easy way to get more speed.

also, django, but others have mentioned that (it's such a breath of fresh air if you're used to using java...). next year, i hope to play with llvm some (although it will have to be on my own time - can't see how to do that at work...)

Node.js. Event driven I/O is so so sweet. I have sharpened my javascript fu over the last year or so, and being able to bring it server-side is surprisingly fun and easy.
I really enjoyed playing with it, but I think it won't shine until higher level libraries are ported/written for it.

There are basic URL dispatchers and template systems, but nothing as battle-tested as Django (yet).

Easy access to streaming data was pretty nice! As is the event system but I'm afraid as a mostly client-side programmer I take that for granted.

Objective-C and Cocoa, not new but my new favourite development environment. I love the documentation, in my opinion the best documentation of any language.

I love the way Apple doesn't care what anyone else thinks about their language and has ridiculously verbose 40 character long method names to make code clearer.

Love it!

Along with that, I'd probably have to add XCode. Extremely well-designed IDE and makes writing Cocoa a breeze.
Currently working through Joe Armstrong's programming erlang. I'm interested in functional programming and concurrent programs and erlang seems to fit really well.

I also find Clojure very cool :)

What book would you recommend for Erlang? (I've done quite a bit of functional programming, but not exactly lately.)
I've been reading through the oreilly book, Erlang Programming. Its good (like all Oreilly titles) though I'm only into chapter 6. I'd definitely suggest picking it up.
Joe Armstrong's book is probably the best one to start with. It gives you a step-by-step learning process that will get you up and running with Erlang in short order. Once you are finished with it pick up Erlang Programming by Cesarini and Thompson; this book covers a lot of the same territory but goes a bit deeper into some areas that are missing from Armstrong's book (e.g. debugging & tracing, etc.)
Helma NG (Server-side JavaScript).

Easy to get started, fast, stable, the community is helpful and it is easy to read their source code if you get stuck somewhere.

Cassandra.
XMPP, BOSH and the Strophe library (both the JavaScript and C incarnations).

Earlier this year I got tasked with implementing a system which involved multiple mobile clients talking to a rendering server. The mobile devices had a fairly beefy browser (Nokia N900), so the client was clearly suitable to be delivered as a web app. On the server side, we already had a realtime graphics system I had written earlier, to which the web clients would need to talk over a bidirectional connection with near-realtime responsiveness.

Being a C/desktop guy with little network experience, my first intuition was to do the simplest thing I knew how to handle: linking a small embeddable web server (e.g. libmicrohttpd) into the render server, and devising some cheesy custom application-specific protocol over HTTP.

Luckily, my work partner is not as stuck in the 1990s as I am, and he suggested we use XMPP. I was sceptical at first (XML? A server written in Erlang? Do we really need to go there? I just want to tinker with my pointers...)

He showed me some demos of realtime XMPP web apps built with Strophe.js, and I was rather impressed. Then we went over our system's client/server design and how it would map to XMPP, and I was sold.

We ended up using many more XMPP features than I had initially imagined, including publish/subscribe and multi-user chat rooms. Had we gone with my original approach, these concepts would have been implemented in some haphazard way in the render server itself. Now the rendering system just talks to the XMPP server like any other client. It's stable, scalable and fast.

Still, while BOSH in the browser is pretty amazing in practice, it does feel like a hack that's stretching the reasonable limits of what web apps should be doing over HTTP. Hopefully this time next year I'll be able to say that one of the best technologies I've worked with in 2010 was HTML 5 web sockets...

Offtopic:

Everytime I see XMPP in print, it makes me think of that media player I use to use in fvwm way back when.

Google Appengine: Probably _the_ easiest platform to develop a webapp on if you use Python and are okay with its limitations.

Tornado: If you are going to develop on GAE, Tornado is the way to go. It is fast, well written, and only includes the core features needed for a web app.

I can't highlight how much easier it has made things for me since switching from Django. Debugging Tornado's source code was a breath of fresh air compared to Django's monkey-patched bird's nest of dependencies.

It's a real shame that App Engine doesn't support long running requests that Tornado is great at serving, but I definitely agree with you. Platform as a Service is such a breath of fresh air. Heroku is also a great choice for Ruby.
E4X - ECHMAscript for XML

This is in AS3, used in flex. It's a joy to process xml with it.

Solr for super-easy full text searching and Memcache for a no-brainer distributed queue
I just did my first solr implementation this year and it was a pleasure playing the various tokenizers and filters that are included out-of-the box. It replaced a hideous MySQL SELECT and the results from the two aren't even from the same planet in terms of quality.
zsh - clearly not new, but I recently switched from bash to it. Spelling correction is very cool, and I like the tab completion a lot more.

Rails - again, not new, but I've really enjoyed it. I've built web apps in COBOL (had to at my previous employer), so being able to work with Rails has been a joy in comparison. I actually started playing around with Rails last year, but I never really did anything with it until this year. I like Ruby, although I'm not entirely sure I like it more than Python yet. It's growing on me, though. I like that I can have a basic prototype up and running in basically no time at all. When I was learning it, it was also nice that I only really had to learn one piece at a time. I tried out Django shortly before I began using Rails, being more comfortable with Python, but I felt that the learning curve was a bit steeper with Django.

Google Chrome - I'm not sure if this is the type of response you're after, but Chrome quickly supplanted Safari as my favorite browser. It's faster, the UI is slightly better, and my gripes are few and far between.

redis - insanely fast - I've been using for some stuff at Cork'd mongo - very excited by this one, too. not having to write ALTER TABLE statements is pretty great.