<rss xmlns:source="http://source.scripting.com/" version="2.0">
  <channel>
    <title>Matthias Lüdtke&#39;s better-idea.org</title>
    <link>https://blog.better-idea.org/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Mon, 08 Dec 2025 11:40:13 +0100</lastBuildDate>
    <item>
      <title>Book: A Philosophy of Software Design</title>
      <link>https://blog.better-idea.org/2025/12/08/book-a-philosophy-of-software/</link>
      <pubDate>Mon, 08 Dec 2025 11:40:13 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2025/12/08/book-a-philosophy-of-software/</guid>
      <description>&lt;p&gt;Several years after &lt;em&gt;Clean Code&lt;/em&gt;, which I always found overrated, &lt;em&gt;A Philosophy of Software Design&lt;/em&gt; (2021) felt like a real breath of fresh air.&lt;/p&gt;
&lt;p&gt;Because the book addresses the broader question &lt;em&gt;“What makes code hard or easy to understand?”&lt;/em&gt; it is, in practice, more useful as a guide for writing maintainable software than &lt;em&gt;Clean Code&lt;/em&gt;, which focuses heavily on narrow stylistic rules.&lt;/p&gt;
&lt;p&gt;Early on, Ousterhout states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One of the most important goals of good design is for a system to be obvious.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He then analyses examples that demonstrate this principle in practice.&lt;/p&gt;
&lt;p&gt;The key idea that stayed with me—and one I plan to explore further—is the concept of &lt;strong&gt;deep modules&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Deep modules: The best modules are those that provide powerful functionality yet have simple interfaces.&lt;br&gt;
The most important issue in designing classes and other modules is to make them deep, so that they have simple interfaces for the common use cases, yet still provide significant functionality. This maximizes the amount of complexity that is concealed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ousterhout’s talk at Google is also worth watching: &lt;em&gt;A Philosophy of Software Design&lt;/em&gt; (1 hour, highly recommended) &lt;a href=&#34;https://www.youtube.com/watch?v=bmSAYlu0NcY&#34;&gt;www.youtube.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A few more quotes that capture the essence of the book:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Complexity is anything related to the structure of a software system that makes it hard to understand and modify the system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Complexity is caused by two things: dependencies and obscurity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Design systems so that developers only need to face a small fraction of the overall complexity at any given time.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      <source:markdown>Several years after *Clean Code*, which I always found overrated, *A Philosophy of Software Design* (2021) felt like a real breath of fresh air.

Because the book addresses the broader question *“What makes code hard or easy to understand?”* it is, in practice, more useful as a guide for writing maintainable software than *Clean Code*, which focuses heavily on narrow stylistic rules.

Early on, Ousterhout states:

&gt; One of the most important goals of good design is for a system to be obvious.

He then analyses examples that demonstrate this principle in practice.

The key idea that stayed with me—and one I plan to explore further—is the concept of **deep modules**:

&gt; Deep modules: The best modules are those that provide powerful functionality yet have simple interfaces.  
&gt; The most important issue in designing classes and other modules is to make them deep, so that they have simple interfaces for the common use cases, yet still provide significant functionality. This maximizes the amount of complexity that is concealed.

Ousterhout’s talk at Google is also worth watching: *A Philosophy of Software Design* (1 hour, highly recommended) [www.youtube.com](https://www.youtube.com/watch?v=bmSAYlu0NcY).

A few more quotes that capture the essence of the book:

&gt; Complexity is anything related to the structure of a software system that makes it hard to understand and modify the system.

&gt; Complexity is caused by two things: dependencies and obscurity.

&gt; Design systems so that developers only need to face a small fraction of the overall complexity at any given time.
</source:markdown>
    </item>
    
    <item>
      <title>jsonnormalize</title>
      <link>https://blog.better-idea.org/2025/09/14/jsonnormalize/</link>
      <pubDate>Sun, 14 Sep 2025 15:04:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2025/09/14/jsonnormalize/</guid>
      <description>&lt;p&gt;I have written &lt;code&gt;jsonnormalize&lt;/code&gt; a while ago, but I am surprised at how often I need this helper to compare some json:
&lt;a href=&#34;https://github.com/mat/dotfiles/blob/master/bin/jsonnormalize&#34;&gt;https://github.com/mat/dotfiles/blob/master/bin/jsonnormalize&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>I have written `jsonnormalize` a while ago, but I am surprised at how often I need this helper to compare some json:
&lt;https://github.com/mat/dotfiles/blob/master/bin/jsonnormalize&gt;

</source:markdown>
    </item>
    
    <item>
      <title>PyData Berlin 2025 Notes</title>
      <link>https://blog.better-idea.org/2025/09/04/pydata-berlin-notes/</link>
      <pubDate>Thu, 04 Sep 2025 14:23:42 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2025/09/04/pydata-berlin-notes/</guid>
      <description>&lt;p&gt;I just came back from the &lt;a href=&#34;https://pydata.org/berlin2025&#34;&gt;PyData conference in Berlin&lt;/a&gt; and apart from meeting a lot of great people, I took some tidbits away:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Docker&amp;rsquo;s &lt;a href=&#34;https://docs.docker.com/build/cache/optimize/#:~:text=Cache%20mounts%20are,-a%20way%20to&#34;&gt;Cache mounts&lt;/a&gt; can be used to solve the problem of a single pip dependency change invalidating the entire Docker cache. So instead of doing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; pip install -r requirements.txt&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can do:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; --mount&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;cache,target&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/root/.cache/pip &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    pip install -r requirements.txt&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or, equivalently, for &lt;code&gt;uv&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt; RUN --mount&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;cache,target&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/root/.cache/uv &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;     uv sync&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will cache the pip downloads and speed up subsequent builds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can, through the magic of WebAssembly, run DuckDB in the browser: &lt;a href=&#34;https://shell.duckdb.org&#34;&gt;https://shell.duckdb.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For documentation, people (e.g. like Github, Cloudflare, basically everyone) are more or less following the &lt;a href=&#34;https://diataxis.fr/&#34;&gt;Diátaxis&lt;/a&gt; framework. I have a Dejavu feeling that I have seen this somewhere before under a different name. The idea is to split documentation into four categories: tutorials, how-to guides, explanations, and references. Tutorials and how-to guides are task-oriented, while explanations and references are information-oriented (on a need-to-know basis).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How did I miss &lt;a href=&#34;https://webllm.mlc.ai&#34;&gt;WebLLM&lt;/a&gt; before?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For PDF/HTML parsing and text extraction &lt;a href=&#34;https://github.com/docling-project/docling&#34;&gt;docling&lt;/a&gt; is the new hotness and already very promising.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
      <source:markdown>I just came back from the [PyData conference in Berlin](https://pydata.org/berlin2025) and apart from meeting a lot of great people, I took some tidbits away:

1. Docker&#39;s [Cache mounts](https://docs.docker.com/build/cache/optimize/#:~:text=Cache%20mounts%20are,-a%20way%20to) can be used to solve the problem of a single pip dependency change invalidating the entire Docker cache. So instead of doing:

   ```Dockerfile
   RUN pip install -r requirements.txt
   ```
   You can do:

   ```Dockerfile
   RUN --mount=type=cache,target=/root/.cache/pip \
       pip install -r requirements.txt
   ```
   Or, equivalently, for `uv`

   ```Dockerfile
    RUN --mount=type=cache,target=/root/.cache/uv \
        uv sync
   ```
   This will cache the pip downloads and speed up subsequent builds.

1. You can, through the magic of WebAssembly, run DuckDB in the browser: https://shell.duckdb.org
1. For documentation, people (e.g. like Github, Cloudflare, basically everyone) are more or less following the [Diátaxis](https://diataxis.fr/) framework. I have a Dejavu feeling that I have seen this somewhere before under a different name. The idea is to split documentation into four categories: tutorials, how-to guides, explanations, and references. Tutorials and how-to guides are task-oriented, while explanations and references are information-oriented (on a need-to-know basis).
1. How did I miss [WebLLM](https://webllm.mlc.ai) before?
1. For PDF/HTML parsing and text extraction [docling](https://github.com/docling-project/docling) is the new hotness and already very promising.

</source:markdown>
    </item>
    
    <item>
      <title>patience</title>
      <link>https://blog.better-idea.org/2025/07/18/patience/</link>
      <pubDate>Fri, 18 Jul 2025 15:30:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2025/07/18/patience/</guid>
      <description>&lt;p&gt;Sometimes, with flaky tests, you just have to have some &lt;code&gt;patience&lt;/code&gt;. I have written this helper script recently to use &lt;code&gt;git bisect&lt;/code&gt; with a somewhat flaky test:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mat/dotfiles/blob/master/bin/patience&#34;&gt;https://github.com/mat/dotfiles/blob/master/bin/patience&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>Sometimes, with flaky tests, you just have to have some `patience`. I have written this helper script recently to use `git bisect` with a somewhat flaky test: 

https://github.com/mat/dotfiles/blob/master/bin/patience

</source:markdown>
    </item>
    
    <item>
      <title>Unicode Symbol as Text or Emoji</title>
      <link>https://blog.better-idea.org/2015/04/23/unicode-symbol-as-text-or/</link>
      <pubDate>Thu, 23 Apr 2015 11:23:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2015/04/23/unicode-symbol-as-text-or/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://mts.io/2015/04/21/unicode-symbol-render-text-emoji/&#34;&gt;Unicode symbol as text or emoji&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Append &lt;a href=&#34;https://codepoints.net/U+FE0E&#34;&gt;codepoints.net/U+FE0E&lt;/a&gt; to make a Unicode symbol render as text.&lt;/p&gt;
</description>
      <source:markdown>[Unicode symbol as text or emoji](http://mts.io/2015/04/21/unicode-symbol-render-text-emoji/)

Append [codepoints.net/U+FE0E](https://codepoints.net/U+FE0E) to make a Unicode symbol render as text.

</source:markdown>
    </item>
    
    <item>
      <title>When tech is fully adopted, it disappears</title>
      <link>https://blog.better-idea.org/2014/11/02/when-tech-is-fully-adopted/</link>
      <pubDate>Sun, 02 Nov 2014 21:57:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2014/11/02/when-tech-is-fully-adopted/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When tech is fully adopted, it disappears.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://www.slideshare.net/slideshow/mobile-is-eating-the-world-40841467/40841467#41&#34;&gt;Mobile Is Eating the World&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>&gt; When tech is fully adopted, it disappears.

-- [Mobile Is Eating the World](https://www.slideshare.net/slideshow/mobile-is-eating-the-world-40841467/40841467#41)
</source:markdown>
    </item>
    
    <item>
      <title>Alfred: UIColor from Hex</title>
      <link>https://blog.better-idea.org/2013/10/16/alfred-uicolor-from-hex/</link>
      <pubDate>Wed, 16 Oct 2013 16:03:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2013/10/16/alfred-uicolor-from-hex/</guid>
      <description>&lt;p&gt;Being tired of manually creating &lt;a href=&#34;https://developer.apple.com/documentation/uikit/uicolor&#34;&gt;UIColor&lt;/a&gt; instances from hexadecimal representations (and not always having a category on UIColor handy for this) I finally hacked together this humble Alfred script to do just that:&lt;/p&gt;
&lt;p&gt;E voilà, we now have this string waiting in the clipboard:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[UIColor colorWithRed:19.0f/256.0f green:55.0f/256.0f blue:66.0f/256.0f alpha:1.0f]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Download Workflow from GitHub: &lt;a href=&#34;https://github.com/mat/dotfiles/blob/master/Alfred/UIColor-from-Hex.alfredworkflow?raw=true&#34;&gt;UIColor-from-Hex.alfredworkflow&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;https://blog.better-idea.org/uploads/2025/alfred-uicolor.png&#34;&gt;
</description>
      <source:markdown>Being tired of manually creating [UIColor](https://developer.apple.com/documentation/uikit/uicolor) instances from hexadecimal representations (and not always having a category on UIColor handy for this) I finally hacked together this humble Alfred script to do just that:



E voilà, we now have this string waiting in the clipboard:

```
[UIColor colorWithRed:19.0f/256.0f green:55.0f/256.0f blue:66.0f/256.0f alpha:1.0f]
```


Download Workflow from GitHub: [UIColor-from-Hex.alfredworkflow](https://github.com/mat/dotfiles/blob/master/Alfred/UIColor-from-Hex.alfredworkflow?raw=true)

&lt;img src=&#34;https://blog.better-idea.org/uploads/2025/alfred-uicolor.png&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Incremental Development — No Silver Bullet</title>
      <link>https://blog.better-idea.org/2012/05/20/incremental-development-no-silver-bullet/</link>
      <pubDate>Sun, 20 May 2012 12:58:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2012/05/20/incremental-development-no-silver-bullet/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Incremental development — grow, don&amp;rsquo;t build, software.&lt;/p&gt;
&lt;p&gt;I still remember the jolt I felt in 1958 when I first heard a friend talk about building a program, as opposed to writing one. In a flash he broadened my whole view of the software process. The metaphor shift was powerful, and accurate. Today we understand how like other building processes the construction of software is, and we freely use other elements of the metaphor, such as specifications, assembly of components, and scaffolding.&lt;/p&gt;
&lt;p&gt;The building metaphor has outlived its usefulness. It is time to change again. If, as I believe, the conceptual structures we construct today are too complicated to be specified accurately in advance, and too complex to be built faultlessly, then we must take a radically different approach.&lt;/p&gt;
&lt;p&gt;[&amp;hellip;] Some years ago Harlan Mills proposed that any software system should be grown by incremental development. That is, the system should first be made to run, even if it does nothing useful except call the proper set of dummy subprograms. Then, bit by bit, it should be fleshed out, with the subprograms in turn being developed&amp;ndash;into actions or calls to empty stubs in the level below.&lt;/p&gt;
&lt;p&gt;I have seen most dramatic results since I began urging this technique on the project builders in my Software Engineering Laboratory class. Nothing in the past decade has so radically changed my own practice, or its effectiveness. The approach necessitates top-down design, for it is a top-down growing of the software. It allows easy backtracking. It lends itself to early prototypes. Each added function and new provision for more complex data or circumstances grows organically out of what is already there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a href=&#34;https://www.cgl.ucsf.edu/Outreach/pc204/NoSilverBullet.html?cmdf=fred+brooks+no+silver+bullet+html#:~:text=Incremental%20development&#34;&gt;Fred Brooks, No Silver Bullet, 1986&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>&gt; Incremental development — grow, don&#39;t build, software.
&gt;
&gt; I still remember the jolt I felt in 1958 when I first heard a friend talk about building a program, as opposed to writing one. In a flash he broadened my whole view of the software process. The metaphor shift was powerful, and accurate. Today we understand how like other building processes the construction of software is, and we freely use other elements of the metaphor, such as specifications, assembly of components, and scaffolding.
&gt;
&gt; The building metaphor has outlived its usefulness. It is time to change again. If, as I believe, the conceptual structures we construct today are too complicated to be specified accurately in advance, and too complex to be built faultlessly, then we must take a radically different approach.
&gt;
&gt; [...] Some years ago Harlan Mills proposed that any software system should be grown by incremental development. That is, the system should first be made to run, even if it does nothing useful except call the proper set of dummy subprograms. Then, bit by bit, it should be fleshed out, with the subprograms in turn being developed--into actions or calls to empty stubs in the level below.
&gt;
&gt; I have seen most dramatic results since I began urging this technique on the project builders in my Software Engineering Laboratory class. Nothing in the past decade has so radically changed my own practice, or its effectiveness. The approach necessitates top-down design, for it is a top-down growing of the software. It allows easy backtracking. It lends itself to early prototypes. Each added function and new provision for more complex data or circumstances grows organically out of what is already there.

— [Fred Brooks, No Silver Bullet, 1986](https://www.cgl.ucsf.edu/Outreach/pc204/NoSilverBullet.html?cmdf=fred+brooks+no+silver+bullet+html#:~:text=Incremental%20development)

</source:markdown>
    </item>
    
    <item>
      <title>Marco Arment on &#39;interesting&#39; features</title>
      <link>https://blog.better-idea.org/2011/01/26/marco-arment-on-interesting-features/</link>
      <pubDate>Wed, 26 Jan 2011 09:27:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2011/01/26/marco-arment-on-interesting-features/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Geeks like us are always tempted to implement very complex, never-ending features because they’re academically or algorithmically interesting, or because they can add massive value if done well, such as speech or handwriting recognition, recommendation engines, or natural-language processing.&lt;/p&gt;
&lt;p&gt;These features — often very easy for people but very hard for computers — often produce mediocre-at-best results, are never truly finished, and usually require massive time investments to achieve incremental progress with diminishing returns.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;http://www.randsinrepose.com/archives/2011/01/25/interview_marco_arment.html&#34;&gt;http://www.randsinrepose.com/archives/2011/01/25/interview_marco_arment.html&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>&gt; Geeks like us are always tempted to implement very complex, never-ending features because they’re academically or algorithmically interesting, or because they can add massive value if done well, such as speech or handwriting recognition, recommendation engines, or natural-language processing.
&gt;
&gt; These features — often very easy for people but very hard for computers — often produce mediocre-at-best results, are never truly finished, and usually require massive time investments to achieve incremental progress with diminishing returns.

-- &lt;http://www.randsinrepose.com/archives/2011/01/25/interview_marco_arment.html&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Fowler on Craftmanship</title>
      <link>https://blog.better-idea.org/2011/01/21/fowler-on-craftmanship/</link>
      <pubDate>Fri, 21 Jan 2011 01:11:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2011/01/21/fowler-on-craftmanship/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The software shouldn&amp;rsquo;t be at the center of a programmer&amp;rsquo;s world, instead a programmer should focus on the benefit that the software is supposed to deliver.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;http://martinfowler.com/bliki/CraftmanshipAndTheCrevasse.html&#34;&gt;http://martinfowler.com/bliki/CraftmanshipAndTheCrevasse.html&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>&gt; The software shouldn&#39;t be at the center of a programmer&#39;s world, instead a programmer should focus on the benefit that the software is supposed to deliver.

-- &lt;http://martinfowler.com/bliki/CraftmanshipAndTheCrevasse.html&gt;

</source:markdown>
    </item>
    
    <item>
      <title>Fowler on Productivity</title>
      <link>https://blog.better-idea.org/2010/11/21/fowler-on-productivity/</link>
      <pubDate>Sun, 21 Nov 2010 10:38:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2010/11/21/fowler-on-productivity/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I assert that any true measure of software development productivity must be based on delivered business value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;http://martinfowler.com/bliki/CannotMeasureProductivity.html&#34;&gt;http://martinfowler.com/bliki/CannotMeasureProductivity.html&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>&gt; I assert that any true measure of software development productivity must be based on delivered business value.

-- &lt;http://martinfowler.com/bliki/CannotMeasureProductivity.html&gt;

</source:markdown>
    </item>
    
    <item>
      <title>Fowler and Rebecca Parsons on DSLs</title>
      <link>https://blog.better-idea.org/2010/11/21/fowler-and-rebecca-parsons-on/</link>
      <pubDate>Sun, 21 Nov 2010 05:02:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2010/11/21/fowler-and-rebecca-parsons-on/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.drdobbs.com/architecture-and-design/228200852&#34;&gt;http://www.drdobbs.com/architecture-and-design/228200852&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Good overview, Q&amp;amp;A style.  Remember to keep your DSL simple (otherwise it might morph into just another L)&lt;/p&gt;
</description>
      <source:markdown>&lt;http://www.drdobbs.com/architecture-and-design/228200852&gt;

Good overview, Q&amp;A style.  Remember to keep your DSL simple (otherwise it might morph into just another L)

</source:markdown>
    </item>
    
    <item>
      <title>Advanced Regular Expressions</title>
      <link>https://blog.better-idea.org/2010/11/16/advanced-regular-expressions/</link>
      <pubDate>Tue, 16 Nov 2010 11:37:00 +0100</pubDate>
      
      <guid>http://matthiasl.micro.blog/2010/11/16/advanced-regular-expressions/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/&#34;&gt;http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I always forget about word boundaries and back references.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: &lt;a href=&#34;http://stackoverflow.com/questions/868181/hidden-features-of-regex/1269657#1269657&#34;&gt;stackoverflow.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
      <source:markdown>&lt;http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/&gt;

I always forget about word boundaries and back references.

*Source: [stackoverflow.com](http://stackoverflow.com/questions/868181/hidden-features-of-regex/1269657#1269657)*


</source:markdown>
    </item>
    
  </channel>
</rss>
