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

index.html 34KB

5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  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>Tiny Wins (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="http://joelcalifa.com/blog/tiny-wins/">
  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. Tiny Wins (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="http://joelcalifa.com/blog/tiny-wins/">Source originale du contenu</a></h3>
  445. <p>Over the years, I&rsquo;ve worked on many important, large-scale projects, from figuring out high level strategy and blue sky products, to overhauling core flows and IA, to implementing design systems from the ground up. </p>
  446. <p>Working on these big projects can be exhilarating. They&rsquo;re often deemed critical by company leadership and various stakeholders, and it&rsquo;s validating to be trusted with and attached to something so visible and impactful.</p>
  447. <p>I recently shipped two things at GitHub that had an impact beyond my wildest dreams. The amount of gratitude and love that spilled out of the community is like nothing I&rsquo;ve seen before.
  448. But the things I shipped weren&rsquo;t these huge, meaty projects. They were <em>tiny</em>.</p>
  449. <hr>
  450. <p>First, <strong>we made the favicons for GitHub Pull Request pages dynamic</strong>. Now browser tabs would always show a PR&rsquo;s current build status. Before releasing this, users had to periodically click back into tabs to see if their builds had completed so they could continue their work. Impatient users would click back into various PR tabs a <em>lot</em>.</p>
  451. <figure class="tweetEmbed"><blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">A little hack week project <a href="https://twitter.com/notdetails?ref_src=twsrc%5Etfw">@notdetails</a> and I just shipped. <a href="https://t.co/3EvfEmWtan">pic.twitter.com/3EvfEmWtan</a></p>&mdash; Jason Long (@jasonlong) <a href="https://twitter.com/jasonlong/status/922900826607190016?ref_src=twsrc%5Etfw">October 24, 2017</a></blockquote></figure>
  452. <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
  453. <p>I put together new favicons and Jason worked on implementing the dynamic switch. This change took less than a week, and hundreds of people noticed it immediately. This is just a small sample of the many delighted responses.</p>
  454. <div><picture>
  455. <source srcset="/assets/images/generated/blog/tiny-wins/tweets1-1029by1418-66f846.png" media="(min-width: 65rem)">
  456. <source srcset="/assets/images/generated/blog/tiny-wins/tweets1-880by1213-66f846.png" media="(min-width: 45rem)">
  457. <source srcset="/assets/images/generated/blog/tiny-wins/tweets1-700by965-66f846.png" media="(min-width: 35rem)">
  458. <source srcset="/assets/images/generated/blog/tiny-wins/tweets1-small-500by960-eba833.png">
  459. <img srcset="/assets/images/generated/blog/tiny-wins/tweets1-small-500by960-eba833.png" alt="Tweets about GitHub favicons" class="noBorder grown" >
  460. </picture>
  461. </div>
  462. <p>My next project was <strong>changing the <code>...</code> indicator on new PR pages to an arrow that indicated merge direction</strong>. Before releasing this, people would regularly confuse which branch would be merged into which.</p>
  463. <figure class="tweetEmbed"><blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Ever get confused between your &ldquo;base&rdquo; and &ldquo;compare&rdquo; branches? Shipped a tiny <a href="https://twitter.com/github?ref_src=twsrc%5Etfw">@github</a> change today that will hopefully clear things up. <a href="https://t.co/acOddhxLDs">pic.twitter.com/acOddhxLDs</a></p>&mdash; Joel Califa (@notdetails) <a href="https://twitter.com/notdetails/status/937823787495571456?ref_src=twsrc%5Etfw">December 4, 2017</a></blockquote></figure>
  464. <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
  465. <p>This was a one-line code change that took a few minutes. I didn&rsquo;t even design the arrow — it was already in our icon set.</p>
  466. <p>This tiny change solved a seemingly small frustration, but it turned out to be very significant to many of our users. Again, we saw hundreds of enthusiastic responses and shares.</p>
  467. <div><picture>
  468. <source srcset="/assets/images/generated/blog/tiny-wins/tweets2-1029by1418-2b701c.png" media="(min-width: 65rem)">
  469. <source srcset="/assets/images/generated/blog/tiny-wins/tweets2-880by1213-2b701c.png" media="(min-width: 45rem)">
  470. <source srcset="/assets/images/generated/blog/tiny-wins/tweets2-700by965-2b701c.png" media="(min-width: 35rem)">
  471. <source srcset="/assets/images/generated/blog/tiny-wins/tweets2-small-500by960-290bfc.png">
  472. <img srcset="/assets/images/generated/blog/tiny-wins/tweets2-small-500by960-290bfc.png" alt="Tweets about the GitHub merge arrow" class="noBorder grown" >
  473. </picture>
  474. </div>
  475. <h2>Low effort, high impact</h2>
  476. <p>The first of these changes took just under a week and the second took only a few minutes. Both changes affected very small sections of the platform, yet both enjoyed a passionate, almost euphoric reception. Users were <em>excited</em>.</p>
  477. <p>That&rsquo;s not to say that impact can or should be measured by the number of likes received (unlike, say, personal worth). But the individual responses tell a story of how meaningful even the smallest tweak can be to your users.</p>
  478. <p>I can&rsquo;t count how many times I&rsquo;ve seen the following graphic in its various forms over the years:</p>
  479. <div><img class="noBorder" src="/assets/images/blog/tiny-wins/evaluation.png" alt="Matrix of low to high effort and low to high impact"></div>
  480. <p>The obvious advice, as seen in this version of it, is to execute on things that take little time and make big dents. Curiously, I haven&rsquo;t seen many organizations actually take this advice to heart. Considering how valuable this type of work can be, I honestly don&rsquo;t understand why.</p>
  481. <p>Let&rsquo;s discuss what changes like this can do for you.</p>
  482. <h3>One small change can add up to a big win</h3>
  483. <p>High frequency actions (such as creating new PRs on GitHub) take place millions of times a day. A given user might go through the same flow several times per week, per day, or even per hour. These flows become a part of their lives.</p>
  484. <p>If there is even a slight inefficiency or frustration, it compounds with every use. One confusing moment that takes an extra 5 seconds—repeated multiple times a day in perpetuity—adds up to a lot of anxiety and wasted time.</p>
  485. <p><em>That&rsquo;s</em> why users are so thankful for these tweaks. They understand the significance of all that future time saved.</p>
  486. <p>We can see similar reactions after Netflix added a button that let users skip a TV show&rsquo;s intro sequence. Following this change, users no longer had to scrub back and forth through videos until they landed on the exact start of an episode.</p>
  487. <div><picture>
  488. <source srcset="/assets/images/generated/blog/tiny-wins/tweets3-1029by998-e52806.png" media="(min-width: 65rem)">
  489. <source srcset="/assets/images/generated/blog/tiny-wins/tweets3-880by853-e52806.png" media="(min-width: 45rem)">
  490. <source srcset="/assets/images/generated/blog/tiny-wins/tweets3-700by679-e52806.png" media="(min-width: 35rem)">
  491. <source srcset="/assets/images/generated/blog/tiny-wins/tweets3-small-500by960-dc4b6d.png">
  492. <img srcset="/assets/images/generated/blog/tiny-wins/tweets3-small-500by960-dc4b6d.png" alt="Tweets about Netflix's skip intro button" class="noBorder grown" >
  493. </picture>
  494. </div>
  495. <p>We can see more responses along the same lines after Chrome released a volume icon that indicated which tabs were making noise. Following this change, users no longer had to click into every open tab to find the source of their discomfort.</p>
  496. <div></div>
  497. <figure class="grown noBorder">
  498. <picture>
  499. <source srcset="/assets/images/generated/blog/tiny-wins/tweets4-1029by998-0ec748.png" media="(min-width: 65rem)">
  500. <source srcset="/assets/images/generated/blog/tiny-wins/tweets4-880by853-0ec748.png" media="(min-width: 45rem)">
  501. <source srcset="/assets/images/generated/blog/tiny-wins/tweets4-700by679-0ec748.png" media="(min-width: 35rem)">
  502. <source srcset="/assets/images/generated/blog/tiny-wins/tweets4-small-500by960-d5df44.png">
  503. <img srcset="/assets/images/generated/blog/tiny-wins/tweets4-small-500by960-d5df44.png" alt="Tweets about Chrome tabs' noise indicator" >
  504. </picture>
  505. <figcaption>Nobel prizes all around.</figcaption>
  506. </figure>
  507. <p>There are many more examples of this kind of overwhelming gratitude following similar tweaks. The changes may seem minor, but they resolved frustrations that were experienced over and over by <em>millions</em> of users. </p>
  508. <p>Imagine that one of your 20 Chrome tabs is currently auto-playing the most obnoxious video on the entire internet. The way you solve this is by trial-and-error clicking through every single tab. You didn&rsquo;t find it the first time. How is that possible? Ugh, maybe you clicked into it without noticing. Let&rsquo;s try again and again until finally, defeated, you close your entire browser. Rinse and repeat tomorrow and every other day for the foreseeable future.</p>
  509. <figure class="grown noBorder">
  510. <div><img class="noBorder" src="/assets/images/blog/tiny-wins/bad-experience.png" alt="the experience in emoji form"></div>
  511. <figcaption>A dramatized reenactment.</figcaption>
  512. </figure>
  513. <p>Compare that to the experience of just closing the tab with the noise icon.</p>
  514. <div><img class="noBorder grown" src="/assets/images/blog/tiny-wins/good-experience.png" alt="a better experience in emoji form"></div>
  515. <p>You can think of the aforementioned changes as shortcuts. The intermediate steps (randomly clicking through your many tabs to find the source of your pain, or racking your brain for which git branch merges into which so you don&rsquo;t accidentally break your company) are small paper cuts, but they add up. These changes get rid of them.</p>
  516. <p>Getting your personal pet peeve fixed is powerful, often more so than new, more substantial features. Think about all that cumulative impact resulting from such little effort.</p>
  517. <p>This is what I call a Tiny Win.</p>
  518. <h3>Tiny Wins can strengthen your business</h3>
  519. <p>Let&rsquo;s get this out of the way: large projects are important. If a company wants to continue innovating, tiny iterations like the ones above don&rsquo;t quite cut it. So, to be clear, I&rsquo;m not suggesting we begin planning roadmaps around these Tiny Wins. Ambitious projects should lead the way.</p>
  520. <p>But large scale projects demand coordination, diligence, and — most of all — time. These things don&rsquo;t happen overnight. In the time it takes to ship something of substance, a product can begin to feel stagnant. For a startup (especially one with viable competition) that stagnation can spell death.</p>
  521. <p>To combat this, companies have to create an atmosphere of momentum, and prove to their users that they&rsquo;re both listening and improving. They need to fill the long gaps between ambitious launches with smaller ships.</p>
  522. <p>Many companies try to strike a balance by building MVPs and iterating from there. This, ideally, provides users with regular value along every step of the way. But each of these steps can still take anywhere from a two-week sprint to several months—and the output of each step is not always inherently valuable. It&rsquo;s often the next small thing on the way to a more complete product.</p>
  523. <p>In contrast, the various improvements I listed above are all self-contained. Netflix&rsquo;s &ldquo;skip intro&rdquo; button is significant to users <em>in itself</em>. As is Chrome&rsquo;s noise indicators and GitHub&rsquo;s dynamic favicons.</p>
  524. <p>Because of this, these changes were perceived and acknowledged as fresh, complete features. They communicated to users that <em>they were being listened to</em>. These features bred excitement, goodwill, and likely loyalty towards their respective companies. Hell, they probably even contributed to some organic growth.</p>
  525. <p>MVPs and iteration are powerful tools that should be leveraged by companies looking to move quickly. But Tiny Wins are much more potent when it comes to filling the gaps, improving retention, and nurturing your community of users.</p>
  526. <h2>Make Tiny Wins work for you</h2>
  527. <p>OK, so Tiny Wins are great and they have this cute name to boot. Obviously you&rsquo;re sold on this. The next step, then, is to leverage them regularly and reap the rewards.</p>
  528. <p>Now, your first instinct might be to open up your user feedback channels and start prioritizing issues. I&rsquo;d caution against this.</p>
  529. <p>I noticed something weird about the issues we solved with these changes. They were almost never reported.</p>
  530. <p>Hundreds of people were ecstatic when we added that arrow to PR pages. Out of those, not a single one indicated that this flow was confusing. A lot of people assumed it was their own fault for not just &ldquo;getting&rdquo; it.</p>
  531. <div><picture>
  532. <source srcset="/assets/images/generated/blog/tiny-wins/tweets5-1029by180-309373.png" media="(min-width: 65rem)">
  533. <source srcset="/assets/images/generated/blog/tiny-wins/tweets5-880by154-309373.png" media="(min-width: 45rem)">
  534. <source srcset="/assets/images/generated/blog/tiny-wins/tweets5-700by122-309373.png" media="(min-width: 35rem)">
  535. <source srcset="/assets/images/generated/blog/tiny-wins/tweets5-small-500by375-d82c9d.png">
  536. <img srcset="/assets/images/generated/blog/tiny-wins/tweets5-small-500by375-d82c9d.png" alt="Tweets from people blaming themselves" class="noBorder grown" >
  537. </picture>
  538. </div>
  539. <p>Others get so accustomed to these flows that they don&rsquo;t even notice their anxiety. If they do, it&rsquo;s just part of life. The status quo. Something to live with, not improve.</p>
  540. <p>How many people recognized the act of scrubbing a video to find the start of an episode as improvable? How many people thought to ask the Chrome team to solve their noisy tab problems?</p>
  541. <blockquote>Something something faster horses.&rdquo; —Henry Ford<span class="arrow"></span></blockquote>
  542. <p>The lesson here is that you can&rsquo;t trust your users to bubble up the small stuff, which as we&rsquo;ve seen can often be the best stuff to build). This means that you can&rsquo;t exclusively rely on existing user feedback and tickets. You need to dig deeper.</p>
  543. <h3>Make a list, check it twice</h3>
  544. <p>Making a list of quick wins isn’t hard, but making sure that what you’re building is worth the effort can be trickier. Not every opportunity will have the kind of impact we saw above, and that’s what Tiny Wins are all about.</p>
  545. <p><strong>Tiny Wins are standalone.</strong> These changes are small, scoped, and provide their own value. If the change can&rsquo;t be appreciated on its own, it doesn&rsquo;t belong on the list.</p>
  546. <p><strong>Tiny Wins are low effort.</strong> These projects are straightforward, scoped, and takes a short amount of time. If the change requires a significant amount of time and effort, it doesn&rsquo;t belong on the list.</p>
  547. <p><strong>Tiny Wins are high impact.</strong> They affect things that the majority of users interact with on a regular basis. If the change won&rsquo;t have the compounding effects we&rsquo;ve discussed, it doesn&rsquo;t belong on the list. This means that something like addressing your system&rsquo;s <a href="http://blog.capwatkins.com/dark-corners">dark corners</a>, while important and worthwhile, is not right for this list.</p>
  548. <p><strong>Tiny Wins are often shortcuts.</strong> They save a user&rsquo;s time by getting rid of existing steps — <em>physical or mental</em> — required to perform an action. This is a really useful way to think about the types of changes we saw above, and a good way to differentiate them from other low-hanging fruits that don&rsquo;t belong on your lists. At least initially, users will still remember the frustrating experiences they once had to deal with. They&rsquo;ll remember them viscerally. That&rsquo;s where the love comes from.</p>
  549. <hr>
  550. <p>So start by setting up a meeting with as many perspectives as you can. Designers, Developers, PMs, Customer Success, and Support staff all have equally valuable insights here, but anyone with a finger on the pulse of your user base is especially important. Ask yourselves:</p>
  551. <ul>
  552. <li>What are your product&rsquo;s most frequently used flows?</li>
  553. <li>What about those flows is frustrating? What regularly takes up time or cognitive load? This could be an extra click or an ambiguous component.</li>
  554. <li>How frustrating are these moments? What is the sum of time or frustration that fixing each of these small things will save? How many users would be affected?</li>
  555. <li>Will it be noticeable? Will it be shareable? Will it create joy?</li>
  556. </ul>
  557. <p>Fresh eyes are extremely useful when it comes to answering these questions. I&rsquo;d only been at GitHub for a few months when I added the arrow to the PR page, and I did that because it just <em>didn&rsquo;t make sense</em> to me.</p>
  558. <p>Designers, like users, get used to their product and its various quirks. In time, it can become increasingly difficult to see what could be improved. So try to include new employees in this process. Make it a part of your team&rsquo;s on-boarding. And nurture an atmosphere that encourages your team to continue questioning the status quo even as they get to know the product.</p>
  559. <p>Once you&rsquo;ve populated the initial list, you can validate individual items with users and prioritize them based on effort/impact, as you would anything else.</p>
  560. <h3>Now do the things on the list</h3>
  561. <p>Every organization is different, so there isn&rsquo;t a universal process that&rsquo;ll work for everything. What I <em>can</em> say is that the key element to make this work is a regular cadence. This is what will create a sense that the company is listening and moving quickly. This is what will breed trust in your user base.</p>
  562. <ul>
  563. <li>Include a Tiny Win in every sprint, or fill your downtime by picking items off the list. Make sure these tweaks are shipped frequently.</li>
  564. <li>Keep the list alive by including new people, adding new items to it, revalidating it, and reprioritizing it often.</li>
  565. <li>Make it a point to include your social media managers early in the conversation. Highlighting these features the right way is extremely important, and also fun!</li>
  566. </ul>
  567. <p>That&rsquo;s it. Not exactly rocket science. Not exactly novel. But very powerful.</p>
  568. <p>I believe that getting into the habit of shipping Tiny Wins can do wonders for your brand. It can set you apart from competitors. It can show your users that you&rsquo;re listening to them and that they can trust you. It can turn those same users into promoters, boost your NPS, and lead to organic growth. Most importantly, it&rsquo;ll make your product, and the lives of your users, that much better.</p>
  569. <p>Imagine all of that for such a tiny amount of ongoing effort. </p>
  570. <p>So&hellip; what can you fix today?</p>
  571. </article>
  572. </section>
  573. <nav id="jumpto">
  574. <p>
  575. <a href="/david/blog/">Accueil du blog</a> |
  576. <a href="http://joelcalifa.com/blog/tiny-wins/">Source originale</a> |
  577. <a href="/david/stream/2019/">Accueil du flux</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. Voici quelques articles choisis :
  593. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  594. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  595. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  596. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  597. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  598. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  599. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  600. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  601. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  602. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  603. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  604. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  605. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  606. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  607. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  608. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  609. </p>
  610. <p>
  611. 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>.
  612. </p>
  613. <p>
  614. Je ne traque pas ta navigation mais mon
  615. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  616. conserve des logs d’accès.
  617. </p>
  618. </div>
  619. </footer>
  620. <script type="text/javascript">
  621. ;(_ => {
  622. const jumper = document.getElementById('jumper')
  623. jumper.addEventListener('click', e => {
  624. e.preventDefault()
  625. const anchor = e.target.getAttribute('href')
  626. const targetEl = document.getElementById(anchor.substring(1))
  627. targetEl.scrollIntoView({behavior: 'smooth'})
  628. })
  629. })()
  630. </script>