<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: rails</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/rails.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2026-03-13T03:44:34+00:00</updated><author><name>Simon Willison</name></author><entry><title>Shopify/liquid: Performance: 53% faster parse+render, 61% fewer allocations</title><link href="https://simonwillison.net/2026/Mar/13/liquid/#atom-tag" rel="alternate"/><published>2026-03-13T03:44:34+00:00</published><updated>2026-03-13T03:44:34+00:00</updated><id>https://simonwillison.net/2026/Mar/13/liquid/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Shopify/liquid/pull/2056"&gt;Shopify/liquid: Performance: 53% faster parse+render, 61% fewer allocations&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
PR from Shopify CEO Tobias Lütke against Liquid, Shopify's open source Ruby template engine that was somewhat inspired by Django when Tobi first created it &lt;a href="https://simonwillison.net/2005/Nov/6/liquid/"&gt;back in 2005&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tobi found dozens of new performance micro-optimizations using a variant of &lt;a href="https://github.com/karpathy/autoresearch"&gt;autoresearch&lt;/a&gt;, Andrej Karpathy's new system for having a coding agent run hundreds of semi-autonomous experiments to find new effective techniques for training &lt;a href="https://github.com/karpathy/nanochat"&gt;nanochat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tobi's implementation started two days ago with this &lt;a href="https://github.com/Shopify/liquid/blob/2543fdc1a101f555db208fb0deeb2e3bf1ae9e36/auto/autoresearch.md"&gt;autoresearch.md&lt;/a&gt; prompt file and an &lt;a href="https://github.com/Shopify/liquid/blob/2543fdc1a101f555db208fb0deeb2e3bf1ae9e36/auto/autoresearch.sh"&gt;autoresearch.sh&lt;/a&gt; script for the agent to run to execute the test suite and report on benchmark scores.&lt;/p&gt;
&lt;p&gt;The PR now lists &lt;a href="https://github.com/Shopify/liquid/pull/2056/commits"&gt;93 commits&lt;/a&gt; from around 120 automated experiments. The PR description lists what worked in detail - some examples:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Replaced StringScanner tokenizer with &lt;code&gt;String#byteindex&lt;/code&gt;.&lt;/strong&gt; Single-byte &lt;code&gt;byteindex&lt;/code&gt; searching is ~40% faster than regex-based &lt;code&gt;skip_until&lt;/code&gt;. This alone reduced parse time by ~12%.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pure-byte &lt;code&gt;parse_tag_token&lt;/code&gt;.&lt;/strong&gt; Eliminated the costly &lt;code&gt;StringScanner#string=&lt;/code&gt; reset that was called for every &lt;code&gt;{% %}&lt;/code&gt; token (878 times). Manual byte scanning for tag name + markup extraction is faster than resetting and re-scanning via StringScanner. [...]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cached small integer &lt;code&gt;to_s&lt;/code&gt;.&lt;/strong&gt; Pre-computed frozen strings for 0-999 avoid 267 &lt;code&gt;Integer#to_s&lt;/code&gt; allocations per render.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This all added up to a 53% improvement on benchmarks - truly impressive for a codebase that's been tweaked by hundreds of contributors over 20 years.&lt;/p&gt;
&lt;p&gt;I think this illustrates a number of interesting ideas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Having a robust test suite - in this case 974 unit tests - is a &lt;em&gt;massive unlock&lt;/em&gt; for working with coding agents. This kind of research effort would not be possible without first having a tried and tested suite of tests.&lt;/li&gt;
&lt;li&gt;The autoresearch pattern - where an agent brainstorms a multitude of potential improvements and then experiments with them one at a time - is really effective.&lt;/li&gt;
&lt;li&gt;If you provide an agent with a benchmarking script "make it faster" becomes an actionable goal.&lt;/li&gt;
&lt;li&gt;CEOs can code again! Tobi has always been more hands-on than most, but this is a much more significant contribution than anyone would expect from the leader of a company with 7,500+ employees. I've seen this pattern play out a lot over the past few months: coding agents make it feasible for people in high-interruption roles to productively work with code again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's Tobi's &lt;a href="https://github.com/tobi"&gt;GitHub contribution graph&lt;/a&gt; for the past year, showing a significant uptick following that &lt;a href="https://simonwillison.net/tags/november-2025-inflection/"&gt;November 2025 inflection point&lt;/a&gt; when coding agents got really good.&lt;/p&gt;
&lt;p&gt;&lt;img alt="1,658 contributions in the last year - scattered lightly through Jun, Aug, Sep, Oct and Nov and then picking up significantly in Dec, Jan, and Feb." src="https://static.simonwillison.net/static/2026/tobi-contribs.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;He used &lt;a href="https://github.com/badlogic/pi-mono"&gt;Pi&lt;/a&gt; as the coding agent and released a new &lt;a href="https://github.com/davebcn87/pi-autoresearch"&gt;pi-autoresearch&lt;/a&gt; plugin in collaboration with David Cortés, which maintains state in an &lt;code&gt;autoresearch.jsonl&lt;/code&gt; file &lt;a href="https://github.com/Shopify/liquid/blob/3182b7c1b3758b0f5fe2d0fcc71a48bbcb11c946/autoresearch.jsonl"&gt;like this one&lt;/a&gt;.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://x.com/tobi/status/2032212531846971413"&gt;@tobi&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/andrej-karpathy"&gt;andrej-karpathy&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/agentic-engineering"&gt;agentic-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/november-2025-inflection"&gt;november-2025-inflection&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tobias-lutke"&gt;tobias-lutke&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="performance"/><category term="rails"/><category term="ruby"/><category term="ai"/><category term="andrej-karpathy"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="coding-agents"/><category term="agentic-engineering"/><category term="november-2025-inflection"/><category term="tobias-lutke"/></entry><entry><title>Quoting Ally Piechowski</title><link href="https://simonwillison.net/2026/Mar/6/ally-piechowski/#atom-tag" rel="alternate"/><published>2026-03-06T21:58:33+00:00</published><updated>2026-03-06T21:58:33+00:00</updated><id>https://simonwillison.net/2026/Mar/6/ally-piechowski/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://piechowski.io/post/how-i-audit-a-legacy-rails-codebase/"&gt;&lt;p&gt;&lt;strong&gt;Questions for developers:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“What’s the one area you’re afraid to touch?”&lt;/li&gt;
&lt;li&gt;“When’s the last time you deployed on a Friday?”&lt;/li&gt;
&lt;li&gt;“What broke in production in the last 90 days that wasn’t caught by tests?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Questions for the CTO/EM:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“What feature has been blocked for over a year?”&lt;/li&gt;
&lt;li&gt;“Do you have real-time error visibility right now?”&lt;/li&gt;
&lt;li&gt;“What was the last feature that took significantly longer than estimated?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Questions for business stakeholders:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Are there features that got quietly turned off and never came back?”&lt;/li&gt;
&lt;li&gt;“Are there things you’ve stopped promising customers?”&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://piechowski.io/post/how-i-audit-a-legacy-rails-codebase/"&gt;Ally Piechowski&lt;/a&gt;, How to Audit a Rails Codebase&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/software-engineering"&gt;software-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/technical-debt"&gt;technical-debt&lt;/a&gt;&lt;/p&gt;



</summary><category term="rails"/><category term="software-engineering"/><category term="technical-debt"/></entry><entry><title>Supercharge the One Person Framework with SQLite: Rails World 2024</title><link href="https://simonwillison.net/2024/Oct/16/sqlite-rails/#atom-tag" rel="alternate"/><published>2024-10-16T22:24:45+00:00</published><updated>2024-10-16T22:24:45+00:00</updated><id>https://simonwillison.net/2024/Oct/16/sqlite-rails/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fractaledmind.github.io/2024/10/16/sqlite-supercharges-rails/"&gt;Supercharge the One Person Framework with SQLite: Rails World 2024&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Stephen Margheim shares an annotated transcript of the &lt;a href="https://www.youtube.com/watch?v=l56IBad-5aQ"&gt;YouTube video&lt;/a&gt; of his recent talk at this year's Rails World conference in Toronto.&lt;/p&gt;
&lt;p&gt;The Rails community is leaning &lt;em&gt;hard&lt;/em&gt; into SQLite right now. Stephen's talk is some of the most effective evangelism I've seen anywhere for SQLite as a production database for web applications, highlighting several new changes &lt;a href="https://simonwillison.net/2024/Oct/7/whats-new-in-ruby-on-rails-8/"&gt;in Rails 8&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;... there are two additions coming with Rails 8 that merit closer consideration. Because these changes make Rails 8 the first version of Rails (and, as far as I know, the first version of any web framework) that provides a fully production-ready SQLite experience out-of-the-box. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those changes: &lt;a href="https://github.com/rails/rails/pull/50371"&gt;Ensure SQLite transaction default to IMMEDIATE mode&lt;/a&gt; to avoid "database is locked" errors when a deferred transaction attempts to upgrade itself with a write lock (discussed here &lt;a href="https://simonwillison.net/2024/Mar/31/optimizing-sqlite-for-servers/"&gt;previously&lt;/a&gt;, and added to Datasette 1.0a14 &lt;a href="https://simonwillison.net/2024/Aug/5/datasette-1a14/#sqlite-isolation-level-immediate-"&gt;in August&lt;/a&gt;) and &lt;a href="https://github.com/rails/rails/pull/51958"&gt;SQLite non-GVL-blocking, fair retry interval busy handler&lt;/a&gt; - a lower-level change that ensures SQLite's busy handler doesn't hold Ruby's Global VM Lock (the Ruby version of Python's GIL) while a thread is waiting on a SQLite lock.&lt;/p&gt;
&lt;p&gt;The rest of the talk makes a passionate and convincing case for SQLite as an option for production deployments, in line with the Rails goal of being a &lt;a href="https://world.hey.com/dhh/the-one-person-framework-711e6318"&gt;One Person Framework&lt;/a&gt; - "a toolkit so powerful that it allows a single individual to create modern applications upon which they might build a competitive business".&lt;/p&gt;
&lt;p&gt;&lt;img alt="Animated slide. The text Single-machine SQLite-only deployments can't serve production workloads is stamped with a big red Myth stamp" src="https://static.simonwillison.net/static/2024/sqlite-myth-smaller.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Back in April Stephen published &lt;a href="https://fractaledmind.github.io/2024/04/15/sqlite-on-rails-the-how-and-why-of-optimal-performance/"&gt;SQLite on Rails: The how and why of optimal performance&lt;/a&gt; describing some of these challenges in more detail (including the best explanation I've seen anywhere of &lt;code&gt;BEGIN IMMEDIATE TRANSACTION&lt;/code&gt;) and promising:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unfortunately, running SQLite on Rails out-of-the-box isn’t viable today. But, with a bit of tweaking and fine-tuning, you can ship a very performant, resilient Rails application with SQLite. And my personal goal for Rails 8 is to make the out-of-the-box experience fully production-ready.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It looks like he achieved that goal!

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=41858018"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gil"&gt;gil&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scaling"&gt;scaling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite-busy"&gt;sqlite-busy&lt;/a&gt;&lt;/p&gt;



</summary><category term="gil"/><category term="rails"/><category term="ruby"/><category term="scaling"/><category term="sqlite"/><category term="sqlite-busy"/></entry><entry><title>What's New in Ruby on Rails 8</title><link href="https://simonwillison.net/2024/Oct/7/whats-new-in-ruby-on-rails-8/#atom-tag" rel="alternate"/><published>2024-10-07T19:17:47+00:00</published><updated>2024-10-07T19:17:47+00:00</updated><id>https://simonwillison.net/2024/Oct/7/whats-new-in-ruby-on-rails-8/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.appsignal.com/2024/10/07/whats-new-in-ruby-on-rails-8.html"&gt;What&amp;#x27;s New in Ruby on Rails 8&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rails 8 takes SQLite from a lightweight development tool to a reliable choice for production use, thanks to extensive work on the SQLite adapter and Ruby driver.&lt;/p&gt;
&lt;p&gt;With the introduction of the solid adapters discussed above, SQLite now has the capability to power Action Cable, Rails.cache, and Active Job effectively, expanding its role beyond just prototyping or testing environments. [...]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transactions default to &lt;code&gt;IMMEDIATE&lt;/code&gt; mode to improve concurrency.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Also included in Rails 8: &lt;a href="https://kamal-deploy.org/"&gt;Kamal&lt;/a&gt;, a new automated deployment system by 37signals for self-hosting web applications on hardware or virtual servers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Kamal basically is Capistrano for Containers, without the need to carefully prepare servers in advance. No need to ensure that the servers have just the right version of Ruby or other dependencies you need. That all lives in the Docker image now. You can boot a brand new Ubuntu (or whatever) server, add it to the list of servers in Kamal, and it’ll be auto-provisioned with Docker, and run right away.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;More from the &lt;a href="https://rubyonrails.org/2024/9/27/rails-8-beta1-no-paas-required"&gt;official blog post about the release&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At 37signals, we're building a growing suite of apps that use SQLite in production with &lt;a href="https://once.com/"&gt;ONCE&lt;/a&gt;. There are now thousands of installations of both &lt;a href="https://once.com/campfire"&gt;Campfire&lt;/a&gt; and &lt;a href="https://once.com/writebook"&gt;Writebook&lt;/a&gt; running in the wild that all run SQLite. This has meant a lot of real-world pressure on ensuring that Rails (and Ruby) is working that wonderful file-based database as well as it can be. Through proper defaults like WAL and IMMEDIATE mode. Special thanks to Stephen Margheim for &lt;a href="https://github.com/rails/rails/pulls?q=is%3Apr+author%3Afractaledmind"&gt;a slew of such improvements&lt;/a&gt; and Mike Dalessio for &lt;a href="https://github.com/sparklemotion/SQLite3-ruby/pull/558"&gt;solving a last-minute SQLite file corruption issue&lt;/a&gt; in the Ruby driver.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=41766515"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/37-signals"&gt;37-signals&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/docker"&gt;docker&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite-busy"&gt;sqlite-busy&lt;/a&gt;&lt;/p&gt;



</summary><category term="37-signals"/><category term="rails"/><category term="ruby"/><category term="sqlite"/><category term="docker"/><category term="sqlite-busy"/></entry><entry><title>Running GitHub on Rails 6.0</title><link href="https://simonwillison.net/2021/Aug/6/running-github-on-rails-60/#atom-tag" rel="alternate"/><published>2021-08-06T16:30:59+00:00</published><updated>2021-08-06T16:30:59+00:00</updated><id>https://simonwillison.net/2021/Aug/6/running-github-on-rails-60/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.blog/2019-09-09-running-github-on-rails-6-0/"&gt;Running GitHub on Rails 6.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Back in 2019 Eileen M. Uchitelle explained how GitHub upgraded everything in production to Rails 6.0 within 1.5 weeks of the stable release. There’s a trick in here I really like: they have an automated weekly job which fetches the latest Rails main branch and runs the full GitHub test suite against it, giving them super-early warnings about anything that might break and letting them provide feedback to upstream about unintended regressions.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/continuous-integration"&gt;continuous-integration&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;&lt;/p&gt;



</summary><category term="continuous-integration"/><category term="github"/><category term="rails"/></entry><entry><title>Is there a substantial difference between using a Mac or a Windows machine for web development (particularly RoR)?</title><link href="https://simonwillison.net/2013/Dec/4/is-there-a-substantial/#atom-tag" rel="alternate"/><published>2013-12-04T09:54:00+00:00</published><updated>2013-12-04T09:54:00+00:00</updated><id>https://simonwillison.net/2013/Dec/4/is-there-a-substantial/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Is-there-a-substantial-difference-between-using-a-Mac-or-a-Windows-machine-for-web-development-particularly-RoR/answer/Simon-Willison"&gt;Is there a substantial difference between using a Mac or a Windows machine for web development (particularly RoR)?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No matter if you are on Mac or Windows you should be using a Linux virtual machine for development, ideally running the same operating system as you deployment environment (I like Ubuntu for this). Vagrant is a popular tool for managing this kind of setup.&lt;/p&gt;

&lt;p&gt;That said, for web development you should be on a Mac, with Windows running in a virtual machine. You need the Mac in order to test in desktop Safari and use the iOS simulator to test in Mobile Safari on iPhone and iPad.&lt;/p&gt;

&lt;p&gt;I don't think it is possible to run OS X in a VM on Windows without using cracked versions of the installation disks, and you have no guarantees that technique you use will continue working for later OS versions.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="programming"/><category term="rails"/><category term="web-development"/><category term="quora"/></entry><entry><title>How can one become a masterful Rails developer (and still have a life)?</title><link href="https://simonwillison.net/2013/Oct/22/how-can-one-become/#atom-tag" rel="alternate"/><published>2013-10-22T09:20:00+00:00</published><updated>2013-10-22T09:20:00+00:00</updated><id>https://simonwillison.net/2013/Oct/22/how-can-one-become/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/How-can-one-become-a-masterful-Rails-developer-and-still-have-a-life/answer/Simon-Willison"&gt;How can one become a masterful Rails developer (and still have a life)?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Don't sacrifice your social life. Sacrifice TV.&lt;/p&gt;

&lt;p&gt;Most people manage to maintain an active social life while also watching multiple hours of TV every day. Imagine how much Rails you could learn if you dedicated a couple of hours to it every day for 6 months.&lt;/p&gt;

&lt;p&gt;Also, build real projects. Reading tutorials doesn't count if you're not also writing code.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="programming"/><category term="rails"/><category term="ruby"/><category term="web-development"/><category term="quora"/></entry><entry><title>What is the best framework to use, Yii or Ruby on Rails?</title><link href="https://simonwillison.net/2013/Oct/17/what-is-the-best/#atom-tag" rel="alternate"/><published>2013-10-17T18:38:00+00:00</published><updated>2013-10-17T18:38:00+00:00</updated><id>https://simonwillison.net/2013/Oct/17/what-is-the-best/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-is-the-best-framework-to-use-Yii-or-Ruby-on-Rails?no_redirect=1"&gt;What is the best framework to use, Yii or Ruby on Rails?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a big decision, and it's worth taking the time to pick what's the best fit for you. I recommend going through the tutorials for each one, building the basic application they describe and seeing which made the most sense to you. As a Django developer, I suggest trying that framework too :)&lt;/p&gt;

&lt;p&gt;If you just want a recommendation on Rails vs Yii, I would go for Rails. Ruby is a less frustrating language to develop in than PHP and has a higher quality collection of other open source libraries you can use in your project. Rails is also a more mature and more widely used framework.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/startups"&gt;startups&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="php"/><category term="programming"/><category term="rails"/><category term="startups"/><category term="web-development"/><category term="quora"/></entry><entry><title>Is it worth it for an aspiring web developer in NYC to attend the San Francisco Startup Jobs Fair in November? What I mean is what are my chances that a company would be interested in me, allowing that my code skills are up to snuff, if I don't live ...</title><link href="https://simonwillison.net/2013/Oct/13/is-it-worth-it/#atom-tag" rel="alternate"/><published>2013-10-13T10:51:00+00:00</published><updated>2013-10-13T10:51:00+00:00</updated><id>https://simonwillison.net/2013/Oct/13/is-it-worth-it/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Is-it-worth-it-for-an-aspiring-web-developer-in-NYC-to-attend-the-San-Francisco-Startup-Jobs-Fair-in-November-What-I-mean-is-what-are-my-chances-that-a-company-would-be-interested-in-me-allowing-that-my-code-skills-are-up-to-snuff-if-I-dont-live-out-in-SF-yet/answer/Simon-Willison"&gt;Is it worth it for an aspiring web developer in NYC to attend the San Francisco Startup Jobs Fair in November? What I mean is what are my chances that a company would be interested in me, allowing that my code skills are up to snuff, if I don&amp;#39;t live out in SF yet?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Not being in SF already is no problem at all - demand for talented developers is crazy high, so provided you are a great developer the fact you would need to relocate won't be a barrier.&lt;/p&gt;

&lt;p&gt;If you do travel to SF for the job fair, make sure you get as much out of the trip as possible - try to line up some in-person interviews with companies that look interesting to you in the days before and after the event itself.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/san-francisco"&gt;san-francisco&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nyc"&gt;nyc&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="rails"/><category term="san-francisco"/><category term="web-development"/><category term="quora"/><category term="nyc"/></entry><entry><title>What web programming framework best supports 'drag and drop' actions?  Please give examples of sites and/or plug-ins that support the interaction.</title><link href="https://simonwillison.net/2012/Feb/19/what-web-programming-framework/#atom-tag" rel="alternate"/><published>2012-02-19T17:56:00+00:00</published><updated>2012-02-19T17:56:00+00:00</updated><id>https://simonwillison.net/2012/Feb/19/what-web-programming-framework/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-web-programming-framework-best-supports-drag-and-drop-actions-Please-give-examples-of-sites-and-or-plug-ins-that-support-the-interaction/answer/Simon-Willison"&gt;What web programming framework best supports &amp;#39;drag and drop&amp;#39; actions?  Please give examples of sites and/or plug-ins that support the interaction.&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Drag and drop is a client-side thing - it has nothing to do with the server-side technology being used.&lt;/p&gt;

&lt;p&gt;Take a look at the drag and drop implementation provided by the big open source JavaScript libraries - Dojo, YUI, jQuery UI all have solid implementations.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/coffeescript"&gt;coffeescript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming-languages"&gt;programming-languages&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="coffeescript"/><category term="django"/><category term="programming-languages"/><category term="python"/><category term="rails"/><category term="quora"/></entry><entry><title>Why did Twitter have so many problems if it is made with Ruby?</title><link href="https://simonwillison.net/2012/Feb/19/why-did-twitter-have/#atom-tag" rel="alternate"/><published>2012-02-19T14:21:00+00:00</published><updated>2012-02-19T14:21:00+00:00</updated><id>https://simonwillison.net/2012/Feb/19/why-did-twitter-have/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Why-did-Twitter-have-so-many-problems-if-it-is-made-with-Ruby/answer/Simon-Willison"&gt;Why did Twitter have so many problems if it is made with Ruby?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The technical problem Twitter solves (distributing millions of short messages per minute to an enormous graph of follow relationships) is extremely hard in any language.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="rails"/><category term="ruby"/><category term="twitter"/><category term="quora"/></entry><entry><title>How long until Ruby developers are as cheap as PHP developers? is it already happening? should I still learn it or it only has a couple years left and I'm better off with SSJS?</title><link href="https://simonwillison.net/2012/Feb/4/how-long-until-ruby/#atom-tag" rel="alternate"/><published>2012-02-04T13:02:00+00:00</published><updated>2012-02-04T13:02:00+00:00</updated><id>https://simonwillison.net/2012/Feb/4/how-long-until-ruby/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/How-long-until-Ruby-developers-are-as-cheap-as-PHP-developers-is-it-already-happening-should-I-still-learn-it-or-it-only-has-a-couple-years-left-and-Im-better-off-with-SSJS/answer/Simon-Willison"&gt;How long until Ruby developers are as cheap as PHP developers? is it already happening? should I still learn it or it only has a couple years left and I&amp;#39;m better off with SSJS?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you want to be a highly paid engineer, you should worry less about your expertise in a specific language and more about developing broad and deep skills across a wider range of development topics.&lt;/p&gt;

&lt;p&gt;- Have you used Redis, MongoDB, Riak and/or Cassandra?&lt;br /&gt;- Can you set up and make use of a Continuous Integration server like Jenkins?&lt;br /&gt;- Do you understand TDD, BDD and other testing techniques?&lt;br /&gt;- How's your HTTP? Do you understand REST, caching headers, URL design, content negotiation, SPDY, WebSockets?&lt;br /&gt;- Are you familiar with message queues, pubsub, zeromq?&lt;br /&gt;- Do you understand basic web app security? XSS, CSRF, clickjacking, OWASP, escape-by-default templating?&lt;br /&gt;- Do you know what's involved in client-side web performance optimisation (Steve Souders' High Performance Web Sites stuff)?&lt;/p&gt;

&lt;p&gt;All of the above are, in my opinion, important skills for a senior web engineer. None of them are any different if you are using PHP, Ruby, Python or something else.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/careers"&gt;careers&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="javascript"/><category term="rails"/><category term="ruby"/><category term="web-development"/><category term="quora"/><category term="careers"/></entry><entry><title>Play Framework, Django or Rails? Which one do you recommend for  Social Networking Web applications.</title><link href="https://simonwillison.net/2012/Jan/14/play-framework-django-or/#atom-tag" rel="alternate"/><published>2012-01-14T09:22:00+00:00</published><updated>2012-01-14T09:22:00+00:00</updated><id>https://simonwillison.net/2012/Jan/14/play-framework-django-or/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Play-Framework-Django-or-Rails-Which-one-do-you-recommend-for-Social-Networking-Web-applications/answer/Simon-Willison"&gt;Play Framework, Django or Rails? Which one do you recommend for  Social Networking Web applications.&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Both Rails and Django have been used for a large number of high profile social networking web applications. Off the top of my head, Django is used by Instagram and Pinterest, Rails is used by Posterous and Ravelry. I don't know what the largest sites built using Play are at the moment.&lt;/p&gt;

&lt;p&gt;The hard problems involved in building a social network are essentially framework-agnostic: things like scaling an activity feed and running queries against large social graphs are solved by smart application architecture, not built-in framework functionality. Whether you use Rails, Django or Play will have almost no effect on how you solve those larger architectural challenges.&lt;/p&gt;

&lt;p&gt;Pick the one you are most comfortable working with and start worrying about your site's functionality rather than its application framework.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/frameworks"&gt;frameworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/play"&gt;play&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/social-networks"&gt;social-networks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webapps"&gt;webapps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="django"/><category term="frameworks"/><category term="play"/><category term="rails"/><category term="social-networks"/><category term="webapps"/><category term="quora"/></entry><entry><title>Is there a framework that allows me to collect input from individual users, and then charge for the aggregate and analysis of that data?</title><link href="https://simonwillison.net/2012/Jan/2/is-there-a-framework/#atom-tag" rel="alternate"/><published>2012-01-02T14:04:00+00:00</published><updated>2012-01-02T14:04:00+00:00</updated><id>https://simonwillison.net/2012/Jan/2/is-there-a-framework/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Is-there-a-framework-that-allows-me-to-collect-input-from-individual-users-and-then-charge-for-the-aggregate-and-analysis-of-that-data/answer/Simon-Willison"&gt;Is there a framework that allows me to collect input from individual users, and then charge for the aggregate and analysis of that data?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No - your needs are extremely specific. You're going to have to build this yourself.&lt;/p&gt;

&lt;p&gt;(Even if there was an open source framework that covered the kind if thing you are talking about, my hunch is that by the time you had finished customising it to your exact needs you would have invested a similar amount of effort as you would building it from scratch)&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/frameworks"&gt;frameworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="frameworks"/><category term="php"/><category term="python"/><category term="rails"/><category term="quora"/></entry><entry><title>Can someone improve their knowledge of programming in Ruby or PHP by using a framework like Rails or Zend, or does the framework just do a lot of the work for you without giving you an opportunity to learn from it?</title><link href="https://simonwillison.net/2011/Dec/4/can-someone-improve-their/#atom-tag" rel="alternate"/><published>2011-12-04T13:04:00+00:00</published><updated>2011-12-04T13:04:00+00:00</updated><id>https://simonwillison.net/2011/Dec/4/can-someone-improve-their/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Can-someone-improve-their-knowledge-of-programming-in-Ruby-or-PHP-by-using-a-framework-like-Rails-or-Zend-or-does-the-framework-just-do-a-lot-of-the-work-for-you-without-giving-you-an-opportunity-to-learn-from-it/answer/Simon-Willison"&gt;Can someone improve their knowledge of programming in Ruby or PHP by using a framework like Rails or Zend, or does the framework just do a lot of the work for you without giving you an opportunity to learn from it?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the source, luke.&lt;/p&gt;

&lt;p&gt;(By which I mean, the most effective way to become a better programmer is to read good code written by other programmers. You can learn a great deal from reading Rails/Zend/Django)&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="php"/><category term="programming"/><category term="rails"/><category term="web-development"/><category term="quora"/></entry><entry><title>CSRF: Flash + 307 redirect = Game Over</title><link href="https://simonwillison.net/2011/Feb/10/csrf/#atom-tag" rel="alternate"/><published>2011-02-10T22:07:00+00:00</published><updated>2011-02-10T22:07:00+00:00</updated><id>https://simonwillison.net/2011/Feb/10/csrf/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://lists.webappsec.org/pipermail/websecurity_lists.webappsec.org/2011-February/007533.html"&gt;CSRF: Flash + 307 redirect = Game Over&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Here’s the exploit that Django and Rails both just released fixes for. It’s actually a flaw in the Flash player. Flash isn’t meant to be able to make cross-domain HTTP requests with custom HTTP headers unless the crossdomain.xml file on the other domain allows them to, but it turns out a 307 redirect (like a 302, but allows POST data to be forwarded) confuses the Flash player in to not checking the crossdomain.xml on the host it is being redirect to.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/crossdomainxml"&gt;crossdomainxml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/flash"&gt;flash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;&lt;/p&gt;



</summary><category term="crossdomainxml"/><category term="csrf"/><category term="django"/><category term="flash"/><category term="rails"/><category term="security"/><category term="recovered"/></entry><entry><title>Is there an online calendar for all the Ruby / Rails conferences to be held in 2011?</title><link href="https://simonwillison.net/2011/Jan/16/is-there-an-online/#atom-tag" rel="alternate"/><published>2011-01-16T12:34:00+00:00</published><updated>2011-01-16T12:34:00+00:00</updated><id>https://simonwillison.net/2011/Jan/16/is-there-an-online/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Is-there-an-online-calendar-for-all-the-Ruby-Rails-conferences-to-be-held-in-2011/answer/Simon-Willison"&gt;Is there an online calendar for all the Ruby / Rails conferences to be held in 2011?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Have you tried both our Ruby and our Rails topic pages?&lt;/p&gt;

&lt;span&gt;&lt;a href="http://lanyrd.com/topics/ruby-on-rails/"&gt;http://lanyrd.com/topics/ruby-on...&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;a href="http://lanyrd.com/topics/ruby/"&gt;http://lanyrd.com/topics/ruby/&lt;/a&gt;&lt;/span&gt;

&lt;p&gt;We've got a pretty good collection now. Of course, if there's any that we're missing you can add them yourself, or just leave a comment on this question.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/conference"&gt;conference&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="rails"/><category term="ruby"/><category term="quora"/><category term="conference"/></entry><entry><title>How long would it take an average programmer to do a Ruby on Rails Reddit clone prototype?</title><link href="https://simonwillison.net/2010/Dec/16/how-long-would-it/#atom-tag" rel="alternate"/><published>2010-12-16T10:17:00+00:00</published><updated>2010-12-16T10:17:00+00:00</updated><id>https://simonwillison.net/2010/Dec/16/how-long-would-it/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/How-long-would-it-take-an-average-programmer-to-do-a-Ruby-on-Rails-Reddit-clone-prototype/answer/Simon-Willison"&gt;How long would it take an average programmer to do a Ruby on Rails Reddit clone prototype?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Just FYI, Reddit is an open source Python project: &lt;span&gt;&lt;a href="http://code.reddit.com/"&gt;http://code.reddit.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/prototyping"&gt;prototyping&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="prototyping"/><category term="rails"/><category term="web-development"/><category term="quora"/></entry><entry><title>What are the tradeoffs (e.g. development speed, performance, scalability) between using various php frameworks, ruby/rails, or python/django?  Is there any reason to choose one overwhelmingly over another?</title><link href="https://simonwillison.net/2010/Nov/27/what-are-the-tradeoffs/#atom-tag" rel="alternate"/><published>2010-11-27T18:18:00+00:00</published><updated>2010-11-27T18:18:00+00:00</updated><id>https://simonwillison.net/2010/Nov/27/what-are-the-tradeoffs/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-are-the-tradeoffs-e-g-development-speed-performance-scalability-between-using-various-php-frameworks-ruby-rails-or-python-django-Is-there-any-reason-to-choose-one-overwhelmingly-over-another/answer/Simon-Willison"&gt;What are the tradeoffs (e.g. development speed, performance, scalability) between using various php frameworks, ruby/rails, or python/django?  Is there any reason to choose one overwhelmingly over another?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At this point, I'd argue that the decision between them comes down to programming language rather than framework - the frameworks have mostly converged on a very similar set of features.&lt;/p&gt;

&lt;p&gt;All three solutions scale in exactly the same way (shared nothing architecture).&lt;/p&gt;

&lt;p&gt;If you're writing something for people to deploy on their own hosting plans, PHP is far more widely supported. For a service that you host yourself, you need to decide which language ecosystem is the best fit for how you like to develop.&lt;/p&gt;

&lt;p&gt;Update 14 months later: I'd argue today that thanks to hosting platforms such as &lt;span&gt;&lt;a href="http://ep.io"&gt;ep.io&lt;/a&gt;&lt;/span&gt;, Heroku and dotCloud PHP's hosting advantage isn't nearly as pronounced.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/frameworks"&gt;frameworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="django"/><category term="frameworks"/><category term="php"/><category term="python"/><category term="rails"/><category term="web-development"/><category term="quora"/></entry><entry><title>Why is Diaspora built on Ruby on Rails instead of Node.js?</title><link href="https://simonwillison.net/2010/Nov/27/why-is-diaspora-built/#atom-tag" rel="alternate"/><published>2010-11-27T10:29:00+00:00</published><updated>2010-11-27T10:29:00+00:00</updated><id>https://simonwillison.net/2010/Nov/27/why-is-diaspora-built/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Why-is-Diaspora-built-on-Ruby-on-Rails-instead-of-Node-js/answer/Simon-Willison"&gt;Why is Diaspora built on Ruby on Rails instead of Node.js?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because Node.js had almost no visibility at all six months ago when Diaspora started. Also, Node.js has only very recently stopped breaking API backwards compatibility on a regular basis. Plus the Ruby library ecosystem is much, much larger than the Node.js ecosystem.&lt;/p&gt;

&lt;p&gt;I love Node.js, but it's still quite an immature technology for full stack web development.&lt;/p&gt;

&lt;p&gt;(I'm not involved in the Diaspora project)&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/nodejs"&gt;nodejs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="nodejs"/><category term="rails"/><category term="quora"/></entry><entry><title>Why is Java perceived as not cool for startups? We seem to be getting a lot of feedback lately that a startup should be using Ruby on Rails, PHP, Python, etc., if they want to be agile and iterate quickly.</title><link href="https://simonwillison.net/2010/Nov/14/why-is-java-perceived/#atom-tag" rel="alternate"/><published>2010-11-14T12:21:00+00:00</published><updated>2010-11-14T12:21:00+00:00</updated><id>https://simonwillison.net/2010/Nov/14/why-is-java-perceived/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Why-is-Java-perceived-as-not-cool-for-startups-We-seem-to-be-getting-a-lot-of-feedback-lately-that-a-startup-should-be-using-Ruby-on-Rails-PHP-Python-etc-if-they-want-to-be-agile-and-iterate-quickly/answer/Simon-Willison"&gt;Why is Java perceived as not cool for startups? We seem to be getting a lot of feedback lately that a startup should be using Ruby on Rails, PHP, Python, etc., if they want to be agile and iterate quickly.&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I believe what takes the longest time in software engineering is not actually writing the code, but untangling it to find bugs, and Java is much more conducive to that, and the tooling is much stronger than for other languages.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;You should re-evaluate your beliefs. Dynamic language programmers spend a great deal of time thinking about code quality and maintainability. &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; (and &lt;a href="http://en.wikipedia.org/wiki/Behavior-driven_development"&gt;BDD&lt;/a&gt;), which I believe was first popularised within the Ruby community) are extremely widespread, and profiling and debugging tools are widely used and constantly improved. A strong test suite provides far more effective protection against bugs than static typing and an IDE.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/java"&gt;java&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming-languages"&gt;programming-languages&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/startups"&gt;startups&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/static-typing"&gt;static-typing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/careers"&gt;careers&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="java"/><category term="programming"/><category term="programming-languages"/><category term="rails"/><category term="startups"/><category term="static-typing"/><category term="quora"/><category term="careers"/></entry><entry><title>Hookbox</title><link href="https://simonwillison.net/2010/Jul/29/hookbox/#atom-tag" rel="alternate"/><published>2010-07-29T09:48:00+00:00</published><updated>2010-07-29T09:48:00+00:00</updated><id>https://simonwillison.net/2010/Jul/29/hookbox/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://hookbox.org/"&gt;Hookbox&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
For most web projects, I believe implementing any real-time comet features on a separate stack from the rest of the application makes sense—keep using Rails, Django or PHP for the bulk of the application logic, and offload any WebSocket or Comet requests to a separate stack built on top of something like Node.js, Twisted, EventMachine or Jetty. Hookbox is the best example of that philosophy I’ve yet seen—it’s a Comet server that makes WebHook requests back to your regular application stack to check if a user has permission to publish or subscribe to a given channel. “The key insight is that all application development with hookbox happens either in JavaScript or in the native language of the web application itself”.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://cometdaily.com/2010/07/26/a-fast-introduction-to-hookbox/"&gt;Comet Daily&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/michael-carter"&gt;michael-carter&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webhooks"&gt;webhooks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hookbox"&gt;hookbox&lt;/a&gt;&lt;/p&gt;



</summary><category term="comet"/><category term="django"/><category term="javascript"/><category term="michael-carter"/><category term="php"/><category term="rails"/><category term="webhooks"/><category term="recovered"/><category term="hookbox"/></entry><entry><title>Node.js, redis, and resque</title><link href="https://simonwillison.net/2010/Feb/28/paul/#atom-tag" rel="alternate"/><published>2010-02-28T23:02:23+00:00</published><updated>2010-02-28T23:02:23+00:00</updated><id>https://simonwillison.net/2010/Feb/28/paul/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.pgrs.net/2010/2/28/node-js-redis-and-resque"&gt;Node.js, redis, and resque&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Paul Gross has been experimenting with Node.js proxies for allowing web applications to be upgraded without missing any requests. Here he places all incoming HTTP requests in a redis queue, then has his backend Rails servers consume requests from the queue and push the responses back on to a queue for Node to deliver. When the backend application is upgraded, requests remain in the queue and users see a few seconds of delay before their request is handled. It’s not production ready yet (POST requests aren’t handled, for example) but it’s a very interesting approach.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://news.ycombinator.com/item?id=1157280"&gt;Hacker News | Node.js, redis, and resque&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/highavailability"&gt;highavailability&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nodejs"&gt;nodejs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/redis"&gt;redis&lt;/a&gt;&lt;/p&gt;



</summary><category term="highavailability"/><category term="http"/><category term="javascript"/><category term="nodejs"/><category term="rails"/><category term="redis"/></entry><entry><title>Play framework for Java</title><link href="https://simonwillison.net/2009/Oct/25/play/#atom-tag" rel="alternate"/><published>2009-10-25T23:21:36+00:00</published><updated>2009-10-25T23:21:36+00:00</updated><id>https://simonwillison.net/2009/Oct/25/play/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.playframework.org/"&gt;Play framework for Java&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I’m genuinely impressed by this—it’s a full stack web framework for Java that actually does feel a lot like Django or Rails. Best feature: code changes are automatically detected and reloaded by the development web server, giving you the same save-and-refresh workflow you get in Django (no need to compile and redeploy to try out your latest changes).


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/frameworks"&gt;frameworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/java"&gt;java&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/play"&gt;play&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web"&gt;web&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="frameworks"/><category term="java"/><category term="play"/><category term="rails"/><category term="web"/></entry><entry><title>How We Made GitHub Fast</title><link href="https://simonwillison.net/2009/Oct/21/github/#atom-tag" rel="alternate"/><published>2009-10-21T21:14:38+00:00</published><updated>2009-10-21T21:14:38+00:00</updated><id>https://simonwillison.net/2009/Oct/21/github/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://github.com/blog/530-how-we-made-github-fast"&gt;How We Made GitHub Fast&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Detailed overview of the new GitHub architecture. It’s a lot more complicated than I would have expected—lots of moving parts are involved in ensuring they can scale horizontally when they need to. Interesting components include nginx, Unicorn, Rails, DRBD, HAProxy, Redis, Erlang, memcached, SSH, git and a bunch of interesting new open source projects produced by the GitHub team such as BERT/Ernie and ProxyMachine.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/drbd"&gt;drbd&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/erlang"&gt;erlang&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ernie"&gt;ernie&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/git"&gt;git&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/haproxy"&gt;haproxy&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/memcached"&gt;memcached&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nginx"&gt;nginx&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/proxymachine"&gt;proxymachine&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/redis"&gt;redis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/replication"&gt;replication&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scaling"&gt;scaling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ssh"&gt;ssh&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/unicorn"&gt;unicorn&lt;/a&gt;&lt;/p&gt;



</summary><category term="drbd"/><category term="erlang"/><category term="ernie"/><category term="git"/><category term="github"/><category term="haproxy"/><category term="memcached"/><category term="nginx"/><category term="proxymachine"/><category term="rails"/><category term="redis"/><category term="replication"/><category term="ruby"/><category term="scaling"/><category term="ssh"/><category term="unicorn"/></entry><entry><title>nginx_http_push_module</title><link href="https://simonwillison.net/2009/Oct/17/push/#atom-tag" rel="alternate"/><published>2009-10-17T16:48:31+00:00</published><updated>2009-10-17T16:48:31+00:00</updated><id>https://simonwillison.net/2009/Oct/17/push/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://github.com/slact/nginx_http_push_module"&gt;nginx_http_push_module&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
More clever design with webhooks—here’s an nginx module that provides a comet endpoint URL which will hang until a back end process POSTs to another URL on the same server. This makes it much easier to build asynchronous comet apps using regular synchronous web frameworks such as Django, PHP and Rails.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nginx"&gt;nginx&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webhooks"&gt;webhooks&lt;/a&gt;&lt;/p&gt;



</summary><category term="comet"/><category term="django"/><category term="nginx"/><category term="php"/><category term="rails"/><category term="webhooks"/></entry><entry><title>XSS Protection by Default in Rails 3.0</title><link href="https://simonwillison.net/2009/Oct/8/xss/#atom-tag" rel="alternate"/><published>2009-10-08T16:35:52+00:00</published><updated>2009-10-08T16:35:52+00:00</updated><id>https://simonwillison.net/2009/Oct/8/xss/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://intertwingly.net/blog/2009/10/08/XSS-Protection-by-Default-in-Rails-3-0"&gt;XSS Protection by Default in Rails 3.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Fantastic news—congratulations, Rails core team.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xss"&gt;xss&lt;/a&gt;&lt;/p&gt;



</summary><category term="rails"/><category term="ruby"/><category term="security"/><category term="xss"/></entry><entry><title>Ravelry</title><link href="https://simonwillison.net/2009/Sep/3/ravelry/#atom-tag" rel="alternate"/><published>2009-09-03T18:50:20+00:00</published><updated>2009-09-03T18:50:20+00:00</updated><id>https://simonwillison.net/2009/Sep/3/ravelry/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.tbray.org/ongoing/When/200x/2009/09/02/Ravelry"&gt;Ravelry&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Tim Bray interviews Casey Forbes, the single engineer behind Ravelry, the knitting community that serves 10 million Rails requests a day using just seven physical servers, MySQL, Sphinx, memcached, nginx, haproxy, passenger and Tokyo Cabinet.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/caseyforbes"&gt;caseyforbes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/haproxy"&gt;haproxy&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/memcached"&gt;memcached&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mysql"&gt;mysql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nginx"&gt;nginx&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/passenger"&gt;passenger&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ravelry"&gt;ravelry&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scaling"&gt;scaling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sphinx-search"&gt;sphinx-search&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tim-bray"&gt;tim-bray&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tokyocabinet"&gt;tokyocabinet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tokyotyrant"&gt;tokyotyrant&lt;/a&gt;&lt;/p&gt;



</summary><category term="caseyforbes"/><category term="haproxy"/><category term="memcached"/><category term="mysql"/><category term="nginx"/><category term="passenger"/><category term="rails"/><category term="ravelry"/><category term="scaling"/><category term="sphinx-search"/><category term="tim-bray"/><category term="tokyocabinet"/><category term="tokyotyrant"/></entry><entry><title>cache-money</title><link href="https://simonwillison.net/2009/Jun/28/cachemoney/#atom-tag" rel="alternate"/><published>2009-06-28T15:17:30+00:00</published><updated>2009-06-28T15:17:30+00:00</updated><id>https://simonwillison.net/2009/Jun/28/cachemoney/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://github.com/nkallen/cache-money/tree/master"&gt;cache-money&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A “write-through caching library for ActiveRecord”, maintained by Nick Kallen from Twitter. Queries hit memcached first, and caches are automatically kept up-to-date when objects are created, updated and deleted. Only some queries are supported—joins and comparisons won’t hit the cache, for example.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/activerecord"&gt;activerecord&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cachemoney"&gt;cachemoney&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/caching"&gt;caching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/memcached"&gt;memcached&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;&lt;/p&gt;



</summary><category term="activerecord"/><category term="cachemoney"/><category term="caching"/><category term="memcached"/><category term="rails"/><category term="twitter"/></entry><entry><title>whine flu, railsmalefail 2009</title><link href="https://simonwillison.net/2009/Apr/29/danny/#atom-tag" rel="alternate"/><published>2009-04-29T11:39:38+00:00</published><updated>2009-04-29T11:39:38+00:00</updated><id>https://simonwillison.net/2009/Apr/29/danny/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.oblomovka.com/wp/2009/04/28/how-to-be-edgy/"&gt;whine flu, railsmalefail 2009&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Danny quotes the smartest take on the CouchDB/pr0n controversy: “It’s about presenting women as ’the other,’ not ’us.’ It would have been just as offensive if all the women shown were domineering mothers in aprons, shaking their fingers and threatening with rolling pins.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/danny-obrien"&gt;danny-obrien&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sexism"&gt;sexism&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="danny-obrien"/><category term="rails"/><category term="sexism"/></entry></feed>