One of the most common questions I get from non-technical business leaders is: 'What technology should I use for my business?' Of course, technical leaders are often already wedded to a given technology, and that can be a mistake. But when you have no idea what on Earth Erlang is and you're pretty sure that Go is just a game you used to play as a kid, it can be pretty overwhelming to try to wade through the various dogmas and flame wars to figure out what's right for you.
When it comes to technology there certainly is an interesting fixation on the tools. It’s utterly bizarre to me that someone could get passionate about a 30 year old command-line text editor: “EMACS is awesome! Anyone who doesn’t use it is a complete idiot!!!”. It’s also amusing to me that sometimes people don’t care enough: “They are all just tools, they all have their strengths and weaknesses and applications”.
The religious debates are fun, but what’s interesting about either end of the spectrum is that people almost always focus on the wrong things. The technologies used by a business are tools, but they are not just tools. They represent far more than the jobs they help get done.
By now I have a lot of direct and indirect experience with various web application technologies. I really don’t care about crap like ‘scalability’ or ‘performance’, yadayadayada... Everything ends up as bytecode. Everything is throttled by the same network and IO (e.g. DB) bottlenecks. Everything overcomes these to scale by the same means: caching and distributed hardware.
What I care about is total cost, and even more importantly — culture. When you adopt a technology, what are the in-laws like? What kind of family are marrying into? What are you in for? Because ultimately adopting a technology is like marrying into a family. You’re going to be joining this culture. Relying on it for tutorials, documentation, plugins, libraries, services, and (hopefully) eventually employees.
At the risk of stereotyping and potentially offending (though truth-be-told, if you tend to get offended by this kind of stuff, you certainly care about the wrong things), let me paint some very rough family portraits. When it comes to web tech, there are basically three major options out there: PHP, Python, and Ruby.
Anyone setting out to explore the web-technology landscape will likely immediately encounter PHP. For a time in the early 2000s, The PHP clan practically put the web on its shoulders and carried it along. PHP is like country-music. It’s straightforward an a bit plaintive… almost earnest. It’s a lot of C-F-G and minor scales. And that’s ok. You can do a lot with C-F-G. PHP is Bret Farve selling jeans. It’s not presumptuous or stylish. It has no pretense, but not much grace, either. PHP is pickup trucks and family sedans. PHP is cheap to deploy, but in reality it is ultimately one of the most expensive web techs because it by nature gravitates toward idiosyncratic mess. You can certainly overcome this gravity with various struts and ladders and patches, but it does take a lot of extra vigilance/effort/cost.
The PHP culture tends to a ‘just get it to run’ lowest-common-denominator mindset which is not bad (and actually underlies a lot of the hacker/tinker mindset), but it does not lend itself to awesomeness either. That said, PHP by now is so diffuse that any specific cultural characterization is very hard to articulate: if you plucked a random 25yr old coder from the middle-American suburbs, odds are he/she would be a PHP hacker — the near definition of vanilla non-culture. I take that as a negative, but it can be very effective for some.
Python is a great up and coming alternative with a very different culture. The Python culture is typified by engineering mindsets and propriety (the ‘right way’) and people who have a deep interest in and respect for map-reduce algorithms, but a tendency to avoid eye-contact ☺ Python is rigorous and highly articulate. It certainly won’t gravitate towards a mess, but it doesn’t encourage much free-expression either. It’s shoe-gazer math-rock: complex time changes and rich arrangements. Python is german engineering — BMW and Mercedes Benz.
I dig Python, but ultimately it’s not my flow. It also tends to be expensive: for positive reasons (e.g. the high-caliber math-based culture) and for negative reasons (e.g. the emphasis on propriety limits efficiency and productive shortcuts). Python may well be a great choice for big-data, statistical analysis, or financial software, but it is not for me.
My tribe of choice is very much Ruby and the Rails community. Ruby is the computer language of Philosophers and Poets. It is programming for Liberal arts majors (like me). If that sounds paradoxical or even obnoxious to you then you should take a good look at python ☺ If that sounds like a revelation to you, then you should just dive right in.
Ruby is Jazz. Improvisational programming with well-defined rules of engagement. It is a self-aware chameleon, borrower, and hat-tipper (so meta). Ruby is Italian sports-cars and turbo-charged anything.
To understand Ruby culture (and in fact Ruby itself!) in a nutshell, take a glance at _Why’s Poignant Guide to Ruby (by its own right, really a remarkable cultural artifact of the information age). It is truly one of the most effective cultural litmus tests I’ve ever seen. People very immediately and clearly either ‘get it’ or don’t — in either case often violently and viscerally.
These kinds of strong tonal articulations tend to cause very strong self-identifying effects. You quickly and effectively get the right people in and keep the wrong people out. People who obsess over garbage-collection algorithms, or equally, people who are ok with throwing 50 lines of code into an html template just to get a project out the door are both equally perplexed, terrified, and repulsed by the fierce Dragon of Dwemthy’s Array (as well they should be).
Because Ruby wants to be beautiful, there are specific tangible effects that fall out. Often, these are beneficial as concerns performance, intelligibility, and especially maintainability. Rubyists tend to care more about what code ‘says’ than what it ‘does’. This is a wonderful thing.
So, yeah, I’m pretty firmly entrenched in the Ruby/Rails camp. It has enabled me, a non-programmer by training or personality, to build immensely complex, powerful, and scalable systems on minimal budgets. But then, I also dig Jazz. I also totally get that some folks are more into country or prog-metal. At the end of the day, these kinds of decisions are (and should be) more about aesthetics and culture than about performance or features.
- .NET/C# = ‘enterprisy’ you should probably be using python, but for whatever reason you have contractual/sla type obligations that force you to use cumbersome proprietary or non-open-source technologies.
- The Bleeders: Go, Erlang, Haskell, Clojure, Scala. Almost anyone seriously messing with this stuff is either: trying hard to impress someone or working on problems you almost certainly don't have if you're reading this. I'd avoid the bleeders like the plague.