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 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  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>Iterating the web away: losing the next generation (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://www.baldurbjarnason.com/notes/iterating-the-web-away/">
  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. Iterating the web away: losing the next generation (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://www.baldurbjarnason.com/notes/iterating-the-web-away/">Source originale du contenu</a></h3>
  445. <p>I made my first website more than twenty years ago. It was horrible.</p>
  446. <!--break-->
  447. <ul>
  448. <li>Black text on a dark grey background.</li>
  449. <li>A complex table layout.</li>
  450. <li>Animated gifs everywhere. (Some things never change.)</li>
  451. </ul>
  452. <p>Making it was a lot of fun, though.</p>
  453. <p>When, a few years ago, I dug the website up, my biggest issue wasn’t with its technical flaws but with my horrible design sense.</p>
  454. <p>Black on grey? Really?</p>
  455. <p>I had no taste. I like to think I’ve improved.</p>
  456. <p>As to the technical side, a lot of the flaws were just inherent in the web of the time. The web kind of sucked.</p>
  457. <p>But even though it did suck it pulled me in and turned me into a developer. I got into web development because it was interesting, fun, and challenging.</p>
  458. <p>Web development today is still challenging. But the rest?</p>
  459. <p>If I were a seventeen year old geek today, I’m not so sure that I’d get into web development.</p>
  460. <p>I’m convinced I wouldn’t.</p>
  461. <p>The web back then combined three important characteristics that made it very attractive to young geeks like me who wanted to <em>make something</em>:</p>
  462. <ol>
  463. <li>It was cheaper than the competition.</li>
  464. <li>It reached more people than the competition.</li>
  465. <li>It was easier than the competition.</li>
  466. </ol>
  467. <h2 id="cheaper">Cheaper</h2>
  468. <p>In the mid to late nineties, if you wanted to make interactive media—i.e. anything interesting on a computer—you didn’t have that many options.</p>
  469. <p>Tools like Director were well beyond your average teenager’s budget and most schools didn’t have it installed on their computers.</p>
  470. <p>Flash wasn’t a factor until the late nineties at the earliest and even then you still needed an expensive application too expensive for your average household.</p>
  471. <p>Pirating these apps was a pain in the ass and didn’t really become an option until you were in college. Pirating over a slow modem was always a hassle.</p>
  472. <p>If you had a Mac, you could probably get your hands on Hypercard.</p>
  473. <p>Proper programming environments and software development tools were too expensive and too hard to get.</p>
  474. <p>So, for most of us, Hypercard was it.</p>
  475. <p>Until the web arrived. Editing text files was and is free. Even the WYSIWIG HTML editors of the time were more widely available than Macromedia’s fare, flawed as those editors were.</p>
  476. <p>Today we have an embarrassment of riches. Every mobile phone platform offers a free development environment, even if some of them still require payment for distribution.</p>
  477. <p>Apple as of <a href="https://developer.apple.com/xcode/">Xcode 7</a> will no longer require a paid developer account for you to make an app to just put on your own phone.</p>
  478. <p>Being the free platform is no longer a competitive advantage when it comes to getting aspiring teenage developers interested.</p>
  479. <h2 id="distribution">Distribution</h2>
  480. <p>The Hypercard stacks I made before I got my first modem never went anywhere beyond the stack of floppies in my bedroom. Reaching people who might have been interested was hard, connecting with them and building a community of interest from Iceland was impossible.</p>
  481. <p>But the web made it easy. Communities is what the web <em>is</em>. Everything else is a complication.</p>
  482. <p>Overnight you went from being a lone geek with weirdo interests to being a part of something bigger. You were now connected with a large group of people who weren’t just interested in the same things but were interested in what <em>you</em> thought about them.</p>
  483. <p>Mind-blowing.</p>
  484. <p>Again, this has changed. The web has fractured as it has grown. The best way to connect with people is still through communities but these communities no longer exist as a network of websites like they did in the early days. Some of them exist as clusters within one social media silo or another. Others cluster around a single website.</p>
  485. <p>Distributing the stuff you make has become both much more complex and much simpler than just putting your website online and submitting it to a bunch of directories and search engines.</p>
  486. <p>It’s simpler in that you can connect with people just by joining a social media website and having a bunch of conversations. It’s more complex in that there are a host of venues and formats you can deliver and make things in, all of which are flooded with crap from all over the world. Blog posts, websites, ebooks, iBooks Author ebooks, Android and iOS apps, and more—even if you limit yourself to just interactive media, you still have a wealth of options. If you’re just thinking about creating and making digital stories in general, it’s an embarrassment of riches.</p>
  487. <p>Nobody will notice you in the flood, but the difficulty of getting attention just going to be a fact of life from now on, regardless of the platform you choose.</p>
  488. <h2 id="easier">Easier</h2>
  489. <p>Macromedia Director was a mess. I didn’t get a chance to work in Director until I was in my twenties but it remains to this day one of the most frustrating platforms I’ve ever worked with. It’s one of three platforms I know that were so inconsistent that you could do the exact same thing in the exact same way in an exactly identical context twice and it’d work in one but not the other.</p>
  490. <p>The only other platforms I’ve worked with that matched that frustration are the modern web and modern ebook development.</p>
  491. <p>(Web development being thankfully saner than ebook development.)</p>
  492. <p>But back in the nineties, the web was the simpler, less capable, but much easier option for making things. Especially if you were on a budget. You could, if you wanted, find an open source programming environment to work with but those were much harder, much more complicated, and, actually, not that much more capable.</p>
  493. <p>Hypercard, of course, was a lot easier. But it was also older, almost a relic even then—<a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/ElegantWeaponForAMoreCivilizedAge">“a more elegant weapon for a more civilised age”</a>. It didn’t even support colour out of the box. It also limited you to the Mac.</p>
  494. <p>Later on, Flash did give the web a run for its money in terms of the ease of making things, but that wasn’t a reality until the early 2000s. And even then it always lost on price.</p>
  495. <p>The web had the best balance of fun, distribution, price, and ease of making. For a young geek in the nineties it was <em>irresistible</em>.</p>
  496. <p>You can still limit yourself to a subset of the web that is relatively easy to work with, but unlike JavaScript, it isn’t so much a ‘good part’ as a plurality of ‘not ugly’ parts each with its own set of compromises. You can avoid frameworks like Angular, Ember, or React, but then you’re pretty sunk if you want to do something complex with the DOM. You can opt out of a lot of CSS complexities with things like BEM, but that also means opting out of most of the cascade’s useful features. And JavaScript has a host of idiosyncrasies that you simply can’t opt out of.</p>
  497. <p>You can’t make a decision on how to simplify your approach to web development—how to make it saner—without understanding the compromises, which by definition means that you already have to be a web development expert. Beginners are screwed.</p>
  498. <h2 id="iterating-the-web-away">Iterating the web away</h2>
  499. <p>Even though the web platform is vastly more capable today than it was twenty years ago, it still doesn’t match native apps in capabilities. <a href="https://www.red-sweater.com/blog/1110/cant-catch-me">It never will.</a> Which would be fine and dandy if it weren’t for how complicated web development has become. It’s not just a question of the escalating number of APIs, properties, and elements you need to keep track of, the web’s lack of a cohesive conceptual model means that the very foundation of the web platform is too complicated for a web developer to internalise.</p>
  500. <p>CSS makes no goddamn sense—it’s a horrible blended purée of incompatible layout models, naïve language construction, and irrationally tight coupling between seemingly unrelated parts (using the word ‘modules’ for a language as monolithic in its structure as CSS is a bit of a joke).</p>
  501. <p>Javascript has good bits but when you’re learning it <em>you can’t avoid the horrible bits</em>—it’s always going to be a mess to learn.</p>
  502. <p>HTML is reaching the complexity of a fully-fledged programming language but without any of the features you use to manage complexity. There is no shared conceptual framework between the various facets of web development.</p>
  503. <p><a href="https://en.wikipedia.org/wiki/Representational_state_transfer">REST</a> and <a href="https://en.wikipedia.org/wiki/HATEOAS">HATEOAS</a> come close but neither are built into the foundation of CSS or JavaScript in any meaningful way, nor is it easy to see how they could. It’s the foundation of HTTP, sure. And you can define a subset of HTML that is pretty much HATEOAS to a T. Which is why <a href="https://www.tbray.org/ongoing/When/201x/2015/06/05/End-of-HTML">they will outlast the rest of the web stack</a>. (See also Facebook’s Instant Articles, which uses HTML and HTTP, or Apple News.)</p>
  504. <p>Looking at the alternatives for a smart teenage geek, iOS app development, for example, you’d think that they’d be more complicated than web dev. But we’ve reached a point where it’s about to be the other way around.</p>
  505. <p>Cocoa development is complicated, sure, but its conceptual model is much more cohesive. The layout and rendering model makes more sense. Swift and Objective C are both complicated but are also both built on a fairly strong conceptual foundation (stronger than Javascript’s at least). Xcode playgrounds help a lot.</p>
  506. <p>The overall concepts behind native app development are easier to grasp and internalise, and the experience of developing for them is much more consistent, making it easier to learn their more complex features.</p>
  507. <h2 id="losing-the-next-generation">Losing the next generation</h2>
  508. <p>I’m worried that the next generation of smart-ass teenage developers is going to overwhelmingly choose native app development over web development. They’ll see it as the easier, more fun option. Web development will (or even has) become the boring thing you learn because your work needs you to.</p>
  509. <p>Chasing CSS rendering oddities—“goddamn it, why is this breaking, this used to work!”—is just about the most stupid way to spend an afternoon (regular bug hunting doesn’t even compare) and yet, as a web developer, it’s a major part of my job.</p>
  510. <p>In our zeal to chase after native app development we’ve lost sight of making web development logical, fun, and interesting. By chasing features we’ve sacrificed the developer experience.</p>
  511. <p>As I follow new CSS features, web component spec work, new JavaScript APIs and syntax features, it seems more an more clear that the future looks like Angular:</p>
  512. <p>Boring, complex, enterprise-y, and about as sexy as a mouldy gym sock.</p>
  513. <p>We don’t just need to pause web feature development, <a href="http://www.quirksmode.org/blog/archives/2015/07/stop_pushing_th.html">as Peter-Paul Koch suggested</a>, we need to rethink web development and the web platform from the ground up.</p>
  514. <p>Adding new features, even if they <em>do</em> address the platform’s flaws, doesn’t erase the bad parts. Beginners are just as screwed as they were before.</p>
  515. <p>The web platform needs to be more cohesive. It needs to be more consistent. It needs to be more fun. It’s <em>none</em> of these things. It doesn’t have to be that much easier, though that would be preferable—complexity can be fun if it has a consistent foundation and if the learning process is built on a strong feedback loop—but it needs to make more conceptual sense. A <em>lot</em> more sense.</p>
  516. <p>If we don’t, in ten years time, not only will all of the geeky teenagers of the world be making native apps and eschewing web dev, there’s a strong possibility that I’ll have joined them.</p>
  517. </article>
  518. </section>
  519. <nav id="jumpto">
  520. <p>
  521. <a href="/david/blog/">Accueil du blog</a> |
  522. <a href="https://www.baldurbjarnason.com/notes/iterating-the-web-away/">Source originale</a> |
  523. <a href="/david/stream/2019/">Accueil du flux</a>
  524. </p>
  525. </nav>
  526. <footer>
  527. <div>
  528. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  529. <p>
  530. Bonjour/Hi!
  531. 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>
  532. 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>).
  533. </p>
  534. <p>
  535. 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>.
  536. </p>
  537. <p>
  538. Voici quelques articles choisis :
  539. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  540. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  541. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  542. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  543. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  544. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  545. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  546. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  547. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  548. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  549. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  550. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  551. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  552. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  553. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  554. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  555. </p>
  556. <p>
  557. 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>.
  558. </p>
  559. <p>
  560. Je ne traque pas ta navigation mais mon
  561. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  562. conserve des logs d’accès.
  563. </p>
  564. </div>
  565. </footer>
  566. <script type="text/javascript">
  567. ;(_ => {
  568. const jumper = document.getElementById('jumper')
  569. jumper.addEventListener('click', e => {
  570. e.preventDefault()
  571. const anchor = e.target.getAttribute('href')
  572. const targetEl = document.getElementById(anchor.substring(1))
  573. targetEl.scrollIntoView({behavior: 'smooth'})
  574. })
  575. })()
  576. </script>