Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  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>Principes Web — 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. <!-- Canonical URL for SEO purposes -->
  28. <link rel="canonical" href="https://larlet.fr/david/blog/2015/principes-web/">
  29. <!-- SEO/Semantic metadata -->
  30. <meta name="description" content="Les principes qui m’animent lorsque je conçois et réalise un site Web." />
  31. <meta name="twitter:description" property="og:description" itemprop="description" content="Les principes qui m’animent lorsque je conçois et réalise un site Web." />
  32. <meta name="twitter:title" property="og:title" itemprop="name" content="Principes Web" />
  33. <meta name="twitter:card" content="summary" />
  34. <meta name="twitter:creator" content="@davidbgk" />
  35. <meta name="twitter:url" property="og:url" content="https://larlet.fr/david/blog/2015/principes-web/" />
  36. <meta property="og:type" content="article" />
  37. <meta property="og:site_name" content="David Larlet (@davidbgk)" />
  38. <meta name="twitter:image" property="og:image" itemprop="image" content="https://larlet.fr/static/david/blog/2015/principes-web.jpg" />
  39. <style>
  40. /* http://meyerweb.com/eric/tools/css/reset/ */
  41. html, body, div, span,
  42. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  43. a, abbr, address, big, cite, code,
  44. del, dfn, em, img, ins,
  45. small, strike, strong, tt, var,
  46. dl, dt, dd, ol, ul, li,
  47. fieldset, form, label, legend,
  48. table, caption, tbody, tfoot, thead, tr, th, td,
  49. article, aside, canvas, details, embed,
  50. figure, figcaption, footer, header, hgroup,
  51. menu, nav, output, ruby, section, summary,
  52. time, mark, audio, video {
  53. margin: 0;
  54. padding: 0;
  55. border: 0;
  56. font-size: 100%;
  57. font: inherit;
  58. vertical-align: baseline;
  59. }
  60. /* HTML5 display-role reset for older browsers */
  61. article, aside, details, figcaption, figure,
  62. footer, header, hgroup, menu, nav, section { display: block; }
  63. body { line-height: 1; }
  64. blockquote, q { quotes: none; }
  65. blockquote:before, blockquote:after,
  66. q:before, q:after {
  67. content: '';
  68. content: none;
  69. }
  70. table {
  71. border-collapse: collapse;
  72. border-spacing: 0;
  73. }
  74. /* http://practicaltypography.com/equity.html */
  75. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  76. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: normal;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  89. font-weight: 300;
  90. font-style: italic;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'EquityTextB';
  95. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  96. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  97. font-weight: 700;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. @font-face {
  102. font-family: 'ConcourseT3';
  103. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  104. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  105. font-weight: 300;
  106. font-style: normal;
  107. font-display: swap;
  108. }
  109. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  110. body {
  111. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  112. font-family: "EquityTextB", Palatino, serif;
  113. background-color: #f0f0ea;
  114. color: #07486c;
  115. font-kerning: normal;
  116. -moz-osx-font-smoothing: grayscale;
  117. -webkit-font-smoothing: subpixel-antialiased;
  118. text-rendering: optimizeLegibility;
  119. font-variant-ligatures: common-ligatures contextual;
  120. font-feature-settings: "kern", "liga", "clig", "calt";
  121. }
  122. pre, code, kbd, samp, var, tt {
  123. font-family: 'TriplicateT4c', monospace;
  124. }
  125. em {
  126. font-style: italic;
  127. color: #323a45;
  128. }
  129. strong {
  130. font-weight: bold;
  131. color: black;
  132. }
  133. nav {
  134. background-color: #323a45;
  135. color: #f0f0ea;
  136. display: flex;
  137. justify-content: space-around;
  138. padding: 1rem .5rem;
  139. }
  140. nav:last-child {
  141. border-bottom: 1vh solid #2d7474;
  142. }
  143. nav a {
  144. color: #f0f0ea;
  145. }
  146. nav abbr {
  147. border-bottom: 1px dotted white;
  148. }
  149. h1 {
  150. border-top: 1vh solid #2d7474;
  151. border-bottom: .2vh dotted #2d7474;
  152. background-color: #e3e1e1;
  153. color: #323a45;
  154. text-align: center;
  155. padding: 5rem 0 4rem 0;
  156. width: 100%;
  157. font-family: 'ConcourseT3';
  158. display: flex;
  159. flex-direction: column;
  160. }
  161. h1.single {
  162. padding-bottom: 10rem;
  163. }
  164. h1 span {
  165. position: absolute;
  166. top: 1vh;
  167. left: 20%;
  168. line-height: 0;
  169. }
  170. h1 span a {
  171. line-height: 1.7;
  172. padding: 1rem 1.2rem .6rem 1.2rem;
  173. border-radius: 0 0 6% 6%;
  174. background: #2d7474;
  175. font-size: 1.3rem;
  176. color: white;
  177. text-decoration: none;
  178. }
  179. h2 {
  180. margin: 4rem 0 1rem;
  181. border-top: .2vh solid #2d7474;
  182. padding-top: 1vh;
  183. }
  184. h3 {
  185. text-align: center;
  186. margin: 3rem 0 .75em;
  187. }
  188. hr {
  189. height: .4rem;
  190. width: .4rem;
  191. border-radius: .4rem;
  192. background: #07486c;
  193. margin: 2.5rem auto;
  194. }
  195. time {
  196. display: bloc;
  197. margin-left: 0 !important;
  198. }
  199. ul, ol {
  200. margin: 2rem;
  201. }
  202. ul {
  203. list-style-type: square;
  204. }
  205. a {
  206. text-decoration-skip-ink: auto;
  207. text-decoration-thickness: 0.05em;
  208. text-underline-offset: 0.09em;
  209. }
  210. article {
  211. max-width: 50rem;
  212. display: flex;
  213. flex-direction: column;
  214. margin: 2rem auto;
  215. }
  216. article.single {
  217. border-top: .2vh dotted #2d7474;
  218. margin: -6rem auto 1rem auto;
  219. background: #f0f0ea;
  220. padding: 2rem;
  221. }
  222. article p:last-child {
  223. margin-bottom: 1rem;
  224. }
  225. p {
  226. padding: 0 .5rem;
  227. margin-left: 3rem;
  228. }
  229. p + p,
  230. figure + p {
  231. margin-top: 2rem;
  232. }
  233. blockquote {
  234. background-color: #e3e1e1;
  235. border-left: .5vw solid #2d7474;
  236. display: flex;
  237. flex-direction: column;
  238. align-items: center;
  239. padding: 1rem;
  240. margin: 1.5rem;
  241. }
  242. blockquote cite {
  243. font-style: italic;
  244. }
  245. blockquote p {
  246. margin-left: 0;
  247. }
  248. figure {
  249. border-top: .2vh solid #2d7474;
  250. background-color: #e3e1e1;
  251. text-align: center;
  252. padding: 1.5rem 0;
  253. margin: 1rem 0 0;
  254. font-size: 1.5rem;
  255. width: 100%;
  256. }
  257. figure img {
  258. max-width: 250px;
  259. max-height: 250px;
  260. border: .5vw solid #323a45;
  261. padding: 1px;
  262. }
  263. figcaption {
  264. padding: 1rem;
  265. line-height: 1.4;
  266. }
  267. aside {
  268. display: flex;
  269. flex-direction: column;
  270. background-color: #e3e1e1;
  271. padding: 1rem 0;
  272. border-bottom: .2vh solid #07486c;
  273. }
  274. aside p {
  275. max-width: 50rem;
  276. margin: 0 auto;
  277. }
  278. /* https://fvsch.com/code/css-locks/ */
  279. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  280. font-size: 1rem;
  281. line-height: calc( 1.5em + 0.2 * 1rem );
  282. }
  283. h1 {
  284. font-size: 1.9rem;
  285. line-height: calc( 1.2em + 0.2 * 1rem );
  286. }
  287. h2 {
  288. font-size: 1.6rem;
  289. line-height: calc( 1.3em + 0.2 * 1rem );
  290. }
  291. h3 {
  292. font-size: 1.35rem;
  293. line-height: calc( 1.4em + 0.2 * 1rem );
  294. }
  295. @media (min-width: 20em) {
  296. /* The (100vw - 20rem) / (50 - 20) part
  297. resolves to 0-1rem, depending on the
  298. viewport width (between 20em and 50em). */
  299. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  300. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  301. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  302. margin-left: 0;
  303. }
  304. h1 {
  305. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. h2 {
  309. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  310. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  311. }
  312. h3 {
  313. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  314. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  315. }
  316. }
  317. @media (min-width: 50em) {
  318. /* The right part of the addition *must* be a
  319. rem value. In this example we *could* change
  320. the whole declaration to font-size:2.5rem,
  321. but if our baseline value was not expressed
  322. in rem we would have to use calc. */
  323. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  324. font-size: calc( 1rem + .6 * 1rem );
  325. line-height: 1.5em;
  326. }
  327. p, li, pre, details {
  328. margin-left: 3rem;
  329. }
  330. h1 {
  331. font-size: calc( 1.9rem + 1.5 * 1rem );
  332. line-height: 1.2em;
  333. }
  334. h2 {
  335. font-size: calc( 1.5rem + 1.5 * 1rem );
  336. line-height: 1.3em;
  337. }
  338. h3 {
  339. font-size: calc( 1.35rem + 1.5 * 1rem );
  340. line-height: 1.4em;
  341. }
  342. figure img {
  343. max-width: 500px;
  344. max-height: 500px;
  345. }
  346. }
  347. figure.unsquared {
  348. margin-bottom: 1.5rem;
  349. }
  350. figure.unsquared img {
  351. height: inherit;
  352. }
  353. @media print {
  354. body { font-size: 100%; }
  355. a:after { content: " (" attr(href) ")"; }
  356. a, a:link, a:visited, a:after {
  357. text-decoration: underline;
  358. text-shadow: none !important;
  359. background-image: none !important;
  360. background: white;
  361. color: black;
  362. }
  363. abbr[title] { border-bottom: 0; }
  364. abbr[title]:after { content: " (" attr(title) ")"; }
  365. img { page-break-inside: avoid; }
  366. @page { margin: 2cm .5cm; }
  367. h1, h2, h3 { page-break-after: avoid; }
  368. p3 { orphans: 3; widows: 3; }
  369. img {
  370. max-width: 250px !important;
  371. max-height: 250px !important;
  372. }
  373. nav, aside { display: none; }
  374. }
  375. ul.with_columns {
  376. column-count: 1;
  377. }
  378. @media (min-width: 20em) {
  379. ul.with_columns {
  380. column-count: 2;
  381. }
  382. }
  383. @media (min-width: 50em) {
  384. ul.with_columns {
  385. column-count: 3;
  386. }
  387. }
  388. ul.with_two_columns {
  389. column-count: 1;
  390. }
  391. @media (min-width: 20em) {
  392. ul.with_two_columns {
  393. column-count: 1;
  394. }
  395. }
  396. @media (min-width: 50em) {
  397. ul.with_two_columns {
  398. column-count: 2;
  399. }
  400. }
  401. .gallery {
  402. display: flex;
  403. flex-wrap: wrap;
  404. justify-content: space-around;
  405. }
  406. .gallery figure img {
  407. margin-left: 1rem;
  408. margin-right: 1rem;
  409. }
  410. .gallery figure figcaption {
  411. font-family: 'ConcourseT3'
  412. }
  413. footer {
  414. font-family: 'ConcourseT3';
  415. display: flex;
  416. flex-direction: column;
  417. border-top: 3px solid white;
  418. padding: 4rem 0;
  419. background-color: #07486c;
  420. color: white;
  421. }
  422. footer > * {
  423. max-width: 50rem;
  424. margin: 0 auto;
  425. }
  426. footer a {
  427. color: #f1c40f;
  428. }
  429. footer .avatar {
  430. width: 200px;
  431. height: 200px;
  432. border-radius: 50%;
  433. float: left;
  434. -webkit-shape-outside: circle();
  435. shape-outside: circle();
  436. margin-right: 2rem;
  437. padding: 2px 5px 5px 2px;
  438. background: white;
  439. border-left: 1px solid #f1c40f;
  440. border-top: 1px solid #f1c40f;
  441. border-right: 5px solid #f1c40f;
  442. border-bottom: 5px solid #f1c40f;
  443. }
  444. </style>
  445. <h1 class="single">
  446. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  447. Principes Web
  448. <time>Publié le 28 juillet 2015</time>
  449. </h1>
  450. <article class="single">
  451. <p>Cette histoire <a href="/david/blog/2015/coconstruction-ao/">d’Appel d’Offre</a> m’a amené à réfléchir aux principes qui m’animent lorsque je conçois et réalise un site Web. Même s’il y a du recouvrement, je les considère comme étant orthogonaux au <a href="/david/blog/2014/manifeste-developpeur/">manifeste de développeur</a> précédemment rédigé. Ces principes vont certainement servir de fil rouge aux <a href="/david/pro/enseignement/">cours de cette année</a> donc vos retours sont les bienvenus.</p>
  452. <h2>Accessibilité</h2>
  453. <blockquote>
  454. <p><strong>Responsive web design is all about accessibility.</strong> Although it is hard to make a business case for it, accessibility is very important, as it is a core concept of the web, as Aaron mentioned, and, being mostly device-agnostic, our best bet at future proofing content for screens that don’t even exist yet, as Rosie pointed out.</p>
  455. <p><cite><em><a href="https://hiddedevries.nl/en/blog/2015-06-20-responsive-day-out-3-the-final-breakpoint/">Responsive day out 3: the final breakpoint</a></em> (<a href="/david/cache/b81e5ead29fc9dcca90932464e54c8ed/">cache</a>)</cite></p>
  456. </blockquote>
  457. <p>J’ai longtemps cru que l’accessibilité était dédiée aux personnes présentant des déficiences. <em>J’avais tort.</em> Avoir un site accessible ne signifie pas être conforme au <a href="https://references.modernisation.gouv.fr/rgaa-3-0">RGAA</a> ou être lisible par un lecteur d’écran. Avoir un site accessible c’est le rendre <a href="http://timkadlec.com/2015/06/thriving-in-unpredictability/">disponible</a> (<a href="/david/cache/3f9bce9494214d3a3f21dd05ebab85f3/">cache</a>) par le plus grand nombre en améliorant le rapport signal/bruit et la lisibilité, c’est le rendre accessible quel que soit le périphérique autant dans sa résolution que dans sa puissance ou sa connectivité, c’est le rendre sauvegardable/liable/partageable, c’est <a href="http://sixtwothree.org/posts/designing-with-progressive-enhancement">l’améliorer progressivement</a> (<a href="/david/cache/dc941db5d707f2708939323d9cd93442/">cache</a>) et incrémentalement. <strong>L’accessibilité est la base de la pyramide de Maslow de l’expérience utilisateur.</strong></p>
  458. <p>Vous pouvez ajouter toute la <em>gamification</em>, le <em>growthhacking</em> ou l’intégration aux réseaux sociaux que vous voulez après ça, si vous n’avez pas une base solide à votre pyramide ça ne sert à rien. Les visiteurs seront partis bien avant d’avoir eu la moindre interaction avec vous. En produisant de la qualité lisible (et indexable) par tous vous êtes déjà dans l’infime minorité des sites qui donnent envie d’aller plus loin avec vous sur le net.</p>
  459. <h2>Pérennité</h2>
  460. <blockquote>
  461. <p>We, as a species, are currently putting together a universal repository of knowledge and ideas, unprecedented in scope and scale. Which information-handling technology should we model it on? The one that’s worked for 4 billion years and is responsible for our existence? Or the one that’s led to the greatest intellectual tragedies in history?</p>
  462. <p><cite><em><a href="http://worrydream.com/TheWebOfAlexandria/">The Web of Alexandria</a></em> (<a href="/david/cache/bd244789119bc6d32deb987b95e37043/">cache</a>)</cite></p>
  463. </blockquote>
  464. <p>Chaque produit doit se questionner sur la pérennité de ses données et de ses liens. Parfois c’est futile et temporaire, d’autres fois c’est jugé comme étant une ressource clé qui doit être conservée une décennie ou deux. Cette contrainte doit s’envisager de manière stratégique. Les technologies employées importent peu, il s’agit avant tout de garder le contrôle sur les données et les liens qui sont fait.</p>
  465. <p>Il y a deux sources possibles d’endommagement de votre capital :</p>
  466. <ul>
  467. <li>vous et les parties prenantes du projet ;</li>
  468. <li>les attaques externes.</li>
  469. </ul>
  470. <p>Les secondes sont bien plus faciles à gérer :-). Ne négligez pas la menace interne — humaine — en commençant par vous. Éprouvez vos sauvegardes et vos stratégies de migration. <strong>Passez plus de temps à documenter vos données qu’à documenter votre code.</strong> Évaluez ce qui est critique en terme de confidentialité et de confiance pour vos utilisateurs, <em>avec vos utilisateurs</em> et limitez leur périmètre.</p>
  471. <h2>Frugalité</h2>
  472. <blockquote>
  473. <p>Datensparsamkeit is a concept from these privacy laws that is an opposite philosophy to "capture-all-the-things". A translation isn’t straightforward (which is why I’ve retained the German word) but loosely you might translate it as something like "data austerity", "data minimization", "data parsimony", or "data frugality". It means that you should always ask yourself why you are capturing or storing data, and look to handle only the minimum amount of data you need for your purpose.</p>
  474. <p><cite><em><a href="http://martinfowler.com/bliki/Datensparsamkeit.html">Datensparsamkeit</a></em> (<a href="/david/cache/2d7e6b8ac2e7f33001a34f1884f00d6c/">cache</a>)</cite></p>
  475. </blockquote>
  476. <p>Récolter toutes les données possibles est la solution de facilité. Il faut remettre en cause <a href="http://www.nngroup.com/articles/mobile-input-checklist/">chaque champ de formulaire</a> (<a href="/david/cache/7fe9e2c3bafffac17d376f359ab9c323/">cache</a>), chaque donnée personnelle collectée. S’interroger sur les lois auxquelles elles sont soumises et <a href="http://idlewords.com/bt14.htm">les solutions à mettre en place</a> (<a href="/david/cache/bf91cb0067cdafb97553ec195630fc76/">cache</a>) pour informer vos utilisateurs. <strong>Toute donnée non collectée est une fuite évitée.</strong></p>
  477. <p>Il en est de même pour les données servies au visiteur, accédez à votre site depuis un TGV et <a href="https://medium.com/@zengabor/three-takeaways-for-web-developers-after-two-weeks-of-painfully-slow-internet-9e7f6d47726e">constatez facilement les dégâts</a> (<a href="/david/cache/e00ae9f67fe78b3490ecafe16a7802d4/">cache</a>). Les performances de votre site sont directement affectées par votre gourmandise. Il faut remettre en question chaque dépendance (externe), les publicités et les statistiques ne sont peut-être pas essentielles pour vos utilisateurs et/ou la survie du service.</p>
  478. <h2>Empathie</h2>
  479. <blockquote>
  480. <ul>
  481. <li><strong>Early customer validation</strong> over releasing products with unknown end-user value</li>
  482. <li><strong>Collaborative design</strong> over designing on an island</li>
  483. <li><strong>Solving user problems</strong> over designing the next “cool” feature</li>
  484. <li><strong>Measuring KPIs</strong> over undefined success metrics</li>
  485. <li><strong>Applying appropriate tools</strong> over following a rigid plan</li>
  486. <li><strong>Nimble design</strong> over heavy wireframes, comps or specs</li>
  487. </ul>
  488. <p><cite><em><a href="http://www.smashingmagazine.com/2014/01/08/lean-ux-manifesto-principle-driven-design/">The Lean UX Manifesto: Principle-Driven Design</a></em> (<a href="/david/cache/178740c41843109b2d3034da74746315/">cache</a>)</cite></p>
  489. </blockquote>
  490. <p>La transformation d’un produit utile en <a href="https://medium.com/the-happy-startup-school/beyond-mvp-10-steps-to-make-your-product-minimum-loveable-51800164ae0c">un produit « charmant »</a> (<a href="/david/cache/a1bf79316204474c8d8522758f017124/">cache</a>) est très difficile. C’est pourtant celle qui fait la différence, trop de produits <em>Open-Source</em> sont malheureusement là pour le démontrer… <strong>Pour aller de l’efficace à l’enviable, il faut avant tout avoir une approche basée sur l’écoute et la remise en question.</strong> Limiter les contraintes et réduire la pression cognitive d’interaction avec vos contenus.</p>
  491. <p><a href="https://medium.com/@jaf_designer/why-product-thinking-is-the-next-big-thing-in-ux-design-ee7de959f3fe">Penser son produit</a> (<a href="/david/cache/42b387daa6d294c18983ebb91a6c29c5/">cache</a>) va au-delà de l’esthétique ou des interactions, il s’agit d’accompagner l’utilisateur dans son apprentissage d’un service ainsi que dans son amélioration. La confiance qui doit s’établir pour qu’un produit progresse réclame du temps et de l’attention.</p>
  492. <h2>Chemin</h2>
  493. <blockquote>
  494. <p>This switch from web design to experience design is directly caused by the shift from web pages to digital products, tools, and ecosystems. Web pages are just part of something much bigger: mobile apps, API’s, social media presence, search engine optimization, customer service channels, and physical locations all inform the experience a user has with a brand, product, or service. Pretending that you can run a business or deliver value just by taking care of the web channel is naïve at best and harmful at worst.</p>
  495. <p><cite><em><a href="http://mashable.com/2015/07/06/why-web-design-dead/">Web design is dead</a></em> (<a href="/david/cache/cfea7986147a83150a85fb636d396a99/">cache</a>)</cite></p>
  496. </blockquote>
  497. <p>Une présence en ligne n’est plus un but, c’est un chemin. <strong>C’est une relation tripartite entre ceux qui cultivent, ceux qui cuisinent et ceux qui agencent le jardin.</strong> Il y a des saisonnalités et des objectifs intermédiaires mais il n’y a pas d’arrêt dans ce cycle. C’est la raison pour laquelle <a href="/david/pro/devis/">les devis sont désuets</a> (et les Appels d’Offres également).</p>
  498. <p>Si le <a href="https://adactio.com/journal/6692">Web est un <em>continuum</em></a> (<a href="/david/cache/1efa2e01199c9e2e3f761386162bf875/">cache</a>), la relation qui permet de le produire l’est aussi. Trop <a href="http://www.svpg.com/product-fail">de produits échouent</a> (<a href="/david/cache/062df59908e9101831be29fd1235e170/">cache</a>) faute de communication à la fois dans l’équipe mais aussi avec les utilisateurs. Pour la communication interne, les approches agiles donnent des outils, pour la communication externe, le <em>LEAN</em> donne des pistes avec les interviews et la conception de <a href="/david/pro/produits-essentiels/">produits essentiels</a>.</p>
  499. <hr />
  500. <p>Ces principes guident mes choix lorsque j’interviens sur un projet, ils permettent d’établir une vision stratégique sur le long terme du produit et/ou d’identifier les points bloquants spécifiques à traiter de manière tactique et ponctuelle. Ils constituent une base de discussion et de remise en question personnelle continue.</p>
  501. </article>
  502. <figure class="image" property="schema:image">
  503. <img src="/static/david/blog/2015/principes-web.jpg" alt="" />
  504. </figure>
  505. <nav id="jumpto">
  506. <p>
  507. <a rel=prev href="/david/blog/2015/coconstruction-ao/">← Co-construction d’Appel d’Offre</a> | <a href="/david/blog/" title="Retour à la liste des expériences">↑</a> | <a rel=next href="/david/blog/2015/rentree-classes/">Rentrée des classes →</a>
  508. </p>
  509. </nav>
  510. <footer>
  511. <div>
  512. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  513. <p>
  514. Bonjour/Hi!
  515. 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>
  516. 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>).
  517. </p>
  518. <p>
  519. 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>.
  520. </p>
  521. <p>
  522. Les dernières publications hebdomadaires sont :
  523. </p>
  524. <ul class="with_columns">
  525. <li>
  526. <a href="/david/stream/2019/12/17/">Origines</a>
  527. </li>
  528. <li>
  529. <a href="/david/stream/2019/12/10/">Publier</a>
  530. </li>
  531. <li>
  532. <a href="/david/stream/2019/12/03/">En forêt</a>
  533. </li>
  534. <li>
  535. <a href="/david/stream/2019/11/26/">Ecocentric</a>
  536. </li>
  537. <li>
  538. <a href="/david/stream/2019/11/19/">Se livrer</a>
  539. </li>
  540. <li>
  541. <a href="/david/stream/2019/11/12/">Dépendances</a>
  542. </li>
  543. <li>
  544. <a href="/david/stream/2019/11/05/">Positif</a>
  545. </li>
  546. <li>
  547. <a href="/david/stream/2019/10/29/">Dettes</a>
  548. </li>
  549. <li>
  550. <a href="/david/stream/2019/10/22/">Privilèges</a>
  551. </li>
  552. <li>
  553. <a href="/david/stream/2019/10/15/">Discrétion</a>
  554. </li>
  555. <li>
  556. <a href="/david/stream/2019/10/08/">Désespérance</a>
  557. </li>
  558. <li>
  559. <a href="/david/stream/2019/10/01/">Présent</a>
  560. </li>
  561. <li>
  562. <a href="/david/stream/2019/09/24/">Manifester</a>
  563. </li>
  564. <li>
  565. <a href="/david/stream/2019/09/17/">Arpenter</a>
  566. </li>
  567. <li>
  568. <a href="/david/stream/2019/09/10/">Nostalgie</a>
  569. </li>
  570. <li>
  571. <a href="/david/stream/2019/09/03/">Déconstruire</a>
  572. </li>
  573. <li>
  574. <a href="/david/stream/2019/08/27/">Documenter</a>
  575. </li>
  576. <li>
  577. <a href="/david/stream/2019/08/20/">Frustration</a>
  578. </li>
  579. <li>
  580. <a href="/david/stream/2019/08/13/">Holisme</a>
  581. </li>
  582. <li>
  583. <a href="/david/stream/2019/08/06/">1%</a>
  584. </li>
  585. <li>
  586. <a href="/david/stream/2019/07/30/">Exemplarité</a>
  587. </li>
  588. <li>
  589. <a href="/david/stream/2019/07/23/">Timelines</a>
  590. </li>
  591. <li>
  592. <a href="/david/stream/2019/07/16/">Écoute</a>
  593. </li>
  594. <li>
  595. <a href="/david/stream/2019/07/02/">Anxiété</a>
  596. </li>
  597. <li>
  598. <a href="/david/stream/2019/06/21/">À lier</a>
  599. </li>
  600. <li>
  601. <a href="/david/stream/2019/06/14/">Pauvreté</a>
  602. </li>
  603. <li>
  604. <a href="/david/stream/2019/06/07/">Amateur</a>
  605. </li>
  606. <li>
  607. <a href="/david/stream/2019/05/31/">Pollution</a>
  608. </li>
  609. <li>
  610. <a href="/david/stream/2019/05/24/">Apaisement</a>
  611. </li>
  612. <li>
  613. <a href="/david/stream/2019/05/10/">Folie</a>
  614. </li>
  615. <li>
  616. <a href="/david/stream/2019/05/03/">Sympathie</a>
  617. </li>
  618. <li>
  619. <a href="/david/stream/2019/04/12/">Péremption</a>
  620. </li>
  621. <li>
  622. <a href="/david/stream/2019/04/05/">Définitions</a>
  623. </li>
  624. <li>
  625. <a href="/david/stream/2019/03/29/">Acceptation</a>
  626. </li>
  627. <li>
  628. <a href="/david/stream/2019/03/22/">Dissonance</a>
  629. </li>
  630. <li>
  631. <a href="/david/stream/2019/03/15/">Reconnaissance</a>
  632. </li>
  633. <li>
  634. <a href="/david/stream/2019/03/08/">Lecture</a>
  635. </li>
  636. <li>
  637. <a href="/david/stream/2019/03/01/">Journaux</a>
  638. </li>
  639. <li>
  640. <a href="/david/stream/2019/02/22/">Écriture</a>
  641. </li>
  642. <li>
  643. <a href="/david/stream/2019/02/15/">Kyriarchie</a>
  644. </li>
  645. <li>
  646. <a href="/david/stream/2019/02/08/">Mots-serrures</a>
  647. </li>
  648. <li>
  649. <a href="/david/stream/2019/02/01/">Sans voie</a>
  650. </li>
  651. <li>
  652. <a href="/david/stream/2019/01/25/">Auto-diagnostic</a>
  653. </li>
  654. <li>
  655. <a href="/david/stream/2019/01/18/">Agilité</a>
  656. </li>
  657. <li>
  658. <a href="/david/stream/2019/01/11/">Métaphores</a>
  659. </li>
  660. <li>
  661. <a href="/david/stream/2019/01/04/">Balbutiements</a>
  662. </li>
  663. </ul>
  664. <p>
  665. Voici quelques articles choisis :
  666. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  667. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  668. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  669. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  670. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  671. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  672. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  673. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  674. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  675. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  676. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  677. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  678. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  679. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  680. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  681. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  682. </p>
  683. <p>
  684. 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>.
  685. </p>
  686. <p>
  687. Je ne traque pas ta navigation mais mon
  688. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  689. conserve des logs d’accès.
  690. </p>
  691. </div>
  692. </footer>
  693. <script type="text/javascript">
  694. ;(_ => {
  695. const jumper = document.getElementById('jumper')
  696. jumper.addEventListener('click', e => {
  697. e.preventDefault()
  698. const anchor = e.target.getAttribute('href')
  699. const targetEl = document.getElementById(anchor.substring(1))
  700. targetEl.scrollIntoView({behavior: 'smooth'})
  701. })
  702. })()
  703. </script>
  704. <script>
  705. /* Service workers */
  706. if (navigator.serviceWorker) {
  707. window.addEventListener('load', function () {
  708. var selector = 'a[href^="/david/cache/"], a[rel=prev], a[rel=next]'
  709. function sendLinks (selector) {
  710. var links = [].slice.call(document.querySelectorAll(selector)).map(function (link) {
  711. return link.getAttribute('href')
  712. })
  713. links.push(location.pathname) // Put the current page in cache too.
  714. navigator.serviceWorker.controller.postMessage({ links: links })
  715. }
  716. navigator.serviceWorker.getRegistration()
  717. .then(function (registration) {
  718. if (!registration || !navigator.serviceWorker.controller) {
  719. return navigator.serviceWorker.register('/serviceworker.js')
  720. .then(navigator.serviceWorker.ready)
  721. .then(function () {
  722. console.log('[ServiceWorker] Ready to go!')
  723. })
  724. .catch(console.error.bind(console))
  725. } else {
  726. console.log('[ServiceWorker] Send links via registration')
  727. sendLinks(selector)
  728. }
  729. })
  730. navigator.serviceWorker.addEventListener('controllerchange', function () {
  731. console.log('[ServiceWorker] Send links via controller change')
  732. sendLinks(selector)
  733. })
  734. navigator.serviceWorker.addEventListener('message', function (event) {
  735. var link = document.querySelector('a[href="' + event.data.link + '"]')
  736. if (event.data.status && link) {
  737. link.style.backgroundColor = '#2d7474'
  738. link.style.color = '#f0f0ea'
  739. link.setAttribute('title', 'En cache pour consultation sans connexion')
  740. }
  741. })
  742. })
  743. } else {
  744. console.warn('[ServiceWorker] No cache for old browsers.')
  745. }
  746. </script>