Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

index.html 46KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  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>Simplicité par défaut — 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/2016/simplicite-defaut/">
  29. <!-- SEO/Semantic metadata -->
  30. <meta name="description" content="Une forme de décroissance technique pour revenir aux fondamentaux." />
  31. <meta name="twitter:description" property="og:description" itemprop="description" content="Une forme de décroissance technique pour revenir aux fondamentaux." />
  32. <meta name="twitter:title" property="og:title" itemprop="name" content="Simplicité par défaut" />
  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/2016/simplicite-defaut/" />
  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/2016/simplicite-defaut.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. Simplicité par défaut
  448. <time>Publié le 22 avril 2016</time>
  449. </h1>
  450. <article class="single">
  451. <p><em>Ce billet est un accompagnement à l’intervention donnée lors de <a href="http://www.mix-it.fr/">Mix-IT</a>. Je n’appelle plus cela des résumés car ce n’est pas forcément ce qui est exprimé le jour J, il s’agit davantage d’un complément.</em></p>
  452. <p>Il s’agit de la suite de mes recherches relatives <a href="/david/blog/2016/minimalisme-esthetique/">au minimalisme et à l’esthétique</a>. J’ai choisi de faire une suite pour des raisons assez personnelles, une sorte d’introspection thérapeutique. La préparation de la précédente intervention m’avait mis dans un état assez douloureux d’incohérence entre mon quotidien et ce que je prônais. J’avais besoin d’aller plus loin pour identifier les raisons profondes qui me poussaient à la recherche de cette simplicité.</p>
  453. <h2>Paternité</h2>
  454. <ol>
  455. <li>Ajouter des couches</li>
  456. <li>Changer des couches</li>
  457. <li>Enlever des couches</li>
  458. <li>Changer des couches</li>
  459. <li>Mettre des couches</li>
  460. </ol>
  461. <p>J’en suis à l’étape 3 dans ma maturité en tant que développeur. La paternité change les priorités et je pense qu’elle a un grand rôle dans le fait de vouloir remettre le focus sur la valeur apportée plus que sur la technique. Me battre pour une meilleure expérience utilisateur plutôt que contre un <em>framework</em>, chercher à se faire plaisir davantage via ce qui est produit que par un contentement technique.</p>
  462. <blockquote>
  463. <p>Je suis un expérimentateur en ce sens que j’écris pour me changer moi-même et ne plus penser la même chose qu’auparavant.</p>
  464. <p><cite>Michel Foucault</cite></p>
  465. </blockquote>
  466. <p>Lorsque j’expérimente aujourd’hui, ce n’est plus pour découvrir une nouvelle bibliothèque mais pour trouver de nouveaux moyens de simplifier un problème. Dans ce contexte, il est intéressant de <a href="http://www.internetactu.net/2016/02/18/lexperience-est-elle-ce-qui-est-a-la-croisee-du-business-et-du-design/">re-questionner la page blanche</a> (<a href="/david/cache/eb012ce4808fe5872aaa24a51e151ab7/">cache</a>), de re-challenger certaines <a href="https://austinknight.com/writing/the-road-to-mediocrity-is-paved-with-best-practices/">bonnes pratiques communément admises</a> (<a href="/david/cache/3ecaa08e8a128885840fe94ed86cea72/">cache</a>).</p>
  467. <h2>Enseignement</h2>
  468. <p>Le fait de <a href="/david/pro/enseignement/">donner des cours</a> m’a permis de réaliser à quel point nos outils sont complexes et élitistes. L’expression japonaise 「灯台下暗し」 (tōdai moto kurashi) prendre du recul pour avoir de la lumière (littéralement : il fait sombre sous la lanterne) me semble appropriée, ce sont les étudiants qui sont arrivés avec leurs lanternes et ont commencé à me faire sérieusement douter. Je leurs suis extrêmement reconnaissant de m’avoir ouvert les yeux et d’avoir pu creuser ensemble quelques approches possibles pour simplifier l’apprentissage des briques du Web.</p>
  469. <blockquote>
  470. <p>The only reliable, widely used way to ensure impeccable software quality is to write less software that does less stuff, and then spend eons honing that tiny lot. Such an approach, however, is very rarely compatible with commercial success or even programmer motivations (despite what many may claim).</p>
  471. <p><cite><em><a href="https://m.signalvnoise.com/software-has-bugs-this-is-normal-f64761a262ca">Software has bugs. This is normal.</a></em> (<a href="/david/cache/81f2337ef46ed130b13bc0ba50f809d5/">cache</a>)</cite></p>
  472. </blockquote>
  473. <p>La route a été longue et difficile car les étudiants ont <a href="http://www.awwwards.com/">des exemples</a> complètement inaccessibles, energivores et à l’expérience utilisateur désastreuse. Nous avons une certaine responsabilité à encenser ce genre de sites, les dégâts chez de nouveaux apprenants sont flagrants et toute la profession en pâtit.</p>
  474. <h2>Leftpad</h2>
  475. <blockquote>
  476. <p>Every package that you use adds yet another <strong>dependency</strong> to your project. Dependencies, by their very name, are things you <strong>need</strong> in order for your code to function. The more dependencies you take on, the more points of failure you have. Not to mention the more chance for error: have you vetted any of the programmers who have written these functions that you depend on daily?</p>
  477. <p><cite><em><a href="http://www.haneycodes.net/npm-left-pad-have-we-forgotten-how-to-program/">NPM &amp; left-pad: Have We Forgotten How To Program?</a></em> (<a href="/david/cache/68b4ccd13ef04eb9a617d50741c15945/">cache</a>)</cite></p>
  478. </blockquote>
  479. <p>J’étais en train de préparer cette intervention lorsque le <em>fiasco</em> leftpad est arrivé dans l’écosystème NPM. Du coup, j’ai eu immédiatement plein d’articles faisant une ode à la simplicité, à la réduction de dépendances et mettant en garde contre les couches d’abstraction. <a href="https://github.com/stevemao/left-pad/issues/4#issuecomment-200082643">Merci</a> Azer Koçulu, je pouvais difficilement rêver mieux :-). Je ne vais pas tirer sur l’ambulance mais ça illustre presque trop bien mon propos.</p>
  480. <blockquote>
  481. <p>as your project progresses, your team’s productivity will drop because of all the complexity and dependencies. You’ll need more people to maintain it, and more people with specific knowledge to maintain it. If your lead developers leave, you’re dead. You should be fighting complexity and not embracing it. Every added framework, and even library, makes your project more difficult to maintain. Avoid unnecessary frameworks and libraries from day one.</p>
  482. <p><cite><em><a href="http://www.catonmat.net/blog/frameworks-dont-make-sense/">Frameworks don’t make much sense</a></em> (<a href="/david/cache/9dd2379d19fd9f879b44ee9921f1a7e8/">cache</a>)</cite></p>
  483. </blockquote>
  484. <p>Jusqu’où aller dans cette démarche ? Par où commencer ?</p>
  485. <h2>Burnout technique</h2>
  486. <blockquote>
  487. <p>Maybe it’s not too late for <em>you</em>, though. Perhaps, like me, you aren’t feeling particularly overworked. But are you feeling irritable, tired, and apathetic about the work you need to do? Are you struggling to concentrate on simple tasks?</p>
  488. <p>Then maybe what you’re feeling is burnout, too.</p>
  489. <p><cite><em><a href="https://m.signalvnoise.com/avoiding-the-trap-8df59e718f3e">Avoiding the Trap</a></em> (<a href="/david/cache/5e9c5a89355b2eb336f154fd4845634d/">cache</a>)</cite></p>
  490. </blockquote>
  491. <p>J’ai travaillé pendant un an et demi avec Mozilla sur la partie paiement du <a href="https://marketplace.firefox.com/">Marketplace</a> puis sur le site des <a href="https://addons.mozilla.org/fr/firefox/">extensions de Firefox</a>. Et depuis un an avec <a href="http://www.etalab.gouv.fr/">Etalab</a> sur la plateforme <a href="https://www.data.gouv.fr/fr/">datagouv</a>. Dans les deux situations, j’ai passé davantage de temps à lutter contre les outils plutôt qu’à les apprécier pour le travail rendu. C’est terrible car ceux-ci sont censés théoriquement faire gagner du temps mais sur le long terme cela se révèle être faux dans mon cas.</p>
  492. <p><strong>Je me demande si je ne suis pas en train de faire un burnout technique, non pas par trop de travail mais par manque de contrôle dans mes outils.</strong></p>
  493. <p><em>Je ferais probablement un article complet sur le sujet car c’est un gros morceaux et je manque encore de recul.</em></p>
  494. <h2>The aesthetic microlith</h2>
  495. <blockquote>
  496. <p>Growth for the sake of growth is the ideology of the cancer cell.</p>
  497. <p><cite>Edward Abbey</cite></p>
  498. </blockquote>
  499. <p>Toutes ces raisons m’ont amené à étudier une nouvelle piste. Cette appellation est une combinaison du <a href="https://m.signalvnoise.com/the-majestic-monolith-29166d022228">Majestic Monolith</a> (<a href="/david/cache/20dbf01ea2951cc6d136d5d2185db73b/">cache</a>) et des <em>microservices</em>. Je me persuade qu’il y a une voie différente entre ces deux extrêmes. Une voie qui limite les <a href="http://blog.robertelder.org/interfaces-most-important-software-engineering-concept/">fuites d’abstraction</a> (<a href="/david/cache/0f39895846c57b132dc47e2ab3a34207/">cache</a>) afin de réduire la dette technique et de favoriser l’inclusion de nouveaux membres dans une équipe. Une voie qui ne demande pas de réécrire la moitié de l’application tous les six mois car une nouvelle montée en version majeure n’est pas rétro-compatible. Une voie où l’on ne raisonne plus en termes de <em>features</em> et de <em>bugs</em> mais d’expérience utilisateur et de satisfaction pour l’ensemble des parties prenantes. Un environnement qui permet de faire une pause dans les développements afin de prendre le temps de davantage considérer les besoins des personnes qui utilisent le produit.</p>
  500. <blockquote>
  501. <p>We all want things to be simpler. But we may not know what to sacrifice in order to achieve that goal.</p>
  502. <p><cite><em><a href="https://medium.com/@mbostock/what-makes-software-good-943557f8a488">What Makes Software Good?</a></em> (<a href="/david/cache/b0e68315fb4945d6997b2afd4adcdf1e/">cache</a>)</cite></p>
  503. </blockquote>
  504. <p>Dans cette recherche de simplicité, j’ai essayé de remettre en question chaque concept de programmation, chaque bonne pratique, chaque bibliothèque, chaque ligne de code. J’ai essayé de produire un prototype qui soit un peu plus conséquent que <a href="https://github.com/davidbgk/confoo">celui proposé à Confoo</a> pour voir jusqu’où cela pouvait aller. Ce qu’il me manque c’est non pas du temps de développement mais du temps de vie du projet pour analyser les effets produits sur le moyen terme. <em>Je devrais avoir l’occasion d’expérimenter cela avec <a href="http://scopyleft.fr/">scopyleft</a> prochainement, ça sent la trilogie.</em></p>
  505. <p>À court terme en tout cas, c’est extrêmement plus fun à coder et l’on arrive au résultat finalement aussi rapidement. Cela devient une matière beaucoup plus malléable, dont on connait les forces et les faiblesses car le périmètre est réduit. En contrepartie, certains cas aux limites vont être écartés et l’expérience de certains utilisateurs se dégrade plus rapidement. Ce n’est pas que le coût de prise en compte soit énorme, il s’agit davantage de le prendre en considération lorsque le besoin est réel.</p>
  506. <h2>Budgets</h2>
  507. <p>L’utilisation de budgets m’a été rendue familière dans le domaine de la performance avec une <a href="http://codepen.io/bradfrost/pen/EPQVBp/">répartition de différentes dépendances</a> pour ne pas dépasser un certain seuil. J’essaye d’étendre le concept dans mes prototypes :</p>
  508. <ul>
  509. <li><strong>Budget d’abstraction</strong> : ne pas dépasser 10 Mo pour son environnement Python ou Node par exemple. Ai-je bien compris les concepts sous-jacents de ces dépendances ? Comment un nouveau collaborateur va-t-il les comprendre ?</li>
  510. <li><strong>Budget d’embarquement</strong> : pouvoir installer en trois commandes, lancer en une seule et lire la documentation sur une page unique. Est-ce que le fait de devoir découper la documentation n’est pas emblématique d’un trop grand nombre de fonctionnalités ?</li>
  511. <li><strong>Budget de temps</strong> : une soirée de temps en temps, des interviews courtes (10 minutes), « une semaine de dev max ». Pourriez-vous recoder le cœur de votre produit en moins d’une semaine ?</li>
  512. <li><strong>Budget de test</strong> : la documentation est test, l’interface est test, la possibilité de tout tester manuellement rapidement. Quelle est la latence de vos boucles de <em>feedback</em> ?</li>
  513. <li><strong>Budget de LOC</strong> : au-delà de 5000 lignes de codes (incluant les dépendances !), le nombre de <a href="http://www.themacro.com/articles/2016/03/agility-requires-safety/">bugs potentiels</a> (<a href="/david/cache/21c99b54692888fd9f0612c609cd0cf5/">cache</a>) devient <a href="http://www.planningforaliens.com/blog/2016/04/11/why-js-development-is-crazy/">ingérable</a> (<a href="/david/cache/7044815984f8d2d65c2dd0b506a799ea/">cache</a>), analysez sur votre projet actuel à quel point il est difficile de s’y tenir !</li>
  514. </ul>
  515. <p><strong>Le point important de ces budgets ne réside pas tant dans la valeur choisie que dans la prise de recul que cela demande lorsqu’on atteint les limites.</strong> Est-ce que cette dépendance est vraiment nécessaire, est-ce que je suis prêt à retirer cette autre dépendance pour lui laisser la place, etc. Bien entendu, cette approche est critiquable et c’est ce qui fait tout l’intérêt de son expression et de vos réactions.</p>
  516. <h2>Élitisme</h2>
  517. <blockquote>
  518. <p>I call this kind of attitude the “Tea Party” of JavaScript development. The reason why we currently have JavaScript tooling fatigue is exactly because Tea Party developers insist on writing everything themselves instead of trying to build a better abstraction. The lesson here isn’t not fewer dependencies: it’s managing dependencies.</p>
  519. <p><cite><em><a href="http://www.haneycodes.net/npm-left-pad-have-we-forgotten-how-to-program/#comment-127232">NPM &amp; left-pad: Have We Forgotten How To Program?</a></em> (<a href="/david/cache/68b4ccd13ef04eb9a617d50741c15945/">cache</a>)</cite></p>
  520. </blockquote>
  521. <p>Il est certain que faire la cuisine demande un peu plus de savoir-faire que de faire réchauffer un plat cuisiné. On en revient ici à la problématique de l’enseignement mais aussi de la perte des développeurs ayant de l’expérience pour des tâches issues du <em>management</em>. La combinaison des deux donne une profession qui ne sait se servir que du micro-ondes car elle n’a même pas conscience de saveurs qu’elle n’a jamais expérimentée. Cette situation conduit à la prolétarisation du développeur et à la perte de ses savoirs.</p>
  522. <p>En contrepartie, repartir de la base demande moins d’expérience en terme d’outillage. Pour continuer l’analogie, il n’est plus nécessaire de connaître une dizaine de marques de micro-ondes pour être capable de faire réchauffer un plat sans relire la notice : la source de chaleur est là, ça chauffe lorsqu’on approche un aliment.</p>
  523. <h2>Réinventer la roue</h2>
  524. <blockquote>
  525. <p>There’s nothing wrong with aesthetic enjoyment, and the joys of free software are many and varied. […] But these pleasures do not translate into political outcomes unless they are wedded to explicitly political activities.</p>
  526. <p><cite><em><a href="https://www.jacobinmag.com/2016/02/free-software-movement-richard-stallman-linux-open-source-enclosure/">Reclaiming the Computing Commons</a></em> (<a href="/david/cache/e6f57bb2a95da1508f0bb905bc08471c/">cache</a>)</cite></p>
  527. </blockquote>
  528. <p>Peut-être y a-t-il un acte politique dans la simplification de certaines briques. Celui de comprendre et d’être <a href="/david/blog/2016/javascript-reduit/">en capacité de transmettre</a>. Celui de proposer des alternatives un peu moins <em>mainstream</em> mais finalement enrichissantes aussi, souvent dans d’autres domaines.</p>
  529. <p>Réinventer la roue permet de comprendre pourquoi est-ce qu’il y a rotation et quelles sont les parties importantes. Il ne s’agit pas ici de savoir fondre une jante et de calculer le coefficient de friction de la gomme d’un pneu. Il ne s’agit pas tant de ré-interroger le <em>« comment »</em> que de creuser le <em>« pourquoi »</em>.</p>
  530. <h2>Passer à l’échelle</h2>
  531. <blockquote>
  532. <p>The cleaner and nicer the program, the faster it’s going to run. And if it doesn’t, it’ll be easy to make it fast.</p>
  533. <p><cite>Joshua Bloch</cite></p>
  534. </blockquote>
  535. <p>Les retours que j’ai eu lors de la <a href="/david/blog/2016/minimalisme-esthetique/">précédente intervention</a> portaient essentiellement là-dessus. Il se trouve qu’en choisissant des solutions minimalistes, elles sont bien souvent plus rapides et davantage interchangeables. Ce n’est pas toujours le cas car elles peuvent se révéler être plus spécifiques également.</p>
  536. <p>Tout le monde semble obnubilé par un passage à l’échelle avant même d’avoir un premier utilisateur. Considérant que la plupart des projets échouent pour bien d’autres raisons, il serait peut-être temps de réévaluer l’intérêt de dimensionner immédiatement les nouveaux services pour encaisser une charge qui n’arrivera probablement jamais…</p>
  537. <p>Les problèmes de performances sont vraiment des considérations de riches et doivent être traitées en fonction du besoin. Elles peuvent être anticipées dans le cas d’événements majeurs mais sinon un simple serveur suffit amplement sans avoir à imager, dockeriser, virtualiser, etc.</p>
  538. <h2>Stabilité</h2>
  539. <blockquote>
  540. <p>“Whatever new we do must make it possible for people to make a transition from old tools and ideas to new.” In this sense, software is less like a poem and more like a contract, a constitution, or a covenant. Software is history, organization, and social relationships made tangible.</p>
  541. <p><cite><em><a href="http://themaintainers.org/s/ensmenger-maintainers-v2.pdf">When Good Software Goes Bad</a></em> (<a href="/static/david/blog/ensmenger-maintainers-v2.pdf">cache</a>)</cite></p>
  542. </blockquote>
  543. <p>Le problème actuel d’utiliser des outils minimalistes c’est qu’ils sont peu employés ce qui demande souvent un plus grand investissement dans les communautés concernées. C’est aussi le sentiment d’appartenir à un petit groupe dont tous les membres travaillent sur un <em>bien commun</em> et le modèlent à l’image de leurs besoins et de leurs aspirations. Le rythme de développement devient aussi plus raisonnable car le périmètre est réduit à dessein.</p>
  544. <p>La stabilité d’une plateforme est aussi améliorée par le peu d’outils employés aux effets de bords non contrôlés. J’ai tellement d’exemples sur le sujet accumulés depuis ces quinze dernières années que cela pourrait faire l’objet d’un billet complet !</p>
  545. <h2>Maintenance</h2>
  546. <blockquote>
  547. <p>Capitalism excels at innovation but is failing at maintenance, and for most lives it is maintenance that matters more</p>
  548. <p><cite><em><a href="https://aeon.co/essays/innovation-is-overvalued-maintenance-often-matters-more">Innovation is overvalued. Maintenance often matters more</a></em> (<a href="/david/cache/172fb3d15c9330057ebaefda78e429dd/">cache</a>)</cite></p>
  549. </blockquote>
  550. <p>Le problème ici c’est que je n’ai jamais rencontré de projet qui réduisent leur complexité dans le temps. Que ce soit via des <a href="/david/stream/2015/08/24/">itérations de retrait</a> ou des réécritures complètes on arrive toujours à des usines à gaz si l’on ne s’est pas fixé en amont — de manière consentie par toutes les parties prenantes — les budgets évoqués plus haut. Pourtant en restant à l’échelle du <em>microlith</em>, la maintenance se trouverait potentiellement réduite de beaucoup.</p>
  551. <p>Si l’on s’en tient à l’estimation selon laquelle la <a href="http://themaintainers.org/s/ensmenger-maintainers-v2.pdf">maintenance représente 67% d’un produit</a> (<a href="/static/david/blog/ensmenger-maintainers-v2.pdf">cache</a>), il devient important de trouver comment réduire ce coût.</p>
  552. <h2>Conclusion</h2>
  553. <blockquote>
  554. <p>There are only two hard things in Computer Science: knowing how to admit you’re wrong and apologizing when you are.</p>
  555. <p><cite><a href="https://twitter.com/fogus/status/714916368022372354">Fogus</a></cite></p>
  556. </blockquote>
  557. <p>J’assume de pouvoir me tromper complètement sur le sujet. J’ai l’impression que la profession est en train de se scinder entre ceux qui suivent le rythme et ceux qui s’épuisent. Je propose ici une troisième voie qui me semble davantage soutenable tout en répondant à 80% du besoin et en utilisant des technologies récentes, il s’agit d’une <em>descente créative</em> chère aux adeptes de la permaculture.</p>
  558. <p><strong>Une forme de décroissance technique pour revenir aux fondamentaux sans pour autant s’en tenir à des expériences utilisateurs et développeurs de la décennie précédente.</strong></p>
  559. <p>Je n’ai pas l’impression d’être le seul dans ma démarche mais cela reste un mouvement minoritaire, ce qui est peut-être un atout. Là où les designers parlent de <a href="http://brutalistwebsites.com/">brutalité</a>, j’évoquerais plutôt la <a href="/david/blog/2014/diversion-numerique/">frugalité</a> avant même d’évoquer la composante <a href="https://ethicalweb.org/">éthique</a> (<a href="/david/cache/31f3a76ecda75ce903178e9a434621de/">cache</a>) qui finie forcément par être chatouillée.</p>
  560. <h2>Discussions</h2>
  561. <p>Pas mal de réactions suite à l’intervention qui a plutôt été bien accueillie. Il s’agissait d’un public — plutôt SSII et plutôt familier avec Java — qui n’a pas forcément les mêmes contraintes que pour du développement web. Néanmoins, j’ai retenu quelques axes de discussion :</p>
  562. <ul>
  563. <li>De nombreuses questions et réactions ont portées sur l’enseignement, sur la manière de découvrir par soi-même les limites d’un <em>framework</em> dans le temps imparti par exemple. C’est un sujet à part entière qui mériterait peut-être un billet dédié ou une intervention (ParisWeb ?).</li>
  564. <li>La thématique des itérations de retrait avec la distinction entre retirer du code et retirer des fonctionnalités. Entre le faire au fil de l’eau et dédier une période à cela.</li>
  565. <li>Sur la dualité valeur pour l’utilisateur et fun pour le développeur, sachant qu’avec du fun le développeur va vraisemblablement être en mesure de produire de la valeur plus rapidement.</li>
  566. <li>Sur la capacité à avoir des métriques en fonction de la solution technique retenue. J’ai été assez inspiré par la <em>keynote</em> de <a href="https://pedagogieagile.com/">Christian den Hartigh</a> et sur son introduction de l’aléatoire dans les réponses. Peut-être qu’en choisissant aléatoirement une solution technique cela produirait d’autres résultats ?</li>
  567. <li>Sur la question économique de la simplicité, moins de fonctionnalités équivalant à moins de temps/argent/pouvoir pour les développeurs.</li>
  568. <li>Sur l’industrialisation qui n’est rendue possible qu’avec une <em>stack</em> figée et propre à l’entreprise plus qu’au besoin.</li>
  569. </ul>
  570. <p>Et j’en oublie certainement d’autres, n’hésitez pas à expérimenter chez vous et à raconter vos propres histoires.</p>
  571. </article>
  572. <figure class="image" property="schema:image">
  573. <img src="/static/david/blog/2016/simplicite-defaut.jpg" alt="" />
  574. </figure>
  575. <nav id="jumpto">
  576. <p>
  577. <a rel=prev href="/david/blog/2016/classements-listes/">← Classements et listes</a> | <a href="/david/blog/" title="Retour à la liste des expériences">↑</a> | <a rel=next href="/david/blog/2016/mixit-2016/">Mix-IT 2016 →</a>
  578. </p>
  579. </nav>
  580. <footer>
  581. <div>
  582. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  583. <p>
  584. Bonjour/Hi!
  585. 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>
  586. 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>).
  587. </p>
  588. <p>
  589. 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>.
  590. </p>
  591. <p>
  592. Les dernières publications hebdomadaires sont :
  593. </p>
  594. <ul class="with_columns">
  595. <li>
  596. <a href="/david/stream/2019/12/17/">Origines</a>
  597. </li>
  598. <li>
  599. <a href="/david/stream/2019/12/10/">Publier</a>
  600. </li>
  601. <li>
  602. <a href="/david/stream/2019/12/03/">En forêt</a>
  603. </li>
  604. <li>
  605. <a href="/david/stream/2019/11/26/">Ecocentric</a>
  606. </li>
  607. <li>
  608. <a href="/david/stream/2019/11/19/">Se livrer</a>
  609. </li>
  610. <li>
  611. <a href="/david/stream/2019/11/12/">Dépendances</a>
  612. </li>
  613. <li>
  614. <a href="/david/stream/2019/11/05/">Positif</a>
  615. </li>
  616. <li>
  617. <a href="/david/stream/2019/10/29/">Dettes</a>
  618. </li>
  619. <li>
  620. <a href="/david/stream/2019/10/22/">Privilèges</a>
  621. </li>
  622. <li>
  623. <a href="/david/stream/2019/10/15/">Discrétion</a>
  624. </li>
  625. <li>
  626. <a href="/david/stream/2019/10/08/">Désespérance</a>
  627. </li>
  628. <li>
  629. <a href="/david/stream/2019/10/01/">Présent</a>
  630. </li>
  631. <li>
  632. <a href="/david/stream/2019/09/24/">Manifester</a>
  633. </li>
  634. <li>
  635. <a href="/david/stream/2019/09/17/">Arpenter</a>
  636. </li>
  637. <li>
  638. <a href="/david/stream/2019/09/10/">Nostalgie</a>
  639. </li>
  640. <li>
  641. <a href="/david/stream/2019/09/03/">Déconstruire</a>
  642. </li>
  643. <li>
  644. <a href="/david/stream/2019/08/27/">Documenter</a>
  645. </li>
  646. <li>
  647. <a href="/david/stream/2019/08/20/">Frustration</a>
  648. </li>
  649. <li>
  650. <a href="/david/stream/2019/08/13/">Holisme</a>
  651. </li>
  652. <li>
  653. <a href="/david/stream/2019/08/06/">1%</a>
  654. </li>
  655. <li>
  656. <a href="/david/stream/2019/07/30/">Exemplarité</a>
  657. </li>
  658. <li>
  659. <a href="/david/stream/2019/07/23/">Timelines</a>
  660. </li>
  661. <li>
  662. <a href="/david/stream/2019/07/16/">Écoute</a>
  663. </li>
  664. <li>
  665. <a href="/david/stream/2019/07/02/">Anxiété</a>
  666. </li>
  667. <li>
  668. <a href="/david/stream/2019/06/21/">À lier</a>
  669. </li>
  670. <li>
  671. <a href="/david/stream/2019/06/14/">Pauvreté</a>
  672. </li>
  673. <li>
  674. <a href="/david/stream/2019/06/07/">Amateur</a>
  675. </li>
  676. <li>
  677. <a href="/david/stream/2019/05/31/">Pollution</a>
  678. </li>
  679. <li>
  680. <a href="/david/stream/2019/05/24/">Apaisement</a>
  681. </li>
  682. <li>
  683. <a href="/david/stream/2019/05/10/">Folie</a>
  684. </li>
  685. <li>
  686. <a href="/david/stream/2019/05/03/">Sympathie</a>
  687. </li>
  688. <li>
  689. <a href="/david/stream/2019/04/12/">Péremption</a>
  690. </li>
  691. <li>
  692. <a href="/david/stream/2019/04/05/">Définitions</a>
  693. </li>
  694. <li>
  695. <a href="/david/stream/2019/03/29/">Acceptation</a>
  696. </li>
  697. <li>
  698. <a href="/david/stream/2019/03/22/">Dissonance</a>
  699. </li>
  700. <li>
  701. <a href="/david/stream/2019/03/15/">Reconnaissance</a>
  702. </li>
  703. <li>
  704. <a href="/david/stream/2019/03/08/">Lecture</a>
  705. </li>
  706. <li>
  707. <a href="/david/stream/2019/03/01/">Journaux</a>
  708. </li>
  709. <li>
  710. <a href="/david/stream/2019/02/22/">Écriture</a>
  711. </li>
  712. <li>
  713. <a href="/david/stream/2019/02/15/">Kyriarchie</a>
  714. </li>
  715. <li>
  716. <a href="/david/stream/2019/02/08/">Mots-serrures</a>
  717. </li>
  718. <li>
  719. <a href="/david/stream/2019/02/01/">Sans voie</a>
  720. </li>
  721. <li>
  722. <a href="/david/stream/2019/01/25/">Auto-diagnostic</a>
  723. </li>
  724. <li>
  725. <a href="/david/stream/2019/01/18/">Agilité</a>
  726. </li>
  727. <li>
  728. <a href="/david/stream/2019/01/11/">Métaphores</a>
  729. </li>
  730. <li>
  731. <a href="/david/stream/2019/01/04/">Balbutiements</a>
  732. </li>
  733. </ul>
  734. <p>
  735. Voici quelques articles choisis :
  736. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  737. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  738. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  739. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  740. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  741. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  742. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  743. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  744. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  745. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  746. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  747. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  748. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  749. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  750. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  751. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  752. </p>
  753. <p>
  754. 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>.
  755. </p>
  756. <p>
  757. Je ne traque pas ta navigation mais mon
  758. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  759. conserve des logs d’accès.
  760. </p>
  761. </div>
  762. </footer>
  763. <script type="text/javascript">
  764. ;(_ => {
  765. const jumper = document.getElementById('jumper')
  766. jumper.addEventListener('click', e => {
  767. e.preventDefault()
  768. const anchor = e.target.getAttribute('href')
  769. const targetEl = document.getElementById(anchor.substring(1))
  770. targetEl.scrollIntoView({behavior: 'smooth'})
  771. })
  772. })()
  773. </script>
  774. <script>
  775. /* Service workers */
  776. if (navigator.serviceWorker) {
  777. window.addEventListener('load', function () {
  778. var selector = 'a[href^="/david/cache/"], a[rel=prev], a[rel=next]'
  779. function sendLinks (selector) {
  780. var links = [].slice.call(document.querySelectorAll(selector)).map(function (link) {
  781. return link.getAttribute('href')
  782. })
  783. links.push(location.pathname) // Put the current page in cache too.
  784. navigator.serviceWorker.controller.postMessage({ links: links })
  785. }
  786. navigator.serviceWorker.getRegistration()
  787. .then(function (registration) {
  788. if (!registration || !navigator.serviceWorker.controller) {
  789. return navigator.serviceWorker.register('/serviceworker.js')
  790. .then(navigator.serviceWorker.ready)
  791. .then(function () {
  792. console.log('[ServiceWorker] Ready to go!')
  793. })
  794. .catch(console.error.bind(console))
  795. } else {
  796. console.log('[ServiceWorker] Send links via registration')
  797. sendLinks(selector)
  798. }
  799. })
  800. navigator.serviceWorker.addEventListener('controllerchange', function () {
  801. console.log('[ServiceWorker] Send links via controller change')
  802. sendLinks(selector)
  803. })
  804. navigator.serviceWorker.addEventListener('message', function (event) {
  805. var link = document.querySelector('a[href="' + event.data.link + '"]')
  806. if (event.data.status && link) {
  807. link.style.backgroundColor = '#2d7474'
  808. link.style.color = '#f0f0ea'
  809. link.setAttribute('title', 'En cache pour consultation sans connexion')
  810. }
  811. })
  812. })
  813. } else {
  814. console.warn('[ServiceWorker] No cache for old browsers.')
  815. }
  816. </script>