A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 5 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  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>Budget de performance : un indispensable à la rapidité des sites web (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://medium.com/@DamienJubeau/budget-de-performance-indispensable-rapidite-sites-web-a771922e89e8">
  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. Budget de performance : un indispensable à la rapidité des sites web (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://medium.com/@DamienJubeau/budget-de-performance-indispensable-rapidite-sites-web-a771922e89e8">Source originale du contenu</a></h3>
  445. <p name="8d9c" id="8d9c" class="graf--p graf-after--h2">Je vous propose de découvrir une notion essentielle pour adopter une véritable culture de la performance web sur vos projets : <strong class="markup--strong markup--p-strong">les budgets de performance</strong>.<br/>Ces derniers ne vont pas s’exprimer en euros, mais en secondes, en mégaoctects ou encore en nombre de fichiers !</p>
  446. <p name="7c7a" id="7c7a" class="graf--p graf-after--p">Une notion qui mériterait d’être connue et d’être utilisée par tous les métiers du web, pour accompagner le cycle de vie des sites web et <strong class="markup--strong markup--p-strong">reprendre le contrôle de leur rapidité</strong>.</p>
  447. <h3 name="9d92" id="9d92" class="graf--h3 graf-after--p">Le constat initial</h3>
  448. <p name="dc56" id="dc56" class="graf--p graf-after--figure"><strong class="markup--strong markup--p-strong">Le web grossit</strong>. Les pages s’alourdissent, le nombre de ressources (images, scripts, css, etc) nécessaires pour afficher une page web ne cesse de croître.</p>
  449. <p name="5c4d" id="5c4d" class="graf--p graf-after--p">Pourquoi ? Parce qu’aujourd’hui les sites web sont des applications à part entière, avec des fonctionnalités qui peuvent être très riches, et offrant de nombreux contenus multimédias.</p>
  450. <p name="08bc" id="08bc" class="graf--p graf-after--p">A l’heure actuelle, si l’on considère les 1000 sites les plus visités au monde, voici le bilan dressé :</p>
  451. <p name="003c" id="003c" class="graf--p graf-after--figure">Même si vous avez à coeur la performance lors du développement initial de votre site web, ce dernier <strong class="markup--strong markup--p-strong">va inexorablement évoluer </strong>: nouvelles fonctionnalités, nouveaux contenus, refactoring technique, etc.</p>
  452. <p name="97a7" id="97a7" class="graf--p graf-after--p">Votre site va vivre et s’enrichir : A/B Testing, moteur de recommandations, retargeting, click-to-chat, etc, sont autant de fonctionnalités qui se répandent et sont à même d’intervenir dans le cycle de vie de votre site web.</p>
  453. <p name="99f3" id="99f3" class="graf--p graf-after--p">Le budget de performance est un framework, un outil qui va vous permettre de <strong class="markup--strong markup--p-strong">placer la performance au coeur de vos préoccupations</strong> et d’<strong class="markup--strong markup--p-strong">éviter toute dérive</strong> qui conduirait à ralentir votre site, car n’oublions pas, <a href="https://www.dareboost.com/fr/webperf-impacts" data-href="https://www.dareboost.com/fr/webperf-impacts" class="markup--anchor markup--p-anchor" rel="nofollow">un site rapide est indispensable au succès de votre business.</a></p>
  454. <h3 name="293f" id="293f" class="graf--h3 graf-after--p">La vitesse est une fonctionnalité</h3>
  455. <p name="1732" id="1732" class="graf--p graf-after--h3">En 2010 Urs Hölzle a rapporté ce propos tenu par Larry Page, cofondateur de Google :</p>
  456. <blockquote name="e842" id="e842" class="graf--blockquote graf--startsWithDoubleQuote graf-after--p">“<em class="markup--em markup--blockquote-em">As a product manager you should know that speed is product feature number one.”</em></blockquote>
  457. <p name="debd" id="debd" class="graf--p graf-after--blockquote">(traduction : <em class="markup--em markup--p-em">en tant que responsable produit, tu devrais savoir que la vitesse est la fonctionnalité numéro un du produit</em>)</p>
  458. <p name="b4e1" id="b4e1" class="graf--p graf-after--p">La <strong class="markup--strong markup--p-strong">vitesse</strong> est une philosophie chez Google, puisque considérée depuis les débuts comme une <strong class="markup--strong markup--p-strong">différenciation</strong> majeure.<br/>Je vous propose de découvrir pourquoi ce propos est plein de sens, et en quoi il nous amène à la notion de budget de performance.</p>
  459. <p name="6b8e" id="6b8e" class="graf--p graf-after--p">Vous connaissez probablement la notion de suivi de disponibilité, qui consiste à s’assurer qu’un serveur web est bien disponible (uptime monitoring), sans quoi le site n’est tout simplement pas accessible. Il ne pourra donc pas produire de chiffre d’affaires dans cette période.<br/>Et cela peut représenter des pertes à long terme, vous risquez de vous priver à tout jamais des visiteurs qui n’auront pas pu accéder à vos pages.</p>
  460. <p name="acde" id="acde" class="graf--p graf-after--p"><strong class="markup--strong markup--p-strong">La vitesse de votre site, peut être vue comme un prolongement de sa disponibilité</strong> : à quoi bon avoir un site si ce dernier met 13 minutes à se charger ? Évidemment aucun. Il est très naturel de comprendre qu’un temps d’attente extrême ne produira aucun résultat.</p>
  461. <p name="75a5" id="75a5" class="graf--p graf-after--p">Et si le temps de chargement de votre page était d’une minute ? Peut-être quelques âmes patientes attendraient jusque là, mais rares seraient-elles !</p>
  462. <p name="e982" id="e982" class="graf--p graf-after--p">La <strong class="markup--strong markup--p-strong">perception de l’attente</strong> est un sujet complexe, et notre patience est impactée par de nombreux paramètres. Le premier et sans doute le plus fort : la valeur que nous attendons au bout du tunnel.</p>
  463. <p name="5893" id="5893" class="graf--p graf-after--p">Qui serait prêt à attendre 3h à la caisse d’un supermarché ? Personne.<br/>Qui serait prêt à attendre 3h pour la sortie du dernier smartphone en vogue ? Ils sont nombreux !</p>
  464. <p name="230f" id="230f" class="graf--p graf-after--p">Mais attention, tout le monde est loin d’être prêt à cela : <strong class="markup--strong markup--p-strong">notre perception de la valeur nous est personnelle</strong>.</p>
  465. <p name="fcf6" id="fcf6" class="graf--p graf-after--figure">Reprenons les courageux qui patientent dans la file pendant 3h. Seraient-ils prêts à la même chose par une température de 45° ? ou bien sous une tempête de neige ? Sans doute pas : <strong class="markup--strong markup--p-strong">notre capacité à attendre est contextuelle</strong> !</p>
  466. <p name="7722" id="7722" class="graf--p graf-after--p">La difficulté qui se présente à tout éditeur de site web, c’est de devoir faire abstraction de son propre contexte, pour prendre en compte, non pas sa propre expérience, mais bien la multitude de profils qui figure parmi ses visiteurs.</p>
  467. <p name="dd1f" id="dd1f" class="graf--p graf-after--p">Alors que l’attente effective d’un internaute sur votre page pourra être impactée par sa localisation (cf <a href="http://blog.dareboost.com/fr/2015/06/la-latence-pourquoi-ralentit-elle-votre-site-web/" data-href="http://blog.dareboost.com/fr/2015/06/la-latence-pourquoi-ralentit-elle-votre-site-web/" class="markup--anchor markup--p-anchor" rel="nofollow">les effets de la latence</a>), son accès Internet, son périphérique ou encore son navigateur web, la perception de cette attente pourra être impactée par ses habitudes de navigation, son expérience récente (le site précédemment visité était-il très lent ? très rapide ?), ses préjugés sur votre marque ou encore tout simplement son humeur !</p>
  468. <p name="198b" id="198b" class="graf--p graf-after--p">Pour chaque utilisateur, une fonctionnalité X ou Y aura<strong class="markup--strong markup--p-strong"> une valeur perçue différente</strong>.<br/>Toute fonctionnalité aura un impact technique sur votre site, et peut donc jouer sur l’attente à laquelle vous exposez un utilisateur.</p>
  469. <p name="bbd7" id="bbd7" class="graf--p graf-after--p">Si, comme l’évoque Larry Page, vous pensez à la vitesse comme la fonctionnalité principale de votre produit, vous aurez au coeur de vos préoccupations ces différents éléments.</p>
  470. <p name="d2ce" id="d2ce" class="graf--p graf-after--p"><strong class="markup--strong markup--p-strong">Une fonctionnalité n’a de sens pour un visiteur que si la valeur ajoutée apportée compense l’attente provoquée.</strong></p>
  471. <p name="1451" id="1451" class="graf--p graf-after--p"><strong class="markup--strong markup--p-strong">La notion de budget de performance</strong> va répondre à ce problème : non pas en vous imposant d’avoir un site rapide, mais en vous permettant de <strong class="markup--strong markup--p-strong">considérer chaque fonctionnalité comme devant respecter une contrainte de vitesse</strong>. Vous serez donc amené à faire les arbitrages nécessaires entre la valeur apportée par une fonctionnalité et ses impacts sur la vitesse.</p>
  472. <h3 name="e6b6" id="e6b6" class="graf--h3 graf-after--p">Quels indicateurs utiliser pour les budgets de performance ?</h3>
  473. <p name="6f37" id="6f37" class="graf--p graf-after--figure">La notion de budget n’est en soit pas complexe, et vous en comprendrez très simplement ces exemples :</p>
  474. <ul class="postList"><li name="435c" id="435c" class="graf--li graf--startsWithDoubleQuote graf-after--p">“Notre page d’accueil doit faire moins d’1Mo”</li><li name="854a" id="854a" class="graf--li graf--startsWithDoubleQuote graf-after--li">“Sur mobile, en 3G, toutes nos pages doivent s’afficher en moins de 3 secondes”</li><li name="f84d" id="f84d" class="graf--li graf--startsWithDoubleQuote graf-after--li">“Le serveur web doit répondre en moins de 200ms”</li></ul>
  475. <p name="7e01" id="7e01" class="graf--p graf-after--li">Comme nous l’évoquions, c’est un cadre que l’on va s’imposer de respecter, d’où la notion de “budget” : vous ne pouvez pas dépenser plus de X secondes, ou plus de Y Mo, etc.</p>
  476. <p name="ad61" id="ad61" class="graf--p graf-after--p">Ce cadre peut-être plus ou moins précis, et les seuils que l’on va y apporter peuvent être de natures très différentes.</p>
  477. <p name="9583" id="9583" class="graf--p graf-after--p">Le premier pas est probablement d’<strong class="markup--strong markup--p-strong">intégrer la notions de performance très en amont de vos projets</strong>, dès les premières expressions de besoins. J’apprécie énormément ce propos de <a href="http://bradfrost.com/blog/post/performance-as-design/" data-href="http://bradfrost.com/blog/post/performance-as-design/" class="markup--anchor markup--p-anchor" rel="nofollow">Brad Frost</a> à ce sujet :</p>
  478. <blockquote name="ffac" id="ffac" class="graf--blockquote graf-after--p"><em class="markup--em markup--blockquote-em">Statements of work, project proposals and design briefs should explicitly and repeatedly call out performance as a primary goal. “The goal of this project is to create a stunning, flexible, lightning-fast experience…”</em></blockquote>
  479. <p name="1076" id="1076" class="graf--p graf-after--blockquote"><em class="markup--em markup--p-em">(Les cahiers des charges, réponses à appels d’offres, et briefs de conception devraient explicitement et de manière répétée mentionner la performance comme objectif principal. “Le but de ce projet est de créer une expérience à couper le souffle, souple, rapide comme l’éclair …”)</em></p>
  480. <p name="76f3" id="76f3" class="graf--p graf-after--p">On s’assure ainsi de ne jamais oublier ce critère et d’en faire un point de vigilance majeur. C’est nécessaire à toutes les étapes de votre projet.<br/><strong class="markup--strong markup--p-strong">Plus la prise en compte de la performance sera tardive, plus les efforts à mettre en oeuvre seront importants.</strong></p>
  481. <p name="3e2d" id="3e2d" class="graf--p graf-after--p">Pour vous permettre d’exprimer vos budgets de performance, <a href="http://timkadlec.com/2014/11/performance-budget-metrics/" data-href="http://timkadlec.com/2014/11/performance-budget-metrics/" class="markup--anchor markup--p-anchor" rel="nofollow">Tim Kaldec</a> a proposé <strong class="markup--strong markup--p-strong">un découpage très intéressant des métriques disponibles</strong>, que je vous propose de découvrir ici :</p>
  482. <h4 name="c0f5" id="c0f5" class="graf--h4 graf-after--p"><strong class="markup--strong markup--h4-strong">Milestone timings (jalons temporels)</strong></h4>
  483. <p name="f6ab" id="f6ab" class="graf--p graf-after--h4"><em class="markup--em markup--p-em">Exemples : Temps de réponse serveur; Temps de chargement total; Temps avant début de l’affichage;</em></p>
  484. <p name="ca93" id="ca93" class="graf--p graf-after--p">Ces mesures ont l’avantage d’être faciles à suivre dans le temps, l’idéal pour mettre en place un cadre à respecter pour l’équipe technique. Attention cependant : le chargement d’une page ne se résume pas à un instant T, heureusement, le speedindex va venir en renfort.</p>
  485. <h4 name="d0b2" id="d0b2" class="graf--h4 graf-after--p"><strong class="markup--strong markup--h4-strong">SpeedIndex (indice de performance)</strong></h4>
  486. <p name="b434" id="b434" class="graf--p graf-after--h4">Cet indice est largement reconnu par les experts en performance web, car <strong class="markup--strong markup--p-strong">il retranscrit comment la page va se charger avec une seule valeur</strong>, d’un point de vue utilisateur.</p>
  487. <p name="dfc1" id="dfc1" class="graf--p graf-after--p">Il a donc mérité pour Tim une catégorie dédiée, et ce n’est pas un mal, même si j’aurais tendance à y ajouter le <em class="markup--em markup--p-em">Time To Interact</em> (qui fait partie de la catégorie précédente), car l’affichage de la page doit être complété de son interactivité pour que l’expérience utilisateur soit vraiment au rendez-vous.</p>
  488. <p name="62ef" id="62ef" class="graf--p graf-after--p">Si vous souhaitez en savoir plus sur le speedindex, vous trouverez dans cet article des <a href="http://blog.dareboost.com/fr/2015/07/start-render-visually-complete-speedindex/" data-href="http://blog.dareboost.com/fr/2015/07/start-render-visually-complete-speedindex/" class="markup--anchor markup--p-anchor" rel="nofollow">explications ainsi que sur 2 autres métriques liées au rendu visuel.</a></p>
  489. <h4 name="2926" id="2926" class="graf--h4 graf-after--p"><strong class="markup--strong markup--h4-strong">Quantity based metrics (Mesures basées sur la quantité)</strong></h4>
  490. <p name="198d" id="198d" class="graf--p graf-after--h4"><em class="markup--em markup--p-em">Exemples : Nombre de requêtes; Poids total de la page; Poids total des images</em></p>
  491. <p name="04b7" id="04b7" class="graf--p graf-after--p">Nous avons ici des mesures sans lien direct de cause à effet sur l’expérience utilisateur. Cependant, l’énorme avantage est que<strong class="markup--strong markup--p-strong"> ce sont des valeurs que l’on anticipe beaucoup mieux que l’impact sur l’expérience utilisateur</strong>.</p>
  492. <p name="3953" id="3953" class="graf--p graf-after--p">Comme nous l’indique Tim, il est bien plus facile de comprendre que l’ajout d’un script va augmenter le poids de la page, que d’anticiper l’impact de ce script sur le speedindex.</p>
  493. <p name="34bd" id="34bd" class="graf--p graf-after--p">Un autre exemple, très en amont dans la chaîne de conception, que j’apprécie beaucoup, est apporté par <a href="http://danielmall.com/articles/how-to-make-a-performance-budget/" data-href="http://danielmall.com/articles/how-to-make-a-performance-budget/" class="markup--anchor markup--p-anchor" rel="nofollow">Daniel Mall</a> : lors du maquette graphique, limiter le nombre de polices de caractères qu’il est possible d’utiliser ! C’est un exemple typique de la nécessité d’intégrer des budgets au plus tôt : la maquette proposée par votre graphiste peut être esthétiquement superbe, mais vous conduire à des performances nécessairement désastreuses;</p>
  494. <h4 name="d579" id="d579" class="graf--h4 graf-after--p"><strong class="markup--strong markup--h4-strong">Rule based metrics (mesures basées sur des règles)</strong></h4>
  495. <p name="e75c" id="e75c" class="graf--p graf-after--h4"><em class="markup--em markup--p-em">Exemples : score PageSpeed; score YSlow; score DareBoost</em></p>
  496. <p name="12b0" id="12b0" class="graf--p graf-after--p">Plusieurs outils existent sur le marché pour vous permettre vérifier sur une pages web le respect des bonnes pratiques qui favorisent la rapidité. Ces scores résument donc la qualité technique de vos pages du point de vue de la performance (les ressources sont-elles compressées ? les images sont-elles optimisées ? etc) .</p>
  497. <p name="6747" id="6747" class="graf--p graf-after--p">Là encore, il n’y a pas de relation directe avec l’expérience utilisateur, mais en intégrant ce type de scores dans vos budgets, vous vous assurez de <strong class="markup--strong markup--p-strong">détecter des régressions majeures</strong>, et de ne pas louper d’optimisation technique évidente.</p>
  498. <h3 name="b9bc" id="b9bc" class="graf--h3 graf-after--p">Comment fixer le seuil d’un budget ?</h3>
  499. <p name="100e" id="100e" class="graf--p graf-after--figure">Nous l’avons évoqué au cours des paragraphes précédents, les budgets de performance doivent être mis en place le plus tôt possible dans vos projets, et accompagner ceux-ci tout au long de leur cycle de vie.</p>
  500. <p name="a5c0" id="a5c0" class="graf--p graf-after--p">Il faudra veiller à<strong class="markup--strong markup--p-strong"> adapter les indicateurs utilisés en fonction des étapes et des interlocuteurs.</strong></p>
  501. <p name="5625" id="5625" class="graf--p graf-after--p">Mais quelles sont les méthodes pour fixer un budget ? Quelle vitesse devez-vous atteindre ? Comment choisir ces seuils qui vont accompagner vos projets et peuvent être des contraintes fortes à certaines étapes ?</p>
  502. <p name="55df" id="55df" class="graf--p graf-after--p">Ces questions ont été l’objet de l’article <a href="http://timkadlec.com/2014/01/fast-enough/" data-href="http://timkadlec.com/2014/01/fast-enough/" class="markup--anchor markup--p-anchor" rel="nofollow"><em class="markup--em markup--p-em">Fast Enough </em></a>de Tim Kaldec, qui nous rappelle notamment <strong class="markup--strong markup--p-strong">la règle des 20%</strong> apportée par Steven Seow :<strong class="markup--strong markup--p-strong"> on ne perçoit une différence entre deux durées que si l’écart entre elles est supérieur à 20%.</strong></p>
  503. <p name="f785" id="f785" class="graf--p graf-after--p">En vous basant sur cette règle, vous pourrez donc fixer vos budgets en vous positionnant <strong class="markup--strong markup--p-strong">par rapport à vos concurrents</strong>, que ce soit pour être meilleur (au moins, 20% plus rapide) ou à défaut, ne pas être être perçu comme plus lent ! (au plus, 20% plus lent).</p>
  504. <p name="d0c5" id="d0c5" class="graf--p graf-after--p">Autre méthode intéressante, toujours mentionnée dans cet article : <strong class="markup--strong markup--p-strong">se baser sur la perception du temps</strong>. Une réponse en moins de 100ms parait instantanée, 1 seconde est la durée pendant laquelle un internaute conserve son attention au maximum, alors qu’au bout de 10 secondes il l’aura totalement perdue.</p>
  505. <p name="d6bd" id="d6bd" class="graf--p graf-after--p">Vos budgets peuvent également être composés pour<strong class="markup--strong markup--p-strong"> prendre en compte les coûts pour vos visiteurs</strong> : dans de nombreux pays, les connexions mobiles sont encore limitées en bande passante, et naviguer sur des sites mobiles trop lourd est loin d’être anecdotique ! Pour en savoir plus, je vous invite à consulter cet excellent projet : <a href="http://whatdoesmysitecost.com/" data-href="http://whatdoesmysitecost.com/" class="markup--anchor markup--p-anchor" rel="nofollow">http://whatdoesmysitecost.com/</a></p>
  506. <p name="df3e" id="df3e" class="graf--p graf-after--p">Ces quelques données vous aideront, mais encore une fois, la perception de l’attente est dépendante de la valeur attendue et obtenue, c’est donc dans cette optique que vous devez concevoir vos budgets !</p>
  507. <h3 name="2613" id="2613" class="graf--h3 graf-after--p">S’adapter aux budgets ou adapter les budgets</h3>
  508. <p name="638b" id="638b" class="graf--p graf-after--h3">Lorsque vous ajoutez une nouvelle fonctionnalité ou un nouveau contenu, il n’est pas étonnant que vos budgets puissent être mis à mal. Mais votre objectif doit être de les respecter à tout prix !</p>
  509. <p name="e5ea" id="e5ea" class="graf--p graf-after--p"><strong class="markup--strong markup--p-strong">Lorsqu’un budget est enfreint</strong>, vous allez devoir successivement envisager ces différentes possibilités :</p>
  510. <ul class="postList"><li name="d79d" id="d79d" class="graf--li graf-after--p"><strong class="markup--strong markup--li-strong">optimiser</strong> : que ce soit sur ce changement ou sur un élément déjà existant, pouvez-vous mettre en place des optimisations qui vont vous permettre de respecter à nouveau les différents budgets ?</li><li name="1eab" id="1eab" class="graf--li graf-after--li"><strong class="markup--strong markup--li-strong">épurer</strong> : peut-être qu’un ancien contenu ou une ancienne fonctionnalité n’est plus nécessaire et peut être supprimé ?</li><li name="decd" id="decd" class="graf--li graf-after--li"><strong class="markup--strong markup--li-strong">abandonner</strong> : la valeur ajoutée apportée est-elle suffisante pour justifier une violation des budgets ? Si ce n’est pas le cas, c’est peut-être tout simplement que cette nouveauté n’en vaut pas la peine</li><li name="4107" id="4107" class="graf--li graf-after--li"><strong class="markup--strong markup--li-strong">évoluer</strong> : si aucune des actions précitées n’est envisageable, il ne vous restera pas d’autre solution que de faire évoluer les budgets de performance problématiques. Il n’est pas question de les abandonner, mais bien de les faire évoluer pour pouvoir intégrer le changement. Vous aurez ainsi un nouveau cadre à respecter à l’avenir.</li></ul>
  511. <p name="405d" id="405d" class="graf--p graf-after--li">Quelle que soit l’issue, <strong class="markup--strong markup--p-strong">le budget de performance en tant qu’outil aura fait son office</strong> : vous vous serez <strong class="markup--strong markup--p-strong">interrogé sur les impacts</strong> de cette évolution, et vous en aurez <strong class="markup--strong markup--p-strong">maîtrisé les conséquences</strong>.</p>
  512. <p name="b3de" id="b3de" class="graf--p graf-after--p">J’espère que cet article vous aura convaincu de l’utilité de mettre en oeuvre les budgets de performance dans vos projets, pour que tous ensemble nous allions vers un web plus rapide !</p>
  513. <blockquote name="74b7" id="74b7" class="graf--blockquote graf-after--p graf--last"><strong class="markup--strong markup--blockquote-strong"><em class="markup--em markup--blockquote-em">Damien Jubeau</em></strong><br/>CEO et co-fondateur du service en ligne <a href="https://www.dareboost.com" data-href="https://www.dareboost.com" class="markup--anchor markup--blockquote-anchor" rel="nofollow"><strong class="markup--strong markup--blockquote-strong">dareboost.com</strong></a> (diagnostic automatique de la performance web et surveillance quotidienne des budgets de performance)</blockquote>
  514. </article>
  515. </section>
  516. <nav id="jumpto">
  517. <p>
  518. <a href="/david/blog/">Accueil du blog</a> |
  519. <a href="https://medium.com/@DamienJubeau/budget-de-performance-indispensable-rapidite-sites-web-a771922e89e8">Source originale</a> |
  520. <a href="/david/stream/2019/">Accueil du flux</a>
  521. </p>
  522. </nav>
  523. <footer>
  524. <div>
  525. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  526. <p>
  527. Bonjour/Hi!
  528. 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>
  529. 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>).
  530. </p>
  531. <p>
  532. 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>.
  533. </p>
  534. <p>
  535. Voici quelques articles choisis :
  536. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  537. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  538. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  539. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  540. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  541. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  542. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  543. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  544. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  545. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  546. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  547. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  548. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  549. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  550. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  551. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  552. </p>
  553. <p>
  554. 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>.
  555. </p>
  556. <p>
  557. Je ne traque pas ta navigation mais mon
  558. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  559. conserve des logs d’accès.
  560. </p>
  561. </div>
  562. </footer>
  563. <script type="text/javascript">
  564. ;(_ => {
  565. const jumper = document.getElementById('jumper')
  566. jumper.addEventListener('click', e => {
  567. e.preventDefault()
  568. const anchor = e.target.getAttribute('href')
  569. const targetEl = document.getElementById(anchor.substring(1))
  570. targetEl.scrollIntoView({behavior: 'smooth'})
  571. })
  572. })()
  573. </script>