A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="en">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Echoing Wirth's plea for lean software (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Is that even respected? Retrospectively? What a shAItshow…
  28. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  29. <meta name="robots" content="noai, noimageai">
  30. <!-- Documented, feel free to shoot an email. -->
  31. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  32. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  36. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  37. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  38. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  39. <script>
  40. function toggleTheme(themeName) {
  41. document.documentElement.classList.toggle(
  42. 'forced-dark',
  43. themeName === 'dark'
  44. )
  45. document.documentElement.classList.toggle(
  46. 'forced-light',
  47. themeName === 'light'
  48. )
  49. }
  50. const selectedTheme = localStorage.getItem('theme')
  51. if (selectedTheme !== 'undefined') {
  52. toggleTheme(selectedTheme)
  53. }
  54. </script>
  55. <meta name="robots" content="noindex, nofollow">
  56. <meta content="origin-when-cross-origin" name="referrer">
  57. <!-- Canonical URL for SEO purposes -->
  58. <link rel="canonical" href="https://blog.testdouble.com/posts/2024-01-24-plea-for-lean/">
  59. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  60. <article>
  61. <header>
  62. <h1>Echoing Wirth's plea for lean software</h1>
  63. </header>
  64. <nav>
  65. <p class="center">
  66. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  68. </svg> Accueil</a> •
  69. <a href="https://blog.testdouble.com/posts/2024-01-24-plea-for-lean/" title="Lien vers le contenu original">Source originale</a>
  70. <br>
  71. Mis en cache le 2024-01-24
  72. </p>
  73. </nav>
  74. <hr>
  75. <p>Our industry lost one of its great minds on New Year’s Day as Niklaus Wirth passed at the age of 89. My first real computer programming class in high school used Pascal, which he designed in 1970, and the majority of my college courses used Modula-2, which he also designed in 1975. Both of these languages advanced the field of programming with innovations like modules, one-pass compilation, and concurrent programming. The type safety, clarity, and compiler support made these languages very approachable and easy to learn, likely keeping me on the path of a career in our industry. One of his greatest contributions to our field, that seems eerily prescient now, is his article “A Plea for Lean Software” published in Computer magazine in 1995.</p>
  76. <p>The article laments the fact that we have been conditioned with significant advances in hardware, leading to software that is unnecessarily bloated. Humorously, the article begins by addressing how memory requirements jump “from several to many megabytes." I am writing this blog post in a browser window that is consuming 700MB while reviewing his article in Preview, clocking in at just shy of 1GB of memory consumption, almost proving his point 29 years later.</p>
  77. <p><strong>We are spoiled</strong></p>
  78. <p>The premise that software projects and programmers have become spoiled by the rapid advances in hardware is evident now more than ever. I carry around an iPhone 15 that has 2.15 teraflops of processing power. The most powerful supercomputer at the time I graduated college in 1998 could only do 1.6 teraflops. Looking back 25 years, it’s hard to imagine software development on such antiquated hardware, but I can attest that many of the systems we developed in the late 90s and early 2000s are still running to this day. Many of the biggest businesses with systems that need minimal downtime and no margin of error still run mainframe systems that were built in the 80s and 90s. Contrast that to the build in 3 months, run for 3 years, and then rewrite it all pattern that is so prevalent in businesses today and I think Mr. Wirth may have been on to something.</p>
  79. <p>His article focused almost completely on the advances in hardware that were spoiling us, but 30 years later we also have massive advances in software that provide significant gains in programming efficiency. We operate on programming languages and frameworks that no longer require us to manually manage memory consumption. There’s largely no need for configuring parallelism in our systems for computational heavy tasks. In almost any web development language, we can largely pull in a number of prebuilt frameworks or packages that will solve a huge number of problems that he would’ve had to tackle himself. How then was he so much more productive than most of the teams I see today?</p>
  80. <p>In the article, he’s trying to distill the lessons they learned while creating the Oberon System, a text-based user interface and operating system that he and a colleague completed in 3 years. It was based upon the programming language Oberon, which they also developed in this time. Keep in mind, they designed and developed this system 37 years ago, when their workstations likely had less than 2MB of RAM and were able to perform maybe 2M instructions per second. I struggle to imagine even the best programmers that I know creating an OS and a programming language under these constraints. What led to their success?</p>
  81. <p><strong>MOAR FEATURES</strong></p>
  82. <p>A point that he makes consistently throughout the article is that, as an industry, we have tendency to build a lot of features that no one really wants or needs.</p>
  83. <p><em>Uncontrolled software growth has also been accepted because customers have trouble distinguishing between essential features and those that are just “nice to have.”</em></p>
  84. <p>We see this all. the. time. Software businesses that are bootstrapped or early stage have to focus maniacally on only building the features that are proven to be critical to adoption. Then as adoption picks up, a second or third round of funding comes in, and these same businesses accelerate right out of the lean startup mindset. That first sales hire brings every idea to the table that a prospect may have mentioned into the newer and longer list of <strong>critical features</strong>. Immature product management does a poor job of validating the features and pruning the list into the set of features that truly drive outcomes.</p>
  85. <p>It results in large systems that are extremely difficult for end users to operate within. Simplicity is inversely proportional to the number of features available for use.</p>
  86. <p><img src="https://cdn-blog.testdouble.com/img/plea-for-lean/simplicity-graph.f6526546c7913435ddea37cc72251c703d73bd6a7fc05e8b2bc7f3dc0fa98798.png" alt="Simplicity vs Features" class="" loading="eager"></p>
  87. <p>When simplicity goes away, businesses are then forced to invest in other areas like documentation, training, and customer support. All for a user experience that is more likely to drive away new customers instead of achieving the original goal of bringing more users in. If you don’t believe me, ask yourself how often you see teams prioritize removing neglected features as part of their planning?</p>
  88. <p><em>Any and all features mean design becomes more complicated and usability more cumbersome.</em></p>
  89. <p>This incessant accumulation of features results in another cause for inefficiency: larger and larger software organizations.</p>
  90. <p><strong>MOAR DEVELOPERS</strong></p>
  91. <p>In my experience, overly complicated software designs are the number one reason for failure within software focused businesses. Yet engineering leaders rarely focus on addressing complexity within their systems. I can only assume that they believe the complexity is necessary and not incidental, which leaves them with only one option to pursue: throw more bodies at the problem.</p>
  92. <p><em>The belief that complex systems require armies of designers and programmers is wrong.</em></p>
  93. <p>Wirth couldn’t have been more correct on this point. He built an entire operating system and a new programming language with one collaborator. Yet we hear of teams increasing their engineering personnel by 10, 20, 50, even 100s of developers. It’s so common at this point it’s become a badge of honor and a means for proving the value of an organization for the next round of investors. There’s only one problem with this line of thinking: it’s wrong.</p>
  94. <p>If these businesses truly relied upon so many engineers to achieve success, we would not have had <strong><strong>262,582</strong></strong> people laid off in 2023 alone as an industry (credit <a href="https://layoffs.fyi/">layoffs.fyi</a>). Businesses feel an inherent pressure to be first to market, otherwise they’ll have missed their window and their idea will be dead on arrival. They will do whatever they can to achieve success, including over-hiring on the basis that 10 developers will complete a project in 1/10th of the time of a single developer. As my co-founder, Justin Searls, describes in this <a href="../2023-04-03-never-staff-to-the-peak">thorough blog post</a>, staffing engineering teams to peak levels has a multitude of bad outcomes. Not just for the business, but as we’ve seen the last couple of years, for the engineering teams themselves.</p>
  95. <p><strong>A Plea for Lean Software Teams</strong></p>
  96. <p>If we are to get back to leaner and more efficient software development organizations, we need to solve both of these problems - too many features and too many developers.</p>
  97. <p>Businesses need highly capable product managers who focus relentlessly on driving outcomes, not output. It’s exciting to see many of the agile consultants I used to work with focusing more in this space. It’s one of the reasons we’re extremely excited about <a href="../2023-11-08-test-double-acquires-pathfinder">working with Pathfinder Product</a> more closely. Great product managers are difficult to find, but when you have highly capable people in these roles, they have an outsized impact on the business.</p>
  98. <p>Further, if we have learned anything in the last 3 years as an industry, it should be to strive for building small, highly efficient teams and avoiding bloated, overstaffed organizations at all costs. Larger teams move slower, create more incidental complexity, and are much more susceptible to the layoffs we’ve all been suffering through. Engineering leaders would be well served to focus on hiring smaller teams and providing them with sufficient time and support to create simple solutions that generate business value.</p>
  99. </article>
  100. <hr>
  101. <footer>
  102. <p>
  103. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  104. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  105. </svg> Accueil</a> •
  106. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  107. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  108. </svg> Suivre</a> •
  109. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  110. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  111. </svg> Pro</a> •
  112. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  113. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  114. </svg> Email</a> •
  115. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  116. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  117. </svg> Légal</abbr>
  118. </p>
  119. <template id="theme-selector">
  120. <form>
  121. <fieldset>
  122. <legend><svg class="icon icon-brightness-contrast">
  123. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  124. </svg> Thème</legend>
  125. <label>
  126. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  127. </label>
  128. <label>
  129. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  130. </label>
  131. <label>
  132. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  133. </label>
  134. </fieldset>
  135. </form>
  136. </template>
  137. </footer>
  138. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  139. <script>
  140. function loadThemeForm(templateName) {
  141. const themeSelectorTemplate = document.querySelector(templateName)
  142. const form = themeSelectorTemplate.content.firstElementChild
  143. themeSelectorTemplate.replaceWith(form)
  144. form.addEventListener('change', (e) => {
  145. const chosenColorScheme = e.target.value
  146. localStorage.setItem('theme', chosenColorScheme)
  147. toggleTheme(chosenColorScheme)
  148. })
  149. const selectedTheme = localStorage.getItem('theme')
  150. if (selectedTheme && selectedTheme !== 'undefined') {
  151. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  152. }
  153. }
  154. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  155. window.addEventListener('load', () => {
  156. let hasDarkRules = false
  157. for (const styleSheet of Array.from(document.styleSheets)) {
  158. let mediaRules = []
  159. for (const cssRule of styleSheet.cssRules) {
  160. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  161. continue
  162. }
  163. // WARNING: Safari does not have/supports `conditionText`.
  164. if (cssRule.conditionText) {
  165. if (cssRule.conditionText !== prefersColorSchemeDark) {
  166. continue
  167. }
  168. } else {
  169. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  170. continue
  171. }
  172. }
  173. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  174. }
  175. // WARNING: do not try to insert a Rule to a styleSheet you are
  176. // currently iterating on, otherwise the browser will be stuck
  177. // in a infinite loop…
  178. for (const mediaRule of mediaRules) {
  179. styleSheet.insertRule(mediaRule.cssText)
  180. hasDarkRules = true
  181. }
  182. }
  183. if (hasDarkRules) {
  184. loadThemeForm('#theme-selector')
  185. }
  186. })
  187. </script>
  188. </body>
  189. </html>