davideisinger.com

My personal website
Log | Files | Refs | README

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/