[Lecture slides. Work in progress…]
What the WWW was/is/will be all about, software engineering principles pertinent to web development (web=app=mobile), current failures and implications for startups, and maybe attempted forecasts?
A serial CTO’s perspective on what makes the world (of PWA startups particularly) tick.
- WWW: the web of everything
- Software engineering: goals and principles relevant to startups, web
- Zombies: recent trends
- Fail fast
There’s a URI scheme for everything…
דע מאין באת
- “Rodent oriented”: long and messy re/evolution
- Transport protocol…
- … “misused as application container”
- Zen garden
- Rounded corners…
- Web 2.0
- User generated content (UGC)
- Rails… Meteor, Hoodie
- Web scale
(Credit to Sir TBL, and so many/few giants’ shoulders, aside) the Web/Internet are a long sequence of many small technological revolutions.
- 70s: explosive growth
- BBS, CompuServe: network effect, social
- 80s: too much information, new tools needed
- “Lost in hyperspace”
- Precursors: Usenet (NNTP), Gopher, WAIS, VERONICA, IRC…
- Protocols (app layer): many before, and many since
90s: birth of WWW.
- HTML, HTTP
- URI/L, method, variants, content negotiation…
… “misused as application container”
Y2K: unresolved/able tension.
- Hypermedia future [Halasz]: didn’t happen
- SSI, CGI, RIA, LAMP
- DHTML, AJAX, SPA
- Semantic Web, Linked Data [TBL]: also didn’t happen? Yet?
… DOM API standard, SEO, bookmarklet, intranet, canvas, MathML (etc), WebRTC, REST, WebGL, iPhone(?), mobile, long tail, What the Stack?! (draft), Continuous(?), deferred script loading, HTTP/2, Devtools (Firebug, Weinre)…
- “Web isn’t a poster”: table-based layouts… raster→vector, 960 pixels, RWD, Flexbox, Grid
- Content/styling/behavior: separation of concerns (informal).
- (Inwards) Hacks, polyfills, jQuery, Houdini
- (Outwards) Unhosted, serverless, Bespin, Electron
- (Upwards) Dao of Web Design [LMGTFY?]
- Styleguide, Material Design, design system…
… Web 2.0
User generated content (UGC)
(NB: how radically different the WWW is — from non-networked, GUI, media…)
- Karma… WikiWikiWeb: crowdsourcing, Cunningham’s Law
- Folksonomies… Wisdom of the crowd
- Mashups, syndication, hackability
- Changed business models, YouTubers…
Rails… Meteor, Hoodie
How that evolution manifested in implementations. “The nice thing about standards is that you have so many to choose from.”*
- Preprocessing (SSI), asset pipelining… DSLs (HAML, Sass, CoffeeScript)
- Middleware, micro-libraries, micro-frameworks
- “Explicit is better” — or is it?
- Scaffolding: convention
- No HTTP (→WebSockets), no HTML (on wire) (→JSON), no CSS (→Stylus)
- Ecosystem: package/dependencies management
To summarize: WWW (tech stack, aka platform) > GUI (desktop, native).
- Inherently, or historically positioned to, better handle diversity
- Devices, form factor
- RWD (eg smartwatch, Google Glass)
- A11y (eg touch)
- Personalization, branding, etc (contrast with GUI rooted in uniformity)
- Native proprietary stacks suck!
- CDN > Rollout
- Already penetrated/won market: hybrid (WebView)
- Web 2.0, UGC, karma, SEO (see semantic), hypermedia (see),
- Social: FOAF, long tail, Webmentions…
- RWD, Mobile Web, PWA
- Memex??… NoteCards
- Rabbit holes: Tools for Thought / Howard Rheingold: “an exercise in retrospective futurism”
- Dear Developer, The Web Isn’t About You
- Bloatware: average site heavier than Doom
“Is it web scale?”
- Long tail
- Cal Henderson, Dunning-Kruger
- Django (et al) is broken
- Conway’s Law
- Look & feel
- App Store
- Evil Corp vetting
- Branding and modern UI
- WIMP to CUA, Alto to WorkplaceOS
- MVC (Smalltalk), CDE, Taligent, DCOM/CORBA
Whatever happened to?
- Web components
- Google Wave
- Dart (Swing…?)
- Crockford’s Seif
Bleeding edge: state of the art
Where are we today? Best practices?
- 12 Factor App Manifesto, Dao of Web Design
- Progressive enhancement: vs graceful degradation, in HTML, CSS, JS, feature detection, micro-experiences instead of “apps”, inclusiveness/empathy…
- Codebase: One codebase tracked in revision control, many deploys
- Dependencies: Explicitly declare and isolate dependencies
- Config: Store config in the environment
- Backing services: Treat backing services as attached resources
- Build, release, run: Strictly separate build and run stages
- Processes: Execute the app as one or more stateless processes
- Port binding: Export services via port binding
- Concurrency: Scale out via the process model
- Disposability: Maximize robustness with fast startup and graceful shutdown
- Dev/prod parity: Keep development, staging, and production as similar as possible
- Logs: Treat logs as event streams
- Admin processes: Run admin/management tasks as one-off processes
Eclectic reminders of concepts relevant to startups, web.
Neglected, rare. Daoism?
- People-centered (cf Agile Manifesto)
- Limitations-centered: cognitive complexity, adaptive complexity (vs time-space)
No silver bullet
- Software Crisis, 1968
- Criteria [for modularization], 1974
- OOA/D vs OOP
- Liskov substitution principle, type theory, correctness
- Process, Principles, and Goals, 1975
Life cycle methodologies
Meta of programming.
- SDLC. ALU.
- Extreme Programmers (XP), “release early and often”, Continuous
- … Agile Manifesto
Chief cause of problems is solutions
- Solution space; Whorf-Sapir?
- Specifications (formal)
NoSQL, no types, no OOP, no patterns
- Schemaless, no migrations
- Type theory/systems: weak, strong, static→dynamic
- Sharding — naturally
Zombies: where do they come from?
- Social phenomena
- Women invent programming, then displaced when commercialized during 70s; again, in recent apocalypse: feminization of workforce/poverty
- Seniority distribution [Uncle Bob]
Can’t go into zeitgeist/Trump — post-truth, idiocracy, propaganda, fake…
… except a few mentions?
… Dunning-Kruger? (Maybe not dyslexia, attention deficit, smartphones)
You’ve ruined JS
- “… not knowing how miserable they are” [Crockford]
- Programmer (language) evolution
- Crockford’s Seif?
- Desert generation [Bible]
- JS fatigue
- It’s the future!
- “The DOM isn’t slow, you are.”
- Solutions to problems you don’t have
כל התורה על רגל אחת.
- Design patterns vs language features [eg, Java vs LISP]
Critical theory: is hard
… “Ontology engineer” (problem/solution space), epistemology, anti-positivism, poetic, deconstruction, incommensurability, “indistinguishable from magic”, “not evenly distributed”, adoption curve/hype cycle, spiral dynamics (everybody’s right), stages of simulacrum, worse is better, Dunning-Kruger, thermodynamics?
Evidence: you (>99%) will fail!
- “הון סיכון”, Gaussian distribution, herd mentality, bubbles, adoption curve/hype cycle
- Embrace failure: learn, from experience, takes time
- Fail better: differentiation, competitive, innovate
- Fail faster: TTM, engineering
- Priority: time to market (because it must be a competition)
- You’re doing it wrong: over-schedule/budget
- It’s the tech (methodology), dummy!
SE for startups
Engineering: quality of service (ie orthogonal to features).
- Plan to throw one away
- Due diligence
- “Everything takes longer and costs more.”
- “There is always one more bug.” [First law of cybernetic entomology]
(Given to fools?)