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 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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>The Demo → Demo Loop (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://daverupert.com/2022/06/demo-to-demo-loop/">
  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>The Demo → Demo Loop</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://daverupert.com/2022/06/demo-to-demo-loop/" title="Lien vers le contenu original">Source originale</a>
  70. <br>
  71. Mis en cache le 2024-01-09
  72. </p>
  73. </nav>
  74. <hr>
  75. <p><picture>
  76. <source media="(prefers-color-scheme: dark)" srcset="https://daverupert.com/images/posts/2022/squiggle-dark.png"></source>
  77. <img alt="The design squiggle with a tightening loop overlayed" src="https://daverupert.com/images/posts/2022/squiggle.png">
  78. </picture></p>
  79. <p>I’m 100% convinced that working demo-to-demo is the secret formula to making successful creative products.</p>
  80. <ul>
  81. <li>Video games have a strong history of <a href="https://daverupert.com/2021/10/the-mistake-every-new-game-developer-makes/">ritualizing prototypes</a>, play testing, and <a href="https://daverupert.com/2020/09/follow-the-fun/">following the fun</a>. There’s even some <a href="https://www.microsoft.com/en-us/research/publication/what-went-right-and-what-went-wrong-an-analysis-of-155-postmortems-from-game-development/">data that suggests prototypes increase your chances of success</a>.</li>
  82. <li>Mentioned in <a href="https://amzn.to/3OhPgKk">Creativity, Inc</a> and exemplified in the Frozen II documentary <em><a href="https://disneyplusoriginals.disney.com/show/into-the-unknown-making-frozen-2">Into the Unknown</a>,</em> Pixar and Disney Animation use “dailies” to demo work in progress. Each animator shares their progress every day on the five seconds of film they’re responsible for.</li>
  83. <li>Outlined in Ken Kocienda’s book <a href="https://amzn.to/3AC7COp">Creative Selection</a>, Apple’s clandestine “Project Purple” that made the iPhone embraced frequent demos when creating iOS, but at the speed at which they were working “hallway demos” would happen hours or minutes after a previous demo.</li>
  84. <li>A core part of <a href="https://www.thesprintbook.com/">Design Sprints</a> is getting a functioning prototype in front of users so your team can prove and vet an idea in a week rather than months.</li>
  85. </ul>
  86. <p>Or as IDEO famously put it…</p>
  87. <blockquote>
  88. <p>A prototype is worth a thousand meetings<br>
  89. — IDEO</p>
  90. </blockquote>
  91. <p>Demos improve meetings. I’ve found “Demo First” meetings are life-giving because they start with something tangible, as opposed to discussing some hypothetical future scenario until time runs out and you have to schedule more meetings. Start meetings by showing progress. Better yet, a demo doesn’t always need to be a call or a meeting; thirty second screencasts are as good as gold.</p>
  92. <p>Demos improve workflows. Breaking up large tasks into “what can I demo next” is an exciting way to work. There’s always an immediate goal for me to find a demo-able checkpoint where I can get tactical feedback frequently. It can save a lot of rework and we can catch ourselves going down a bad path early.</p>
  93. <p>Demos improve project scoping. Demos and prototypes give you a good idea of <em>what’s easy</em> and <em>what’s hard</em> in the underlying system. Demoing often means you and others may be able to spot problems far off or find “fast paths” mid-flight. Often slight corrections or adjustments to the design can save weeks or months of work without sacrificing quality or user experience.</p>
  94. <p>If I’m honest, “Dailies” are probably overkill, but I wouldn’t hate it. I would certainly prefer daily demos over vague, ritualistic standup-speak. It’s worth noting here that not all days or weeks are bangers. What’s important is establishing an organizational practice of demo’ing and honing your skills and confidence at providing demos.</p>
  95. <p>The point is, do whatever is a right fit for your organization but <strong>never wait too long to demo</strong>. Allow room for ad hoc “hallway” demos to happen. And move the needle closer to daily.</p>
  96. </article>
  97. <hr>
  98. <footer>
  99. <p>
  100. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  101. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  102. </svg> Accueil</a> •
  103. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  104. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  105. </svg> Suivre</a> •
  106. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  107. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  108. </svg> Pro</a> •
  109. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  110. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  111. </svg> Email</a> •
  112. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  113. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  114. </svg> Légal</abbr>
  115. </p>
  116. <template id="theme-selector">
  117. <form>
  118. <fieldset>
  119. <legend><svg class="icon icon-brightness-contrast">
  120. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  121. </svg> Thème</legend>
  122. <label>
  123. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  124. </label>
  125. <label>
  126. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  127. </label>
  128. <label>
  129. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  130. </label>
  131. </fieldset>
  132. </form>
  133. </template>
  134. </footer>
  135. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  136. <script>
  137. function loadThemeForm(templateName) {
  138. const themeSelectorTemplate = document.querySelector(templateName)
  139. const form = themeSelectorTemplate.content.firstElementChild
  140. themeSelectorTemplate.replaceWith(form)
  141. form.addEventListener('change', (e) => {
  142. const chosenColorScheme = e.target.value
  143. localStorage.setItem('theme', chosenColorScheme)
  144. toggleTheme(chosenColorScheme)
  145. })
  146. const selectedTheme = localStorage.getItem('theme')
  147. if (selectedTheme && selectedTheme !== 'undefined') {
  148. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  149. }
  150. }
  151. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  152. window.addEventListener('load', () => {
  153. let hasDarkRules = false
  154. for (const styleSheet of Array.from(document.styleSheets)) {
  155. let mediaRules = []
  156. for (const cssRule of styleSheet.cssRules) {
  157. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  158. continue
  159. }
  160. // WARNING: Safari does not have/supports `conditionText`.
  161. if (cssRule.conditionText) {
  162. if (cssRule.conditionText !== prefersColorSchemeDark) {
  163. continue
  164. }
  165. } else {
  166. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  167. continue
  168. }
  169. }
  170. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  171. }
  172. // WARNING: do not try to insert a Rule to a styleSheet you are
  173. // currently iterating on, otherwise the browser will be stuck
  174. // in a infinite loop…
  175. for (const mediaRule of mediaRules) {
  176. styleSheet.insertRule(mediaRule.cssText)
  177. hasDarkRules = true
  178. }
  179. }
  180. if (hasDarkRules) {
  181. loadThemeForm('#theme-selector')
  182. }
  183. })
  184. </script>
  185. </body>
  186. </html>