<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Software development</title>
    <description>Dries Buytaert on Software development.</description>
    <link>https://dri.es/tag/software-development</link>
    <atom:link href="https://dri.es/tag/software-development/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Friction, abstraction and verification</title>
      <link>https://dri.es/friction-abstraction-and-verification</link>
      <guid>https://dri.es/friction-abstraction-and-verification</guid>
      <pubDate>Mon, 08 Jun 2026 03:13:27 -0400</pubDate>
      <description><![CDATA[<p>AI coding agents like Claude Code and OpenAI Codex tend to choose the path that is cheapest to complete. They work within a budget of tokens, context, time, tools, and permissions. Every step spends from that budget: reading documentation, installing software, running it, configuring it, changing it, and fixing errors.</p>
<p>For Open Source, this is a rare opportunity. AI agents could become its biggest adoption engine yet. While that should energize Open Source communities, it should also make proprietary vendors deeply uncomfortable.</p>
<p>Many proprietary software vendors have spent years optimizing for a human buyer journey: capture a lead, qualify the buyer, force a signup, offer a demo or trial experience, ask for a credit card, schedule a sales call.</p>
<p>Humans may grumble but keep going. To an AI coding agent, these are blockers, not buying steps.</p>
<p>Open Source starts from a different place. AI agents can read the source code, run it locally, and change it without asking anyone for permission. That does not guarantee adoption, but it removes the proprietary gates that slow agents down.</p>
<p>But being Open Source is not enough. Open Source removes the &quot;permission barriers&quot;, but it can still have &quot;execution barriers&quot;. If an Open Source project is hard to install, configure, extend, debug, or verify, an agent may choose an easier Open Source project instead.</p>
<p>In that sense, AI agents amplify an old truth about software adoption: the best software does not always win. The software with the easiest path to a working result often does.</p>
<p>But AI agents amplify that truth through &quot;silent rejection&quot;. A human evaluator might complain, ask for help, file an issue, or write an angry Reddit post. An AI agent just tries another path. You may never know your software was considered and rejected.</p>
<h2>Easy is more than low friction</h2>
<p>If you want your project to be adopted, you have to make the best path the easiest one to complete.</p>
<p>And &quot;easy&quot; means more than low friction. For an AI agent, there are at least three costs: friction, abstraction, and verification.</p>
<figure>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 685 155" role="img" aria-label="Three adoption costs: friction, abstraction, and verification" focusable="false" color="var(--primary-font-color, #222)" style="max-width:100%;height:auto;font-size:1rem">
  <desc>A compact diagram showing three adoption costs: friction, abstraction, and verification.</desc>
  <g font-family="inherit" text-anchor="middle" fill="currentColor">
  <g transform="translate(0 14)">
  <rect width="215" height="96" rx="14" fill="var(--hover-color, #f4f4f4)" />
  <text x="107.5" y="35" font-size="1.2em" font-weight="650">Friction</text>
  <path d="M77.5 50h60" stroke="var(--table-zebra-color, #ddd)" stroke-width="1" />
  <text x="107.5" y="75" font-size="0.88em">Can I get it running?</text>
  <text x="107.5" y="126" font-size="0.76em" fill="var(--secondary-font-color, #666)">Install • Setup • Access</text>
</g>
  <g transform="translate(235 14)">
  <rect width="215" height="96" rx="14" fill="var(--hover-color, #f4f4f4)" />
  <text x="107.5" y="35" font-size="1.2em" font-weight="650">Abstraction</text>
  <path d="M77.5 50h60" stroke="var(--table-zebra-color, #ddd)" stroke-width="1" />
  <text x="107.5" y="70" font-size="0.88em">Do I know what</text>
  <text x="107.5" y="88" font-size="0.88em">to do next?</text>
  <text x="107.5" y="126" font-size="0.76em" fill="var(--secondary-font-color, #666)">Recipes • Scaffolds • Defaults</text>
</g>
  <g transform="translate(470 14)">
  <rect width="215" height="96" rx="14" fill="var(--hover-color, #f4f4f4)" />
  <text x="107.5" y="35" font-size="1.2em" font-weight="650">Verification</text>
  <path d="M77.5 50h60" stroke="var(--table-zebra-color, #ddd)" stroke-width="1" />
  <text x="107.5" y="70" font-size="0.88em">Can I tell whether</text>
  <text x="107.5" y="88" font-size="0.88em">it worked?</text>
  <text x="107.5" y="126" font-size="0.76em" fill="var(--secondary-font-color, #666)">Tests • Errors • Visible state</text>
</g>
</g>
</svg>
</figure>
<p><em>Friction</em> is the cost of getting to a system the agent can run and change. Some friction comes from the environment: runtimes, containers, databases, package managers, local services, and setup choices that must be installed or configured before useful work can begin. Some comes from access and authorization: private repositories, account creation, credentials, and API keys.</p>
<p><em>Abstraction</em> is the cost of figuring out what to do next. Once the software is running, the agent still has to know which modules to use, how to structure the data, which settings to apply, which conventions to follow, and how the pieces should fit together. A good site template, recipe, or scaffold packages that expertise so the agent can take several correct steps at once instead of reconstructing the path from scratch.</p>
<p><em>Verification</em> is the cost of knowing whether the work succeeded. Tests, clear errors, inspectable state, and fast debugging cycles help the agent compare what happened with what should have happened. As I wrote in <a href="https://dri.es/ai-rewards-strict-apis">AI rewards strict APIs</a>, agents do not struggle with complexity; they struggle with ambiguity.</p>
<p>Each cost burns tokens, meaning the AI agent has to spend more of its limited context and reasoning budget reading documentation, comparing different options, or recovering from failed attempts.</p>
<h2>What helps agents helps people</h2>
<p>This is not just an AI problem. People have always preferred software that is easy to get running, gives them a clear path forward, and tells them when something worked. AI agents make the same preference more obvious because they have even less room for trial and error.</p>
<p>Developer Experience (DX) makes software easier for developers to evaluate, build with, and maintain. Agent Experience (AX) makes software easier for agents to install, modify, and verify.</p>
<p>In practice, the overlap is large. Better scaffolding, clearer errors, faster setup, opinionated best practices, and reliable tests help agents, but they also help developers, evaluators, and contributors.</p>
<h2>Open Source still has to compete</h2>
<p>The cheap-to-run advantage will not belong to Open Source forever. Proprietary vendors and SaaS companies are adding free tiers, programmatic access, and Model Context Protocol servers that give agents tools and context with less friction.</p>
<p>Open Source's structural advantage is about to expand, but it will concentrate in the projects that are easiest for agents to understand, run, and improve.</p>
<p>Every software project will have to earn its place in the agent flow. Being open will get you considered, but being easy to discover, install, inspect, modify, and verify will get you chosen.</p>
]]></description>
    </item>
    <item>
      <title>Software as clay on the wheel</title>
      <link>https://dri.es/software-as-clay-on-the-wheel</link>
      <guid>https://dri.es/software-as-clay-on-the-wheel</guid>
      <pubDate>Tue, 20 Jan 2026 14:39:26 -0500</pubDate>
      <description><![CDATA[<p>A few weeks ago, Simon Willison started a coding agent, went to decorate a Christmas tree with his family, watched a movie, and came back to a working HTML5 parser.</p>
<p>It sounds like a party trick.  But it worked because the results were easy to check. The unit tests either pass or they don't. The type checker either accepts the code or it doesn't. In that kind of environment, the work can keep moving without much supervision.</p>
<p>Geoffrey Huntley's <a href="https://ghuntley.com/loop/">Ralph Wiggum loop</a> is probably the cleanest expression of this idea I've seen, and it's becoming more popular quickly. In <a href="https://youtu.be/4Nna09dG_c0">his demonstration video</a>, he describes creating specifications through conversation with an AI agent, and letting the loop run. Each iteration starts fresh: the agent reads the specification, picks the most important remaining task, implements it, runs the tests. If they pass, it commits to Git and exits. The next iteration begins with empty context, reads the current state from disk, and picks up where the previous run left off.</p>
<p>If you think about it, that's what human prompting already looks like: prompt, wait, review, prompt again. You're shaping the code or text the way a potter shapes clay: push a little, spin the wheel, look, push again. The Ralph loop just automates the spinning, which makes much more ambitious tasks practical.</p>
<p>The key difference is how state is handled. When you work this way by hand, the whole conversation comes along for the ride. In the Ralph loop, each iteration starts clean.</p>
<p>Why? Because carrying everything with you all the time is a great way to stop getting anywhere. If you're going to work on a problem for hundreds of iterations, things start to pile up. As tokens accumulate, the signal can get lost in noise. By flushing context between iterations and storing state in files, each run can start clean.</p>
<p>Simon Willison's <a href="https://simonwillison.net/2025/Dec/15/porting-justhtml/">port of an HTML5 library from Python to JavaScript</a> showed the principle at larger scale. Using GPT-5.2 through Codex CLI with the <code>--yolo</code> flag for uninterrupted execution, he gave a handful of prompts and let it run while he decorated a Christmas tree with his family and watched a movie.</p>
<p>Four and a half hours later, the agent had produced a working HTML5 parser. It passed over 9,200 tests from the official <a href="https://github.com/html5lib/html5lib-tests">html5lib-tests suite</a>.</p>
<p>HTML5 parsing is notoriously complex, but the specification precisely defines how even malformed markup should be handled, with thousands of edge cases accumulated over years. The tests gave the AI agent constant grounding: each test run pulled it back to reality before errors could compound.</p>
<p>As Simon put it: &quot;If you can reduce a problem to a robust test suite you can set a coding agent loop loose on it with a high degree of confidence that it will eventually succeed&quot;. Ralph loops and Willison's approach differ in structure, but both depend on tests as the source of truth.</p>
<p><a href="https://cursor.com/blog/scaling-agents">Cursor's research on scaling agents</a> confirms this is starting to work at enterprise scale. Their team explored what happens when hundreds of agents work concurrently on a single codebase for weeks. In one experiment, they built a web browser from scratch. Over a million lines of code across a thousand files, generated in a week. And <a href="https://simonwillison.net/2026/Jan/19/scaling-long-running-autonomous-coding/">the browser worked</a>.</p>
<p>That doesn't mean it's secure, fast, or something you'd ship. It just means it met the criteria they gave it. If you decide to check for security or performance, it will work toward that as well. But the pattern is what matters: clear tests, constant verification, and agents that know when they're done.</p>
<p>From solo loops to hundreds of agents running in parallel, the same pattern keeps emerging. It feels like something fundamental is crystallizing: autonomous AI is starting to work well when you can accurately define success upfront.</p>
<p>Willison's success criteria were &quot;simple&quot;: all 9,200 tests needed to pass. That is a lot of tests, but the agent got there. Clear success criteria made autonomy possible.</p>
<p>As I argued in <a href="https://dri.es/ai-flattens-interfaces-and-deepens-foundations">AI flattens interfaces and deepens foundations</a>, this changes where humans add value:</p>
<blockquote>
<p>Humans are moving to where they set direction at the start and refine results at the end. AI handles everything in between.</p>
</blockquote>
<p>The title of this post comes from Geoffrey Huntley. He describes software as <a href="https://ghuntley.com/loop/">clay on the pottery wheel</a>, and once you've worked this way, it's hard to think about it any other way. As Huntley wrote: &quot;If something isn't right, you throw it back on the wheel and keep going&quot;. That is exactly how it felt when I built my first Ralph Wiggum loop. Throw it back, refine it, spin again until it's right.</p>
<p>Of course, the Ralph Wiggum loop has limits. It works well when verification is unambiguous. A unit test returns pass or fail. But not all problems come with clear tests. And writing tests can be a lot of work.</p>
<p>For example, I've been thinking about how such loops could work for Drupal, where non-technical users build pages. &quot;Make this page more on-brand&quot; isn't a test you can run.</p>
<p>Or maybe it is? An AI agent could evaluate a page against brand guidelines and return pass or fail. It could check reading level and even do some basic accessibility tests. The verifier doesn't have to be a traditional test suite. It just has to provide clear feedback.</p>
<p>All of this just exposes something we already intuitively understand: defining success is hard. Really hard. When people build pages manually, they often iterate until it &quot;feels right&quot;. They know what they want when they see it, but can't always articulate it upfront. Or they hire experts who carry that judgment from years of experience. This is the part of the work that is <a href="https://dri.es/ai-and-the-great-digital-agency-unbundling">hardest to automate</a>. The craft is moving upstream, from implementation to specification and validation.</p>
<p>The question for any task is becoming: <em>can you tell, reliably, whether the result is getting better or worse?</em> Where you can, the loop takes over. Where you can't, your judgment still matters.</p>
<p>The boundary keeps moving fast. A year ago, I was <a href="https://dri.es/comparing-local-llms-for-alt-text-generation">wrestling with local LLMs to generate good <code>alt</code>-text</a> for my photos. Today, AI agents build working HTML5 parsers while you watch a movie.  It's hard not to find that a little absurd. And hard not to be excited.</p>
]]></description>
    </item>
    <item>
      <title>Setting up a new computer with Homebrew</title>
      <link>https://dri.es/setting-up-a-new-computer-with-homebrew</link>
      <guid>https://dri.es/setting-up-a-new-computer-with-homebrew</guid>
      <pubDate>Mon, 26 Aug 2024 10:29:51 -0400</pubDate>
      <description><![CDATA[<p>Setting up a new computer can be a lot of work, but I've made it much simpler with <a href="https://brew.sh/">Homebrew</a>, a popular package manager.</p>
<h2>Creating a list of installed software</h2>
<p>As a general rule, I prefer to install all software on my Mac using <a href="https://brew.sh/">Homebrew</a>. I always try Homebrew first and only resort to downloading software directly from websites if it is not available through Homebrew.</p>
<p>Homebrew manages both <em>formulae</em> and <em>casks</em>. Casks are typically GUI applications, while formulae are command-line tools or libraries. To keep these two types of packages organized and avoid potential conflicts, I save them in separate lists.</p>
<p>First, I generate a list of all manually installed formulae on my old computer:</p>
<pre><code class="language-shell">$ brew leaves &gt; brews.txt
</code></pre>
<p>The <code>brew leaves</code> command displays only the formulae you installed directly using Homebrew. It excludes any formulae that were installed automatically as dependencies. To view all installed formulae, including dependencies, you can use the <code>brew list</code> command.</p>
<p>Next, I generate a separate list for installed casks:</p>
<pre><code class="language-shell">$ brew list --cask &gt; casks.txt
</code></pre>
<p>This keeps the formulae (<code>brews.txt</code>) and casks (<code>casks.txt</code>) in distinct files, avoiding any ambiguity.</p>
<h2>Reviewing your packages</h2>
<p>It is a good idea to check if you still need all packages on your new computer. I review my formulae and casks as follows:</p>
<p>For formulae:</p>
<pre><code class="language-shell">$ cat brews.txt | xargs brew desc --formula --eval-all
</code></pre>
<p>For casks:</p>
<pre><code class="language-shell">$ cat casks.txt | xargs brew desc --cask --eval-all
</code></pre>
<p>These commands provide a short description for each package in your lists.</p>
<h2>Installing your packages on a new machine</h2>
<p>Transfer your <code>brews.txt</code> and <code>casks.txt</code> files to the new computer, install Homebrew, and run:</p>
<p>To install formulae:</p>
<pre><code class="language-shell">$ xargs brew install --formula 
</code></pre>
<p>To install casks:</p>
<pre><code class="language-shell">$ xargs brew install --cask 
</code></pre>
]]></description>
    </item>
    <item>
      <title>Twenty years later and I am still at my desk learning CSS</title>
      <link>https://dri.es/twenty-years-later-and-i-am-still-at-my-desk-learning-css</link>
      <guid>https://dri.es/twenty-years-later-and-i-am-still-at-my-desk-learning-css</guid>
      <pubDate>Mon, 19 Feb 2018 16:24:29 -0500</pubDate>
      <description><![CDATA[<p>I was working on <a href="https://dri.es/my-posse-plan-for-evolving-my-site">my POSSE plan</a> when Vanessa called and asked if I wanted to meet for a coffee. Of course, I said yes. In the car ride over, I was thinking about how I made my first website over twenty years ago. HTML table layouts were still cool and it wasn't clear if CSS was going to be widely adopted. I decided to learn CSS anyway. More than twenty years later, the workflows, the automated toolchains, and the development methods have become increasingly powerful, but also a lot more complex. Today, <a href="https://frankchimero.com/writing/everything-easy-is-hard-again/">you simply npm your webpack via grunt with vue babel or bower to react asdfjkl;lkdhgxdlciuhw</a>. Everything is different now, except that I'm still at my desk learning CSS.</p>
]]></description>
    </item>
    <item>
      <title>Applaud the Drupal maintainers</title>
      <link>https://dri.es/applaud-the-drupal-maintainers</link>
      <guid>https://dri.es/applaud-the-drupal-maintainers</guid>
      <pubDate>Wed, 20 Apr 2016 05:38:16 -0400</pubDate>
      <description><![CDATA[<p>Today is another big day for Drupal as <a href="https://www.drupal.org/blog/drupal-8-1-0">we just released Drupal 8.1.0</a>. Drupal 8.1.0 is an important milestone as it is a departure from the Drupal 7 release schedule where we couldn't add significant new features until Drupal 8. Drupal 8.1.0 balances maintenance with innovation.</p>
<p>On my blog and in presentations, I often talk about the future of Drupal and where we need to innovate. I highlight important developments in the Drupal community, and push my own ideas to disrupt the status quo. People, myself included, like to talk about the shiny innovations, but it is crucial to understand that innovation is only a piece of how we grow Drupal's success. What can't be forgotten is the maintenance, the bug fixing, the work on Drupal.org and our test infrastructure, the documentation writing, the ongoing coordination and the processes that allow us to crank out stable releases.</p>
<p>We often recognize those who help Drupal innovate or introduce novel things, but today, I'd like us to praise those who maintain and improve what already exists and that was innovated years ago. So much of what makes Drupal successful is the &quot;daily upkeep&quot;. The seemingly mundane and unglamorous effort that goes into maintaining Drupal has a tremendous impact on the daily life of hundreds of thousands of Drupal developers, millions of Drupal content managers, and <a href="https://dri.es/reaching-the-next-billion-with-drupal">billions of people that visit Drupal sites</a>. Without that maintenance, there would be no stability, and without stability, no room for innovation.</p>
]]></description>
    </item>
    <item>
      <title>A better runtime for component-based web applications</title>
      <link>https://dri.es/a-better-runtime-for-component-based-web-applications</link>
      <guid>https://dri.es/a-better-runtime-for-component-based-web-applications</guid>
      <pubDate>Wed, 27 Aug 2014 15:53:44 -0400</pubDate>
      <description><![CDATA[<p>I have an idea but currently don't have the time or resources to work on it. So I'm sharing the idea here, hoping we can at least discuss it, and maybe someone will even feel inspired to take it on.</p>
<p>The idea is based on two predictions. First, I'm convinced that the future of web sites or web applications is component-based platforms (e.g. Drupal modules, WordPress plugins, etc). Second, I believe that the best way to deploy and use web sites or web applications is through a SaaS hosting environment (e.g. <a href="https://wordpress.com">WordPress.com</a>, <a href="http://drupalgardens.com">DrupalGardens</a>, <a href="http://force.com">SalesForce's Force.com platform</a>, <a href="http://demandware.com">DemandWare's SaaS platform</a>, etc). Specifically, I believe that in the big picture <a href="https://en.wikipedia.org/wiki/On-premises_software">on-premise software</a> is a &quot;transitional state&quot;. It may take another 15 years, but on-premise software will become the exception rather than the standard. Combined, these two predictions present a future where we have component-based platforms running in SaaS environments.</p>
<p>To get the idea, imagine a <a href="https://wordpress.com">WordPress.com</a>, <a href="http://squarespace.com">SquareSpace</a>, <a href="http://wix.com">Wix</a> or <a href="http://drupalgardens.com">DrupalGardens</a> where you can install every module/plugin available, including your own custom modules/plugins, instead of being limited to those modules/plugins manually approved by their vendors. This is a big deal because one of the biggest challenges with running web sites or web applications is that almost every user wants to extend or customize the application beyond what is provided out of the box.</p>
<p>Web applications have to be (1) manageable, (2) extensible, (3) customizable and (4) robust. The problem is that we don't have a programming language or an execution runtime that is able to meet all four of these requirements in the context of building and running dynamic component-based applications.</p>
<p>Neither PHP, JavaScript, Ruby, Go or Java allow us to build truly robust applications as the runtimes don't provide proper resource isolation. Often all the components (i.e. Drupal modules, WordPress plugins) run in the same memory space. In the Java world you have <a href="https://en.wikipedia.org/wiki/Enterprise_JavaBeans">Enterprise Java Beans</a> or <a href="https://en.wikipedia.org/wiki/OSGi">OSGi</a> which add some level of isolation and management, but it still doesn't provide full component-level isolation or component-level fault containment. As a result, it is required that one component pretty much trusts the other components installed on the system. This means that usually one malfunctioning component can corrupt the other component's data or functional logic, or that one component can harm the performance of the entire platform. In other words, you have to review, certify and test components before installing them on your platform. As a result, most SaaS vendors won't let you install untrusted or custom components.</p>
<p>What we really need here is an execution runtime that allows you to install untrusted components and guarantee application robustness at the same time. Such technology would be a total game-changer as we could build unlimited customizable SaaS platforms that leverage the power of community innovation. You'd be able to install any Drupal module on <a href="http://drupalgardens.com">DrupalGardens</a>, any plugin on <a href="https://wordpress.com">WordPress.com</a> or custom code on <a href="http://squarespace.com">Squarespace</a> or <a href="http://www.wix.com">Wix</a>. It would fundamentally disrupt the entire industry and would help us achieve <a href="https://dri.es/the-assembled-web">the assembled web dream</a>.</p>
<p>I've been giving this some thought, and what I think we need is the ability to handle each HTTP request in a <a href="https://en.wikipedia.org/wiki/Micro_kernel">micro-kernel-like environment</a> where each software component (i.e. Drupal module, WordPress plugin) runs in its own isolated process or environment and communicates with the other components through a form of <a href="https://en.wikipedia.org/wiki/Inter-process_communication">inter-process communication</a> (i.e. think remote procedure calls or web service calls). It is a lot harder to implement than it sounds as the inter-process communication could add huge overhead (e.g. we might need fast or clever ways to safely share data between isolated components without having to copy or transfer a lot of data around). Alternatively, virtualization technology like <a href="http://docker.com">Docker</a> might help us move in this direction as well. Their goal of a lightweight container is a step towards micro-services but it is likely to have more communication overhead. In both scenarios, Drupal would look a lot like a collection of micro web services (Drupal 10 anyone?).</p>
<p>Once we have such a runtime, we can implement and enforce governance and security policies for each component (e.g. limit its memory usage, limit its I/O, security permission, but also control access to the underlying platform like the database). We'd have real component-based isolation along with platform-level governance: (1) manageable, (2) extensible, (3) customizable and (4) robust.</p>
<p>Food for thought and discussion?</p>
]]></description>
    </item>
    <item>
      <title>Why the big architectural changes in Drupal 8</title>
      <link>https://dri.es/why-the-big-architectural-changes-in-drupal-8</link>
      <guid>https://dri.es/why-the-big-architectural-changes-in-drupal-8</guid>
      <pubDate>Mon, 09 Sep 2013 13:33:02 -0400</pubDate>
      <description><![CDATA[<p>There has been a lot of chatter about Drupal 8. Will Drupal 8 be performant? Will Drupal 8 be easy to develop modules for? Will I have to learn Symfony? I want to address these concerns and explain why Drupal 8 introduces such big changes.</p>
<figure><img src="https://dri.es/files/images/blog/why-the-big-architectural-changes-in-drupal-8.jpg" alt="Why the big architectural changes in Drupal 8?" width="742" height="417" />
</figure>
<h2>Lessons from the past: the pain before the gain</h2>
<p>The reason Drupal has been successful is because we always made big, forward-looking changes. It's a cliché, but change has always been the only constant in Drupal. The result is that Drupal has stayed relevant, unlike nearly every other Open Source CMS over the years. The biggest risk for our project is that we don't embrace change.</p>
<p>The downside is that with every major release of Drupal, we've gone through a lot of pain adjusting to this change. I first <a href="https://dri.es/the-pain-before-the-payoff">wrote about it in 2006 when trying to get Drupal 4.7 released</a>:</p>
<p><q>So let's capture that thought for future reference. Sweeping changes are required to make major advances in technology, and oftentimes there is a lot of pain before the payoff.</q></p>
<h2>We decided that big changes were required</h2>
<p>Drupal 7 is a fantastic CMS, but at the same time there are some fairly big limitations, including an incomplete Entity API, a lack of separation between content and configuration, leading to deployment challenges, a lack of separation between logic and presentation in the theme layer, and more. We created solutions for those challenges using contributed modules, but those solutions were in many cases incomplete. In Drupal 8, we decided to tackle a lot of these problems head-on, through the Configuration Management Initiative, the Twig templating layer, and a complete Entity API.</p>
<p>The web landscape has also dramatically changed around Drupal since January 2011, when Drupal 7 was released. Mobile browsing is ubiquitous, and so are third-party services that people may want to integrate their Drupal sites with. Website users expect a much higher bar when it comes to ease of use. We anticipated these trends and as a result, we spent the past 2.5 years working on Drupal 8's mobile features and user experience improvements.</p>
<p>But are all these great improvements enough?</p>
<h2>We need to modernize Drupal 8</h2>
<p>One of our biggest challenges with Drupal is that it is hard for organizations of all sizes to find Drupal talent (developers, themers, site builders, etc.). Drupal 7 didn't address this problem (e.g. we held on to procedural programming instead of object-oriented programming), and in fact made it a bit worse with the introduction of even more &quot;Drupalisms&quot; (e.g. excessive use of structured arrays). For most people new to Drupal, Drupal 7 is really complex.</p>
<p>The most effective way to address the Drupal talent issue, as well as the complexity issue, is to bring Drupal in line with modern frameworks and platforms, so there is less Drupal-specific knowledge to learn in order to become proficient. We decided to adopt modern PHP concepts and standards, object-oriented programming, and the <a href="http://symfony.com">Symfony framework</a>. While a lot of the Drupal concepts (Fields, Views, Entities, Nodes) continue to exist in Drupal 8, they are now implemented using object-oriented programming design patterns.</p>
<p>The advantages and disadvantages of object-oriented programming are well-understood. The disadvantages are size, verbosity, the amount of work it takes to write (including the design planning that goes into it), and slower performance. For people new to object-oriented programming, there may be a steep learning curve; some of the key programming techniques, such as inheritance and polymorphism, can be challenging initially. The advantages are encapsulation (both to hide implementation details and to avoid tampering with internal values), faster development thanks to reuse, extensibility, and better maintainability. Compared to procedural programs, object-oriented programs are easier to maintain, extend, and refactor. So although a lot of work is spent to write the program, less work is needed to maintain it over time.</p>
<p>For Drupal 8, this means that the code will be more abstract, more verbose, and slower, yet also be more maintainable, more modular, and more accessible to non-Drupal developers. The end result is that Drupal 8 should help us attract new people to Drupal in a way Drupal 7 didn't.</p>
<p>This is exactly what happened with other projects like <a href="http://symfony.com">Symfony</a>; Symfony 2 was a complete rearchitecture of Symfony 1. A lot of people were alienated by that, yet at the same time Symfony 2 took off like a rocket ship. The same thing has happened with the major releases of Drupal as well, despite how much change each one brings.</p>
<h2>Change is scary for the existing Drupal developers</h2>
<p>However, as we get closer to the release of Drupal 8, existing Drupal developers have become increasingly aware of the massive changes that Drupal 8 will bring. This has resulted in some fear; some people feel like they have to relearn everything they know, and that developing for Drupal 8 has changed to the point where it's no longer fun. This fear is completely understandable. Change is hard, can be scary, and often takes a long time to be absorbed.</p>
<p>But even if we completely streamlined the Drupal 8 developer experience, Drupal 8 will still look and work radically different under the hood. As mentioned, there are advantages and disadvantages to object-oriented programming and modern design patterns. But if we care about the long-term success of Drupal, we can't preserve the past. The risk of sticking with the old Drupal 7 architecture is that we won't be able to attract many more Drupal developers, and that over time, Drupal will become the odd one out.</p>
<h2>There is a lot of work left to be done</h2>
<p>Part of the fear out there is well-founded because in <a href="https://dri.es/drupal-8-apis-are-freezing-but-not-frozen">the current state of development</a>, Drupal 8 isn't good enough. While there are many things to like about Drupal 8, I'm also the first to admit that we have work to do on the Drupal 8 developer experience (as well as performance) before Drupal 8 can ship. Creating a well-designed object-oriented application takes more time and design work than creating a procedural one. Some major improvements have already landed, but we're still working hard on <a href="https://www.drupal.org/node/2081777">improving the developer experience</a>. We need more help, especially from Drupal 7 developers, on how we can make Drupal 8 more approachable for them. I'm not afraid to make major API changes if the developer-experience improvement is suitably large. So if you have concerns about Drupal 8, <a href="https://www.drupal.org/node/2081777#help">now is the time to step up and help</a>. In return, I promise we'll work on Drupal 8 until it is ready. <em>Thank you!</em></p>
]]></description>
    </item>
    <item>
      <title>Code freeze and thresholds</title>
      <link>https://dri.es/code-freeze-and-thresholds</link>
      <guid>https://dri.es/code-freeze-and-thresholds</guid>
      <pubDate>Mon, 25 Feb 2013 08:42:05 -0500</pubDate>
      <description><![CDATA[<p><em>Note: some of the information on this page is out of date. For the latest information about how Drupal releases are managed, see <a href="https://www.drupal.org/core/release-cycle">https://www.drupal.org/core/release-cycle</a>.</em></p>
<p>As of Monday, February 18, <a href="https://dri.es/drupal-8-feature-freeze-extended">Drupal 8 feature completion phase</a> has officially ended. Since December 1, the original code freeze date, we've managed to add numerous awesome features that were previously in-progress, such as:</p>
<ul>
<li>WYSIWYG with CKEditor</li>
<li>In-Place Editing</li>
<li>Entity Reference Field</li>
<li>Date and Time Field</li>
<li>Revised content creation form</li>
<li>Tour module to offer step-by-step help</li>
<li>API support for Multilingual configuration</li>
<li>Revamped and far more usable UI for configuring translatable entities and fields</li>
<li>A RESTful API for entity CRUD in Drupal core</li>
<li>Support for Views to be output in JSON, XML, or other formats made available by contributed modules</li>
<li>Important under-the-hood improvements to allow for native ESI/CSI/SSI caching support in Drupal.</li>
</ul>
<p>There are also a handful of <a href="https://www.drupal.org/project/issues/search/drupal?text=&amp;assigned=&amp;submitted=&amp;participant=&amp;status%5B%5D=Open&amp;version%5B%5D=8.x&amp;issue_tags_op=or&amp;issue_tags=RTBC+Feb+18">features that were RTBC by Feb 18</a>, but not quite ready for commit. They are still undergoing consideration. All things considered, I'm glad we extended the code freeze.</p>
<h2>What happens now?</h2>
<p>We now enter the <a href="https://dri.es/updated-drupal-8-release-schedule">&quot;clean-up&quot; phase</a> of Drupal 8, where focus turns to refactoring of existing subsystems, better integrating features, and improving the consistency and coherence of the existing functionality. While APIs can and will still change as this coherence shapes up, contributed module authors are nevertheless encouraged to start porting their modules now, as there is still time to influence and fix APIs and the overall developer experience in Drupal 8. This will become much harder as we get closer to code freeze.</p>
<h2>So ... REALLY, what happens now?</h2>
<p>In the course of adding all of the great features we've added so far to Drupal 8, we've accumulated some technical debt and are currently well over the <a href="https://dri.es/issue-queue-thresholds-for-drupal-core">issue queue thresholds for Drupal core</a>. We roll a release candidate of Drupal 8 when there are 0 critical bugs and tasks remaining. Our over-arching goal should therefore be to reduce the number of threshold issues over time.</p>
<p>At the same time, there are a lot of small, non-destabilizing features that would make Drupal 8 better. Especially for the kinds of iterative improvements that we would allow into 8.1 or 8.2, it doesn't make sense to hold those up until then, if we're able to get them into 8.0 without it delaying the 8.0 release date.</p>
<p>To help with this goal, catch and I have discussed a plan for allowing <em>some</em> features to continue to be committed to core up until RC1, providing we are under thresholds. To help guide us towards release, we plan to reduce the critical task/bug thresholds by one per week, starting the week of code freeze:</p>
<ul>
<li>July 1: 14</li>
<li>July 8: 13</li>
<li>July 15: 12</li>
<li>...</li>
<li>September 2: 5</li>
<li>September 9: 4</li>
<li>September 16: 3</li>
<li><strong>September 23: 2</strong></li>
</ul>
<p>September 23 is the week of <a href="https://prague2013.drupal.org/">DrupalCon Prague</a>, and our goal would be to come out of the conference with a first Drupal 8 RC by fixing the last two critical bugs and two critical tasks (or however many there actually are) at the sprint. :-)</p>
<p>However, there are some caveats:</p>
<ul>
<li>Features can't require any new major/critical follow-ups, as that would impact the timing of release. In general, this means no new &quot;big&quot; features, as those tend not to be possible to accomplish without some fairly large follow-ups needed (e.g. Responsive Layout Builder, Project Browser, a new core theme, Symfony Form API). These kinds of issues will likely be moved to Drupal 9.</li>
<li>Primarily, this means small, self-contained, iterative improvements that we'd be willing to backport to Drupal 8 (see <a href="https://groups.drupal.org/node/210973">https://groups.drupal.org/node/210973</a>).</li>
<li>Committer attention will generally be prioritized on tasks/bugs first, rather than features.</li>
</ul>
<p>For now, we've decided to leave the major bugs/tasks threshold at 100 throughout release, and <em>not</em> tie them to the release date trigger for Drupal 8. I will re-evaluate this as we get closer to release.</p>
<h2>What isn't bound by thresholds?</h2>
<p>We obviously want Drupal 8 to ship as a coherent product, so a major focus will be around better <em>integration</em> of existing features. For example, work required to get the Symfony pieces of Drupal working well with blocks and enabling ESI/CSI/SSI caching. Turning administrative pages into Views so that they can be better tuned for the task at hand. Completing conversions of major APIs such as Twig, new Entity API, CMI, and so on, to fix rough edges such as the inability to translate/in-place-edit node titles.</p>
<p>General guidance on what constitutes a task or a feature is available at <a href="https://www.drupal.org/node/1181250">https://www.drupal.org/node/1181250</a>. As we work through the list of these integration items, some features may be recategorized into tasks. At the same time, some issues currently categorized as tasks go beyond strictly integration and polish and will be descoped or recategorized as features.</p>
<h2>Kudos!</h2>
<p>While we still have a lot of work to do, I want to pause and give a sincere thanks to each and every one of the 1,077+ contributors to Drupal 8 so far. You've all done absolutely amazing work and helped establish Drupal 8 as a far more usable, flexible, designer-friendly, future-proof framework for all of us to use for the years to come. Now let's band together and get our baby polished up and out in the world for everyone to enjoy! :-)</p>
]]></description>
    </item>
    <item>
      <title>Linus Torvalds on Git</title>
      <link>https://dri.es/linus-torvalds-on-git</link>
      <guid>https://dri.es/linus-torvalds-on-git</guid>
      <pubDate>Sun, 03 Jun 2007 12:13:56 -0400</pubDate>
      <description><![CDATA[<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/4XpnKHJAok8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
<p>While distributed source code management tools like <a href="http://git.or.cz/">Git</a>, <a href="https://www.selenic.com/mercurial/wiki/">Mercurial</a>, <a href="http://www.monotone.ca/">Monotone</a> and <a href="http://bazaar.canonical.com/">Bazaar</a> (<a href="http://wiki.bazaar.canonical.com/Drupal/tips">which some Drupal developers use</a>) offer advantages over <a href="http://www.nongnu.org/cvs/">CVS</a> or <a href="http://subversion.tigris.org/">SVN</a>, they are not as accessible or well-supported. Drupal developers and Drupal designers are not Linux kernel hackers, and for many of them CVS is the biggest barrier to entry. Without desktop integration for both Windows and the Mac (like <a href="http://www.tortoisecvs.org/">TurtoiseCVS</a> or <a href="http://www.heilancoo.net/MacCVSClient/">MacCVSClient</a> offer), I don't see how we can migrate away from CVS without leaving half of our community behind ...</p>
<p>Not to mention the fact that our entire release management system is built on top of CVS. It would be a lot of work to switch that to another system.</p>
]]></description>
    </item>
    <item>
      <title>Creating passionate users</title>
      <link>https://dri.es/creating-passionate-users</link>
      <guid>https://dri.es/creating-passionate-users</guid>
      <pubDate>Tue, 10 Oct 2006 07:02:11 -0400</pubDate>
      <description><![CDATA[<p>Like many, I'm a long-time reader of <a href="https://headrush.typepad.com/creating_passionate_users/">Creating Passionate Users</a>, a blog co-authored by Kathy Sierra. Last month at <a href="/drupalcon-brussels">Euro OSCON</a> I had the opportunity to attend a 3 hour tutorial by Kathy Sierra, and now I can't wait for the &quot;Creating Passionate Users&quot; book to come out.</p>
<p>I'm a fan.</p>
<p>I'm a fan because over the past year, Kathy has permanently changed my perspective on user experience (and because she managed to put in words what I've known intuitively for a long time). To give you an idea, I've included the blog posts (and graphs) that had the most impact on me.</p>
<figure><img src="https://dri.es/files/images/drupal/cpu-kick-ass-curve.jpg" alt="A graph showing user ability over time, highlighting the &amp;quot;suck threshold&amp;quot; and &amp;quot;passion threshold&amp;quot; for skill improvement." width="444" height="458" />
<figcaption>The goal of a software application is to get users up the curve as quickly as possible. People get passionate if you help them kick ass with your product.  The "time to stop sucking" and "time to first kick-ass" quotients are among the biggest advantages we have in a world where the competition is both fierce and plentiful. Get your users up there faster, and you win. More importantly, it's a way in which we can make a positive impact on the lives of users. (Taken from <a href="http://headrush.typepad.com/creating_passionate_users/2005/10/getting_users_p.html">Attenuation and the suck threshold</a>.)</figcaption>
</figure>
<figure><img src="https://dri.es/files/images/drupal/cpu-how-to-be-an-expert.jpg" alt="A graph showing three learning paths: drop-out, amateur, and expert, based on effort and persistence over time." width="444" height="458" />
<figcaption>Users will typically fall into one of the three categories: expert, amateur, or drop-out. The drop-outs decide that during that "I suck at this" phase, it isn't worth continuing.  They give up.  The amateur made it past the suck threshold, but now they don't want to push for new skills and capabilities. They don't want to suck again.  They'll never get past the kick-ass threshold where there is a much greater chance they'll become passionate. <em>(Taken from <a href="http://headrush.typepad.com/creating_passionate_users/2006/03/how_to_be_an_ex.html">How to be an expert</a>.)</em></figcaption>
</figure>
<figure><img src="https://dri.es/files/images/drupal/cpu-disruptive-upgrades.jpg" alt="A graph showing how difficult upgrades frustrate users by forcing them back into a beginner learning phase." width="486" height="488" />
<figcaption>The problem with disruptive upgrades. People don't upgrade because they don't want to move back into the "suck zone". You have to make it easy to upgrade because users will remember the pain of this upgrade when it comes time for the next one. An upgrade should be worth it so you need a good balance between "upgrade pain" and "added value".  (Taken from <a href="http://headrush.typepad.com/creating_passionate_users/2006/09/why_they_dont_u.html">Why they don't upgrade (and what to do about it)</a>).</figcaption>
</figure>
<figure><img src="https://dri.es/files/images/drupal/cpu-love-hate.jpg" alt="A diagram shows user feelings about a product, with &amp;quot;Love&amp;quot; and &amp;quot;Hate&amp;quot; on opposite ends and &amp;quot;Zone of Mediocrity&amp;quot; in the middle." width="512" height="352" />
<figcaption>The more successful the product or service is, the stronger the pressure to give in to user requests. The more users you have, the more diverse the requests.  The worst thing we can do is give in.  We have to listen to our users but resist. The overwhelming pull of that right (hate) side slides you closer and closer to the middle. Those who hate it will hate it until you've neutered it into submission and taken away the magic some once loved.  (Taken from <a href="http://headrush.typepad.com/creating_passionate_users/2006/05/dont_give_in_to.html">Don't give in to feature demands</a>.)</figcaption>
</figure>
<figure><img src="https://dri.es/files/images/drupal/cpu-featuritis.jpg" alt="A graph shows user happiness decreasing as features increase, highlighting the &amp;quot;Happy User Peak&amp;quot; before frustration sets in." width="440" height="343" />
<figcaption>Don't give in to "featuritis" and be the "I rule" product, not the "This thing I bought does everything, but I suck!" product. (Taken from <a href="http://headrush.typepad.com/creating_passionate_users/2005/06/featuritis_vs_t.html">Featuritis verus the Happy User Peak</a>.)</figcaption>
</figure>
]]></description>
    </item>
  </channel>
</rss>
