A place to cache linked articles (think custom and personal wayback machine)
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  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,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Resilient Web Design - Chapter 7 (archive) — David Larlet</title>
  13. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  14. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
  15. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
  16. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
  17. <link rel="manifest" href="/manifest.json">
  18. <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
  19. <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
  20. <meta name="apple-mobile-web-app-title" content="David Larlet">
  21. <meta name="application-name" content="David Larlet">
  22. <meta name="msapplication-TileColor" content="#da532c">
  23. <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
  24. <meta name="theme-color" content="#f0f0ea">
  25. <!-- That good ol' feed, subscribe :p. -->
  26. <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
  27. <meta name="robots" content="noindex, nofollow">
  28. <meta content="origin-when-cross-origin" name="referrer">
  29. <!-- Canonical URL for SEO purposes -->
  30. <link rel="canonical" href="https://resilientwebdesign.com/chapter7/#Tools">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. Resilient Web Design - Chapter 7 (archive)
  440. <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
  441. </h1>
  442. <section>
  443. <article>
  444. <h3><a href="https://resilientwebdesign.com/chapter7/#Tools">Source originale du contenu</a></h3>
  445. <p>The fourth annual conference on hypertext took place in San Antonio, Texas in December 1991. Tim Berners‐Lee’s World Wide Web project was starting to take shape then. Thinking the conference organisers and attendees would appreciate the project, he submitted a proposal to Hypertext ’91. The proposal was rejected.</p>
  446. <p>The hypertext community felt that the World Wide Web project was far too simplistic. Almost every other hypertext system included the concept of two‐way linking. If a resource moved, any links pointing to that resource would update automatically. The web provided no such guarantees. Its system of linking was much simpler—you just link to something and that’s it. To the organisers of Hypertext ’91, this seemed hopelessly naïve. They didn’t understand that the simplicity of the web was actually its strength. Because linking was so straightforward, anyone could do it. That would prove to be crucial in the adoption and success of the World Wide Web.</p>
  447. <p>It’s all‐too tempting to quickly declare that an approach is naïve, overly simplistic, and unrealistic. The idea that a website can simultaneously offer universal access to everyone while also providing a rich immersive experience for more capable devices …that also seems hopelessly naïve.</p>
  448. <p>This judgement has been handed down many times over the history of the web.</p>
  449. <section aria-labelledby="thisistoosimple">
  450. <h2 id="thisistoosimple">“This is too simple”</h2>
  451. <p>When the Web Standards Project ran its campaign encouraging designers to switch from <code class="markup element">TABLE</code>s for layout to <abbr>CSS</abbr>, it was met with resistance. Time and time again they were criticised for their naïvety. “Sure, a <abbr>CSS</abbr>‐based layout might be fine for a simple personal site but there’s no way it could scale to a large complex project.”</p>
  452. <p>Then Doug Bowman spearheaded the <abbr>CSS</abbr>‐based redesign of Wired.com and Mike Davidson led the <abbr>CSS</abbr>‐based redesign of <abbr>ESPN</abbr>.com. After that the floodgates opened.</p>
  453. <p>When Ethan Marcotte demonstrated the power of responsive design, it was met with resistance. “Sure, a responsive design might work for a simple personal site but there’s no way it could scale to a large complex project.”</p>
  454. <p>Then the Boston Globe launched its responsive site. Microsoft made their homepage responsive. The floodgates opened again.</p>
  455. <p>It’s a similar story today. “Sure, progressive enhancement might work for a simple personal site, but there’s no way it could scale to a large complex project.”</p>
  456. <p>The floodgates are ready to open. We just need you to create the poster child for resilient web design.</p>
  457. </section>
  458. <section aria-labelledby="thisistoodifficult">
  459. <h2 id="thisistoodifficult">“This is too difficult”</h2>
  460. <p>Building resilient websites is challenging. It takes time to apply functionality and features in a considered layered way. The payoff is a website that can better react to unexpected circumstances—unusual browsers, flaky network connections, outdated devices. Nonetheless, for many web designers, the cost in time seems to be too high.</p>
  461. <p>It’s worth remembering that building with progressive enhancement doesn’t mean that <em>everything</em> needs to be made available to <em>everyone</em>. Instead it’s the core functionality that counts. If every single feature needed to be available to every browser on every device, that would indeed be an impossibly arduous process. This is why prioritisation is so important. As long as the core functionality is available using the simplest possible technology, you can—with a clear conscience—layer on more advanced features.</p>
  462. <p>Still, it’s entirely possible that this approach will result in duplicated work. If you build an old‐fashioned client‐server form submission process and then enhance it with JavaScript, you may end up repeating the form‐processing on the client as well as the server. That can be mitigated if you are also using JavaScript on the server. It’s theoretically possible to write universal JavaScript so that the server and browser share a single codebase. Even without universal JavaScript, I still think it’s worth spending time to create technical credit.</p>
  463. <p>The <abbr>UK</abbr>’s Government Service design manual provides an even shorter form of the three‐step process I’ve outlined:</p>
  464. <ol>
  465. <li>First, just make it work</li>
  466. <li>Second, make it work better</li>
  467. </ol>
  468. <p>The design manual also explains why:</p>
  469. <blockquote>
  470. <p>If you build pages with the idea that parts other than <abbr>HTML</abbr> are optional, you’ll create a better and stronger web page.</p>
  471. </blockquote>
  472. <p>This kind of resilience means that the time you spend up‐front is well invested. You might also notice an interesting trend; the more you use this process, the less time it will take.</p>
  473. <p>Moving from <code class="markup element">TABLE</code>s to <abbr>CSS</abbr> seemed like an impossibly idealistic goal. Designers were comfortable using <code class="markup element">TABLE</code> and <code class="markup element">FONT</code> elements for layout. Why would they want to learn a whole new way of working? I remember how tricky it was to make my first <abbr>CSS</abbr>‐based layouts after years of using hacks. It took me quite some time. But my second <abbr>CSS</abbr>‐based layout didn’t take quite so long. After a while, it became normal.</p>
  474. <p>Designers comfortable with fixed‐width layouts had a hard time with responsive design. That first flexible layout was inevitably going to take quite a while to build. But the second flexible layout didn’t take quite so long. After a while, it became normal.</p>
  475. <p>It’s no different with the layered approach needed for building resilient websites. If you’re not used to working this way, the first time you do it will take quite some time. But the second time won’t take quite so long. After a while, it will become normal.</p>
  476. <p>There may well be situations where the three‐step approach won’t work, but they’re not as common as you might think. If you’re building a 3<abbr>D</abbr> game in a web browser, the simplest technology capable of providing the core functionality will still be pretty complex. That said, I’d love to see a text‐only adventure game get enhanced into a first‐person shooter.</p>
  477. </section>
  478. <section aria-labelledby="howdoiconvince">
  479. <h2 id="howdoiconvince">“How do I convince…?”</h2>
  480. <p>The brilliant computer scientist <span id="Grace%20Hopper">Grace Hopper</span> kept an unusual timepiece on her wall. It ran counter‐clockwise. When quizzed on this, she pointed out that it was an arbitrary convention, saying:</p>
  481. <blockquote>
  482. <p>Humans are allergic to change. They love to say, “We’ve always done it this way.” I try to fight that. That’s why I have a clock on my wall that runs counter‐clockwise.</p>
  483. </blockquote>
  484. <figure>
  485. <picture>
  486. <source media="all and (min-width: 75em)" srcset="images/large/grace-hopper.jpg"/>
  487. <source media="all and (min-width: 50em)" srcset="images/medium/grace-hopper.jpg, images/large/grace-hopper.jpg 1.5x"/>
  488. <img src="images/small/grace-hopper.jpg" alt="Grace Hopper in uniform in front of an American flag." srcset="images/medium/grace-hopper.jpg 2x, images/large/grace-hopper.jpg 3x"/>
  489. </picture>
  490. <figcaption>Commodore Grace M. Hopper, United States Navy.</figcaption>
  491. </figure>
  492. <p>Behaviour change is hard. Even if you are convinced of the benefits of a resilient approach to web design, you may find yourself struggling to convince your colleagues, your boss, or your clients. It was ever thus. Take comfort from the history of web standards and responsive design. Those approaches were eventually adopted by people who were initially resistant.</p>
  493. <p>Demonstrating the benefits of progressive enhancement can be tricky. Because the payoff happens in unexpected circumstances, the layered approach is hard to sell. Most people will never even know whether or not a site has been built in a resilient way. It’s a hidden mark of quality that will go unnoticed by people with modern browsers on new devices with fast network connections.</p>
  494. <p>For that same reason, you can start to implement this layered approach without having to convince your colleagues, your boss, or your clients. If they don’t care, then they also won’t notice. As Grace Hopper also said, “it’s easier to ask forgiveness than it is to get permission.”</p>
  495. </section>
  496. <section aria-labelledby="tools">
  497. <p>Changing a workflow or a process can be particularly challenging if it clashes with the tools being used. A tool is supposed to help people get their work done in a more efficient way. The tool should be subservient to the workflow. All too often, tools instead dictate a preferred way of working. Whether it’s <abbr>WYSIWYG</abbr> editors, graphic design programs, content management systems, or JavaScript frameworks, tools inevitably influence workflows.</p>
  498. <p>If you are aware of that influence, and you can recognise it, then you are in a better position to pick and choose the tools that will work best for you. There are many factors that play into the choice of frameworks, for example: “Is it well‐written?”, “Does it have an active community behind it?”, “Does it have clear documentation?”. But perhaps the most important question to ask is, “Does its approach match my own philosophy?”</p>
  499. <p>Every framework has a philosophy because every framework was written by people. If your philosophy aligns with that of the framework, then it will help you work more efficiently. But if your philosophy clashes with that of the framework, you will be fighting it every step of the way. It might even be tempting to just give up and let the framework dictate your workflow. Then the tail would be wagging the dog.</p>
  500. <p>Choose your tools wisely. It would be a terrible shame if you abandoned the resilient approach to web design because of a difference of opinion with a piece of software.</p>
  501. <p>Differences of opinion often boil down to a mismatch in priorities. At its heart, the progressive enhancement approach prioritises the needs of people, regardless of their technology. Tools, frameworks, and code libraries, on the other hand, are often built to prioritise the needs of designers and developers. That’s not a bad thing. Developer convenience is hugely valuable. But speaking personally, I think that user needs should trump developer convenience.</p>
  502. <p>When I’m confronted with a problem, and I have the choice of making it the user’s problem or my problem, I’ll make it my problem every time. That’s my job.</p>
  503. </section>
  504. <section aria-labelledby="futurefriendly">
  505. <h2 id="futurefriendly">Future friendly</h2>
  506. <p>In September of 2011, I was speaking at a conference in Tennessee along with some people much smarter than me. Once the official event was done, we lit out for the countryside where we had rented a house for a few days. We were gathering together to try to figure out where the web was headed.</p>
  507. <figure>
  508. <picture>
  509. <source media="all and (min-width: 75em)" srcset="images/large/devices.jpg"/>
  510. <source media="all and (min-width: 50em)" srcset="images/medium/devices.jpg, images/large/devices.jpg 1.5x"/>
  511. <img src="images/small/devices.jpg" alt="A jumbled pile of phones, tablets, e‐readers." srcset="images/medium/devices.jpg 2x, images/large/devices.jpg 3x"/>
  512. </picture>
  513. <figcaption>A small sample of internet‐enabled devices.</figcaption>
  514. </figure>
  515. <p>We were, frankly, freaked out. The proliferation of mobile devices had changed everything. Tablets were on the rise. People were talking about internet <abbr>TV</abbr>s. We were hoping to figure out what the next big thing would be. Internet‐enabled fridges, perhaps?</p>
  516. <p>In the end, the only thing we could be certain of was uncertainty:</p>
  517. <blockquote>
  518. <p>Disruption will only accelerate. The quantity and diversity of connected devices—many of which we haven’t imagined yet—will explode, as will the quantity and diversity of the people around the world who use them.</p>
  519. </blockquote>
  520. <p>That isn’t cause for despair; it’s cause for celebration. We could either fight this future or embrace it. Realising that it was impossible to be future‐proof, we instead resolved to be future-friendly:</p>
  521. <ol>
  522. <li>Acknowledge and embrace unpredictability.</li>
  523. <li>Think and behave in a future-friendly way.</li>
  524. <li>Help others do the same.</li>
  525. </ol>
  526. <p>That first step is the most important: acknowledging and embracing unpredictability. That is the driving force behind resilient web design. The best way to be future-friendly is to be backwards‐compatible.</p>
  527. <figure>
  528. <picture>
  529. <source media="all and (min-width: 75em)" srcset="images/large/future-friendly.png"/>
  530. <source media="all and (min-width: 50em)" srcset="images/medium/future-friendly.png, images/large/future-friendly.png 1.5x"/>
  531. <img src="images/small/future-friendly.png" alt="A child’s space helmet." srcset="images/medium/future-friendly.png 2x, images/large/future-friendly.png 3x"/>
  532. </picture>
  533. <figcaption>The Future Friendly symbol.</figcaption>
  534. </figure>
  535. </section>
  536. <section aria-labelledby="assumptions">
  537. <h2 id="assumptions">Assumptions</h2>
  538. <p>“We demand rigidly‐defined areas of doubt and uncertainty!” cried the philosophers in <span id="Douglas%20Adams">Douglas Adams</span>’ <cite id="Hitchhiker’s%20Guide%20To%20The%20Galaxy">Hitchhiker’s Guide To The Galaxy</cite>.</p>
  539. <p>As pattern‐matching machines, we are quick to identify trends and codify them into assumptions. Here are just some assumptions that were made over the history of web design:</p>
  540. <ul>
  541. <li>Everyone has a monitor that is 640 pixels wide.</li>
  542. <li>Everyone has the Flash plugin installed.</li>
  543. <li>Everyone has a monitor that is 800 pixels wide.</li>
  544. <li>Everyone has a mouse and a keyboard.</li>
  545. <li>Everyone has a monitor that is 1024 pixels wide.</li>
  546. <li>Everyone has a fast internet connection.</li>
  547. </ul>
  548. <p>The proliferation of mobile devices blew those assumptions out of the water. The rise of mobile didn’t create new uncertainties—instead it shone a light on the uncertainties that already existed.</p>
  549. <p>That should have been a valuable lesson. But before too long the old assumptions were replaced with new ones:</p>
  550. <ul>
  551. <li>There are some activities that people will never want to do on their phones.</li>
  552. <li>Every phone has a touch screen.</li>
  553. <li>Everyone using a phone is in a hurry.</li>
  554. <li>Every browser on every phone supports JavaScript.</li>
  555. </ul>
  556. <p>These kind of assumptions always remind me of old physicist jokes. “Assume a perfectly spherical web browser…”</p>
  557. <p>Assumptions are beguiling. If only we could agree on certain boundaries, then wouldn’t web design be so much easier to control?</p>
  558. <p>As tempting as this siren call is, it obfuscates the true nature of the ever‐changing uncertain web. <span id="Carl%20Sagan">Carl Sagan</span> put it best in his book <cite>The <span id="Demon‐Haunted%20World">Demon‐Haunted World</span></cite>:</p>
  559. <blockquote>
  560. <p>It is far better to grasp the universe as it really is than to persist in delusion, however satisfying and reassuring.</p>
  561. </blockquote>
  562. </section>
  563. <section aria-labelledby="thefuture">
  564. <h2 id="thefuture">The future</h2>
  565. <p>I wish I could predict the future. The only thing that I can predict for sure is that things are going to change.</p>
  566. <p>I don’t know what kind of devices people will be using on the web. I don’t know what kind of software people will be using on the web.</p>
  567. <p>The future, like the web, is unknown.</p>
  568. <p>The future, like the web, will be written by you.</p>
  569. </section>
  570. <aside>
  571. <h2>References</h2>
  572. <ol>
  573. <li><a href="https://www.gov.uk/service-manual"><cite>Government Service Design Manual</cite></a></li>
  574. <li><a href="http://futurefriendlyweb.com/"><cite>Future Friendly</cite></a></li>
  575. </ol>
  576. </aside>
  577. </article>
  578. </section>
  579. <nav id="jumpto">
  580. <p>
  581. <a href="/david/blog/">Accueil du blog</a> |
  582. <a href="https://resilientwebdesign.com/chapter7/#Tools">Source originale</a> |
  583. <a href="/david/stream/2019/">Accueil du flux</a>
  584. </p>
  585. </nav>
  586. <footer>
  587. <div>
  588. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  589. <p>
  590. Bonjour/Hi!
  591. Je suis <a href="/david/" title="Profil public">David&nbsp;Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
  592. Si tu as apprécié cette lecture, n’hésite pas à poursuivre ton exploration. Par exemple via les <a href="/david/blog/" title="Expériences bienveillantes">réflexions bimestrielles</a>, la <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a> ou en t’abonnant au <a href="/david/log/" title="S’abonner aux publications via RSS">flux RSS</a> (<a href="/david/blog/2019/flux-rss/" title="Tiens c’est quoi un flux RSS ?">so 2005</a>).
  593. </p>
  594. <p>
  595. Je m’intéresse à la place que je peux avoir dans ce monde. En tant qu’humain, en tant que membre d’une famille et en tant qu’associé d’une coopérative. De temps en temps, je fais aussi des <a href="https://github.com/davidbgk" title="Principalement sur Github mais aussi ailleurs">trucs techniques</a>. Et encore plus rarement, <a href="/david/talks/" title="En ce moment je laisse plutôt la place aux autres">j’en parle</a>.
  596. </p>
  597. <p>
  598. Voici quelques articles choisis :
  599. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  600. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  601. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  602. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  603. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  604. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  605. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  606. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  607. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  608. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  609. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  610. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  611. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  612. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  613. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  614. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  615. </p>
  616. <p>
  617. On peut <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">échanger par courriel</a>. Si éventuellement tu souhaites que l’on travaille ensemble, tu devrais commencer par consulter le <a href="http://larlet.com">profil dédié à mon activité professionnelle</a> et/ou contacter directement <a href="http://scopyleft.fr/">scopyleft</a>, la <abbr title="Société coopérative et participative">SCOP</abbr> dont je fais partie depuis six ans. Je recommande au préalable de lire <a href="/david/blog/2018/cout-site/" title="Attention ce qui va suivre peut vous choquer">combien coûte un site</a> et pourquoi je suis plutôt favorable à une <a href="/david/pro/devis/" title="Discutons-en !">non-demande de devis</a>.
  618. </p>
  619. <p>
  620. Je ne traque pas ta navigation mais mon
  621. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  622. conserve des logs d’accès.
  623. </p>
  624. </div>
  625. </footer>
  626. <script type="text/javascript">
  627. ;(_ => {
  628. const jumper = document.getElementById('jumper')
  629. jumper.addEventListener('click', e => {
  630. e.preventDefault()
  631. const anchor = e.target.getAttribute('href')
  632. const targetEl = document.getElementById(anchor.substring(1))
  633. targetEl.scrollIntoView({behavior: 'smooth'})
  634. })
  635. })()
  636. </script>