infrequently-org-tvobg0.txt (30133B)
1 [1]Skip to main content 2 3 [2]Infrequently Noted 4 5 Alex Russell on browsers, standards, and the process of progress. 6 7 8 • [3]Home 9 • [4]About 10 • [5] RSS 11 • [6]Mastodon 12 13 [7]Series 14 15 • [8]Browser Choice Must Matter 16 • [9]Effective Standards Work 17 • [10]The Performance Inequality Gap 18 19 Recently 20 21 • [11]Home Screen Advantage 22 • [12]The Performance Inequality Gap, 2024 23 • [13]Why Are Tech Reporters Sleeping On The Biggest App Store Story? 24 • [14]Safari 16.4 Is An Admission 25 • [15]'22, [16]'21, [17]'20, [18]Earlier 26 27 Popular 28 29 • [19]The Performance Inequality Gap, 2024 30 • [20]The Market for Lemons 31 • [21]The Performance Inequality Gap, 2023 32 • [22]Safari 16.4 Is An Admission 33 34 [23]The Market for Lemons 35 36 February 4, 2023 37 38 For most of the past decade, I have spent a considerable fraction of my 39 professional life consulting with teams building on the web. 40 41 It is not going well. 42 43 Not only are new services being built to a self-defeatingly low UX and 44 performance standard, existing experiences are pervasively re-developed on 45 unspeakably slow, JS-taxed stacks. At a business level, this is a disaster, 46 raising the question: "why are new teams buying into stacks that have failed so 47 often before?" 48 49 In other words, "why is this market so inefficient?" 50 51 • [24]What Did They Know And When Did They Know It? 52 • [25]Sandy Foundations 53 • [26]Denouement 54 • [27]Shrinkage 55 56 George Akerlof's most famous paper introduced economists to the idea that 57 information asymmetries distort markets and reduce the quality of goods because 58 sellers with more information can pass off low-quality products as more 59 valuable than informed buyers appraise them to be. ([28]PDF, [29]summary) 60 61 Customers that can't assess the quality of products pay the wrong amount for 62 them, creating a disincentive for high-quality products to emerge and working 63 against their success when they do. For many years, this effect has dominated 64 the frontend technology market. Partisans for slow, complex frameworks have 65 successfully marketed lemons as the hot new thing, despite the pervasive 66 failures in their wake, crowding out higher-quality options in the process.^ 67 [30][1] 68 69 These technologies were initially pitched on the back of "better user 70 experiences", but have [31]utterly failed to deliver on that promise outside of 71 the [32]high-management-maturity organisations in which they were born.^[33][2] 72 Transplanted into the wider web, these new stacks have proven to be [34] 73 expensive duds. 74 75 The complexity merchants knew their environments weren't typical, but sold 76 highly specialised to folks shopping for general purpose solutions anyway. They 77 understood most sites lack latency budgeting, dedicated performance teams, 78 hawkish management reviews, ship gates to prevent regressions, and end-to-end 79 measurements of critical user journeys. They grasped that massive investment in 80 controlling complexity is the only way to scale JS-driven frontends, but warned 81 none of their customers. 82 83 They also knew that their choices were hard to replicate. Few can afford to 84 build and maintain 3+ versions of a site ("desktop", "mobile", and "lite"), and 85 vanishingly few web experiences feature long sessions and login-gated content.^ 86 [35][3] 87 88 Armed with this knowledge, they kept the caveats to themselves. 89 90 What Did They Know And When Did They Know It? [36]# 91 92 This information asymmetry persists; the worst actors still haven't levelled 93 with their communities about what it takes to operate complex JS stacks at 94 scale. They did not signpost the delicate balance of engineering constraints 95 that allowed their products to adopt this new, slow, and complicated tech. Why? 96 For the same reason used car dealers don't talk up average monthly repair 97 costs. 98 99 The market for lemons depends on customers having less information than those 100 selling shoddy products. Some who hyped these stacks early on were earnestly 101 ignorant, which is forgivable when recognition of error leads to changes in 102 behaviour. But that's not what the most popular frameworks of the last decade 103 did. 104 105 As time passed, and the results continued to underwhelm, an initial lack of 106 clarity was revealed to be intentional omission. These omissions have been 107 material to both users and developers. Extensive evidence of these failures was 108 provided directly to their marketeers, often by me. At some point (certainly by 109 2017) the omissions veered into intentional prevarication. 110 111 Faced with the dawning realisation that this tech mostly made things worse, not 112 better, the JS-industrial-complex [37]pulled an Exxon. 113 114 They could have copped to an honest error, admitted that these technologies 115 require vast infrastructure to operate; that they are unscalable in the hands 116 of all but the most sophisticated teams. They did the opposite, doubling down, 117 [38]breathlessly announcing vapourware year after [39]year to forestall 118 critical thinking about fundamental design flaws. They also worked behind the 119 scenes to marginalise those who pointed out the disturbing results and 120 extraordinary costs. 121 122 Credit where it's due, the complexity merchants have been incredibly effective 123 in one regard: top-shelf marketing discipline. 124 125 Over the last ten years, they have worked overtime to make frontend an 126 evidence-free zone. The hucksters knew that discussions about performance 127 tradeoffs would not end with teams investing more in their technology, so 128 boosterism and misdirection were aggressively substituted for evidence and 129 debate. Like a curtain of Halon descending to put out the fire of engineering 130 dialogue, they blanketed the discourse with toxic positivity. Those who dared 131 speak up were branded "negative" and "haters", no matter how much data they 132 lugged in tow. 133 134 Sandy Foundations [40]# 135 136 [41]It was, of course, bullshit. 137 138 Astonishingly, gobsmackingly effective bullshit, but nonsense nonetheless. 139 There was a point to it, though. Playing for time allowed the bullshitters to 140 punt introspection of the always-wrong assumptions they'd built their entire 141 technical ediface on: 142 143 • CPUs get faster every year 144 145 [ narrator: [42]they do not ] 146 147 • Organisations can manage these complex stacks 148 149 [ narrator: [43]they cannot ] 150 151 In time, these misapprehensions would become cursed articles of faith. 152 153 All of this was [44]falsified by 2016, but nobody wanted to turn on the house 154 lights while the JS party was in full swing. Not the developers being showered 155 with shiny tools and boffo praise for replacing "legacy" HTML and CSS that 156 performed fine. Not the scoundrels peddling foul JavaScript elixirs and 157 potions. Not the managers that craved a check to write and a rewrite to take 158 credit for in lieu of critical thinking about user needs and market research. 159 160 Consider the narrative [45]Crazy Ivans that led to this point. 161 162 [46] By 2013 the trashfuture was here, just not evenly distributed yet. 163 Undeterred, the complexity merchants spent a decade selling <a href='/2022/12/ 164 performance-baseline-2023/'>inequality-exascerbating technology</a> as a 165 cure-all tonic. By 2013 the trashfuture was here, just not evenly distributed 166 yet. Undeterred, the complexity merchants spent a decade selling [47] 167 inequality-exascerbating technology as a cure-all tonic. 168 169 It's challenging to summarise a vast discourse over the span of a decade, 170 particularly one as dense with jargon and acronyms as that which led to today's 171 status quo of overpriced failure. These are not quotes, but vignettes of 172 distinct epochs in our tortured journey: 173 174 • "Progressive Enhancement has failed! Multiple pages are slow and clunky! 175 176 SPAs are a better user experience, and managing state is a big problem on 177 the client side. You'll need a tool to help structure that complexity when 178 rendering on the client side, and our framework works at scale" 179 180 [ [48]illustrative example ] 181 182 • "Instead of waiting on the JavaScript that will absolutely deliver a 183 superior SPA experience...someday...why not render on the server as well, 184 so that there's something for the user to look at while they wait for our 185 awesome and totally scalable JavaScript to collect its thoughts?" 186 187 [ [49]an intro to "isomorphic javascript", a.k.a. "Server-Side Rendering", 188 a.k.a. "SSR" ] 189 190 • "SPAs are a better experience, but everyone knows you'll need to do all the 191 work twice because SSR makes that better experience minimally usable. But 192 even with SSR, you might be sending so much JS that things feel bad. So 193 give us credit for a promise of vapourware for delay-loading parts of your 194 JS." 195 196 [ [50]impressive stage management ] 197 198 • "SPAs are a better experience. SSR is vital because SPAs take a long time 199 to start up, and you aren't using our vapourware to split your code 200 effectively. As a result, the main thread is often locked up, which could 201 be bad? 202 203 Anyway, this is totally your fault and not the predictable result of us 204 failing to advise you about the controls and budgets we found necessary to 205 scale JS in our environment. Regardless, we see that you lock up main 206 threads for seconds when using our slow system, so in a few years we'll 207 create a parallel scheduler that will break up the work transparently" 208 209 [ [51]2017's beautiful overview of a fated errand and [52]2018's 210 breathless re-brand ] 211 212 • "The scheduler isn't ready, but thanks for your patience; here's a new way 213 to spell your component that introduces new timing issues but doesn't 214 address the fact that our system is incredibly slow, built for browsers you 215 no longer support, and that CPUs are not getting faster" 216 217 [ [53]representative pitch ] 218 219 • "Now that you're 'SSR'ing your SPA and have re-spelt all of your 220 components, and given that the scheduler hasn't fixed things and CPUs 221 haven't gotten faster, why not skip SPAs and settle for progressive 222 enhancement of sections of a document?" 223 224 [ [54]"islands", [55]"server components", etc. ] 225 226 It's the [56]Steamed Hams of technology pitches. 227 228 Like Chalmers, teams and managers often acquiesce to the contradictions 229 embedded in the stacked rationalisations. Together, the community invented 230 dozens of reasons to look the other way, from the theoretically plausible to 231 the fully imaginary. 232 233 But even as the complexity merchant's well-intentioned victims meekly recite 234 the koans of trickle-down UX — it can work this time, if only we try it hard 235 enough! — the evidence mounts that "modern" web development is, in the main, an 236 expensive failure. 237 238 The baroque and insular terminology of the in-group is a clue. It's functional 239 purpose (outside of signaling) is to obscure furious plate spinning. The tech 240 isn't working, but admitting as much would shrink the market for lemons. 241 242 You'd be forgiven for thinking the verbiage was designed obfuscate. Little 243 comfort, then, that folks selling new approaches must now [57]wade through 244 waist-deep jargon excrement [58]to argue for the next increment of complexity. 245 246 The most recent turn is as predictable as it is bilious. Today's most 247 successful complexity merchants have never backed down, never apologised, and 248 never come clean about what they knew about the level of expense involved in 249 keeping SPA-oriented technologies in check. But they expect you'll follow them 250 down the next dark alley anyway: 251 252 [59] An admission against interest. An admission against interest. 253 254 And why not? The industry has been down to clown for so long it's hard to get 255 in the door if you aren't wearing a red nose. 256 257 The substitution of heroic developer narratives for user success happened 258 imperceptibly. Admitting it was a mistake would embarrass the good and the 259 great alike. Once the lemon sellers embed the data-light idea that improved 260 "Developer Experience" ("DX") leads to better user outcomes, improving "DX" 261 became and end unto itself. Many who knew better felt forced to play along. 262 263 The long lead time for falsifying trickle-down UX was a feature, not a bug; 264 they don't need you to succeed, only to keep buying. 265 266 As marketing goes, the "DX" [60]bait-and-switch is brilliant, but the tech 267 isn't delivering for anyone but developers.^[61][4] The highest goal of the 268 complexity merchants is to put brands on showcase microsites and to make 269 acqui-hiring failing startups easier. Performance and success of the resulting 270 products is merely a nice-to-have. 271 272 Denouement [62]# 273 274 You'd think there would be data, that we would be awash in case studies and 275 blog posts attributing product success to adoption of SPAs and heavy frameworks 276 in an incontrovertable way. 277 278 And yet, after more than a decade of JS hot air, the framework-centric pitch is 279 still phrased in speculative terms because there's no there there. The 280 complexity merchants can't cop to the fact that [63]management competence and 281 lower complexity — not baroque technology — are determinative of product and 282 end-user success. 283 284 The simmering, widespread failure of SPA-premised approaches has belatedly 285 forced the JS colporteurs to adapt their pitches. In each iteration, they must 286 accept a smaller rhetorical lane to explain why this stack is still the future. 287 288 The excuses are running out. 289 290 At long last, the journey has culminated with the rollout of [64]Core Web 291 Vitals. It finally provides an objective quality measurement that prospective 292 customers can use to assess frontend architectures. 293 294 It's no coincidence the final turn away from the SPA justification has happened 295 just as buyers can see a linkage between the stacks they've bought and the 296 monetary outcomes they already value; namely SEO. The objective buyer, circa 297 2023, will understand heavy JS stacks as a regrettable legacy, one that teams 298 who have hollowed out their HTML and CSS skill bases will pay for dearly in 299 years to come. 300 301 No doubt, many folks who know their JS-first stacks are slow will do as Akerlof 302 predicts, and obfuscate for as long as possible. The market for lemons is, 303 indeed, mostly a resale market, and the excesses of our lost decade will not be 304 flushed from the ecosystem quickly. Beware tools pitching "100 on Lighthouse" 305 without checking the real-world [65]Core Web Vitals results. 306 307 Shrinkage [66]# 308 309 A subtle aspect of Akerlof's theory is that markets in which lemons dominate 310 eventually shrink. I've [67]warned for years that the mobile web is under 311 threat from within, and [68]the depressing data I've cited about users moving 312 to apps and away from terrible web experiences is in complete alignment with 313 the theory. 314 315 When websites feel like worse experiences to the folks who write the checks, 316 why should anyone expect them to spend a lot on them? And when websites stop 317 being where accurate information and useful services are, will anyone still 318 believe there's a future in web development? 319 320 The lost decade we've suffered at the hands of lemon purveyors isn't just a 321 local product travesty; it's also an ecosystem-level risk. Forget AI putting 322 web developers out of jobs; JS-heavy web stacks have been shrinking the future 323 market for your services for years. 324 325 As [69]Stigliz memorably quipped: 326 327 Adam Smith's invisible hand — the idea that free markets lead to efficiency 328 as if guided by unseen forces — is invisible, at least in part, because it 329 is not there. 330 331 But dreams die hard. 332 333 I'm already hearing laments from folks who have been responsible citizens of 334 framework-landia lo these many years. Oppressed as they were by the lemon 335 vendors, they worry about babies being throw out with the bathwater, and I 336 empathise. But for the sake of users, and for the new opportunities for the web 337 that will open up when experiences finally improve, I say "chuck those tubs". 338 339 Chuck 'em hard, and post the photos of the unrepentant bastards that sold this 340 nonsense behind the cash register. 341 342 Anti JavaScript JavaScript Club 343 344 We lost a decade to smooth talkers and hollow marketeering; folks who failed 345 the most basic test of intellectual honesty: signposting known unknowns. 346 Instead of engaging honestly with the emerging evidence, they sold lemons and 347 shrunk the market for better solutions. Furiously playing catch-up to stay one 348 step ahead of market rejection, frontend's anguished, belated return to quality 349 has been hindered at every step by those who would stand to lose if their [70] 350 false premises and hollow promises were to be fully re-evaluated. 351 352 Toxic mimicry and recalcitrant ignorance must not be rewarded. 353 354 Vendor's random walk through frontend choices may eventually lead them to be 355 right twice a day, but that's not a reason to keep following their lead. No, we 356 need to move our attention back to the folks that have been right all along. 357 The people who never gave up on semantic markup, CSS, and progressive 358 enhancement for most sites. The people who, when slinging JS, have treated it 359 as special occasion food. The tools and communities whose culture puts the user 360 ahead of the developer and hold evidence of doing better for users in the 361 highest regard.^[71][1:1] 362 363 It's not healing, and it won't be enough to nurse the web back to health, but 364 tossing the Vercels and the Facebooks out of polite conversation is, at least, 365 a start. 366 367 Deepest thanks to [72]Bruce Lawson, [73]Heydon Pickering, [74]Frances Berriman, 368 and [75]Taylor Hunt for their thoughtful feedback on drafts of this post. 369 370 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 371 372 Footnotes 373 374 1. You wouldn't know it from today's frontend discourse, but the modern era 375 has never been without high-quality alternatives to React, Angular, Ember, 376 and other legacy desktop-era frameworks. 377 378 In a bazaar dominated by lemon vendors, many tools and communities have 379 been respectful of today's mostly-mobile users at the expense of their own 380 marketability. These are today's honest brokers and they deserve your 381 attention far more than whatever solution to a problem created by React 382 that the React community is on about this week. 383 384 This has included JS frameworks with an emphasis on speed and low overhead 385 vs. cadillac comfort of first-class IE8 support: 386 387 □ [76]Stencil 388 □ [77]Lit and [78]Polymer 389 □ [79]Svelte 390 □ [80]Preact 391 □ [81]Solid 392 □ [82]Marko 393 □ [83]Inferno 394 □ [84]Hyper 395 □ [85]FAST 396 □ [86]Vue 397 □ [87]Qwik 398 399 It's possible to make slow sites with any of these tools, but the ethos of 400 these communities is that what's good for users is essential, and what's 401 good for developers is nice-to-have — even as they compete furiously for 402 developer attention. This uncompromising focus on real quality is what has 403 been muffled by the blanket the complexity merchants have thrown over 404 today's frontend discourse. 405 406 Similarly, the SPA orthodoxy that precipitated the market for frontend 407 lemons has been challenged both by the continued success of "legacy" tools 408 like WordPress, as well as a new crop of HTML-first systems that provide 409 JS-friendly authoring but output that's largely HTML and CSS: 410 411 □ [88]Eleventy 412 □ [89]Astro 413 □ [90]Enhance 414 □ [91]SvelteKit 415 □ [92]Fresh 416 □ ...and many others. 417 418 The key thing about the tools that work more often than not is that they 419 start with simple output. The difficulty in managing what you've explicitly 420 added based on need, vs. what you've been bequeathed by an inscrutable Rube 421 Goldberg-esque framework, is an order of magnitude in difference. Teams 422 that adopt tools with simpler default output start with simpler problems 423 that tend to have better-understood solutions. [93]↩︎ [94]↩︎ 424 425 2. Organisations that manage their systems (not the other way around) can 426 succeed with any set of tools. They might pick some elegant ones and some 427 awkward ones, but the sine qua non of their success isn't what they pick 428 up, it's how they hold it. 429 430 Recall that Facebook became a multi-billion dollar, globe-striding colossus 431 using PHP and C++. 432 433 The differences between FB and your applications are likely legion. This is 434 why it's fundamentally lazy and wrong for TLs and PMs to accept any sort of 435 argument along the lines of "X scales, FB uses it". 436 437 Pigs can fly; it's only matter of how much force you apply — but if you 438 aren't willing to fund creation of a large enough trebuchet, it's unlikley 439 that porcine UI will take wing in your organisation. [95]↩︎ 440 441 3. I [96]hinted last year at and under-developed model for how we can evolve 442 our discussion around web performance to take account of the larger factors 443 that distinguish different kinds of sites. 444 445 While it doesn't account for many corner-cases, and is insufficient on its 446 own to describe multi-modal experiences like WordPress (a content-producing 447 editor for a small fraction of important users vs. shallow 448 content-consumption reader experience for most), I wind up thinking about 449 the total latency incurred in a user's session divided by the number of 450 interactions. This raises a follow-on question: what's an interaction? 451 Elsewhere, I've defined it as [97]"turns through the interaction loop", but 452 can be more easily described as "taps or clicks that involve your code 453 doing work". This helpfully excludes scrolling, but includes navigations. 454 455 ANYWAY, all of this nets out a session-depth weighted intuition about when 456 and where heavyweight frameworks make sense to load up-front: 457 458 Sites with shorter average sessions can afford less JS up-front. Sites with 459 shorter average sessions can afford less JS up-front. 460 461 Social media sites that gate content behind a login (and can use the login 462 process to pre-load bundles), and which have tons of data about session 463 depth — not to mention ML-based per-user bundling, staffed performance 464 teams, ship gates to prevent regressions, and the funding to build and 465 maintain at least 3 different versions of the site — can afford to make 466 fundamentally different choices about how much to load up-front and for 467 which users. 468 469 The rest of us, trying to serve all users from a single codebase, need to 470 prefer conservative choices that [98]align with our management capacity to 471 keep complexity in check. [99]↩︎ 472 473 4. The "DX" fixation hasn't even worked for developers, if we're being honest. 474 Teams I work with suffer eye-watering build times, shockingly poor code 475 velocity, mysterious performance cliffs, and some poor sod stuck in a broom 476 closet that nobody bothers, lest the webs stop packing. 477 478 And yet, these same teams are happy to tell me they couldn't live without 479 the new ball-and-chain. 480 481 One group, after weeks of debugging a particularly gnarly set of issues 482 brought on by their preposterously inefficient "CSS-in-JS" solution, 483 combined with React's penchant for terrible data flow management, actually 484 said to me that they were so glad they'd moved everything to hooks because 485 it was "so much cleaner" and that "CSS-in-JS" was great because "now they 486 could reason about it"; nevermind the weeks they'd just lost to the 487 combination of dirtier callstacks and harder to reason about runtime 488 implications of heisenbug styling. 489 490 Nothing about the lived experience of web development has meaningfully 491 improved, except perhaps for TypeScript adding structure to large 492 codebases. And yet, here we are. Celebrating failure as success while 493 parroting narratives about developer productivity that have no data to back 494 them up. 495 496 [100]Sunk-cost fallacy rules all we survey. [101]↩︎ 497 498 Next: [102]"Safari 16.4 Is An Admission" 499 500 Previously: [103]"The Performance Inequality Gap, 2023" 501 502 503 References: 504 505 [1] https://infrequently.org/2023/02/the-market-for-lemons/#content 506 [2] https://infrequently.org/ 507 [3] https://infrequently.org/ 508 [4] https://infrequently.org/about-me/ 509 [5] https://infrequently.org/feed/ 510 [6] https://toot.cafe/@slightlyoff 511 [7] https://infrequently.org/series/ 512 [8] https://infrequently.org/series/browser-choice-must-matter/ 513 [9] https://infrequently.org/series/effective-standards-work/ 514 [10] https://infrequently.org/series/performance-inequality/ 515 [11] https://infrequently.org/2024/02/home-screen-advantage/ 516 [12] https://infrequently.org/2024/01/performance-inequality-gap-2024/ 517 [13] https://infrequently.org/2024/01/the-web-is-the-app-store/ 518 [14] https://infrequently.org/2023/02/safari-16-4-is-an-admission/ 519 [15] https://infrequently.org/2022/ 520 [16] https://infrequently.org/2021/ 521 [17] https://infrequently.org/2020/ 522 [18] https://infrequently.org/2018/ 523 [19] https://infrequently.org/2024/01/performance-inequality-gap-2024/ 524 [20] https://infrequently.org/2023/02/the-market-for-lemons/ 525 [21] https://infrequently.org/2022/12/performance-baseline-2023/ 526 [22] https://infrequently.org/2023/02/safari-16-4-is-an-admission/ 527 [23] https://infrequently.org/2023/02/the-market-for-lemons/ 528 [24] https://infrequently.org/2023/02/the-market-for-lemons/#what-did-they-know-and-when-did-they-know-it%3F 529 [25] https://infrequently.org/2023/02/the-market-for-lemons/#sandy-foundations 530 [26] https://infrequently.org/2023/02/the-market-for-lemons/#denouement 531 [27] https://infrequently.org/2023/02/the-market-for-lemons/#shrinkage 532 [28] https://www.sfu.ca/~wainwrig/Econ400/akerlof.pdf 533 [29] https://en.wikipedia.org/wiki/The_Market_for_Lemons 534 [30] https://infrequently.org/2023/02/the-market-for-lemons/#fn-alex-approved-1 535 [31] https://dev.to/tigt/making-the-worlds-fastest-website-and-other-mistakes-56na 536 [32] https://infrequently.org/2022/05/performance-management-maturity/ 537 [33] https://infrequently.org/2023/02/the-market-for-lemons/#fn-everything-in-moderation-2 538 [34] https://infrequently.org/2022/12/performance-baseline-2023/ 539 [35] https://infrequently.org/2023/02/the-market-for-lemons/#fn-amortised-interaction-costs-3 540 [36] https://infrequently.org/2023/02/the-market-for-lemons/#what-did-they-know-and-when-did-they-know-it%3F 541 [37] https://www.scientificamerican.com/article/exxon-knew-about-climate-change-almost-40-years-ago/ 542 [38] https://techcrunch.com/2017/04/18/facebook-announces-react-fiber-a-rewrite-of-its-react-framework/ 543 [39] https://www.youtube.com/watch?v=NZoRlVi3MjQ 544 [40] https://infrequently.org/2023/02/the-market-for-lemons/#sandy-foundations 545 [41] https://ericwbailey.website/published/modern-health-frameworks-performance-and-harm/ 546 [42] https://infrequently.org/2022/12/performance-baseline-2023/ 547 [43] https://infrequently.org/2022/05/performance-management-maturity/ 548 [44] https://www.youtube.com/watch?v=4bZvq3nodf4 549 [45] https://en.wikipedia.org/wiki/Baffles_(submarine) 550 [46] https://youtu.be/Ar9R-CX217o?t=231 551 [47] https://infrequently.org/2022/12/performance-baseline-2023/ 552 [48] https://reactjs.org/blog/2014/02/15/community-roundup-16.html 553 [49] https://webbylab.com/blog/isomorphic-react/ 554 [50] https://reactjs.org/blog/2018/11/13/react-conf-recap.html 555 [51] https://www.youtube.com/watch?v=ZCuYPiUIONs 556 [52] https://www.youtube.com/watch?v=ByBPyMBTzM0 557 [53] https://www.youtube.com/watch?v=wXLf18DsV-I 558 [54] https://www.patterns.dev/posts/islands-architecture/ 559 [55] https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html 560 [56] https://simpsons.fandom.com/wiki/Steamed_Hams 561 [57] https://dev.to/tigt/making-the-worlds-fastest-website-and-other-mistakes-56na 562 [58] https://www.epicweb.dev/the-webs-next-transition 563 [59] https://twitter.com/rauchg/status/1619492334961569792 564 [60] https://infrequently.org/2018/09/the-developer-experience-bait-and-switch/ 565 [61] https://infrequently.org/2023/02/the-market-for-lemons/#fn-sunk-costs-4 566 [62] https://infrequently.org/2023/02/the-market-for-lemons/#denouement 567 [63] https://infrequently.org/2022/05/performance-management-maturity/ 568 [64] https://web.dev/vitals/ 569 [65] https://treo.sh/sitespeed 570 [66] https://infrequently.org/2023/02/the-market-for-lemons/#shrinkage 571 [67] https://infrequently.org/series/performance-inequality/ 572 [68] https://vimeo.com/364402896 573 [69] https://www.theguardian.com/education/2002/dec/20/highereducation.uk1#:~:text=Adam%20Smith's%20invisible%20hand%20%2D%20the,because%20it%20is%20not%20there. 574 [70] https://joshcollinsworth.com/blog/self-fulfilling-prophecy-of-react 575 [71] https://infrequently.org/2023/02/the-market-for-lemons/#fn-alex-approved-1 576 [72] https://brucelawson.co.uk/ 577 [73] https://heydonworks.com/ 578 [74] https://fberriman.com/ 579 [75] https://ti.gt/ 580 [76] https://stenciljs.com/ 581 [77] https://lit.dev/ 582 [78] https://polymer-library.polymer-project.org/3.0/docs/devguide/feature-overview 583 [79] https://svelte.dev/ 584 [80] https://preactjs.com/ 585 [81] https://www.solidjs.com/ 586 [82] https://markojs.com/ 587 [83] https://www.infernojs.org/ 588 [84] https://github.com/WebReflection/hyperHTML 589 [85] https://www.fast.design/ 590 [86] https://vuejs.org/ 591 [87] https://qwik.builder.io/ 592 [88] https://www.11ty.dev/ 593 [89] https://astro.build/ 594 [90] https://enhance.dev/docs/ 595 [91] https://kit.svelte.dev/ 596 [92] https://fresh.deno.dev/ 597 [93] https://infrequently.org/2023/02/the-market-for-lemons/#fnref-alex-approved-1 598 [94] https://infrequently.org/2023/02/the-market-for-lemons/#fnref-alex-approved-1:1 599 [95] https://infrequently.org/2023/02/the-market-for-lemons/#fnref-everything-in-moderation-2 600 [96] https://infrequently.org/2022/03/a-unified-theory-of-web-performance/#a-battle-between-two-teams 601 [97] https://infrequently.org/2022/03/a-unified-theory-of-web-performance/#a-battle-between-two-teams:~:text=These%20steps%20inform%20a%20general%20description%20of%20the%20interaction%20loop%3A 602 [98] https://infrequently.org/2022/05/performance-management-maturity/ 603 [99] https://infrequently.org/2023/02/the-market-for-lemons/#fnref-amortised-interaction-costs-3 604 [100] https://en.wikipedia.org/wiki/Sunk_cost 605 [101] https://infrequently.org/2023/02/the-market-for-lemons/#fnref-sunk-costs-4 606 [102] https://infrequently.org/2023/02/safari-16-4-is-an-admission/ 607 [103] https://infrequently.org/2022/12/performance-baseline-2023/