A place to cache linked articles (think custom and personal wayback machine)
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

index.html 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  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>Vibe Driven Development (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://www.robinrendle.com/notes/vibe-driven-development/">
  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>Vibe Driven Development</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://www.robinrendle.com/notes/vibe-driven-development/" title="Lien vers le contenu original">Source originale</a>
  70. </p>
  71. </nav>
  72. <hr>
  73. <p>Building a great product is a matter of two questions: How should we measure progress? And what should we build next?</p>
  74. <p>That first question is the most important because how you collect data and what you count as success influences everything else; if your organization is measuring shit then they’ll build nothing but shit. And most product orgs suck and churn out garbage projects because they waste so much time thinking in terms of junk data and half baked user inputs to inform their decisions.</p>
  75. <p>(Show me what your org measures and I’ll show ya the crappy product that comes out the other side.)</p>
  76. <p>The problem underlying all this is that when it comes to building a product, all data is garbage, a lie, or measuring the wrong thing. Folks will be obsessed with clicks and charts and NPS scores—the NFTs of product management—and in this sea of noise they believe they can see the product clearly. There are courses and books and talks all about measuring happiness and growth—surveys! surveys! surveys!—with everyone in the field believing that they’ve built a science when they’ve really built a cult.</p>
  77. <p>(No great product has ever been made because of the answers collected in a dumb user survey.)</p>
  78. <p>So how do you measure progress then?</p>
  79. <p>I guess customers could tell us the answer, right? Well, no. Sure, you can talk to customers to see <em>how</em> they struggle but they cannot tell you <em>why</em> they struggle. They’ll have terrible ideas for improvements like “I really wish AI could show me all the relevant things on this page” or “I want more dashboards” where the answer is always much simpler than that. Customer feedback is a geiger counter: they can tell you about the problem coming your way but not how to prevent it.</p>
  80. <p>(Customers, like data, will always mislead us on what to build next.)</p>
  81. <p>See, I don’t think you can build a great product for customers. Yes, yes, yes; you can make billions of dollars building something for customers and go live on a beach in the south of France. But you’ll have built junk in the process; the product will suffer if you build it for customers. You’ll spend every waking moment trying to measure user happiness and score feelings in a spreadsheet and not improving the product.</p>
  82. <p>In every product org it feels as if folks mistake qualitative data—stuff that can’t be measured like feelings—with quantitative data—stuff that can be measured like numbers or time or temperature. They’ll say “this user is 4.5% happy” and, okay, great. Now what? This numerical value sure is bullshit but it’s not even helpful bullshit because these numbers never explain why things suck.</p>
  83. <p>(Just look at the product and it will tell you why it sucks.)</p>
  84. <p>It comes down to this annoying, upsetting, stupid fact: the only way to build a great product is to use it every day, to stare at it, to hold it in your hands to feel its lumps. The data and customers will lie to you but the product never will. And most product orgs suck because they simply don’t use the products that they’re building; they ship incremental nothings without direction because they’re looking at spreadsheets all day long filled with junk data nothings.</p>
  85. <p>See, I don’t know much about product stuff. I have no experience as a product manager, no experience running teams or building a company. Take everything I say here with an enormous silo of salt. But: I don’t care what the data shows me and I’m not sure I ever will. You can show me charts and spreadsheets all day long and I will not care. Tell me what your gut says instead after relentless experience of the product every day. This is the only way to see the world clearly.</p>
  86. <p>Perhaps arbitrary, perhaps a bit naive, but the answer is <a href="https://weeknotes.buttondown.email/archive/trading-time-for-visibility/">vibe-driven development</a>. If you have good experience of the product, your vibes will lead you down the right path of what to build next. I think this is why small orgs make better things faster than large orgs; they’re all about the vibes. Large orgs are bloated and frozen in place because they spend all their time talking about bullshit numbers instead of looking at the product. Whilst smaller orgs typically aren’t run by the numbers, they’re so focused on the product because they have to.</p>
  87. <p>So when we use data to drive development it always leads us down the wrong path, it forces us to look in all the wrong places for the answers. Customers can tell you what sucks, sure. Dashboards and spreadsheets can show you attrition or whatever, yes. But these inputs can’t build a vision of your product for you. They’re mostly distractions and any moment with your eye off the product is a moment lost to making it better.</p>
  88. <p>You can only build a great product if you care more for the vibes than for the data.</p>
  89. </article>
  90. <hr>
  91. <footer>
  92. <p>
  93. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  94. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  95. </svg> Accueil</a> •
  96. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  97. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  98. </svg> Suivre</a> •
  99. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  100. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  101. </svg> Pro</a> •
  102. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  103. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  104. </svg> Email</a> •
  105. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  106. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  107. </svg> Légal</abbr>
  108. </p>
  109. <template id="theme-selector">
  110. <form>
  111. <fieldset>
  112. <legend><svg class="icon icon-brightness-contrast">
  113. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  114. </svg> Thème</legend>
  115. <label>
  116. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  117. </label>
  118. <label>
  119. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  120. </label>
  121. <label>
  122. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  123. </label>
  124. </fieldset>
  125. </form>
  126. </template>
  127. </footer>
  128. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  129. <script>
  130. function loadThemeForm(templateName) {
  131. const themeSelectorTemplate = document.querySelector(templateName)
  132. const form = themeSelectorTemplate.content.firstElementChild
  133. themeSelectorTemplate.replaceWith(form)
  134. form.addEventListener('change', (e) => {
  135. const chosenColorScheme = e.target.value
  136. localStorage.setItem('theme', chosenColorScheme)
  137. toggleTheme(chosenColorScheme)
  138. })
  139. const selectedTheme = localStorage.getItem('theme')
  140. if (selectedTheme && selectedTheme !== 'undefined') {
  141. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  142. }
  143. }
  144. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  145. window.addEventListener('load', () => {
  146. let hasDarkRules = false
  147. for (const styleSheet of Array.from(document.styleSheets)) {
  148. let mediaRules = []
  149. for (const cssRule of styleSheet.cssRules) {
  150. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  151. continue
  152. }
  153. // WARNING: Safari does not have/supports `conditionText`.
  154. if (cssRule.conditionText) {
  155. if (cssRule.conditionText !== prefersColorSchemeDark) {
  156. continue
  157. }
  158. } else {
  159. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  160. continue
  161. }
  162. }
  163. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  164. }
  165. // WARNING: do not try to insert a Rule to a styleSheet you are
  166. // currently iterating on, otherwise the browser will be stuck
  167. // in a infinite loop…
  168. for (const mediaRule of mediaRules) {
  169. styleSheet.insertRule(mediaRule.cssText)
  170. hasDarkRules = true
  171. }
  172. }
  173. if (hasDarkRules) {
  174. loadThemeForm('#theme-selector')
  175. }
  176. })
  177. </script>
  178. </body>
  179. </html>