Reddit: Language vs. Platform

My previous entry, Twitter: Service vs. Platform, was widely misunderstood. I suppose I only have myself to blame, so I'll try to clarify with another example.


This is a companion discussion topic for the original blog entry at: http://www.codinghorror.com/blog/2007/04/reddit-language-vs-platform.html

It’s not the language, it’s the platform. [1]

It’s not the language, it’s the IDE. [2]

[1]http://www.codinghorror.com/blog/archives/000839.html
[2]http://www.codinghorror.com/blog/archives/000195.html

No matter what way we look at this, it’s never going to be about Python vs Erlang vs PhP vs Ruby. It’s gonna be Rails versus Django versus Turbogears vs CodeIgniter. And the deciding factor will probably be
which IDE is best !

Interestingly in ruby you do have a choice of frameworks. Personally, I use camping[1] for fun projects, merb[2] for fast responders, and there is talk of a few new microframeworks like Rack[3] (which works inside other frameworks).

[1] http://code.whytheluckystiff.net/camping/
[2] http://merb.rubyforge.org/
[3] http://rubyforge.org/projects/rack

A camping app I just wrote was http://twitter.caboo.se which grabs json from the twitter API and parses it to show you shared and unshared friends from a group of users.

Merb is a fast mongrel responder that acts like rails and can use many of the rails components but with the mutexes much tighter. Typically we use it for grabbing stats or handling uploads.

Rack is some serious meta-framework magic.

[Disclaimer: I’m one of the lead authors of Django.]

Generally I try to stay out of discussions of the relative merits of web frameworks. I’m too obviously biased to be objective, and there’s already far too much brouhaha flying around.

However, I really feel the need to point out two things about Aaron’s comments:

  • First, much of what he is complaining about has since been fixed. Working well with others has been one of our top priorities in the year+ since Aaron wrote those words, and that effort has paid off big-time.

  • Second, I suspect that Aaron’s comments about Django were driven at the time by some personality conflicts he had with the Django community. He posted a large number of bug reports in a short period of time and reacted negatively when some of them were marked “wontfix” because we felt they didn’t fit well with Django’s philosophy. The tone he took through the whole interaction left me feeling very uncomfortable; I had a hard time finding the “constructive” part of his criticism.

When he then posted the article you post from above, it certainly seemed as much an attack on Django as an article about Reddit. I think Reddit’s choice of web.py was the right one given their goals and constraints, but I’d encourage you to take Aaron’s words about Django with a grain of salt. I suspect he’s as unable to be objective about it as I am.

This language-framework-library-platform issue is one reason that in my project (http://interreality.org), our goal for the next version is to create a library that can be accessed by C, C++, as well as various other languages, through wrapper APIs and also by making it easy to generate multilple language implementations for certain kinds of things from an IDL. We’ll see how this goes.

I once thought it would be easy to bring existing C++ code into the .NET runtime with a few tweaks and a recompile. Haha.

Will we someday have a magic utopia in which language and platform/framework/library are truly decoupled? Maybe something like that, I certainly hope so.

I’d encourage you to take Aaron’s words about Django with a grain of salt

Thanks for clarifying, Jacob.

However, I think it’s fair to say both Rails and Django require you to do some “fitting your code into [the framework’s] worldview”, as Aaron pointed out.

That’s why it’s helpful to have a few alternatives at the ready if you find a particular framework’s worldview to be inconsistent with your own.

As someone who used Django quite a bit and is now moving off it using a more piecemeal fashion (CherryPy, SQLAlchemy, Preppy), I can vouch for Aaron’s (and Jeff’s) comments about “fitting your code into [the framework’s] worldview”.

I don’t think the real issue is that frameworks are good or bad, they are just an attempt to streamline the common parts of building some sort of application so you focus on the interesting stuff and not the infrastructure. Both Django and Rails are good at that, but you have to “stay within the lines” to really continue getting their productivity benefits. When you need to do something outside of the sweet spot, you will often end up fighting the very framework that was once helping you.

If you only do that occasionally, then its not a big deal. But if you run into those limitations frequently, then sometimes less is more … like web.py

a href="http://imgs.xkcd.com/comics/lisp.jpg"http://imgs.xkcd.com/comics/lisp.jpg/a

:smiley:

The one thing that I really like about RoR is that it’s a framework, where as ASP.NET is a platform. Difference being is that in a framework environment people can build plug and play components, where as on a platform, people can build components and you have to make them work for you.

For example, there are a ton of plugins available for rails that allow you to extend your models at a drop of the hat.

With RoR you start building a website… with ASP.NET you start by building a framework for your web site… I’ve been developing for ASP.NET since first betas, and now I’m learning RoR.

The Twitter article made me concerned in terms of performance… I knew about the issues before, but never to that degree. I’ve always been concerned about flaky internationalization support, but this article is really worrying. I’m thinking about going back to ASP.NET, but the though of having to do anal probes with reflector or doing SQL sit ups makes me want to cry in frustration.

I really wish there was a application framework for ASP.NET.

@Alex G

You should check out the Castle Project, http://castleproject.org/, specifically their MonoRail project.

From their site:

Castle is an open source project for .net that aspires to simplify the development of enterprise and web applications. Offering a set of tools (working together or independently) and integration with others open source projects, Castle helps you get more done with less code.

I’ve been using their ActiveRecord pattern for a few months with no complaints; their forum and community support is excellent and prompt, as well.

I think that things like this sometimes don’t help people’s perception of the Rails commnunity.

http://flickr.com/photos/planetargon/127984254/

I guess for me it comes down to the needs of the project. Platforms and frameworks are simply different levels of abstraction. The level of control you wish to have over your code comes at the cost of increased development time to develop extra code. In my mind mode code implicitly leaves more room for error.

To me, the appeal of a framework is less about the initial speed of development and more about the abstraction it gives. This contract programming methodology decouples the server and the service, allowing me as a developer to focus my development and testing on the business logic.

I do not think it is fair to blame a framework for not supporting a feature not specified in the contract. More often, and in the case of Reddit, the project’s needs change and the contract between the framework and developers is no longer appropriate. I think at this point, too many people start complaining about the framework instead of focusing on re-evaluating their needs and matching those to a more appropriate technology.

I am of the “tools in a toolbox” camp, and you could sed -e “s/framework/language/g” to the above paragraph. Jeff, I think we agree on the philosophy we are choosing different ways to describe it. Thanks for clarifying your position, though here is to hoping a third post isn’t needed :slight_smile:

Cheers!

Hi Jeff,

I really enjoyed your this post and your previous one about Ruby on Rails.

Thanks for the interesting insight, as usual.

I would take slight slight issue with Jeff’s assertion that “Rails and Django require you to do some ‘fitting your code into [the framework’s] worldview’, as Aaron pointed out.” It’s more that things are almost unbelievably easy to write in Rails if you do it “the Rails way”, but you actually have to write a little more code to do something different (or wait for an active community to write a plugin for you).

Maybe my deeper concern with the raw performance comparison is that it minimizes the fact that some frameworks and languages can actually encourage you to write more efficient code, use better algorithms and caching approaches, etc. (although the reverse is also true) Simply because I code in c does not mean my web application will run faster.

These Twitter dudes were pretty far from determining that the time it takes to execute one line of Ruby was a bottleneck on their performance. In the the three cases in my career where I was able to get a bottleneck down to the speed of the high level language, doing calculations in signal propagation over terrain, for example, I was able to drop down into c++ to utilize some high performance libraries. Ruby makes it pretty easy to drop down into c for that purpose. Somehow I don’t think that’s the problem here…

Jeez, what a great blog post. After a few reddit hits, I finally just went ahead and subscribed to your site, and it’s already clear that it was a good decision.

No one really has your mix of straight talk and experience and it really shows. Sorry to kiss ass (I guess I’m apologizing more to other commenters than you) but sometimes a little needs to be done, and I don’t really need or want anything from you so I think it’s permissible.

There’s so many people out there who are sort of end-user/developers (meaning, end users of development tools) who are not genius developers or sysadmins in their own right, who just want to use these easy tools to get the job done. Having straight talking people who can help sort out the hype from the reality and help people make good business and technology choices… that just really helps the web, and especially that class of people.

Uber-developers who could write their own framework if they had to, but just consider one a bit of a timesaver don’t understand developing at a more user-like level and how much one depends on people who can sort out all the nitty gritty implementation details and give a recommendation, or at least tell what’s important.

The last link in your article give me a page not found error.

BTW, love the blog. Keep up the hard work.

Much better post now :slight_smile:

The RoR framework is build or should we say, is popular because it provide some magic tricks for developers to get tedious tasks done fast. But it is beyond me why people can’t imagine that the magic will come with a cost.

Not sure I fully agree that ASP.Net supports both types of developers, when you stop using viewstate, the lifecycle model, etc. you cut out quite a lot of the asp.net framework. That must be the same as RoR without AJS, ActiveRecord, etc.? I dont know the RoR framework, but it should still be possible to access the httprequests withour the rails?

ASP.Net has just as well magic features that should make every Web2.0 developers dream come true. “Create a website in 30 seconds”, just use our “bla bla Control”. But the magic that made you come from A to B, does not necessarily help you get to C.

It should be pointed out that the Reddit comments predate the aptly-named “Magic Removal” revision of Django: http://code.djangoproject.com/wiki/RemovingTheMagic

You shouldn’t actually read that page, except to get a sense of how much magic was removed.

It’s a lot better now. In particular, Django entirely relies on the bog-standard Python module loading mechanisms now, so figuring out where you can move things is a no-brainer once you understand Python’s module loading system.

Disclaimer: I know no Rails, and I’m not a web developer.

In transactional operations, it’s all about the database. Rails, by my understanding, has a very object/relational-mapping view of databases, and this has the result of generating database schema that does not actually work very well. Typically this is because multiple requests are made to the database in order to follow the object hierarchy, rather than making a single request to get the one piece of data you need to fulfil this request. Similarly, if you make changes to multiple objects, multiple UPDATE commands result, whereas if you formed your schema based on what was updated together, you might manage fewer requests in total.

Your database’s write speed is going to be directly governed by how fast it can write to the transaction log. SQL Server, at least, writes the logical transaction information to the disk using uncached writes, and will almost 100% be writing sequentially to the end of the log file. It then updates its internal cached copy of the data files, and only writes those out lazily. For this reason, the best thing you can do for your database server’s performance is to ensure that each database has its own independent disk (or RAID 1 array) for its transaction log. Developers don’t generally think in terms of the physical, but disk access time in I/Os per second is usually governed by the head seek time; keeping the transaction log disk dedicated means that the disk head is almost always in the right position to write the next log record. There’s no point using any striping - for sequential accesses, that just means each disk gets used in turn, never in parallel. (RAID 5 is even worse due to needing to read the disk being written to and the parity disk for the stripe in order to compute the new parity, then write to the destination disk and parity disk, for each write that occurs - disastrous for transaction log performance).

In my work, for our own mobile-device application server, we generally don’t bother producing an object model. There just isn’t any point manipulating it when you’re simply providing a single response for one client then getting a request for a completely different client. We’ve solved the object/relational mismatch by not using data objects.

i heart lisp

i heart reddit

:slight_smile: