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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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>
  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>Principles and priorities (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="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2020-06-19.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <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>
  30. <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>
  31. <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>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script type="text/javascript">
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="https://adactio.com/journal/16811">
  55. <body class="remarkdown h1-underline h2-underline h3-underline hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>Principles and priorities</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  63. <a href="https://adactio.com/journal/16811" title="Lien vers le contenu original">Source originale</a>
  64. </p>
  65. </nav>
  66. <hr>
  67. <main>
  68. <p>I think about design principles a lot. I’m such a nerd for design principles, I even have <a href="https://principles.adactio.com">a collection</a>. I’m not saying all of the design principles in the collection are good—far from it! I collect them without judgement.</p>
  69. <p>As for what makes a good design principle, <a href="https://adactio.com/journal/15559">I’ve written about that before</a>. One aspect that everyone seems to agree on is that a design principle shouldn’t be an obvious truism. Take this as an example:</p>
  70. <blockquote>
  71. <p>Make it usable.</p>
  72. </blockquote>
  73. <p>Who’s going to disagree with that? It’s so agreeable that it’s practically worthless as a design principle. But now take this statement:</p>
  74. <blockquote>
  75. <p>Usability is more important than profitability.</p>
  76. </blockquote>
  77. <p>Ooh, now we’re talking! That’s controversial. That’s bound to surface some disagreement, which is a good thing. It’s now passing the reversability test—it’s not hard to imagine an endeavour driven by the opposite:</p>
  78. <blockquote>
  79. <p>Profitability is more important than usability.</p>
  80. </blockquote>
  81. <p>In either formulation, what makes these statements better than the bland toothless agreeable statements—“Usability is good!”, “Profitability is good!”—is that they introduce the element of prioritisation.</p>
  82. <p>I like design principles that can be formulated as:</p>
  83. <blockquote>
  84. <p>X, even over Y.</p>
  85. </blockquote>
  86. <p>It’s not saying that Y is unimportant, just that X is <em>more</em> important:</p>
  87. <blockquote>
  88. <p>Usability, even over profitability.</p>
  89. </blockquote>
  90. <p>Or:</p>
  91. <blockquote>
  92. <p>Profitability, even over usability.</p>
  93. </blockquote>
  94. <p>Design principles formulated this way help to crystalise priorities. <a href="https://clearleft.com/posts/getting-your-priorities-right">Chris has written about the importance of establishing—and revisiting—priorities on any project</a>:</p>
  95. <blockquote>
  96. <p>Prioritisation isn’t and shouldn’t be a one-off exercise. The changing needs of your customers, the business environment and new opportunities from technology mean prioritisation is best done as a regular activity.</p>
  97. </blockquote>
  98. <p>I’ve said it many times, but one on my favourite design principles comes from the <a href="https://www.w3.org/TR/html-design-principles/">HTML design principles</a>. The <a href="https://www.w3.org/TR/html-design-principles/#priority-of-constituencies">priority of consitituencies</a> (it’s got “priorities” right there in the name!):</p>
  99. <blockquote>
  100. <p>In case of conflict, consider users over authors over implementors over specifiers over theoretical purity.</p>
  101. </blockquote>
  102. <p>Or put another way:</p>
  103. <ul>
  104. <li>Users, even over authors.</li>
  105. <li>Authors, even over implementors.</li>
  106. <li>Implementors, even over specifiers.</li>
  107. <li>Specifiers, even over theoretical purity.</li>
  108. </ul>
  109. <p>When it comes to <a href="https://adactio.com/articles/12839">evaluating technology</a> for the web, I think there are a number of factors at play.</p>
  110. <p>First and foremost, there’s the end user. If a technology choice harms the end user, avoid it. I’m thinking here of the kind of performance tax that a user has to pay when developers choose to use megabytes of JavaScript.</p>
  111. <p>Mind you, some technologies have no direct effect on the end user. When it comes to build tools, version control, toolchains …all the stuff that sits on your computer and never directly interacts with users. In that situation, the wants and needs of developers can absolutely take priority.</p>
  112. <p>But as a general principle, I think this works:</p>
  113. <blockquote>
  114. <p>User experience, even over developer experience.</p>
  115. </blockquote>
  116. <p>Sadly, I think the current state of “modern” web development reverses that principle. Developer efficiency is prized above all else. Like I said, that would be absolutely fine if we’re talking about technologies that only developers are exposed to, but as soon as we’re talking about shipping those technologies over the network to end users, it’s negligent to continue to prioritise the developer experience.</p>
  117. <p>I feel like personal websites are an exception here. What you do on your own website is completely up to you. But once you’re taking a paycheck to make websites that will be used by other people, it’s incumbent on you to realise that it’s not about you.</p>
  118. <p>I’ve been talking about developers here, but this is something that applies just as much to designers. But I feel like designers go through that priority shift fairly early in their career. At the outset, they’re eager to make their mark and prove themselves. As they grow and realise that it’s not about them, they understand that the most appropriate solution for the user is what matters, even if that’s a “boring” tried-and-tested pattern that isn’t going to wow any fellow designers.</p>
  119. <p>I’d like to think that developers would follow a similar progression, and I’m sure that some do. But I’ve seen many senior developers who have grown <em>more</em> enamoured with technologies instead of honing in on the most appropriate technology for end users. Maybe that’s because in many organisations, developers are positioned further away from the end users (whereas designers are ideally being confronted with their creations being used by actual people). If a lead developer is focused on the productivity, efficiency, and happiness of the dev team, it’s no wonder that their priorities end up overtaking the user experience.</p>
  120. <p>I realise I’m talking in very binary terms here: developer experience versus user experience. I know it’s not always that simple. Other priorities also come into play, like business needs. Sometimes business needs are in direct conflict with user needs. If an online business makes its money through invasive tracking and surveillance, then there’s no point in having a design principle that claims to prioritise user needs above all else. That would be a hollow claim, and the design principle would become worthless.</p>
  121. <p>Because that’s the point with design principles. They’re there to be used. They’re not a nice fluffy exercise in feeling good about your work. The priority of constituencies begins, “in case of conflict” and that’s exactly when a design principle matters—when it’s tested.</p>
  122. <p>Suppose someone with a lot of clout in your organisation makes a decision, but that decision conflicts with your organisations’s design principles. Instead of having an opinion-based argument about who’s right or wrong, the previously agreed-upon design principles allow you to take ego out of the equation.</p>
  123. <p>Prioritisation isn’t easy, and it gets harder the more factors come into play: user needs, business needs, technical constraints. But it’s worth investing the time to get agreement on the priority of your constituencies. And then formulate that agreement into design principles.</p>
  124. </main>
  125. </article>
  126. <hr>
  127. <footer>
  128. <p>
  129. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  130. <a href="/david/log/" title="Accès au flux RSS">🤖</a> •
  131. <a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
  132. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
  133. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
  134. </p>
  135. <template id="theme-selector">
  136. <form>
  137. <fieldset>
  138. <legend>Thème</legend>
  139. <label>
  140. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  141. </label>
  142. <label>
  143. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  144. </label>
  145. <label>
  146. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  147. </label>
  148. </fieldset>
  149. </form>
  150. </template>
  151. </footer>
  152. <script type="text/javascript">
  153. function loadThemeForm(templateName) {
  154. const themeSelectorTemplate = document.querySelector(templateName)
  155. const form = themeSelectorTemplate.content.firstElementChild
  156. themeSelectorTemplate.replaceWith(form)
  157. form.addEventListener('change', (e) => {
  158. const chosenColorScheme = e.target.value
  159. localStorage.setItem('theme', chosenColorScheme)
  160. toggleTheme(chosenColorScheme)
  161. })
  162. const selectedTheme = localStorage.getItem('theme')
  163. if (selectedTheme && selectedTheme !== 'undefined') {
  164. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  165. }
  166. }
  167. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  168. window.addEventListener('load', () => {
  169. let hasDarkRules = false
  170. for (const styleSheet of Array.from(document.styleSheets)) {
  171. let mediaRules = []
  172. for (const cssRule of styleSheet.cssRules) {
  173. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  174. continue
  175. }
  176. // WARNING: Safari does not have/supports `conditionText`.
  177. if (cssRule.conditionText) {
  178. if (cssRule.conditionText !== prefersColorSchemeDark) {
  179. continue
  180. }
  181. } else {
  182. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  183. continue
  184. }
  185. }
  186. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  187. }
  188. // WARNING: do not try to insert a Rule to a styleSheet you are
  189. // currently iterating on, otherwise the browser will be stuck
  190. // in a infinite loop…
  191. for (const mediaRule of mediaRules) {
  192. styleSheet.insertRule(mediaRule.cssText)
  193. hasDarkRules = true
  194. }
  195. }
  196. if (hasDarkRules) {
  197. loadThemeForm('#theme-selector')
  198. }
  199. })
  200. </script>
  201. </body>
  202. </html>