<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: yagni</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/yagni.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2026-03-11T14:47:09+00:00</updated><author><name>Simon Willison</name></author><entry><title>Quoting John Carmack</title><link href="https://simonwillison.net/2026/Mar/11/john-carmack/#atom-tag" rel="alternate"/><published>2026-03-11T14:47:09+00:00</published><updated>2026-03-11T14:47:09+00:00</updated><id>https://simonwillison.net/2026/Mar/11/john-carmack/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/ID_AA_Carmack/status/1405932642005041153"&gt;&lt;p&gt;It is hard for less experienced developers to appreciate how rarely architecting for future requirements / applications turns out net-positive.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/ID_AA_Carmack/status/1405932642005041153"&gt;John Carmack&lt;/a&gt;, a tweet in June 2021&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/software-engineering"&gt;software-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yagni"&gt;yagni&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/john-carmack"&gt;john-carmack&lt;/a&gt;&lt;/p&gt;



</summary><category term="software-engineering"/><category term="yagni"/><category term="john-carmack"/></entry><entry><title>Writing code is cheap now</title><link href="https://simonwillison.net/guides/agentic-engineering-patterns/code-is-cheap/#atom-tag" rel="alternate"/><published>2026-02-23T16:20:42+00:00</published><updated>2026-02-23T16:20:42+00:00</updated><id>https://simonwillison.net/guides/agentic-engineering-patterns/code-is-cheap/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; &amp;gt;&lt;/em&gt;&lt;/p&gt;
    &lt;p&gt;The biggest challenge in adopting agentic engineering practices is getting comfortable with the consequences of the fact that &lt;em&gt;writing code is cheap now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Code has always been expensive. Producing a few hundred lines of clean, tested code takes most software developers a full day or more. Many of our engineering habits, at both the macro and micro level, are built around this core constraint.&lt;/p&gt;
&lt;p&gt;At the macro level we spend a great deal of time designing, estimating and planning out projects, to ensure that our expensive coding time is spent as efficiently as possible. Product feature ideas are evaluated in terms of how much value they can provide &lt;em&gt;in exchange for that time&lt;/em&gt; - a feature needs to earn its development costs many times over to be worthwhile!&lt;/p&gt;
&lt;p&gt;At the micro level we make hundreds of decisions a day predicated on available time and anticipated tradeoffs. Should I refactor that function to be slightly more elegant if it adds an extra hour of coding time? How about writing documentation? Is it worth adding a test for this edge case? Can I justify building a debug interface for this?&lt;/p&gt;
&lt;p&gt;Coding agents dramatically drop the cost of typing code into the computer, which disrupts &lt;em&gt;so many&lt;/em&gt; of our existing personal and organizational intuitions about which trade-offs make sense.&lt;/p&gt;
&lt;p&gt;The ability to run parallel agents makes this even harder to evaluate, since one human engineer can now be implementing, refactoring, testing and documenting code in multiple places at the same time.&lt;/p&gt;
&lt;h2 id="good-code"&gt;Good code still has a cost&lt;/h2&gt;

&lt;p&gt;Delivering new code has dropped in price to almost free... but delivering &lt;em&gt;good&lt;/em&gt; code remains significantly more expensive than that.&lt;/p&gt;
&lt;p&gt;Here's what I mean by "good code":&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The code works. It does what it's meant to do, without bugs.&lt;/li&gt;
&lt;li&gt;We &lt;em&gt;know the code works&lt;/em&gt;. We've taken steps to confirm to ourselves and to others that the code is fit for purpose.&lt;/li&gt;
&lt;li&gt;It solves the right problem.&lt;/li&gt;
&lt;li&gt;It handles error cases gracefully and predictably: it doesn't just consider the happy path. Errors should provide enough information to help future maintainers understand what went wrong.&lt;/li&gt;
&lt;li&gt;It’s simple and minimal - it does only what’s needed, in a way that both humans and machines can understand now and maintain in the future.&lt;/li&gt;
&lt;li&gt;It's protected by tests. The tests show that it works now and act as a regression suite to avoid it quietly breaking in the future.&lt;/li&gt;
&lt;li&gt;It's documented at an appropriate level, and that documentation reflects the current state of the system - if the code changes an existing behavior the existing documentation needs to be updated to match.&lt;/li&gt;
&lt;li&gt;The design affords future changes. It's important to maintain &lt;a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it"&gt;YAGNI&lt;/a&gt; - code with added complexity to anticipate future changes that may never come is often bad code - but it's also important not to write code that makes future changes much harder than they should be.&lt;/li&gt;
&lt;li&gt;All of the other relevant "ilities" - accessibility, testability, reliability, security, maintainability, observability, scalability, usability - the non-functional quality measures that are appropriate for the particular class of software being developed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Coding agent tools can help with most of this, but there is still a substantial burden on the developer driving those tools to ensure that the produced code is good code for the subset of good that's needed for the current project.&lt;/p&gt;
&lt;h2 id="we-need-to-build-new-habits"&gt;We need to build new habits&lt;/h2&gt;
&lt;p&gt;The challenge is to develop new personal and organizational habits that respond to the affordances and opportunities of agentic engineering. &lt;/p&gt;
&lt;p&gt;These best practices are still being figured out across our industry. I'm still figuring them out myself.&lt;/p&gt;
&lt;p&gt;For now I think the best we can do is to second guess ourselves: any time our instinct says "don't build that, it's not worth the time" fire off a prompt anyway, in an asynchronous agent session where the worst that can happen is you check ten minutes later and find that it wasn't worth the tokens.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&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/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&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/yagni"&gt;yagni&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="coding-agents"/><category term="ai-assisted-programming"/><category term="generative-ai"/><category term="ai"/><category term="llms"/><category term="agentic-engineering"/><category term="yagni"/></entry><entry><title>PAGNIs: Probably Are Gonna Need Its</title><link href="https://simonwillison.net/2021/Jul/1/pagnis/#atom-tag" rel="alternate"/><published>2021-07-01T19:13:58+00:00</published><updated>2021-07-01T19:13:58+00:00</updated><id>https://simonwillison.net/2021/Jul/1/pagnis/#atom-tag</id><summary type="html">
    &lt;p&gt;Luke Page has a great post up with &lt;a href="https://lukeplant.me.uk/blog/posts/yagni-exceptions/"&gt;his list of YAGNI exceptions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;YAGNI - You Ain't Gonna Need It - is a rule that says you shouldn't add a feature just because it might be useful in the future - only write code when it solves a direct problem.&lt;/p&gt;
&lt;p&gt;When should you over-ride YAGNI? When the cost of adding something later is so dramatically expensive compared with the cost of adding it early on that it's worth taking the risk. On when you know from experience that an initial investment will pay off many times over.&lt;/p&gt;
&lt;p&gt;Lukes's exceptions to YAGNI are well chosen: things like logging, API versioning, created_at timestamps and a bias towards "store multiple X for a user" (a many-to-many relationship) if there's any inkling that the system may need to support more than one.&lt;/p&gt;
&lt;p&gt;Because I like attempting to coin phrases, I propose we call these &lt;strong&gt;PAGNIs&lt;/strong&gt; - short for &lt;strong&gt;Probably Are Gonna Need Its&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here are some of mine.&lt;/p&gt;
&lt;h4&gt;A kill-switch for your mobile apps&lt;/h4&gt;
&lt;p&gt;If you're building a mobile app that talks to your API, make sure to ship a kill-switch: a mechanism by which you can cause older versions of the application to show a "you must upgrade to continue using this application" screen when the app starts up.&lt;/p&gt;
&lt;p&gt;In an ideal world, you'll never use this ability: you'll continue to build new features to the app and make backwards-compatible changes to the API forever, such that ancient app versions keep working and new app versions get to do new things.&lt;/p&gt;
&lt;p&gt;But... sometimes that simply isn't possible. You might discover a security hole in the design of the application or API that can only be fixed by breaking backwards-compatibility - or maybe you're still maintaining a v1 API from five years ago to support a mobile application version that's only still installed by 30 users, and you'd like to not have to maintain double the amount of API code.&lt;/p&gt;
&lt;p&gt;You can't add a kill-switch retroactively to apps that have already been deployed!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/myunderpants/status/1410655652867809281"&gt;Apparently Firebase offers this&lt;/a&gt; to many Android apps, but if you're writing for iOS you need to provide this yourself.&lt;/p&gt;
&lt;h4&gt;Automated deploys&lt;/h4&gt;
&lt;p&gt;Nothing kills a side project like coming back to it in six months time and having to figure out how to deploy it again. Thanks to &lt;a href="https://simonwillison.net/tags/githubactions/"&gt;GitHub Actions&lt;/a&gt; and hosting providers like Google Cloud Run, Vercel, Heroku and Netlify setting up automated deployments is way easier now than it used to be. I have enough examples now that getting automated deployments working for a new project usually only takes a few minutes, and it pays off instantly.&lt;/p&gt;
&lt;h4&gt;Continuous Integration (and a test framework)&lt;/h4&gt;
&lt;p&gt;Similar to automated deployment in that GitHub Actions (and Circle CI and Travis before it) make this much less painful to setup than it used to be.&lt;/p&gt;
&lt;p&gt;Introducing a test framework to an existing project can be extremely painful. Introducing it at the very start is easy - and it sets a precedent that code should be tested from day one.&lt;/p&gt;
&lt;p&gt;These days I'm all about &lt;a href="https://simonwillison.net/tags/pytest/"&gt;pytest&lt;/a&gt;, and I have various cookiecutter templates (&lt;a href="https://github.com/simonw/datasette-plugin"&gt;datasette-plugin&lt;/a&gt;, &lt;a href="https://github.com/simonw/click-app"&gt;click-app&lt;/a&gt;, &lt;a href="https://github.com/simonw/python-lib"&gt;python-lib&lt;/a&gt;) that configure it on my new projects (with a passing test) out of the box.&lt;/p&gt;
&lt;p&gt;(Honestly, at this point in my career I consider continuous integration a DAGNI - Definitely Are Gonna Need It.)&lt;/p&gt;
&lt;p&gt;One particularly worthwhile trick is making sure the tests can spin up their own isolated test databases - another thing which is pretty easy to setup early (Django does this for you) and harder to add later on. I extend that to other external data stores - I once put a significant amount of effort into setting up a mechanism for running tests against Elasticsearch and clearing out the data again afterwards, and it paid off multiple times over.&lt;/p&gt;
&lt;p&gt;Even better: &lt;strong&gt;continuous deployment&lt;/strong&gt;! When the tests pass, deploy. If you have automated deployment setup already adding this is pretty easy, and doing it from the very start of a project sets a strong cultural expectation that no-one will land code to the &lt;code&gt;main&lt;/code&gt; branch until it's in a production-ready state and covered by unit tests.&lt;/p&gt;
&lt;p&gt;(If continuous deployment to production is too scary for your project, a valuable middle-ground is continuous deployment to a staging environment. Having everyone on your team able to interact with a live demo of your current main branch is a huge group productivity boost.)&lt;/p&gt;
&lt;h4&gt;API pagination&lt;/h4&gt;
&lt;p&gt;Never build an API endpoint that isn't paginated. Any time you think "there will never be enough items in this list for it to be worth pagination" one of your users will prove you wrong.&lt;/p&gt;
&lt;p&gt;This can be as simple as shipping an API which, even though it only returns a single page, has hard-coded JSON that looks like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-json"&gt;&lt;pre&gt;{
  &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;results&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: [
    {&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;id&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-c1"&gt;1&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;name&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;One&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;},
    {&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;id&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-c1"&gt;2&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;name&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Two&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;},
    {&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;id&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-c1"&gt;3&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;name&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Three&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;}
  ],
  &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;next_url&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-c1"&gt;null&lt;/span&gt;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But make sure you leave space for the pagination information! You'll regret it if you don't.&lt;/p&gt;
&lt;h4&gt;Detailed API logs&lt;/h4&gt;
&lt;p&gt;This is a trick I learned &lt;a href="https://simonwillison.net/2021/Apr/12/porting-vaccinateca-to-django/#value-of-api-logs"&gt;while porting VaccinateCA to Django&lt;/a&gt;. If you are building an API, having a mechanism that provides detailed logs - including the POST bodies passed to the API - is invaluable.&lt;/p&gt;
&lt;p&gt;It's an inexpensive way of maintaining a complete record of what happened with your application - invaluable for debugging, but also for tricks like replaying past API traffic against a new implementation under test.&lt;/p&gt;
&lt;p&gt;Logs like these may become infeasible at scale, but for a new project they'll probably add up to just a few MBs a day - and they're easy to prune or switch off later on if you need to.&lt;/p&gt;
&lt;p&gt;VIAL uses &lt;a href="https://github.com/CAVaccineInventory/vial/blob/a0780e27c39018b66f95278ce18eda5968c325f8/vaccinate/api/utils.py#L86"&gt;a Django view decorator&lt;/a&gt; to log these directly to a PostgreSQL table. We've been running this for a few months and it's now our largest table, but it's still only around 2GB - easily worth it for the productivity boost it gives us.&lt;/p&gt;
&lt;p&gt;(Don't log any sensitive data that you wouldn't want your development team having access to while debugging a problem. This may require clever redaction, or you can avoid logging specific endpoints entirely. Also: don't log authentication tokens that could be used to imitate users: decode them and log the user identifier instead.)&lt;/p&gt;
&lt;h4&gt;A bookmarkable interface for executing read-only SQL queries against your database&lt;/h4&gt;
&lt;p&gt;This one is very much exposing my biases (I just released &lt;a href="https://django-sql-dashboard.datasette.io/"&gt;Django SQL Dashboard 1.0&lt;/a&gt; which provides exactly this for Django+PosgreSQL projects) but having used this for the past few months I can't see myself going back. Using bookmarked SQL queries to inform the implementation of new features is an incredible productivity boost. Here's &lt;a href="https://github.com/CAVaccineInventory/vial/issues/528"&gt;an issue I worked on&lt;/a&gt; recently with 18 comments linking to illustrative SQL queries.&lt;/p&gt;
&lt;p&gt;(On further thought: this isn't actually a great example of a PAGNI because it's not particularly hard to add this to a project at a later date.)&lt;/p&gt;
&lt;h4&gt;Driving down the cost&lt;/h4&gt;
&lt;p&gt;One trick with all of these things is that while they may seem quite expensive to implement, they get dramatically cheaper as you gain experience and gather more tools for helping put them into practice.&lt;/p&gt;
&lt;p&gt;Any of the ideas I've shown here could take an engineering team weeks (if not months) to add to an existing project - but with the right tooling they can represent just an hour (or less) work at the start of a project. And they'll pay themselves off many, many times over in the future.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/continuous-deployment"&gt;continuous-deployment&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/continuous-integration"&gt;continuous-integration&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/definitions"&gt;definitions&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/testing"&gt;testing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pytest"&gt;pytest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-actions"&gt;github-actions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django-sql-dashboard"&gt;django-sql-dashboard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yagni"&gt;yagni&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pagni"&gt;pagni&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="continuous-deployment"/><category term="continuous-integration"/><category term="definitions"/><category term="software-engineering"/><category term="testing"/><category term="pytest"/><category term="github-actions"/><category term="django-sql-dashboard"/><category term="yagni"/><category term="pagni"/></entry><entry><title>YAGNI exceptions</title><link href="https://simonwillison.net/2021/Jul/1/yagni-exceptions/#atom-tag" rel="alternate"/><published>2021-07-01T18:30:24+00:00</published><updated>2021-07-01T18:30:24+00:00</updated><id>https://simonwillison.net/2021/Jul/1/yagni-exceptions/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://lukeplant.me.uk/blog/posts/yagni-exceptions/"&gt;YAGNI exceptions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Luke Plant provides his collection of things that you probably ARE going to need in a project, where adding them later is painful enough that it’s worth the up-front investment. I really like these as a concept, and I’m coining the term PAGNI—for Probably Are Gonna Need It—to describe them.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/spookylukey/status/1409967250426281984"&gt;@spookylukey&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/luke-plant"&gt;luke-plant&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/yagni"&gt;yagni&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pagni"&gt;pagni&lt;/a&gt;&lt;/p&gt;



</summary><category term="luke-plant"/><category term="software-engineering"/><category term="yagni"/><category term="pagni"/></entry><entry><title>Which core programming principles apply to all languages?</title><link href="https://simonwillison.net/2012/Feb/13/which-core-programming-principles/#atom-tag" rel="alternate"/><published>2012-02-13T13:36:00+00:00</published><updated>2012-02-13T13:36:00+00:00</updated><id>https://simonwillison.net/2012/Feb/13/which-core-programming-principles/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Which-core-programming-principles-apply-to-all-languages/answer/Simon-Willison"&gt;Which core programming principles apply to all languages?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;YAGNI: &lt;span&gt;&lt;a href="http://en.wikipedia.org/wiki/You_ain't_gonna_need_it"&gt;http://en.wikipedia.org/wiki/You...&lt;/a&gt;&lt;/span&gt;&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/quora"&gt;quora&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yagni"&gt;yagni&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="programming"/><category term="quora"/><category term="yagni"/></entry><entry><title>Defending YAGNI</title><link href="https://simonwillison.net/2004/Mar/1/defending/#atom-tag" rel="alternate"/><published>2004-03-01T16:24:39+00:00</published><updated>2004-03-01T16:24:39+00:00</updated><id>https://simonwillison.net/2004/Mar/1/defending/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://fishbowl.pastiche.org/2004/03/02/defending_yagni"&gt;Defending YAGNI&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I’ve been learning to say YAGNI recently.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/yagni"&gt;yagni&lt;/a&gt;&lt;/p&gt;



</summary><category term="yagni"/></entry><entry><title>YAGNI and DRY</title><link href="https://simonwillison.net/2003/Dec/9/yagniAndDry/#atom-tag" rel="alternate"/><published>2003-12-09T03:12:39+00:00</published><updated>2003-12-09T03:12:39+00:00</updated><id>https://simonwillison.net/2003/Dec/9/yagniAndDry/#atom-tag</id><summary type="html">
    &lt;p&gt;Two acronyms that have been seeing a lot of action at work recently are &lt;acronym title="You Ain&amp;apos;t Gonna Need It"&gt;YAGNI&lt;/acronym&gt; and &lt;acronym title="Don&amp;apos;t Repeat Yourself"&gt;DRY&lt;/acronym&gt;. They're great principles to go by in any case, but in a pair programming environment they take on a whole new level of utility.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://xp.c2.com/YouArentGonnaNeedIt.html"&gt;You Ain't Gonna Need It&lt;/a&gt; states that you should &lt;q cite="http://xp.c2.com/YouArentGonnaNeedIt.html"&gt;always implement things when you &lt;strong&gt;actually&lt;/strong&gt; need them, never when you just &lt;strong&gt;foresee&lt;/strong&gt; that you need them.&lt;/q&gt; This is great for controlling feature creep; the moment one of us says "we might need that later" the other says "YAGNI" and we can move right along.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.pragmaticprogrammer.com/ppbook/extracts/rule_list.html"&gt;Don't Repeat Yourself&lt;/a&gt; is one of the tips from &lt;a href="http://www.pragmaticprogrammer.com/"&gt;The Pragmatic Programmer&lt;/a&gt;, a book which is every bit as good as &lt;a href="http://www.google.com/search?q=pragmatic+programmer+review" title="Google Search: pragmatic programmer review"&gt;people say it is&lt;/a&gt;. It states that &lt;q cite="http://www.pragmaticprogrammer.com/ppbook/extracts/rule_list.html"&gt;Every piece of knowledge must have a single, unambiguous, authoritative representation within a system&lt;/q&gt; - whenever we spot something that is duplicated and can be considered a "piece of knowledge" we frequently refactor it straight away.&lt;/p&gt;

&lt;p&gt;One of the most interesting things about pair programming is that introduces a complete reliance on communication into something that is generally a solitary activity. Guidelines like the two listed above extend the vocabulary that can be used in such communication, speeding up development and making tough decisions easier to quickly resolve.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/yagni"&gt;yagni&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="yagni"/></entry></feed>