{
  "id": "programming-for-wizards",
  "title": "Programming for Wizards",
  "generatedAt": "2026-07-28T08:19:16.327Z",
  "phase": "01-enhanced-static-manuscript",
  "features": {
    "notes": "planned",
    "solidNotes": "planned",
    "exhibitRuntime": true,
    "readerSettings": true,
    "mathRendering": true,
    "staticFallbacks": true
  },
  "downloads": [
    {
      "format": "epub",
      "title": "EPUB",
      "url": "programming-for-wizards.epub"
    }
  ],
  "chapters": [
    {
      "id": "01-this-is-not-a-programming-book",
      "number": "01",
      "title": "This is not a programming book",
      "part": "Prologue",
      "partId": "prologue",
      "url": "chapters/01-this-is-not-a-programming-book.html",
      "previous": null,
      "next": "interlude-01-useful-tricks",
      "wordCount": 558,
      "rule": null
    },
    {
      "id": "02-numbers-hiding-calculations-in-symbols",
      "number": "02",
      "title": "Numbers: bigger than you think",
      "part": "Part I: Representations are spells",
      "partId": "representations-are-spells",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html",
      "previous": "interlude-01-useful-tricks",
      "next": "03-logic-turning-truth-into-machinery",
      "wordCount": 1759,
      "rule": "Wizard's first rule"
    },
    {
      "id": "03-logic-turning-truth-into-machinery",
      "number": "03",
      "title": "Logic: the truth is out there",
      "part": "Part I: Representations are spells",
      "partId": "representations-are-spells",
      "url": "chapters/03-logic-turning-truth-into-machinery.html",
      "previous": "02-numbers-hiding-calculations-in-symbols",
      "next": "04-language-the-tool-that-changes-the-thinker",
      "wordCount": 763,
      "rule": "Wizard's second rule"
    },
    {
      "id": "04-language-the-tool-that-changes-the-thinker",
      "number": "04",
      "title": "Language: the oldest trick",
      "part": "Part I: Representations are spells",
      "partId": "representations-are-spells",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html",
      "previous": "03-logic-turning-truth-into-machinery",
      "next": "interlude-02-meaning-escapes",
      "wordCount": 629,
      "rule": "Wizard's third rule"
    },
    {
      "id": "05-the-web-as-address",
      "number": "05",
      "title": "The Web: one string to rule them all",
      "part": "Part II: The Web",
      "partId": "the-web",
      "url": "chapters/05-the-web-as-address.html",
      "previous": "interlude-02-meaning-escapes",
      "next": "06-the-web-as-document",
      "wordCount": 1304,
      "rule": "Wizard's fourth rule"
    },
    {
      "id": "06-the-web-as-document",
      "number": "06",
      "title": "The Web: the shape of words",
      "part": "Part II: The Web",
      "partId": "the-web",
      "url": "chapters/06-the-web-as-document.html",
      "previous": "05-the-web-as-address",
      "next": "07-the-web-as-platform",
      "wordCount": 1676,
      "rule": "Wizard's fifth rule"
    },
    {
      "id": "07-the-web-as-platform",
      "number": "07",
      "title": "The Web: waking up the words",
      "part": "Part II: The Web",
      "partId": "the-web",
      "url": "chapters/07-the-web-as-platform.html",
      "previous": "06-the-web-as-document",
      "next": "interlude-03-poor-protocol",
      "wordCount": 1263,
      "rule": "Wizard's sixth rule"
    },
    {
      "id": "08-programming-languages-are-for-humans",
      "number": "08",
      "title": "Teaching machines our words",
      "part": "Part III: Inventing languages",
      "partId": "inventing-languages",
      "url": "chapters/08-programming-languages-are-for-humans.html",
      "previous": "interlude-03-poor-protocol",
      "next": "09-every-program-contains-a-language",
      "wordCount": 1083,
      "rule": "Wizard's seventh rule"
    },
    {
      "id": "09-every-program-contains-a-language",
      "number": "09",
      "title": "Separated by a Common Language",
      "part": "Part III: Inventing languages",
      "partId": "inventing-languages",
      "url": "chapters/09-every-program-contains-a-language.html",
      "previous": "08-programming-languages-are-for-humans",
      "next": "10-code-exhibit-extending-javascript-with-jaqt",
      "wordCount": 1447,
      "rule": "Wizard's eighth rule"
    },
    {
      "id": "10-code-exhibit-extending-javascript-with-jaqt",
      "number": "10",
      "title": "Code exhibit: growing queries inside javascript",
      "part": "Part III: Inventing languages",
      "partId": "inventing-languages",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html",
      "previous": "09-every-program-contains-a-language",
      "next": "interlude-04-worse-spell",
      "wordCount": 2044,
      "rule": null
    },
    {
      "id": "11-the-knitted-castle",
      "number": "11",
      "title": "The knitted castle",
      "part": "Part IV: Boundaries",
      "partId": "boundaries",
      "url": "chapters/11-the-knitted-castle.html",
      "previous": "interlude-04-worse-spell",
      "next": "12-objects-binding-data-behavior-and-time",
      "wordCount": 1591,
      "rule": "Wizard's ninth rule"
    },
    {
      "id": "12-objects-binding-data-behavior-and-time",
      "number": "12",
      "title": "Boundaries: Data, behavior, and time",
      "part": "Part IV: Boundaries",
      "partId": "boundaries",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html",
      "previous": "11-the-knitted-castle",
      "next": "13-architecture-arches-pyramids-and-change",
      "wordCount": 1216,
      "rule": "Wizard's tenth rule"
    },
    {
      "id": "13-architecture-arches-pyramids-and-change",
      "number": "13",
      "title": "Architecture: arches and change",
      "part": "Part IV: Boundaries",
      "partId": "boundaries",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html",
      "previous": "12-objects-binding-data-behavior-and-time",
      "next": "interlude-05-knitted-castle",
      "wordCount": 1374,
      "rule": "Wizard's eleventh rule"
    },
    {
      "id": "14-the-web-as-commons",
      "number": "14",
      "title": "The Web as commons: innovation happens elsewhere",
      "part": "Part V: The Next Web",
      "partId": "the-next-web",
      "url": "chapters/14-the-web-as-commons.html",
      "previous": "interlude-05-knitted-castle",
      "next": "15-the-web-as-data",
      "wordCount": 1171,
      "rule": null
    },
    {
      "id": "15-the-web-as-data",
      "number": "15",
      "title": "The Web as data: things should have addresses too",
      "part": "Part V: The Next Web",
      "partId": "the-next-web",
      "url": "chapters/15-the-web-as-data.html",
      "previous": "14-the-web-as-commons",
      "next": "16-the-web-as-home",
      "wordCount": 1337,
      "rule": null
    },
    {
      "id": "16-the-web-as-home",
      "number": "16",
      "title": "The Web as home: who owns your home directory?",
      "part": "Part V: The Next Web",
      "partId": "the-next-web",
      "url": "chapters/16-the-web-as-home.html",
      "previous": "15-the-web-as-data",
      "next": "interlude-06-final-rule",
      "wordCount": 1022,
      "rule": null
    },
    {
      "id": "17-rule-zero-there-are-no-rules",
      "number": "17",
      "title": "Epilogue: the margin you have been using",
      "part": "Epilogue",
      "partId": "epilogue",
      "url": "chapters/17-rule-zero-there-are-no-rules.html",
      "previous": "interlude-06-final-rule",
      "next": "18-colophon.md",
      "wordCount": 728,
      "rule": "Wizard's final rule"
    },
    {
      "id": "18-colophon.md",
      "number": "18",
      "title": "Acknowledgements",
      "part": "Epilogue",
      "partId": "epilogue",
      "url": "chapters/18-colophon.md.html",
      "previous": "17-rule-zero-there-are-no-rules",
      "next": "about-the-author",
      "wordCount": 74,
      "rule": null
    }
  ],
  "pages": [
    {
      "id": "cover",
      "kind": "cover",
      "label": "Cover",
      "title": "Programming for Wizards",
      "part": "Cover",
      "partId": "cover",
      "url": "index.html",
      "wordCount": 58
    },
    {
      "id": "01-this-is-not-a-programming-book",
      "kind": "chapter",
      "label": "01",
      "title": "This is not a programming book",
      "part": "Prologue",
      "partId": "prologue",
      "url": "chapters/01-this-is-not-a-programming-book.html",
      "wordCount": 558
    },
    {
      "id": "interlude-01-useful-tricks",
      "kind": "interlude",
      "label": null,
      "title": "Interlude",
      "part": "Interlude",
      "partId": "interlude",
      "url": "chapters/interlude-01-useful-tricks.html",
      "wordCount": 27
    },
    {
      "id": "02-numbers-hiding-calculations-in-symbols",
      "kind": "chapter",
      "label": "02",
      "title": "Numbers: bigger than you think",
      "part": "Part I: Representations are spells",
      "partId": "representations-are-spells",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html",
      "wordCount": 1759
    },
    {
      "id": "03-logic-turning-truth-into-machinery",
      "kind": "chapter",
      "label": "03",
      "title": "Logic: the truth is out there",
      "part": "Part I: Representations are spells",
      "partId": "representations-are-spells",
      "url": "chapters/03-logic-turning-truth-into-machinery.html",
      "wordCount": 763
    },
    {
      "id": "04-language-the-tool-that-changes-the-thinker",
      "kind": "chapter",
      "label": "04",
      "title": "Language: the oldest trick",
      "part": "Part I: Representations are spells",
      "partId": "representations-are-spells",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html",
      "wordCount": 629
    },
    {
      "id": "interlude-02-meaning-escapes",
      "kind": "interlude",
      "label": null,
      "title": "Interlude",
      "part": "Interlude",
      "partId": "interlude",
      "url": "chapters/interlude-02-meaning-escapes.html",
      "wordCount": 26
    },
    {
      "id": "05-the-web-as-address",
      "kind": "chapter",
      "label": "05",
      "title": "The Web: one string to rule them all",
      "part": "Part II: The Web",
      "partId": "the-web",
      "url": "chapters/05-the-web-as-address.html",
      "wordCount": 1304
    },
    {
      "id": "06-the-web-as-document",
      "kind": "chapter",
      "label": "06",
      "title": "The Web: the shape of words",
      "part": "Part II: The Web",
      "partId": "the-web",
      "url": "chapters/06-the-web-as-document.html",
      "wordCount": 1676
    },
    {
      "id": "07-the-web-as-platform",
      "kind": "chapter",
      "label": "07",
      "title": "The Web: waking up the words",
      "part": "Part II: The Web",
      "partId": "the-web",
      "url": "chapters/07-the-web-as-platform.html",
      "wordCount": 1263
    },
    {
      "id": "interlude-03-poor-protocol",
      "kind": "interlude",
      "label": null,
      "title": "Interlude",
      "part": "Interlude",
      "partId": "interlude",
      "url": "chapters/interlude-03-poor-protocol.html",
      "wordCount": 20
    },
    {
      "id": "08-programming-languages-are-for-humans",
      "kind": "chapter",
      "label": "08",
      "title": "Teaching machines our words",
      "part": "Part III: Inventing languages",
      "partId": "inventing-languages",
      "url": "chapters/08-programming-languages-are-for-humans.html",
      "wordCount": 1083
    },
    {
      "id": "09-every-program-contains-a-language",
      "kind": "chapter",
      "label": "09",
      "title": "Separated by a Common Language",
      "part": "Part III: Inventing languages",
      "partId": "inventing-languages",
      "url": "chapters/09-every-program-contains-a-language.html",
      "wordCount": 1447
    },
    {
      "id": "10-code-exhibit-extending-javascript-with-jaqt",
      "kind": "chapter",
      "label": "10",
      "title": "Code exhibit: growing queries inside javascript",
      "part": "Part III: Inventing languages",
      "partId": "inventing-languages",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html",
      "wordCount": 2044
    },
    {
      "id": "interlude-04-worse-spell",
      "kind": "interlude",
      "label": null,
      "title": "Interlude",
      "part": "Interlude",
      "partId": "interlude",
      "url": "chapters/interlude-04-worse-spell.html",
      "wordCount": 29
    },
    {
      "id": "11-the-knitted-castle",
      "kind": "chapter",
      "label": "11",
      "title": "The knitted castle",
      "part": "Part IV: Boundaries",
      "partId": "boundaries",
      "url": "chapters/11-the-knitted-castle.html",
      "wordCount": 1591
    },
    {
      "id": "12-objects-binding-data-behavior-and-time",
      "kind": "chapter",
      "label": "12",
      "title": "Boundaries: Data, behavior, and time",
      "part": "Part IV: Boundaries",
      "partId": "boundaries",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html",
      "wordCount": 1216
    },
    {
      "id": "13-architecture-arches-pyramids-and-change",
      "kind": "chapter",
      "label": "13",
      "title": "Architecture: arches and change",
      "part": "Part IV: Boundaries",
      "partId": "boundaries",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html",
      "wordCount": 1374
    },
    {
      "id": "interlude-05-knitted-castle",
      "kind": "interlude",
      "label": null,
      "title": "Interlude",
      "part": "Interlude",
      "partId": "interlude",
      "url": "chapters/interlude-05-knitted-castle.html",
      "wordCount": 30
    },
    {
      "id": "14-the-web-as-commons",
      "kind": "chapter",
      "label": "14",
      "title": "The Web as commons: innovation happens elsewhere",
      "part": "Part V: The Next Web",
      "partId": "the-next-web",
      "url": "chapters/14-the-web-as-commons.html",
      "wordCount": 1171
    },
    {
      "id": "15-the-web-as-data",
      "kind": "chapter",
      "label": "15",
      "title": "The Web as data: things should have addresses too",
      "part": "Part V: The Next Web",
      "partId": "the-next-web",
      "url": "chapters/15-the-web-as-data.html",
      "wordCount": 1337
    },
    {
      "id": "16-the-web-as-home",
      "kind": "chapter",
      "label": "16",
      "title": "The Web as home: who owns your home directory?",
      "part": "Part V: The Next Web",
      "partId": "the-next-web",
      "url": "chapters/16-the-web-as-home.html",
      "wordCount": 1022
    },
    {
      "id": "interlude-06-final-rule",
      "kind": "interlude",
      "label": null,
      "title": "Interlude",
      "part": "Interlude",
      "partId": "interlude",
      "url": "chapters/interlude-06-final-rule.html",
      "wordCount": 37
    },
    {
      "id": "17-rule-zero-there-are-no-rules",
      "kind": "chapter",
      "label": "17",
      "title": "Epilogue: the margin you have been using",
      "part": "Epilogue",
      "partId": "epilogue",
      "url": "chapters/17-rule-zero-there-are-no-rules.html",
      "wordCount": 728
    },
    {
      "id": "18-colophon.md",
      "kind": "chapter",
      "label": "18",
      "title": "Acknowledgements",
      "part": "Epilogue",
      "partId": "epilogue",
      "url": "chapters/18-colophon.md.html",
      "wordCount": 74
    },
    {
      "id": "about-the-author",
      "kind": "back-matter",
      "label": "Bio",
      "title": "About the author",
      "part": "Back Matter",
      "partId": "back-matter",
      "url": "chapters/about-the-author.html",
      "wordCount": 133
    }
  ],
  "exhibits": [],
  "rules": [
    {
      "id": "02-numbers-hiding-calculations-in-symbols-1",
      "anchor": "rule-02-wizards-first-rule",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "label": "Wizard's first rule",
      "text": "Steal the good stuff.",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#rule-02-wizards-first-rule"
    },
    {
      "id": "03-logic-turning-truth-into-machinery-1",
      "anchor": "rule-03-wizards-second-rule",
      "chapter": "03-logic-turning-truth-into-machinery",
      "label": "Wizard's second rule",
      "text": "Tables don't lie.",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#rule-03-wizards-second-rule"
    },
    {
      "id": "04-language-the-tool-that-changes-the-thinker-1",
      "anchor": "rule-04-wizards-third-rule",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "label": "Wizard's third rule",
      "text": "Change the words. Change the world.",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#rule-04-wizards-third-rule"
    },
    {
      "id": "05-the-web-as-address-1",
      "anchor": "rule-05-wizards-fourth-rule",
      "chapter": "05-the-web-as-address",
      "label": "Wizard's fourth rule",
      "text": "Start small, to build big.",
      "url": "chapters/05-the-web-as-address.html#rule-05-wizards-fourth-rule"
    },
    {
      "id": "06-the-web-as-document-1",
      "anchor": "rule-06-wizards-fifth-rule",
      "chapter": "06-the-web-as-document",
      "label": "Wizard's fifth rule",
      "text": "Choose what haunts you.",
      "url": "chapters/06-the-web-as-document.html#rule-06-wizards-fifth-rule"
    },
    {
      "id": "07-the-web-as-platform-1",
      "anchor": "rule-07-wizards-sixth-rule",
      "chapter": "07-the-web-as-platform",
      "label": "Wizard's sixth rule",
      "text": "Your spells may gain a life of their own.",
      "url": "chapters/07-the-web-as-platform.html#rule-07-wizards-sixth-rule"
    },
    {
      "id": "08-programming-languages-are-for-humans-1",
      "anchor": "rule-08-wizards-seventh-rule",
      "chapter": "08-programming-languages-are-for-humans",
      "label": "Wizard's seventh rule",
      "text": "The bill always comes due.",
      "url": "chapters/08-programming-languages-are-for-humans.html#rule-08-wizards-seventh-rule"
    },
    {
      "id": "09-every-program-contains-a-language-1",
      "anchor": "rule-09-wizards-eighth-rule",
      "chapter": "09-every-program-contains-a-language",
      "label": "Wizard's eighth rule",
      "text": "Mind your language.",
      "url": "chapters/09-every-program-contains-a-language.html#rule-09-wizards-eighth-rule"
    },
    {
      "id": "11-the-knitted-castle-1",
      "anchor": "rule-11-wizards-ninth-rule",
      "chapter": "11-the-knitted-castle",
      "label": "Wizard's ninth rule",
      "text": "Assumptions are threads. Cut the threads.",
      "url": "chapters/11-the-knitted-castle.html#rule-11-wizards-ninth-rule"
    },
    {
      "id": "12-objects-binding-data-behavior-and-time-1",
      "anchor": "rule-12-wizards-tenth-rule",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "label": "Wizard's tenth rule",
      "text": "Choose wisely when to choose.",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#rule-12-wizards-tenth-rule"
    },
    {
      "id": "13-architecture-arches-pyramids-and-change-1",
      "anchor": "rule-13-wizards-eleventh-rule",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "label": "Wizard's eleventh rule",
      "text": "You will be wrong. Try not to make it hurt.",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#rule-13-wizards-eleventh-rule"
    },
    {
      "id": "17-rule-zero-there-are-no-rules-1",
      "anchor": "rule-17-wizards-final-rule",
      "chapter": "17-rule-zero-there-are-no-rules",
      "label": "Wizard's final rule",
      "text": "There are no rules.",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#rule-17-wizards-final-rule"
    }
  ],
  "anchors": [
    {
      "id": "h-01-this-is-not-a-programming-book",
      "type": "heading",
      "label": "This is not a programming book",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#h-01-this-is-not-a-programming-book"
    },
    {
      "id": "p-01-there-are-a-lot-of-books-about-programming",
      "type": "paragraph",
      "label": "There are a lot of books about programming. Many of them are called some variant of Programming for Dummies. This is not",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-there-are-a-lot-of-books-about-programming"
    },
    {
      "id": "p-01-this-book-does-not-teach-you-how-to",
      "type": "paragraph",
      "label": "This book doesn't teach you how to write software. It doesn't even tell you what kind of software to write. Instead, I h",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-this-book-does-not-teach-you-how-to"
    },
    {
      "id": "p-01-that-is-what-a-wizard-would-do",
      "type": "paragraph",
      "label": "That is what a wizard would do.",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-that-is-what-a-wizard-would-do"
    },
    {
      "id": "p-01-im-using-the-term-wizard-a-lot-and",
      "type": "paragraph",
      "label": "I'm using the term wizard a lot, and I don't mean it in a way that suggests some level of competence or earned wisdom. I",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-im-using-the-term-wizard-a-lot-and"
    },
    {
      "id": "p-01-but-to-understand-where-and-how-to-change",
      "type": "paragraph",
      "label": "But to understand where and how to change the world, you must first understand how it got to be the way it is. And the i",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-but-to-understand-where-and-how-to-change"
    },
    {
      "id": "p-01-that-is-the-point-of-this-book",
      "type": "paragraph",
      "label": "That's the point of this book.",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-that-is-the-point-of-this-book"
    },
    {
      "id": "p-01-you-may-already-have-good-tools-a-productive",
      "type": "paragraph",
      "label": "You may already have good tools, a productive framework and years of experience using them. This book isn't an argument ",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-you-may-already-have-good-tools-a-productive"
    },
    {
      "id": "p-01-now-this-doesnt-mean-we-should-just-go",
      "type": "paragraph",
      "label": "Now, this doesn't mean we should just go about changing anything we like. For one thing, you will find it difficult to c",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-now-this-doesnt-mean-we-should-just-go"
    },
    {
      "id": "p-01-and-the-best-way-to-do-that-is",
      "type": "paragraph",
      "label": "And the best way to do that is to look at what other wizards have done, and are doing.",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-and-the-best-way-to-do-that-is"
    },
    {
      "id": "p-01-then-steal-their-wisdom",
      "type": "paragraph",
      "label": "Then steal their wisdom.",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-then-steal-their-wisdom"
    },
    {
      "id": "p-01-most-of-the-chapters-in-this-book-are",
      "type": "paragraph",
      "label": "Most of the chapters in this book are stories about people doing exactly that. They changed the notation. They changed t",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-most-of-the-chapters-in-this-book-are"
    },
    {
      "id": "p-01-and-after-that-everyone-else-said-the-new",
      "type": "paragraph",
      "label": "And after that, everyone else said the new thing was obvious.",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-and-after-that-everyone-else-said-the-new"
    },
    {
      "id": "p-01-that-is-how-magic-usually-works",
      "type": "paragraph",
      "label": "That's how magic usually works.",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-that-is-how-magic-usually-works"
    },
    {
      "id": "p-01-one-place-worth-stealing-from-is-the-web",
      "type": "paragraph",
      "label": "One place worth stealing from is the Web. It's one of the very few examples of a software system so successful that it t",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-one-place-worth-stealing-from-is-the-web"
    },
    {
      "id": "p-01-the-web-is-a-chaotic-place-full-of",
      "type": "paragraph",
      "label": "The Web is a chaotic place, full of shining new buildings, patched machinery, forgotten corridors, and ruins that still ",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-the-web-is-a-chaotic-place-full-of"
    },
    {
      "id": "p-01-lets-find-out",
      "type": "paragraph",
      "label": "Let's find out.",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#p-01-lets-find-out"
    },
    {
      "id": "aside-01-write-in-the-margins",
      "type": "aside",
      "label": "Write in the margins",
      "chapter": "01-this-is-not-a-programming-book",
      "url": "chapters/01-this-is-not-a-programming-book.html#aside-01-write-in-the-margins"
    },
    {
      "id": "h-02-numbers-bigger-than-you-think",
      "type": "heading",
      "label": "Numbers: bigger than you think",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#h-02-numbers-bigger-than-you-think"
    },
    {
      "id": "p-02-how-do-you-make-a-number-bigger-than",
      "type": "paragraph",
      "label": "How do you make a number bigger than your fingers?",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-how-do-you-make-a-number-bigger-than"
    },
    {
      "id": "p-02-its-no-secret-that-programming-is-based-on",
      "type": "paragraph",
      "label": "It's no secret that programming is based on numbers. Two of them, 0 and 1. It may come as a surprise that one of those n",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-its-no-secret-that-programming-is-based-on"
    },
    {
      "id": "p-02-lets-go-back-way-back-to-the-first",
      "type": "paragraph",
      "label": "Let's go back, way back, to the first number system our cave-dwelling ancestors ever used: our fingers.",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-lets-go-back-way-back-to-the-first"
    },
    {
      "id": "p-02-hold-up-your-hands-and-you-can-count",
      "type": "paragraph",
      "label": "Hold up your hands and you can count to 10. But what if you want to add a number to your cave painting? Well, you make t",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-hold-up-your-hands-and-you-can-count"
    },
    {
      "id": "p-02-so-the-first-number-we-used-was-1",
      "type": "paragraph",
      "label": "So the first number we used was 1, or the tally mark: I. But tally marks get cumbersome quickly. So someone invented a n",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-so-the-first-number-we-used-was-1"
    },
    {
      "id": "p-02-and-so-it-stayed-for-quite-a-while",
      "type": "paragraph",
      "label": "And so it stayed for quite a while. Until a Roman (or probably someone else, and the Romans just stole the idea) had the",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-and-so-it-stayed-for-quite-a-while"
    },
    {
      "id": "p-02-what-the-romans-invented-here-was-that-you",
      "type": "paragraph",
      "label": "What the Romans invented here was that you could write a calculation to describe the number. 4 is written as V minus I. ",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-what-the-romans-invented-here-was-that-you"
    },
    {
      "id": "p-02-the-simple-rule-is-that-smaller-marks-before",
      "type": "paragraph",
      "label": "The simple rule is that smaller marks before larger marks mean subtraction. If they are placed after larger marks, they ",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-the-simple-rule-is-that-smaller-marks-before"
    },
    {
      "id": "p-02-so-as-an-example-what-does-the-roman",
      "type": "paragraph",
      "label": "So as an example, what does the Roman numeral MMXXI translate to in our Arabic numerals? Yes, we call them Arabic numera",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-so-as-an-example-what-does-the-roman"
    },
    {
      "id": "p-02-now-what-about-mcmxcviii-and-were-still-just",
      "type": "paragraph",
      "label": "Now what about MCMXCVIII? And we're still just around 2000. Roman numerals still get unwieldy fairly quickly. But it's b",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-now-what-about-mcmxcviii-and-were-still-just"
    },
    {
      "id": "p-02-notice-weve-come-from-the-age-of-cave",
      "type": "paragraph",
      "label": "Notice we've come from the age of cave paintings, at least 35,000 years ago, all the way to the Romans, and we still hav",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-notice-weve-come-from-the-age-of-cave"
    },
    {
      "id": "p-02-but-lets-step-back-a-bit-and-introduce",
      "type": "paragraph",
      "label": "But let's step back a bit and introduce the abacus. This simple device's origins are unknown, and it may have been inven",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-but-lets-step-back-a-bit-and-introduce"
    },
    {
      "id": "p-02-by-now-you-may-have-noticed-a-pattern",
      "type": "paragraph",
      "label": "By now, you may have noticed a pattern: Everyone is stealing from everyone else.",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-by-now-you-may-have-noticed-a-pattern"
    },
    {
      "id": "p-02-thats-how-good-ideas-travel-they-get-copied",
      "type": "paragraph",
      "label": "That's how good ideas travel, they get copied, renamed, improved and eventually taught to children as if they had always",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-thats-how-good-ideas-travel-they-get-copied"
    },
    {
      "id": "rule-02-wizards-first-rule",
      "type": "rule",
      "label": "Wizard's first rule",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#rule-02-wizards-first-rule"
    },
    {
      "id": "p-02-anyway-back-to-the-abacus-lets-show-one",
      "type": "paragraph",
      "label": "Anyway, back to the abacus. Let's show one for those who haven't seen one yet:",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-anyway-back-to-the-abacus-lets-show-one"
    },
    {
      "id": "image-02-abacus6-png",
      "type": "image",
      "label": "Abacus_6.png",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#image-02-abacus6-png"
    },
    {
      "id": "p-02-this-is-a-chinese-version-you-could-probably",
      "type": "paragraph",
      "label": "This is a Chinese version; you could probably find something like it still in use around the world today. The idea is si",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-this-is-a-chinese-version-you-could-probably"
    },
    {
      "id": "p-02-but-much-more-important-is-that-here-again",
      "type": "paragraph",
      "label": "But much more important is that here, again, the system introduces a calculation into the representation of numbers. It'",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-but-much-more-important-is-that-here-again"
    },
    {
      "id": "p-02-its-a-lot-easier-to-explain-if-i",
      "type": "paragraph",
      "label": "It's a lot easier to explain if I use Arabic numerals. They use the exact same multiplication by column as the abacus do",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-its-a-lot-easier-to-explain-if-i"
    },
    {
      "id": "p-02-and-here-for-the-first-time-in-our",
      "type": "paragraph",
      "label": "And here, for the first time in our story, we have the number 0. You can write 11, but how do you write 'one ten and no ",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-and-here-for-the-first-time-in-our"
    },
    {
      "id": "p-02-as-a-side-note-the-idea-of-a",
      "type": "paragraph",
      "label": "As a side note, the idea of a number 0 is much older than this. But its status was not well established. The mathematici",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-as-a-side-note-the-idea-of-a"
    },
    {
      "id": "p-02-as-another-aside-i-should-probably-call-arabic",
      "type": "paragraph",
      "label": "As another aside, I should probably call Arabic numerals Hindu numerals instead. It seems the Arabs got the idea from In",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-as-another-aside-i-should-probably-call-arabic"
    },
    {
      "id": "p-02-now-back-to-large-numbers-by-using-position",
      "type": "paragraph",
      "label": "Now back to large numbers. By using position to multiply each numeral, we can write very large numbers. Much larger than",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-now-back-to-large-numbers-by-using-position"
    },
    {
      "id": "p-02-but-there-is-another-calculation-hidden-inside-these",
      "type": "paragraph",
      "label": "But there is another calculation hidden inside these numbers. This is called modular arithmetic. The idea is that we can",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-but-there-is-another-calculation-hidden-inside-these"
    },
    {
      "id": "p-02-why-is-this-important-well-this-insight-opens",
      "type": "paragraph",
      "label": "Why is this important? Well, this insight opens the way for mechanical calculators: devices that can add and subtract nu",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-why-is-this-important-well-this-insight-opens"
    },
    {
      "id": "image-02-detailofarothcalculatingmachine-png",
      "type": "image",
      "label": "Detail_of_a_Roth_Calculating_machine.png",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#image-02-detailofarothcalculatingmachine-png"
    },
    {
      "id": "p-02-blaise-pascal-is-credited-with-making-one-of",
      "type": "paragraph",
      "label": "Blaise Pascal is credited with making one of the first usable mechanical calculators. It could add and subtract, and wit",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-blaise-pascal-is-credited-with-making-one-of"
    },
    {
      "id": "p-02-i-should-mention-the-antikythera-device-this-is",
      "type": "paragraph",
      "label": "I should mention the Antikythera mechanism. This is a device from the classical Greek era, which is thought to have been",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-i-should-mention-the-antikythera-device-this-is"
    },
    {
      "id": "p-02-to-really-understand-how-much-of-a-leap",
      "type": "paragraph",
      "label": "To really understand how much of a leap this is, just take a look back at our timeline of numbers. Around 100 BC is befo",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-to-really-understand-how-much-of-a-leap"
    },
    {
      "id": "p-02-were-getting-pretty-good-at-writing-large-numbers",
      "type": "paragraph",
      "label": "We're getting pretty good at writing large numbers. We can write down 1,000,000 and read it without blinking an eye. But",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-were-getting-pretty-good-at-writing-large-numbers"
    },
    {
      "id": "p-02-to-write-that-number-down-you-will-need",
      "type": "paragraph",
      "label": "To write that number down, you will need a number with at least 111 zeros. Clearly that is no longer practical. So enter",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-to-write-that-number-down-you-will-need"
    },
    {
      "id": "math-02-069",
      "type": "math",
      "label": "math block",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#math-02-069"
    },
    {
      "id": "p-02-but-we-can-also-use-these-to-explain",
      "type": "paragraph",
      "label": "But we can also use these to explain the positional nature of Arabic numerals:",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-but-we-can-also-use-these-to-explain"
    },
    {
      "id": "table-02-075",
      "type": "table",
      "label": "table",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#table-02-075"
    },
    {
      "id": "p-02-so-the-number-972-is-equal-to-9",
      "type": "paragraph",
      "label": "So the number 972 is equal to $$ 9 \\times 10^2 + 7 \\times 10^1 + 2 \\times 10^0 $$",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-so-the-number-972-is-equal-to-9"
    },
    {
      "id": "p-02-so-what-about-our-original-two-numbers-1",
      "type": "paragraph",
      "label": "So what about our original two numbers, 1 and 0? Well, if you understand the magic of positional notation, it turns out ",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-so-what-about-our-original-two-numbers-1"
    },
    {
      "id": "p-02-you-can-use-any-number-of-numerals-such",
      "type": "paragraph",
      "label": "You can use any number of numerals, such as 16 for hexadecimal numbers, for example:",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-you-can-use-any-number-of-numerals-such"
    },
    {
      "id": "math-02-085",
      "type": "math",
      "label": "math block",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#math-02-085"
    },
    {
      "id": "p-02-0x-is-just-a-convention-to-say-this",
      "type": "paragraph",
      "label": "0x is just a convention to say 'this is a hexadecimal number', and since there are 16 single-position numerals, we've go",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-0x-is-just-a-convention-to-say-this"
    },
    {
      "id": "p-02-or-octal-with-8-numerals-per-position",
      "type": "paragraph",
      "label": "Or octal, with 8 numerals per position:",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-or-octal-with-8-numerals-per-position"
    },
    {
      "id": "math-02-093",
      "type": "math",
      "label": "math block",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#math-02-093"
    },
    {
      "id": "p-02-or-reduce-it-to-two-numerals-1-and",
      "type": "paragraph",
      "label": "Or reduce it to two numerals, 1 and 0, and you get binary:",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-or-reduce-it-to-two-numerals-1-and"
    },
    {
      "id": "math-02-099",
      "type": "math",
      "label": "math block",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#math-02-099"
    },
    {
      "id": "p-02-and-using-exponents-we-can-explain-it-a",
      "type": "paragraph",
      "label": "And using exponents, we can explain it a bit better:",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-and-using-exponents-we-can-explain-it-a"
    },
    {
      "id": "table-02-105",
      "type": "table",
      "label": "table",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#table-02-105"
    },
    {
      "id": "p-02-this-means-that-the-binary-number-101-is",
      "type": "paragraph",
      "label": "This means that the binary number 101 is equal to",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-this-means-that-the-binary-number-101-is"
    },
    {
      "id": "math-02-111",
      "type": "math",
      "label": "math block",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#math-02-111"
    },
    {
      "id": "p-02-this-simplifies-to",
      "type": "paragraph",
      "label": "This simplifies to",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-this-simplifies-to"
    },
    {
      "id": "math-02-117",
      "type": "math",
      "label": "math block",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#math-02-117"
    },
    {
      "id": "p-02-binary-numbers-are-so-ubiquitous-in-programming-that",
      "type": "paragraph",
      "label": "Binary numbers are so ubiquitous in programming that you'll see the powers of 2 often. Here are the first few:",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-binary-numbers-are-so-ubiquitous-in-programming-that"
    },
    {
      "id": "table-02-124",
      "type": "table",
      "label": "table",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#table-02-124"
    },
    {
      "id": "p-02-this-is-a-good-time-to-end-our",
      "type": "paragraph",
      "label": "This is a good time to end our archaeological dig through numbers. We started with fingers and tally marks, and ended wi",
      "chapter": "02-numbers-hiding-calculations-in-symbols",
      "url": "chapters/02-numbers-hiding-calculations-in-symbols.html#p-02-this-is-a-good-time-to-end-our"
    },
    {
      "id": "h-03-logic-the-truth-is-out-there",
      "type": "heading",
      "label": "Logic: the truth is out there",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#h-03-logic-the-truth-is-out-there"
    },
    {
      "id": "h-03-riddle-me-this",
      "type": "heading",
      "label": "Riddle me this",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#h-03-riddle-me-this"
    },
    {
      "id": "p-03-you-are-standing-before-two-doors-one-door",
      "type": "paragraph",
      "label": "You are standing before two doors. One door leads to your desire. The other leads to your doom. Before the doors are two",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-you-are-standing-before-two-doors-one-door"
    },
    {
      "id": "p-03-you-may-ask-one-question",
      "type": "paragraph",
      "label": "You may ask one question.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-you-may-ask-one-question"
    },
    {
      "id": "p-03-obviously-you-need-to-ask-a-question-that",
      "type": "paragraph",
      "label": "Obviously, you need to ask a question that reveals which door to use. But the obvious question doesn't work.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-obviously-you-need-to-ask-a-question-that"
    },
    {
      "id": "aside-03-which-door-should-i-choose",
      "type": "aside",
      "label": "Which door should I choose?",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#aside-03-which-door-should-i-choose"
    },
    {
      "id": "p-03-if-you-ask-the-truthful-guard-shell-point",
      "type": "paragraph",
      "label": "If you ask the truthful guard, she'll point to your desire. If you ask the lying guard, she'll point to your doom. Since",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-if-you-ask-the-truthful-guard-shell-point"
    },
    {
      "id": "table-03-015",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-015"
    },
    {
      "id": "p-03-that-doesnt-help-the-answer-depends-on-which",
      "type": "paragraph",
      "label": "That doesn't help. The answer depends on which guard you asked, and you don't know that. So the famous solution is to as",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-that-doesnt-help-the-answer-depends-on-which"
    },
    {
      "id": "aside-03-if-i-asked-the-other-guard-which-door",
      "type": "aside",
      "label": "If I asked the other guard which door leads to my desire, what would she answer?",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#aside-03-if-i-asked-the-other-guard-which-door"
    },
    {
      "id": "p-03-now-whatever-answer-you-get-you-choose-the",
      "type": "paragraph",
      "label": "Now whatever answer you get, you choose the other door.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-now-whatever-answer-you-get-you-choose-the"
    },
    {
      "id": "p-03-if-the-guard-you-ask-tells-the-truth",
      "type": "paragraph",
      "label": "If the guard you ask tells the truth, she must give you the wrong answer, because that is what the liar would say. If th",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-if-the-guard-you-ask-tells-the-truth"
    },
    {
      "id": "table-03-028",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-028"
    },
    {
      "id": "p-03-no-matter-which-guard-you-ask-you-get",
      "type": "paragraph",
      "label": "No matter which guard you ask, you get the wrong answer. So you choose the other door.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-no-matter-which-guard-you-ask-you-get"
    },
    {
      "id": "p-03-your-brain-is-good-at-guessing-logic-is",
      "type": "paragraph",
      "label": "Your brain is good at guessing. Logic is what we use when guessing isn’t good enough.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-your-brain-is-good-at-guessing-logic-is"
    },
    {
      "id": "rule-03-wizards-second-rule",
      "type": "rule",
      "label": "Wizard's second rule",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#rule-03-wizards-second-rule"
    },
    {
      "id": "h-03-boolean-logic",
      "type": "heading",
      "label": "Boolean logic",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#h-03-boolean-logic"
    },
    {
      "id": "p-03-today-we-call-this-boolean-logic-after-george",
      "type": "paragraph",
      "label": "Today we call this Boolean logic, after George Boole. The tables above are called truth tables.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-today-we-call-this-boolean-logic-after-george"
    },
    {
      "id": "p-03-logic-itself-is-much-older-going-back-through",
      "type": "paragraph",
      "label": "Logic itself is much older, going back through the 17th century wizard Leibniz, to an ancient Greek wizard called Aristo",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-logic-itself-is-much-older-going-back-through"
    },
    {
      "id": "p-03-boolean-logic-has-only-two-values",
      "type": "paragraph",
      "label": "Boolean logic has only two values:",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-boolean-logic-has-only-two-values"
    },
    {
      "id": "table-03-049",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-049"
    },
    {
      "id": "p-03-boolean-logic-is-at-the-core-of-modern",
      "type": "paragraph",
      "label": "Boolean logic is at the core of modern programming. It is at the core of computers. Everything your computer does for yo",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-boolean-logic-is-at-the-core-of-modern"
    },
    {
      "id": "p-03-most-boolean-operations-combine-two-terms-lets-call",
      "type": "paragraph",
      "label": "Most Boolean operations combine two terms. Let's call them p and q. Just like our guards, we don't know whether they are",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-most-boolean-operations-combine-two-terms-lets-call"
    },
    {
      "id": "p-03-the-operations-are-and-or-and-not",
      "type": "paragraph",
      "label": "The operations are: and, or and not.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-the-operations-are-and-or-and-not"
    },
    {
      "id": "table-03-060",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-060"
    },
    {
      "id": "table-03-065",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-065"
    },
    {
      "id": "p-03-and-of-course",
      "type": "paragraph",
      "label": "And of course:",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-and-of-course"
    },
    {
      "id": "table-03-072",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-072"
    },
    {
      "id": "p-03-combining-these-we-can-also-create-nor-and",
      "type": "paragraph",
      "label": "Combining these, we can also create nor and nand.",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-combining-these-we-can-also-create-nor-and"
    },
    {
      "id": "table-03-079",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-079"
    },
    {
      "id": "table-03-084",
      "type": "table",
      "label": "table",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#table-03-084"
    },
    {
      "id": "p-03-wait-a-minute-what-is-this-nand-thing",
      "type": "paragraph",
      "label": "Wait a minute... what is this nand thing? Why not just write not and?",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-wait-a-minute-what-is-this-nand-thing"
    },
    {
      "id": "p-03-well-it-so-happens-that-your-computer-can",
      "type": "paragraph",
      "label": "Well... it so happens that your computer can implement just about everything with only nand logic. All other operations ",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-well-it-so-happens-that-your-computer-can"
    },
    {
      "id": "p-03-tables-dont-lie-but-people-do-and-we",
      "type": "paragraph",
      "label": "Tables don't lie, but people do. And we like it. So much that we've invented something entirely new. Something clever an",
      "chapter": "03-logic-turning-truth-into-machinery",
      "url": "chapters/03-logic-turning-truth-into-machinery.html#p-03-tables-dont-lie-but-people-do-and-we"
    },
    {
      "id": "h-04-language-the-oldest-trick",
      "type": "heading",
      "label": "Language: the oldest trick",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#h-04-language-the-oldest-trick"
    },
    {
      "id": "p-04-language-is-magic-old-magic",
      "type": "paragraph",
      "label": "Language is magic. Old magic.",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-language-is-magic-old-magic"
    },
    {
      "id": "p-04-were-so-used-to-it-that-we-dont",
      "type": "paragraph",
      "label": "We're so used to it that we don't see it, but think about it. While you are reading this, I have the capability to injec",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-were-so-used-to-it-that-we-dont"
    },
    {
      "id": "p-04-we-dont-know-exactly-when-humans-started-to",
      "type": "paragraph",
      "label": "We don't know exactly when humans started to use language. But we can be sure it was before we started to write. The cap",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-we-dont-know-exactly-when-humans-started-to"
    },
    {
      "id": "p-04-the-one-constant-in-our-use-of-language",
      "type": "paragraph",
      "label": "The one constant in our use of language seems to be that every generation mutates the language they use. There is no hum",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-the-one-constant-in-our-use-of-language"
    },
    {
      "id": "p-04-an-interesting-question-related-to-this-is-usually",
      "type": "paragraph",
      "label": "An interesting question related to this is usually discussed as linguistic relativity: does language dictate what we can",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-an-interesting-question-related-to-this-is-usually"
    },
    {
      "id": "p-04-there-is-an-actual-wizard-who-has-thought",
      "type": "paragraph",
      "label": "There is an actual wizard who has thought about this.",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-there-is-an-actual-wizard-who-has-thought"
    },
    {
      "id": "p-04-alan-moore-who-writes-books-and-comics-and",
      "type": "paragraph",
      "label": "Alan Moore, who writes books and comics and also calls himself a magician, has a useful idea of magic. But unlike what y",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-alan-moore-who-writes-books-and-comics-and"
    },
    {
      "id": "p-04-in-that-view-there-is-the-physical-world",
      "type": "paragraph",
      "label": "In that view, there is the physical world, made of bodies and stones and rain and hunger. And then there is the imagined",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-in-that-view-there-is-the-physical-world"
    },
    {
      "id": "p-04-language-is-how-we-imagine-our-world-and",
      "type": "paragraph",
      "label": "Language is how we imagine our world, then we make our imagination reality. This is why language is magic in a very prac",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-language-is-how-we-imagine-our-world-and"
    },
    {
      "id": "p-04-computer-programs-make-this-even-stranger-a-program",
      "type": "paragraph",
      "label": "Computer programs make this even stranger. A program starts as something imagined. Then the computer runs it. A message ",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-computer-programs-make-this-even-stranger-a-program"
    },
    {
      "id": "p-04-but-what-if-we-dont-have-the-words",
      "type": "paragraph",
      "label": "But what if we don't have the words that allow a thought to exist?",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-but-what-if-we-dont-have-the-words"
    },
    {
      "id": "p-04-guy-steele-talks-about-this-in-a-very",
      "type": "paragraph",
      "label": "Guy Steele talks about this, in a very nerdy, maybe even wizardly way in a talk called Growing a Language. He starts wit",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-guy-steele-talks-about-this-in-a-very"
    },
    {
      "id": "p-04-if-the-language-has-no-word-for-the",
      "type": "paragraph",
      "label": "If the language has no word for the thing you mean, you have to build the thought out of smaller thoughts. You have to d",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-if-the-language-has-no-word-for-the"
    },
    {
      "id": "p-04-that-is-why-naming-is-not-decoration-when",
      "type": "paragraph",
      "label": "That is why naming is not decoration. When you add the right word, you don't just shorten the sentence. You change what ",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#p-04-that-is-why-naming-is-not-decoration-when"
    },
    {
      "id": "rule-04-wizards-third-rule",
      "type": "rule",
      "label": "Wizard's third rule",
      "chapter": "04-language-the-tool-that-changes-the-thinker",
      "url": "chapters/04-language-the-tool-that-changes-the-thinker.html#rule-04-wizards-third-rule"
    },
    {
      "id": "h-05-the-web-one-string-to-rule-them-all",
      "type": "heading",
      "label": "The Web: one string to rule them all",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#h-05-the-web-one-string-to-rule-them-all"
    },
    {
      "id": "p-05-in-1989-a-wizard-called-tim-invented-the",
      "type": "paragraph",
      "label": "In 1989 a wizard called Tim invented the World Wide Web and changed the world forever. There was quite a bit of world-ch",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-in-1989-a-wizard-called-tim-invented-the"
    },
    {
      "id": "p-05-the-first-website-did-not-look-much-like",
      "type": "paragraph",
      "label": "The first website did not look much like the future. It was mostly text and links, it didn't even have a cookie banner:",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-first-website-did-not-look-much-like"
    },
    {
      "id": "code-05-html",
      "type": "code",
      "label": "html block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-html"
    },
    {
      "id": "p-05-it-does-not-look-revolutionary-today-most-of",
      "type": "paragraph",
      "label": "It does not look revolutionary today. Most of the Web wasn't. But there is one part that is. It is a small thing, a tag ",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-it-does-not-look-revolutionary-today-most-of"
    },
    {
      "id": "code-05-html-the-world-wide-web-project",
      "type": "code",
      "label": "html block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-html-the-world-wide-web-project"
    },
    {
      "id": "p-05-hidden-inside-it-is-another-invention-probably-the",
      "type": "paragraph",
      "label": "Hidden inside it is another invention, probably the more important one:",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-hidden-inside-it-is-another-invention-probably-the"
    },
    {
      "id": "code-05-url-http-info-cern-ch-hypertext-www-theproject",
      "type": "code",
      "label": "url block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-url-http-info-cern-ch-hypertext-www-theproject"
    },
    {
      "id": "p-05-the-url-the-uniform-resource-locator-to-understand",
      "type": "paragraph",
      "label": "The URL. The Uniform Resource Locator. To understand why this small invention mattered, we need to go back a little furt",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-url-the-uniform-resource-locator-to-understand"
    },
    {
      "id": "p-05-back-then-the-internet-was-already-a-few",
      "type": "paragraph",
      "label": "Back then the internet was already a few years old. The idea of hypertext was even older than that. Ted Nelson coined th",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-back-then-the-internet-was-already-a-few"
    },
    {
      "id": "p-05-but-while-hypertext-as-a-concept-had-been",
      "type": "paragraph",
      "label": "But while Hypertext as a concept had been around, nobody had truly made it work. At least not on a global scale.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-but-while-hypertext-as-a-concept-had-been"
    },
    {
      "id": "p-05-ted-nelson-started-the-xanadu-project-in-the",
      "type": "paragraph",
      "label": "Ted Nelson started the Xanadu project in the 1960s. Apple released HyperCard in 1987.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-ted-nelson-started-the-xanadu-project-in-the"
    },
    {
      "id": "p-05-xanadu-promised-two-way-links-worldwide-distribution-version",
      "type": "paragraph",
      "label": "Xanadu promised two-way links, worldwide distribution, version history and a payment system. HyperCard had cards, stacks",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-xanadu-promised-two-way-links-worldwide-distribution-version"
    },
    {
      "id": "p-05-xanadu-tried-to-solve-the-entire-problem-of",
      "type": "paragraph",
      "label": "Xanadu tried to solve the entire problem of hypertext and never produced a system that ordinary people could use. HyperC",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-xanadu-tried-to-solve-the-entire-problem-of"
    },
    {
      "id": "p-05-the-web-could",
      "type": "paragraph",
      "label": "The Web could.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-web-could"
    },
    {
      "id": "p-05-sir-tim-berners-lee-did-not-have-to",
      "type": "paragraph",
      "label": "Sir Tim Berners-Lee did not have to invent networking from scratch. The internet existed. TCP/IP was there. He did not h",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-sir-tim-berners-lee-did-not-have-to"
    },
    {
      "id": "p-05-he-stole-those-ideas-and-packaged-them-together",
      "type": "paragraph",
      "label": "He stole those ideas and packaged them together in this new thing: the URL.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-he-stole-those-ideas-and-packaged-them-together"
    },
    {
      "id": "h-05-three-stolen-pieces",
      "type": "heading",
      "label": "Three stolen pieces",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#h-05-three-stolen-pieces"
    },
    {
      "id": "p-05-look-again-at-the-url",
      "type": "paragraph",
      "label": "Look again at the URL:",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-look-again-at-the-url"
    },
    {
      "id": "code-05-url-http-info-cern-ch-hypertext-www-theproject-2",
      "type": "code",
      "label": "url block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-url-http-info-cern-ch-hypertext-www-theproject-2"
    },
    {
      "id": "p-05-it-has-three-obvious-parts",
      "type": "paragraph",
      "label": "It has three obvious parts:",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-it-has-three-obvious-parts"
    },
    {
      "id": "code-05-text-http-info-cern-ch-hypertext-www-theproject",
      "type": "code",
      "label": "text block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-text-http-info-cern-ch-hypertext-www-theproject"
    },
    {
      "id": "p-05-it-combines-three-pieces-of-information-in-a",
      "type": "paragraph",
      "label": "It combines three pieces of information in a single, human-readable string:",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-it-combines-three-pieces-of-information-in-a"
    },
    {
      "id": "p-05-and-just-like-that-we-could-now-refer",
      "type": "paragraph",
      "label": "And just like that, we could now refer to any file on any computer anywhere in the world.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-and-just-like-that-we-could-now-refer"
    },
    {
      "id": "p-05-and-it-is-simple-small-readable-you-can",
      "type": "paragraph",
      "label": "And it is simple, small and readable. You can copy a URL into an e-mail, print it in a book, write it on a whiteboard, p",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-and-it-is-simple-small-readable-you-can"
    },
    {
      "id": "p-05-the-url-is-an-address-but-it-is",
      "type": "paragraph",
      "label": "The URL is an address, but it is also a tiny user interface to the network.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-url-is-an-address-but-it-is"
    },
    {
      "id": "h-05-the-path",
      "type": "heading",
      "label": "The path",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#h-05-the-path"
    },
    {
      "id": "code-05-text-hypertext-www-theproject-html",
      "type": "code",
      "label": "text block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-text-hypertext-www-theproject-html"
    },
    {
      "id": "p-05-if-you-have-used-a-unix-like-system",
      "type": "paragraph",
      "label": "If you have used a Unix-like system, this shape is familiar. A slash separates folders and files. A path starts at a roo",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-if-you-have-used-a-unix-like-system"
    },
    {
      "id": "code-05-text-hypertext",
      "type": "code",
      "label": "text block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-text-hypertext"
    },
    {
      "id": "p-05-this-feels-obvious-now-but-it-was-only",
      "type": "paragraph",
      "label": "This feels obvious now, but it was only one possible way to name files. DOS and Windows used backslashes and drive lette",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-this-feels-obvious-now-but-it-was-only"
    },
    {
      "id": "code-05-text-node-accountname-password-device-directory-subdirectory-filename",
      "type": "code",
      "label": "text block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-text-node-accountname-password-device-directory-subdirectory-filename"
    },
    {
      "id": "p-05-the-web-was-developed-by-sir-tim-on",
      "type": "paragraph",
      "label": "The Web was developed by Sir Tim on a Unix machine: a NeXT Cube designed by Steve Jobs. So it is no surprise that the UR",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-web-was-developed-by-sir-tim-on"
    },
    {
      "id": "p-05-unix-itself-had-stolen-and-simplified-ideas-from",
      "type": "paragraph",
      "label": "Unix itself had stolen and simplified ideas from earlier systems such as Multics. One of its beautiful tricks is that us",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-unix-itself-had-stolen-and-simplified-ideas-from"
    },
    {
      "id": "p-05-simple-ideas-often-grow-more-complex-threads-when",
      "type": "paragraph",
      "label": "Simple ideas often grow more complex threads when they meet the real world. For example, how would you create a file wit",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-simple-ideas-often-grow-more-complex-threads-when"
    },
    {
      "id": "code-05-code-folder-withaslash",
      "type": "code",
      "label": "code block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-code-folder-withaslash"
    },
    {
      "id": "p-05-an-escape-character-says-the-next-character-is",
      "type": "paragraph",
      "label": "An escape character says: the next character is special. However, DOS already used that character. So Sir Tim chose a di",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-an-escape-character-says-the-next-character-is"
    },
    {
      "id": "code-05-code-folder-2fwithaslash",
      "type": "code",
      "label": "code block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-code-folder-2fwithaslash"
    },
    {
      "id": "p-05-the-escape-character-that-signifies-the-start-of",
      "type": "paragraph",
      "label": "The escape character, that signifies the start of an encoded sequence, is the % character. And it is always followed by ",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-escape-character-that-signifies-the-start-of"
    },
    {
      "id": "p-05-any-character-can-be-added-to-a-url",
      "type": "paragraph",
      "label": "Any character can be added to a URL like this, even if it's not normally printable. This allows URLs to become mobile, p",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-any-character-can-be-added-to-a-url"
    },
    {
      "id": "h-05-the-hostname",
      "type": "heading",
      "label": "The hostname",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#h-05-the-hostname"
    },
    {
      "id": "code-05-url-info-cern-ch",
      "type": "code",
      "label": "url block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-url-info-cern-ch"
    },
    {
      "id": "p-05-the-double-slash-says-that-what-follows-is",
      "type": "paragraph",
      "label": "The double slash says that what follows is a network location. This convention was borrowed too; Berners-Lee has said he",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-double-slash-says-that-what-follows-is"
    },
    {
      "id": "p-05-the-more-important-stolen-idea-here-is-dns",
      "type": "paragraph",
      "label": "The more important stolen idea here is DNS, the Domain Name System.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-more-important-stolen-idea-here-is-dns"
    },
    {
      "id": "p-05-before-dns-the-internet-was-small-enough-that",
      "type": "paragraph",
      "label": "Before DNS, the internet was small enough that people could maintain host files: lists of names and IP addresses. Your c",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-before-dns-the-internet-was-small-enough-that"
    },
    {
      "id": "p-05-a-wizard-called-paul-mockapetris-was-tasked-with",
      "type": "paragraph",
      "label": "A wizard called Paul Mockapetris was tasked with designing a suitable solution. He did so in 1983, and in 1986 it became",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-a-wizard-called-paul-mockapetris-was-tasked-with"
    },
    {
      "id": "p-05-one-machine-no-longer-needed-a-complete-list",
      "type": "paragraph",
      "label": "One machine no longer needed a complete list of every other machine. Names could be delegated. Different organizations c",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-one-machine-no-longer-needed-a-complete-list"
    },
    {
      "id": "p-05-by-1988-dns-was-established-sir-tim-did",
      "type": "paragraph",
      "label": "By 1988 DNS was established, Sir Tim did not need to invent a new naming system. He just put the existing one inside the",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-by-1988-dns-was-established-sir-tim-did"
    },
    {
      "id": "h-05-the-protocol",
      "type": "heading",
      "label": "The protocol",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#h-05-the-protocol"
    },
    {
      "id": "code-05-url-http",
      "type": "code",
      "label": "url block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-url-http"
    },
    {
      "id": "p-05-the-protocol-looks-like-the-least-interesting-part",
      "type": "paragraph",
      "label": "The protocol looks like the least interesting part of the URL. In fact it reveals the almost megalomaniac ambition behin",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-the-protocol-looks-like-the-least-interesting-part"
    },
    {
      "id": "p-05-compare-it-with-gopher-another-worldwide-information-system",
      "type": "paragraph",
      "label": "Compare it with Gopher, another worldwide information system that appeared around the same time. For a brief moment, Gop",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-compare-it-with-gopher-another-worldwide-information-system"
    },
    {
      "id": "code-05-text-1cia-world-factbook-archives-politics-cia-gopher",
      "type": "code",
      "label": "text block",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#code-05-text-1cia-world-factbook-archives-politics-cia-gopher"
    },
    {
      "id": "p-05-a-line-like-that-can-point-to-information",
      "type": "paragraph",
      "label": "A line like that can point to information on another Gopher server. The format is useful, but the world it imagines is s",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-a-line-like-that-can-point-to-information"
    },
    {
      "id": "p-05-a-url-begins-by-saying-which-kind-of",
      "type": "paragraph",
      "label": "A URL begins by saying which kind of space you are entering. http: is one possibility. A browser might also understand f",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-a-url-begins-by-saying-which-kind-of"
    },
    {
      "id": "p-05-it-has-such-a-great-design-that-wizards",
      "type": "paragraph",
      "label": "It has such a great design that wizards everywhere steal it and extend it for their own purposes. Not all later schemes ",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-it-has-such-a-great-design-that-wizards"
    },
    {
      "id": "p-05-almost-none-of-the-pieces-in-a-url",
      "type": "paragraph",
      "label": "Almost none of the pieces in a URL were new. The trick was putting existing pieces together in one simple string.",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#p-05-almost-none-of-the-pieces-in-a-url"
    },
    {
      "id": "rule-05-wizards-fourth-rule",
      "type": "rule",
      "label": "Wizard's fourth rule",
      "chapter": "05-the-web-as-address",
      "url": "chapters/05-the-web-as-address.html#rule-05-wizards-fourth-rule"
    },
    {
      "id": "h-06-the-web-the-shape-of-words",
      "type": "heading",
      "label": "The Web: the shape of words",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#h-06-the-web-the-shape-of-words"
    },
    {
      "id": "p-06-a-url-can-point-to-a-document-but",
      "type": "paragraph",
      "label": "A URL can point to a document, but once the browser gets there, how does it know what to show you? This is where the Web",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-a-url-can-point-to-a-document-but"
    },
    {
      "id": "p-06-ive-written-about-hypertext-and-language-before-but",
      "type": "paragraph",
      "label": "I've written about hypertext and language before, but what is markup doing here? It's been around longer than you might ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-ive-written-about-hypertext-and-language-before-but"
    },
    {
      "id": "p-06-markup-is-simply-an-additional-marking-on-a",
      "type": "paragraph",
      "label": "Markup is simply an additional marking on a document, used to give it extra meaning. The general idea is now called a ma",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-markup-is-simply-an-additional-marking-on-a"
    },
    {
      "id": "image-06-1920px-metalmovabletype-jpg",
      "type": "image",
      "label": "1920px-Metal_movable_type.jpg",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#image-06-1920px-metalmovabletype-jpg"
    },
    {
      "id": "p-06-the-editor-added-markup-to-tell-the-typesetter",
      "type": "paragraph",
      "label": "The editor added markup to tell the typesetter what font and font size to use, as well as other layout decisions.",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-the-editor-added-markup-to-tell-the-typesetter"
    },
    {
      "id": "p-06-when-the-first-computers-came-around-they-were",
      "type": "paragraph",
      "label": "When the first computers came around, they were very limited in the kind of output they could create. If there was a pri",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-when-the-first-computers-came-around-they-were"
    },
    {
      "id": "p-06-once-the-output-devices-gained-more-capabilities-their",
      "type": "paragraph",
      "label": "Once the output devices gained more capabilities, their manufacturers quickly realized a need to somehow instruct these ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-once-the-output-devices-gained-more-capabilities-their"
    },
    {
      "id": "p-06-the-biggest-problem-was-how-to-create-better",
      "type": "paragraph",
      "label": "The biggest problem was how to create better printed output. Early on, the only way to get decent printed output, was to",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-the-biggest-problem-was-how-to-create-better"
    },
    {
      "id": "p-06-the-wizards-at-bell-labs-who-were-busy",
      "type": "paragraph",
      "label": "The wizards at Bell Labs, who were busy inventing Unix, were not impressed. They wanted their Unix and C manuals to be n",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-the-wizards-at-bell-labs-who-were-busy"
    },
    {
      "id": "p-06-another-wizard-called-knuth-wanted-to-write-a",
      "type": "paragraph",
      "label": "Another wizard, called Knuth, wanted to write a book about programming. Well actually, he wanted to write the book on pr",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-another-wizard-called-knuth-wanted-to-write-a"
    },
    {
      "id": "p-06-so-in-1974-he-took-some-time-off",
      "type": "paragraph",
      "label": "So in 1974 he took some time off to develop his own, better, typesetting system. That hiatus turned out to be 11 years a",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-so-in-1974-he-took-some-time-off"
    },
    {
      "id": "p-06-both-troff-and-tex-use-markup-languages-specifically",
      "type": "paragraph",
      "label": "Both troff and TeX use markup languages specifically to typeset documents before putting them on paper. As such they are",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-both-troff-and-tex-use-markup-languages-specifically"
    },
    {
      "id": "p-06-this-is-where-things-get-interesting-sometime-in",
      "type": "paragraph",
      "label": "This is where things get interesting. Sometime in the 1970s some wizards from IBM created a system called GML. This eith",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-this-is-where-things-get-interesting-sometime-in"
    },
    {
      "id": "code-06-gml-h1-chapter-1-introduction",
      "type": "code",
      "label": "gml block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-gml-h1-chapter-1-introduction"
    },
    {
      "id": "p-06-unfortunately-their-work-only-made-it-out-of",
      "type": "paragraph",
      "label": "Unfortunately their work only made it out of IBM as a product you could buy and use, somewhere at the end of the 1980s. ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-unfortunately-their-work-only-made-it-out-of"
    },
    {
      "id": "p-06-gml-eventually-turned-into-sgml-standard-generalized-markup",
      "type": "paragraph",
      "label": "GML eventually turned into SGML--Standard Generalized Markup Language, which became an industry standard in 1986. And in",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-gml-eventually-turned-into-sgml-standard-generalized-markup"
    },
    {
      "id": "p-06-here-is-that-first-html-page-again",
      "type": "paragraph",
      "label": "Here is that first HTML page again:",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-here-is-that-first-html-page-again"
    },
    {
      "id": "code-06-html",
      "type": "code",
      "label": "html block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-html"
    },
    {
      "id": "p-06-this-is-not-an-sgml-document-it-doesnt",
      "type": "paragraph",
      "label": "This is not an SGML document, it doesn't have a DTD header. Later HTML would become compliant with SGML, at least until ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-this-is-not-an-sgml-document-it-doesnt"
    },
    {
      "id": "p-06-it-does-use-the-same-syntax-to-differentiate",
      "type": "paragraph",
      "label": "It does use the same syntax to differentiate between markup and content. All markup tags are enclosed in characters.",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-it-does-use-the-same-syntax-to-differentiate"
    },
    {
      "id": "p-06-lets-take-a-closer-look-at-the-reasons",
      "type": "paragraph",
      "label": "Let's take a closer look at the reasons behind this format. One of the goals of the web was to make HTML easy to write u",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-lets-take-a-closer-look-at-the-reasons"
    },
    {
      "id": "p-06-imagine-an-html-version-without-named-end-tags",
      "type": "paragraph",
      "label": "Imagine an HTML version without named end tags, something like this:",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-imagine-an-html-version-without-named-end-tags"
    },
    {
      "id": "code-06-code-this-is-an-example-text",
      "type": "code",
      "label": "code block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-code-this-is-an-example-text"
    },
    {
      "id": "p-06-this-is-technically-feasible-maybe-even-simpler-however",
      "type": "paragraph",
      "label": "This is technically feasible, maybe even simpler. However, for a human this is much more difficult to read. And cruciall",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-this-is-technically-feasible-maybe-even-simpler-however"
    },
    {
      "id": "p-06-another-consequence-of-the-chosen-format-is-that",
      "type": "paragraph",
      "label": "Another consequence of the chosen format is that some characters cannot be used in the content anymore. Clearly the and ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-another-consequence-of-the-chosen-format-is-that"
    },
    {
      "id": "p-06-however-now-weve-added-the-character-to-the",
      "type": "paragraph",
      "label": "However, now we've added the & character to the list of special characters as well. This is easily solved:",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-however-now-weve-added-the-character-to-the"
    },
    {
      "id": "p-06-and-these-are-the-basics-of-html",
      "type": "paragraph",
      "label": "And these are the basics of HTML.",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-and-these-are-the-basics-of-html"
    },
    {
      "id": "p-06-now-for-the-tricky-parts-as-youve-seen",
      "type": "paragraph",
      "label": "Now for the tricky parts. As you've seen, HTML has elements that have a start and end tags. This means you can enclose o",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-now-for-the-tricky-parts-as-youve-seen"
    },
    {
      "id": "code-06-html-this-is-a-strong-and-partially-emphasized",
      "type": "code",
      "label": "html block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-html-this-is-a-strong-and-partially-emphasized"
    },
    {
      "id": "p-06-instead-you-are-supposed-to-write-this",
      "type": "paragraph",
      "label": "Instead, you are supposed to write this:",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-instead-you-are-supposed-to-write-this"
    },
    {
      "id": "code-06-html-this-is-a-strong-and-partially-emphasized-2",
      "type": "code",
      "label": "html block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-html-this-is-a-strong-and-partially-emphasized-2"
    },
    {
      "id": "p-06-and-this-html-can-be-represented-as-a",
      "type": "paragraph",
      "label": "And this HTML can be represented as a tree structure:",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-and-this-html-can-be-represented-as-a"
    },
    {
      "id": "p-06-this-is-how-your-web-browser-understands-this",
      "type": "paragraph",
      "label": "This is how your web browser understands this HTML. Most modern browsers allow you to take a look at this structure, by ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-this-is-how-your-web-browser-understands-this"
    },
    {
      "id": "p-06-the-html-specification-forces-you-to-create-a",
      "type": "paragraph",
      "label": "The HTML specification forces you to create a tree structure of your document. There can be no overlapping markup.",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-the-html-specification-forces-you-to-create-a"
    },
    {
      "id": "p-06-this-tree-structure-does-have-benefits-you-can",
      "type": "paragraph",
      "label": "This tree structure does have benefits. You can also write the above HTML as follows:",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-this-tree-structure-does-have-benefits-you-can"
    },
    {
      "id": "code-06-html-2",
      "type": "code",
      "label": "html block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-html-2"
    },
    {
      "id": "p-06-and-it-would-render-the-same-the-tree",
      "type": "paragraph",
      "label": "And it would render the same. The tree structure is now made visible by the level of indentation in the source. This is ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-and-it-would-render-the-same-the-tree"
    },
    {
      "id": "p-06-to-make-this-work-web-browsers-apply-what",
      "type": "paragraph",
      "label": "To make this work, web browsers apply what is called white-space collapsing. In general, any time you add multiple white",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-to-make-this-work-web-browsers-apply-what"
    },
    {
      "id": "p-06-for-example-both-lines-in-the-example-below",
      "type": "paragraph",
      "label": "For example, both lines in the example below will line out perfectly:",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-for-example-both-lines-in-the-example-below"
    },
    {
      "id": "code-06-html-this-renders-exactly-the-same",
      "type": "code",
      "label": "html block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-html-this-renders-exactly-the-same"
    },
    {
      "id": "p-06-even-the-extra-3-spaces-at-the-start",
      "type": "paragraph",
      "label": "Even the extra 3 spaces at the start of the second line do not show up.",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-even-the-extra-3-spaces-at-the-start"
    },
    {
      "id": "p-06-now-if-you-really-want-to-open-a",
      "type": "paragraph",
      "label": "Now if you really want to open a can of worms, try writing a rich text editor, with full WYSIWYG (What-You-See-Is-What-Y",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-now-if-you-really-want-to-open-a"
    },
    {
      "id": "code-06-html-3",
      "type": "code",
      "label": "html block",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#code-06-html-3"
    },
    {
      "id": "p-06-however-what-you-are-seeing-is-an-editor",
      "type": "paragraph",
      "label": "However, what you are seeing is an editor, designed by Microsoft originally for Internet Explorer 5.5, with an API that ",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-however-what-you-are-seeing-is-an-editor"
    },
    {
      "id": "p-06-the-only-successful-in-browser-editors-that-are",
      "type": "paragraph",
      "label": "The only successful in-browser editors, that are capable of editing any HTML and deliver a good end result, such as clea",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-the-only-successful-in-browser-editors-that-are"
    },
    {
      "id": "p-06-this-is-a-good-lesson-to-learn-just",
      "type": "paragraph",
      "label": "This is a good lesson to learn: just because something looks simple doesn't mean it is. All choices have consequences. I",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#p-06-this-is-a-good-lesson-to-learn-just"
    },
    {
      "id": "rule-06-wizards-fifth-rule",
      "type": "rule",
      "label": "Wizard's fifth rule",
      "chapter": "06-the-web-as-document",
      "url": "chapters/06-the-web-as-document.html#rule-06-wizards-fifth-rule"
    },
    {
      "id": "h-07-the-web-waking-up-the-words",
      "type": "heading",
      "label": "The Web: waking up the words",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#h-07-the-web-waking-up-the-words"
    },
    {
      "id": "p-07-its-may-1995-youve-just-landed-a-dream",
      "type": "paragraph",
      "label": "It's May 1995. You've just landed a dream job at the hot new startup of the decade: Netscape. You've just arrived and yo",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-its-may-1995-youve-just-landed-a-dream"
    },
    {
      "id": "p-07-you-have-10-days",
      "type": "paragraph",
      "label": "You have 10 days.",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-you-have-10-days"
    },
    {
      "id": "p-07-brendan-eich-was-the-wizard-who-made-javascript",
      "type": "paragraph",
      "label": "Brendan Eich was the wizard who made JavaScript under these conditions. Its creation story is almost mythical.",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-brendan-eich-was-the-wizard-who-made-javascript"
    },
    {
      "id": "p-07-before-javascript-if-you-wanted-to-create-an",
      "type": "paragraph",
      "label": "Before JavaScript, if you wanted to create an interactive website, the only way would be to add a form. A visitor of you",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-before-javascript-if-you-wanted-to-create-an"
    },
    {
      "id": "p-07-in-1995-netscape-was-king-of-the-webbrowser",
      "type": "paragraph",
      "label": "In 1995 Netscape was king of the webbrowser hill. Microsoft Internet Explorer 1.0 would be released in August 1995, and ",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-in-1995-netscape-was-king-of-the-webbrowser"
    },
    {
      "id": "p-07-obviously-for-this-to-come-to-fruition-the",
      "type": "paragraph",
      "label": "Obviously for this to come to fruition, the web would need to be more interactive, more programmable. So Netscape set ou",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-obviously-for-this-to-come-to-fruition-the"
    },
    {
      "id": "p-07-why-netscape-chose-java-isnt-hard-to-see",
      "type": "paragraph",
      "label": "Why Netscape chose Java isn't hard to see. At the time there were still many different computer architectures in use. Wr",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-why-netscape-chose-java-isnt-hard-to-see"
    },
    {
      "id": "p-07-enter-brendan-eich-as-he-later-described-it",
      "type": "paragraph",
      "label": "Enter Brendan Eich. As he later described it:",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-enter-brendan-eich-as-he-later-described-it"
    },
    {
      "id": "aside-07-at-least-client-engineering-management-including-tom-paquin",
      "type": "aside",
      "label": "\"At least client engineering management including Tom Paquin, Michael Toy, and Rick Schell, along with some guy named Ma",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#aside-07-at-least-client-engineering-management-including-tom-paquin"
    },
    {
      "id": "p-07-that-prototype-became-the-programming-language-of-the",
      "type": "paragraph",
      "label": "That prototype became the programming language of the Web.",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-that-prototype-became-the-programming-language-of-the"
    },
    {
      "id": "rule-07-wizards-sixth-rule",
      "type": "rule",
      "label": "Wizard's sixth rule",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#rule-07-wizards-sixth-rule"
    },
    {
      "id": "p-07-we-got-uncharacteristically-lucky-javascript-was-not-a",
      "type": "paragraph",
      "label": "We got uncharacteristically lucky. JavaScript was not a tuned-down, dummified version of Java. You see, Brendan was lure",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-we-got-uncharacteristically-lucky-javascript-was-not-a"
    },
    {
      "id": "p-07-scheme-is-a-descendant-of-lisp-and-algol",
      "type": "paragraph",
      "label": "Scheme is a descendant of Lisp (and Algol.) It is nothing like Java. But as any Lisp-like language, you can change the l",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-scheme-is-a-descendant-of-lisp-and-algol"
    },
    {
      "id": "aside-07-brendan-eich-im-not-proud-but-im-happy",
      "type": "aside",
      "label": "Brendan Eich - \"I’m not proud, but I’m happy that I chose Scheme-ish first-class functions and Self-ish (albeit singular",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#aside-07-brendan-eich-im-not-proud-but-im-happy"
    },
    {
      "id": "p-07-like-any-prototype-that-is-pushed-into-production",
      "type": "paragraph",
      "label": "Like any prototype that is pushed into production too soon, JavaScript has its problems. But its origins in Scheme, and ",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-like-any-prototype-that-is-pushed-into-production"
    },
    {
      "id": "p-07-in-2008-javascript-got-some-positive-publicity-with",
      "type": "paragraph",
      "label": "In 2008 JavaScript got some positive publicity, with a book by wizard Douglas Crockford -- \"JavaScript: The Good Parts\".",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-in-2008-javascript-got-some-positive-publicity-with"
    },
    {
      "id": "h-07-toil-and-trouble",
      "type": "heading",
      "label": "Toil and Trouble",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#h-07-toil-and-trouble"
    },
    {
      "id": "p-07-today-it-is-hard-not-to-associate-the",
      "type": "paragraph",
      "label": "Today it is hard not to associate the DOM (Document Object Model) with JavaScript. And that is not fair to JavaScript. T",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-today-it-is-hard-not-to-associate-the"
    },
    {
      "id": "p-07-but-the-dom-is-still-considered-a-compilation",
      "type": "paragraph",
      "label": "But the DOM is still considered a compilation target. Not something that you program directly, unless you are a masochis",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-but-the-dom-is-still-considered-a-compilation"
    },
    {
      "id": "p-07-even-javascript-itself-has-become-something-you-often",
      "type": "paragraph",
      "label": "Even JavaScript itself has become something you often process before the browser sees it. For years that meant npm, bund",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-even-javascript-itself-has-become-something-you-often"
    },
    {
      "id": "p-07-bundled-minified-obfuscated-unreadable",
      "type": "paragraph",
      "label": "Bundled, minified, obfuscated and unreadable JavaScript.",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-bundled-minified-obfuscated-unreadable"
    },
    {
      "id": "p-07-all-this-stuff-makes-web-development-so-much",
      "type": "paragraph",
      "label": "All this stuff makes web development so much harder than it needed to be. This is the real fallout from rushing JavaScri",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-all-this-stuff-makes-web-development-so-much"
    },
    {
      "id": "p-07-a-simple-example-is-the-javascript-module-system",
      "type": "paragraph",
      "label": "A simple example is the JavaScript module system. For the longest time it didn't exist. In the browser you could mimic i",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-a-simple-example-is-the-javascript-module-system"
    },
    {
      "id": "p-07-and-even-though-there-now-is-a-clear",
      "type": "paragraph",
      "label": "And even though there now is a clear standard module system, what we end up using is often an incompatible version of it",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-and-even-though-there-now-is-a-clear"
    },
    {
      "id": "h-07-the-browser-shaped-computer",
      "type": "heading",
      "label": "The browser-shaped computer",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#h-07-the-browser-shaped-computer"
    },
    {
      "id": "p-07-netscapes-dream-did-not-quite-happen-in-the",
      "type": "paragraph",
      "label": "Netscape's dream did not quite happen in the way Netscape imagined. We did not all simply stop using operating systems a",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-netscapes-dream-did-not-quite-happen-in-the"
    },
    {
      "id": "p-07-a-lot-of-what-people-now-call-using",
      "type": "paragraph",
      "label": "A lot of what people now call \"using the computer\" is really using the browser. Mail, documents, calendars, maps, bankin",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-a-lot-of-what-people-now-call-using"
    },
    {
      "id": "p-07-chromeos-makes-that-idea-unusually-explicit-it-is",
      "type": "paragraph",
      "label": "ChromeOS makes that idea unusually explicit. It is an operating system built around the assumption that the web is not j",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-chromeos-makes-that-idea-unusually-explicit-it-is"
    },
    {
      "id": "p-07-electron-approaches-the-same-idea-from-the-other",
      "type": "paragraph",
      "label": "Electron approaches the same idea from the other direction. If people still expect desktop applications, fine. Put a bro",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-electron-approaches-the-same-idea-from-the-other"
    },
    {
      "id": "p-07-progressive-web-apps-sit-somewhere-in-the-middle",
      "type": "paragraph",
      "label": "Progressive Web Apps sit somewhere in the middle. They try to let web applications behave a bit more like installed soft",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-progressive-web-apps-sit-somewhere-in-the-middle"
    },
    {
      "id": "p-07-none-of-these-has-replaced-the-operating-system",
      "type": "paragraph",
      "label": "None of these has replaced the operating system. We're still divided into an Apple and Windows world, with a little spri",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-none-of-these-has-replaced-the-operating-system"
    },
    {
      "id": "p-07-netscape-wanted-the-browser-to-become-the-operating",
      "type": "paragraph",
      "label": "Netscape wanted the browser to become the operating systemm and in many ways it did. The network is becoming the OS. The",
      "chapter": "07-the-web-as-platform",
      "url": "chapters/07-the-web-as-platform.html#p-07-netscape-wanted-the-browser-to-become-the-operating"
    },
    {
      "id": "h-08-teaching-machines-our-words",
      "type": "heading",
      "label": "Teaching machines our words",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#h-08-teaching-machines-our-words"
    },
    {
      "id": "p-08-a-common-misconception-is-that-programming-languages-are",
      "type": "paragraph",
      "label": "A common misconception is that programming languages exist simply to tell computers what to do. If that were their only ",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-a-common-misconception-is-that-programming-languages-are"
    },
    {
      "id": "p-08-a-computer-doesnt-need-a-programming-language-humans",
      "type": "paragraph",
      "label": "A computer doesn't need a programming language. Humans do.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-a-computer-doesnt-need-a-programming-language-humans"
    },
    {
      "id": "p-08-computers-are-perfectly-fine-executing-instructions-like-this",
      "type": "paragraph",
      "label": "Computers are perfectly fine executing instructions like this:",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-computers-are-perfectly-fine-executing-instructions-like-this"
    },
    {
      "id": "code-08-code-037744-016701-000026-012702-000352-005211-105711",
      "type": "code",
      "label": "code block",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#code-08-code-037744-016701-000026-012702-000352-005211-105711"
    },
    {
      "id": "p-08-this-machine-code-is-written-in-octal-to",
      "type": "paragraph",
      "label": "This machine code is written in octal, to make it slightly more readable for humans. But the first really usable step is",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-this-machine-code-is-written-in-octal-to"
    },
    {
      "id": "code-08-code-037744-016701-000026-mov-037776-r1",
      "type": "code",
      "label": "code block",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#code-08-code-037744-016701-000026-mov-037776-r1"
    },
    {
      "id": "p-08-and-now-with-some-labels-and-comments",
      "type": "paragraph",
      "label": "And now with some labels and comments:",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-and-now-with-some-labels-and-comments"
    },
    {
      "id": "code-08-code-load-0x7400-buffer-address",
      "type": "code",
      "label": "code block",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#code-08-code-load-0x7400-buffer-address"
    },
    {
      "id": "p-08-this-is-the-code-to-make-a-pdp",
      "type": "paragraph",
      "label": "This is the code to make a PDP-11 computer boot. It is commonly known as bootstrap code.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-this-is-the-code-to-make-a-pdp"
    },
    {
      "id": "p-08-even-in-this-enhanced-more-human-form-this",
      "type": "paragraph",
      "label": "Even in this enhanced, more human form, this code is not very readable. Or expressive. Most humans don't code in assembl",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-even-in-this-enhanced-more-human-form-this"
    },
    {
      "id": "p-08-the-programming-language-is-there-for-the-humans",
      "type": "paragraph",
      "label": "The programming language is there for the humans who have to write and understand those instructions.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-the-programming-language-is-there-for-the-humans"
    },
    {
      "id": "p-08-cobol-was-designed-to-make-business-programs-look",
      "type": "paragraph",
      "label": "COBOL was designed to make business programs look more like business language. It was very successful and almost univers",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-cobol-was-designed-to-make-business-programs-look"
    },
    {
      "id": "code-08-cobol",
      "type": "code",
      "label": "cobol block",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#code-08-cobol"
    },
    {
      "id": "p-08-believe-it-or-not-cobol-is-still-in",
      "type": "paragraph",
      "label": "Believe it or not, COBOL is still in use today. The code above is copied from a current manual for DB2, an IBM database ",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-believe-it-or-not-cobol-is-still-in"
    },
    {
      "id": "p-08-that-is-not-an-accident-business-software-tends",
      "type": "paragraph",
      "label": "That is not an accident. Business software tends to outlive the people who wrote it. Once a language becomes part of the",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-that-is-not-an-accident-business-software-tends"
    },
    {
      "id": "p-08-fortran-was-built-for-scientists-and-engineers-it",
      "type": "paragraph",
      "label": "Fortran was built for scientists and engineers. It made formulas, arrays, loops, and numerical work easier to express.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-fortran-was-built-for-scientists-and-engineers-it"
    },
    {
      "id": "p-08-here-is-an-example-in-fortran-77",
      "type": "paragraph",
      "label": "Here is an example in Fortran 77:",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-here-is-an-example-in-fortran-77"
    },
    {
      "id": "code-08-fortran-program-main",
      "type": "code",
      "label": "fortran block",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#code-08-fortran-program-main"
    },
    {
      "id": "p-08-finally-we-arrive-at-lisp-a-wizard-called",
      "type": "paragraph",
      "label": "Finally we arrive at Lisp. A wizard called John McCarthy dreamed up Lisp between 1956 and 1958.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-finally-we-arrive-at-lisp-a-wizard-called"
    },
    {
      "id": "p-08-lisp-is-both-very-small-and-absurdly-expressive",
      "type": "paragraph",
      "label": "Lisp is both very small and absurdly expressive. More importantly for this chapter, it makes it unusually easy to add ne",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-lisp-is-both-very-small-and-absurdly-expressive"
    },
    {
      "id": "p-08-here-is-a-tiny-example",
      "type": "paragraph",
      "label": "Here is a tiny example:",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-here-is-a-tiny-example"
    },
    {
      "id": "code-08-lisp-defmacro-unless-condition-body-body",
      "type": "code",
      "label": "lisp block",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#code-08-lisp-defmacro-unless-condition-body-body"
    },
    {
      "id": "p-08-that-is-why-lisp-keeps-returning-in-conversations",
      "type": "paragraph",
      "label": "That is why Lisp keeps returning in conversations about programming languages, not because everyone should use it, or be",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-that-is-why-lisp-keeps-returning-in-conversations"
    },
    {
      "id": "p-08-a-lisp-interpreter-can-be-written-in-lisp",
      "type": "paragraph",
      "label": "A Lisp interpreter can be written in Lisp itself. Paul Graham shows one in Roots of Lisp, based on McCarthy's original.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-a-lisp-interpreter-can-be-written-in-lisp"
    },
    {
      "id": "h-08-differences-commonalities-and-why-we-cant-have-nice-things",
      "type": "heading",
      "label": "Differences, commonalities, and why we can't have nice things",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#h-08-differences-commonalities-and-why-we-cant-have-nice-things"
    },
    {
      "id": "p-08-computer-languages-are-more-commonly-known-as-programming",
      "type": "paragraph",
      "label": "Computer languages are more commonly known as programming languages. They are designed to make a computer do something. ",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-computer-languages-are-more-commonly-known-as-programming"
    },
    {
      "id": "p-08-unlike-human-languages-programming-languages-are-designed-however",
      "type": "paragraph",
      "label": "Unlike human languages, programming languages are designed. However, they aren't designed to make a computer do anything",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-unlike-human-languages-programming-languages-are-designed-however"
    },
    {
      "id": "p-08-just-like-human-languages-programming-languages-make-it",
      "type": "paragraph",
      "label": "Just like human languages, programming languages make it easier for some ideas to be expressed than others. The best pro",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-just-like-human-languages-programming-languages-make-it"
    },
    {
      "id": "p-08-unfortunately-thats-also-not-true",
      "type": "paragraph",
      "label": "Unfortunately, that's also not true.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-unfortunately-thats-also-not-true"
    },
    {
      "id": "p-08-the-problem-is-communication-any-other-wizard-who",
      "type": "paragraph",
      "label": "The problem is communication. Any other wizard who wants to work with your ideas, your code, will have to learn your ver",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-the-problem-is-communication-any-other-wizard-who"
    },
    {
      "id": "p-08-reading-code-is-hard-it-is-much-easier",
      "type": "paragraph",
      "label": "Reading code is hard. It is much easier to write code. This sounds nonsensical, yet it is true. It is the source of the ",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-reading-code-is-hard-it-is-much-easier"
    },
    {
      "id": "p-08-one-answer-is-to-make-programming-languages-bigger",
      "type": "paragraph",
      "label": "One answer is to make programming languages bigger. Add more standard stuff. Add design patterns. Add frameworks. Make s",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-one-answer-is-to-make-programming-languages-bigger"
    },
    {
      "id": "p-08-there-is-a-reason-this-keeps-happening-code",
      "type": "paragraph",
      "label": "There is a reason this keeps happening. Code is easier to read when everyone uses the same patterns.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-there-is-a-reason-this-keeps-happening-code"
    },
    {
      "id": "p-08-but-there-is-a-cost-eventually-the-patterns",
      "type": "paragraph",
      "label": "But there is a cost. Eventually the patterns become the language. Instead of writing code to solve the problem, you are ",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-but-there-is-a-cost-eventually-the-patterns"
    },
    {
      "id": "p-08-so-the-natural-pressure-on-programming-languages-is",
      "type": "paragraph",
      "label": "So the natural pressure on programming languages is not to become smaller and more powerful, but bigger and less powerfu",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-so-the-natural-pressure-on-programming-languages-is"
    },
    {
      "id": "p-08-small-powerful-languages-are-wonderful-for-the-writer",
      "type": "paragraph",
      "label": "Small, powerful languages are wonderful for the writer, but dangerous for the reader. Large, standard languages are easi",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-small-powerful-languages-are-wonderful-for-the-writer"
    },
    {
      "id": "p-08-just-like-human-languages",
      "type": "paragraph",
      "label": "Just like human languages.",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-just-like-human-languages"
    },
    {
      "id": "rule-08-wizards-seventh-rule",
      "type": "rule",
      "label": "Wizard's seventh rule",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#rule-08-wizards-seventh-rule"
    },
    {
      "id": "p-08-you-should-be-aware-of-this-tension-you",
      "type": "paragraph",
      "label": "You should be aware of this tension. You do not escape it by choosing the one true language, because the one true langua",
      "chapter": "08-programming-languages-are-for-humans",
      "url": "chapters/08-programming-languages-are-for-humans.html#p-08-you-should-be-aware-of-this-tension-you"
    },
    {
      "id": "h-09-separated-by-a-common-language",
      "type": "heading",
      "label": "Separated by a Common Language",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#h-09-separated-by-a-common-language"
    },
    {
      "id": "p-09-react-is-at-the-time-of-writing-the",
      "type": "paragraph",
      "label": "React is, at the time of writing, the dominant JavaScript library for building user interfaces. As a web developer, you ",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-react-is-at-the-time-of-writing-the"
    },
    {
      "id": "p-09-react-has-become-so-ubiquitous-that-companies-no",
      "type": "paragraph",
      "label": "React has become so ubiquitous that companies no longer search only for web developers or JavaScript developers. They se",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-react-has-become-so-ubiquitous-that-companies-no"
    },
    {
      "id": "p-09-that-is-not-an-accident",
      "type": "paragraph",
      "label": "That is not an accident.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-that-is-not-an-accident"
    },
    {
      "id": "p-09-react-and-its-constellation-of-supporting-tools-and",
      "type": "paragraph",
      "label": "React and its constellation of supporting tools and libraries have become their own thing. A React developer expects a c",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-react-and-its-constellation-of-supporting-tools-and"
    },
    {
      "id": "p-09-react-is-effectively-a-dialect-inside-javascript-the",
      "type": "paragraph",
      "label": "React is effectively a dialect inside JavaScript. The syntax still belongs to JavaScript. Much of the meaning belongs to",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-react-is-effectively-a-dialect-inside-javascript-the"
    },
    {
      "id": "p-09-react-is-one-example-of-a-library-framework",
      "type": "paragraph",
      "label": "React is one example of a library, framework, or tool written in a language in such a way that it changes what the langu",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-react-is-one-example-of-a-library-framework"
    },
    {
      "id": "p-09-but-this-is-not-limited-to-react-or",
      "type": "paragraph",
      "label": "But this is not limited to React or even JavaScript. Lisp is the quintessential example. There is no language that can b",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-but-this-is-not-limited-to-react-or"
    },
    {
      "id": "p-09-and-people-have-done-so",
      "type": "paragraph",
      "label": "And people have done so.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-and-people-have-done-so"
    },
    {
      "id": "p-09-oh-boy-have-they-done-so",
      "type": "paragraph",
      "label": "Oh boy, have they done so.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-oh-boy-have-they-done-so"
    },
    {
      "id": "h-09-a-language-of-your-own",
      "type": "heading",
      "label": "A language of your own",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#h-09-a-language-of-your-own"
    },
    {
      "id": "p-09-heres-the-problem-lisp-is-one-of-the",
      "type": "paragraph",
      "label": "Here's the problem: Lisp is one of the most expressive languages ever made. Almost anything invented in programming-lang",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-heres-the-problem-lisp-is-one-of-the"
    },
    {
      "id": "aside-09-aside-ive-mentioned-that-javascript-was-inspired-by",
      "type": "aside",
      "label": "Aside: I've mentioned that JavaScript was inspired by Scheme. Scheme is a dialect of Lisp, so, by a sufficiently irrespo",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#aside-09-aside-ive-mentioned-that-javascript-was-inspired-by"
    },
    {
      "id": "p-09-richard-gabriel-and-guy-steele-wrote-about-lisps",
      "type": "paragraph",
      "label": "Richard Gabriel and Guy Steele wrote about Lisp’s tendency to split into separate worlds in their rather long 1993 artic",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-richard-gabriel-and-guy-steele-wrote-about-lisps"
    },
    {
      "id": "aside-09-it-would-seem-that-almost-every-little-research",
      "type": "aside",
      "label": "It would seem that almost every little research group has its own version of Lisp.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#aside-09-it-would-seem-that-almost-every-little-research"
    },
    {
      "id": "p-09-this-proliferation-eventually-led-to-common-lisp-an",
      "type": "paragraph",
      "label": "This proliferation eventually led to Common Lisp: an attempt to bring several diverging branches of the Lisp family back",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-this-proliferation-eventually-led-to-common-lisp-an"
    },
    {
      "id": "p-09-but-the-issue-was-inherent-in-lisp-no",
      "type": "paragraph",
      "label": "But the issue was inherent in Lisp, no matter the version. Any developer could extend Lisp itself, from within Lisp. The",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-but-the-issue-was-inherent-in-lisp-no"
    },
    {
      "id": "p-09-why-would-you-not-do-that",
      "type": "paragraph",
      "label": "Why would you not do that?",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-why-would-you-not-do-that"
    },
    {
      "id": "p-09-a-famous-example-is-viaweb-one-of-the",
      "type": "paragraph",
      "label": "A famous example is Viaweb, one of the earliest web applications. Its founder, Paul Graham, wrote extensively about the ",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-a-famous-example-is-viaweb-one-of-the"
    },
    {
      "id": "p-09-so-whats-the-problem-again-if-growing-your",
      "type": "paragraph",
      "label": "So what's the problem again? If growing your own language leads to this kind of success, why not grow as much of it as p",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-so-whats-the-problem-again-if-growing-your"
    },
    {
      "id": "p-09-because-the-advantage-is-local",
      "type": "paragraph",
      "label": "Because the advantage is local.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-because-the-advantage-is-local"
    },
    {
      "id": "p-09-every-new-word-in-your-language-makes-the",
      "type": "paragraph",
      "label": "Every new word in your language makes the people inside the system more fluent, more able to express themselves. It also",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-every-new-word-in-your-language-makes-the"
    },
    {
      "id": "h-09-the-vanilla-paradox",
      "type": "heading",
      "label": "The vanilla paradox",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#h-09-the-vanilla-paradox"
    },
    {
      "id": "p-09-theres-a-recurring-movement-against-large-frameworks-like",
      "type": "paragraph",
      "label": "There's a recurring movement against large frameworks, like React. The idea is to return to a more standard, more 'vanil",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-theres-a-recurring-movement-against-large-frameworks-like"
    },
    {
      "id": "p-09-i-admire-the-sentiment-but-unfortunately-cannot-consider",
      "type": "paragraph",
      "label": "I admire the sentiment, but unfortunately cannot consider myself a convert. I too think that the large frameworks tend t",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-i-admire-the-sentiment-but-unfortunately-cannot-consider"
    },
    {
      "id": "p-09-but-theres-no-such-thing-as-a-vanilla",
      "type": "paragraph",
      "label": "But there's no such thing as a Vanilla JavaScript application. Not for long. And the same goes for PHP, C, Rust and cert",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-but-theres-no-such-thing-as-a-vanilla"
    },
    {
      "id": "p-09-weve-already-discussed-the-reason-its-not-only",
      "type": "paragraph",
      "label": "We've already discussed the reason. It's not only Lisp that allows a developer to grow the language.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-weve-already-discussed-the-reason-its-not-only"
    },
    {
      "id": "p-09-it-is-universal",
      "type": "paragraph",
      "label": "It is universal.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-it-is-universal"
    },
    {
      "id": "p-09-in-the-previous-chapter-i-showed-that-programming",
      "type": "paragraph",
      "label": "In the previous chapter, I showed that programming languages make some thoughts easier to express than others. Different",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-in-the-previous-chapter-i-showed-that-programming"
    },
    {
      "id": "p-09-lisp-makes-it-easy-to-build-that-power",
      "type": "paragraph",
      "label": "Lisp makes it easy to build that power into the language itself. But it is not limited to Lisp. Every language has that ",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-lisp-makes-it-easy-to-build-that-power"
    },
    {
      "id": "p-09-this-is-not-an-accident-this-is-the",
      "type": "paragraph",
      "label": "This is not an accident. This is the point.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-this-is-not-an-accident-this-is-the"
    },
    {
      "id": "p-09-each-program-extends-its-host-language-the-syntax",
      "type": "paragraph",
      "label": "Each program extends its host language. The syntax doesn't change, but increasingly the program supplies the meaning.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-each-program-extends-its-host-language-the-syntax"
    },
    {
      "id": "p-09-vanilla-software-does-not-remain-vanilla-for-long",
      "type": "paragraph",
      "label": "Vanilla software does not remain vanilla for long.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-vanilla-software-does-not-remain-vanilla-for-long"
    },
    {
      "id": "p-09-nor-should-it",
      "type": "paragraph",
      "label": "Nor should it.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-nor-should-it"
    },
    {
      "id": "h-09-muddying-the-waters",
      "type": "heading",
      "label": "Muddying the waters",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#h-09-muddying-the-waters"
    },
    {
      "id": "p-09-in-1991-i-moved-to-the-university-of",
      "type": "paragraph",
      "label": "In 1991, I moved to the University of Twente campus to study computer science. It was a heady time. Not least because I ",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-in-1991-i-moved-to-the-university-of"
    },
    {
      "id": "p-09-our-local-instance-and-the-cause-of-much",
      "type": "paragraph",
      "label": "Our local instance, and the cause of much sleep deprivation and many missed lectures, was called Underworld. It was buil",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-our-local-instance-and-the-cause-of-much"
    },
    {
      "id": "p-09-i-have-to-explain-that-last-sentence-a",
      "type": "paragraph",
      "label": "I have to explain that last sentence a little. I mean 'inside' fairly literally. You didn't just look at a codebase and ",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-i-have-to-explain-that-last-sentence-a"
    },
    {
      "id": "p-09-lpmud-not-only-had-rooms-you-were-a",
      "type": "paragraph",
      "label": "LPMud not only had 'rooms'. You were a 'player', and creatures that roamed the world were 'monsters'. The system had a '",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-lpmud-not-only-had-rooms-you-were-a"
    },
    {
      "id": "p-09-and-it-fit",
      "type": "paragraph",
      "label": "And it fit.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-and-it-fit"
    },
    {
      "id": "p-09-lpmud-is-still-around-there-are-still-wizards",
      "type": "paragraph",
      "label": "LPMud is still around. There are still wizards writing inside its code, its world. Unfortunately, few other software sys",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-lpmud-is-still-around-there-are-still-wizards"
    },
    {
      "id": "h-09-a-pattern-emerges",
      "type": "heading",
      "label": "A pattern emerges",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#h-09-a-pattern-emerges"
    },
    {
      "id": "p-09-domain-driven-design-attempts-to-make-developers-more",
      "type": "paragraph",
      "label": "Domain-Driven Design attempts to make developers more conscious of this. It tells them to learn the ubiquitous language ",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-domain-driven-design-attempts-to-make-developers-more"
    },
    {
      "id": "p-09-design-patterns-take-a-different-route-they-teach",
      "type": "paragraph",
      "label": "Design patterns take a different route. They teach developers to use common patterns, and common words, across different",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-design-patterns-take-a-different-route-they-teach"
    },
    {
      "id": "p-09-i-cannot-disagree-that-they-succeed-in-their",
      "type": "paragraph",
      "label": "I cannot disagree that they succeed in their stated aims. But the price is that the language may fit the programmers bet",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-i-cannot-disagree-that-they-succeed-in-their"
    },
    {
      "id": "p-09-so-far-ive-hopefully-shown-that-programs-extend",
      "type": "paragraph",
      "label": "So far I've hopefully shown that programs extend their host language. They create their own dialect. You can choose that",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-so-far-ive-hopefully-shown-that-programs-extend"
    },
    {
      "id": "p-09-i-grew-up-in-a-christian-household-i",
      "type": "paragraph",
      "label": "I grew up in a Christian household. I think it's more like the curse of Babel.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-i-grew-up-in-a-christian-household-i"
    },
    {
      "id": "p-09-domain-driven-design-seems-to-offer-a-way",
      "type": "paragraph",
      "label": "Domain-Driven Design seems to offer a way through: listen to the language of the problem domain and mirror it in the cod",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-domain-driven-design-seems-to-offer-a-way"
    },
    {
      "id": "p-09-software-development-becomes-partly-a-matter-of-becoming",
      "type": "paragraph",
      "label": "Software development becomes partly a matter of becoming one with your world, your domain. It's almost holistic. Not som",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-software-development-becomes-partly-a-matter-of-becoming"
    },
    {
      "id": "p-09-more-something-for-wizards",
      "type": "paragraph",
      "label": "More something for wizards.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-more-something-for-wizards"
    },
    {
      "id": "p-09-all-choices-have-trade-offs-the-language-that",
      "type": "paragraph",
      "label": "All choices have trade-offs. The language that allows you to work quickly now may slow down the next person who has to l",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-all-choices-have-trade-offs-the-language-that"
    },
    {
      "id": "rule-09-wizards-eighth-rule",
      "type": "rule",
      "label": "Wizard's eighth rule",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#rule-09-wizards-eighth-rule"
    },
    {
      "id": "p-09-im-sorry-that-i-cannot-give-you-easy",
      "type": "paragraph",
      "label": "I'm sorry that I cannot give you easy advice to follow. And what's worse, the curse of Babel isn't limited to your code.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-im-sorry-that-i-cannot-give-you-easy"
    },
    {
      "id": "p-09-its-in-your-data-as-well",
      "type": "paragraph",
      "label": "It's in your data as well.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-its-in-your-data-as-well"
    },
    {
      "id": "p-09-code-can-be-replaced-data-has-a-habit",
      "type": "paragraph",
      "label": "Code can be replaced. Data has a habit of surviving.",
      "chapter": "09-every-program-contains-a-language",
      "url": "chapters/09-every-program-contains-a-language.html#p-09-code-can-be-replaced-data-has-a-habit"
    },
    {
      "id": "h-10-code-exhibit-growing-queries-inside-javascript",
      "type": "heading",
      "label": "Code exhibit: growing queries inside javascript",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-code-exhibit-growing-queries-inside-javascript"
    },
    {
      "id": "p-10-the-previous-chapter-introduced-the-concept-of-a",
      "type": "paragraph",
      "label": "The previous chapter introduced the concept of a domain-specific language as a way to focus on a specific problem, witho",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-previous-chapter-introduced-the-concept-of-a"
    },
    {
      "id": "p-10-you-can-create-a-dsl-with-its-own",
      "type": "paragraph",
      "label": "You can create a DSL with its own parser or compiler, as I've written about in the previous chapter, but you don't alway",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-you-can-create-a-dsl-with-its-own"
    },
    {
      "id": "p-10-sometimes-the-language-you-need-is-already-hiding",
      "type": "paragraph",
      "label": "Sometimes the language you need is already hiding inside the language you're using. You add a few conventions, a few hel",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-sometimes-the-language-you-need-is-already-hiding"
    },
    {
      "id": "p-10-that-distinction-matters-a-separate-parser-creates-a",
      "type": "paragraph",
      "label": "That distinction matters. A separate parser creates a hard border. On one side is PHP, JavaScript, Python, or whatever l",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-that-distinction-matters-a-separate-parser-creates-a"
    },
    {
      "id": "p-10-sometimes-that-border-is-worth-it-sql-is",
      "type": "paragraph",
      "label": "Occasionally that border is worth it. SQL is not JavaScript, and that is part of its power. Regular expressions are thei",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-sometimes-that-border-is-worth-it-sql-is"
    },
    {
      "id": "p-10-but-borders-are-expensive-so-before-we-build",
      "type": "paragraph",
      "label": "But borders are expensive. So before we build one, it is worth asking a wizard's question:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-but-borders-are-expensive-so-before-we-build"
    },
    {
      "id": "aside-10-what-if-the-language-we-need-is-already",
      "type": "aside",
      "label": "What if the language we need is already hiding inside the language we have?",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#aside-10-what-if-the-language-we-need-is-already"
    },
    {
      "id": "p-10-now-for-this-example-well-wade-into-the",
      "type": "paragraph",
      "label": "Now, for this example, we'll wade into the deeper waters of JavaScript. Don't worry if you didn't bring your wellies. Yo",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-now-for-this-example-well-wade-into-the"
    },
    {
      "id": "h-10-a-pile-of-little-records",
      "type": "heading",
      "label": "A pile of little records",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-a-pile-of-little-records"
    },
    {
      "id": "p-10-imagine-we-have-some-people",
      "type": "paragraph",
      "label": "Imagine we have some people:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-imagine-we-have-some-people"
    },
    {
      "id": "q0mh6q",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#q0mh6q"
    },
    {
      "id": "p-10-a-list-of-objects-like-this-is-not",
      "type": "paragraph",
      "label": "A list of objects like this is not a database, but it starts to smell like one. We have records. They have fields. Some ",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-a-list-of-objects-like-this-is-not"
    },
    {
      "id": "p-10-for-example",
      "type": "paragraph",
      "label": "For example:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-for-example"
    },
    {
      "id": "aside-10-give-me-the-people-whose-last-name-starts",
      "type": "aside",
      "label": "Give me the people whose last name starts with O and who live in Manchester. Then return only the bits I want to show.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#aside-10-give-me-the-people-whose-last-name-starts"
    },
    {
      "id": "p-10-the-most-direct-version-is-a-loop",
      "type": "paragraph",
      "label": "The most direct version is a loop:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-most-direct-version-is-a-loop"
    },
    {
      "id": "h7p0ep",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h7p0ep"
    },
    {
      "id": "p-10-this-is-fine-it-works-but-the-question",
      "type": "paragraph",
      "label": "This is fine. It works. But the question is hidden inside walking, checking, and pushing. We wanted to talk about people",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-is-fine-it-works-but-the-question"
    },
    {
      "id": "p-10-javascript-already-gives-us-a-nicer-shape",
      "type": "paragraph",
      "label": "JavaScript already gives us a nicer shape:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-javascript-already-gives-us-a-nicer-shape"
    },
    {
      "id": "p9drf7",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p9drf7"
    },
    {
      "id": "p-10-this-is-better-filter-says-which-records-survive",
      "type": "paragraph",
      "label": "This is better. filter() says which records survive. map() says what shape they become.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-is-better-filter-says-which-records-survive"
    },
    {
      "id": "p-10-still-there-is-a-small-itch-the-word",
      "type": "paragraph",
      "label": "Still, there is a small itch. The word person is everywhere. The input shape and the output shape are present, but burie",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-still-there-is-a-small-itch-the-word"
    },
    {
      "id": "p-10-a-common-mistake-is-to-notice-this-itch",
      "type": "paragraph",
      "label": "A common mistake is to notice this itch and immediately summon a parser.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-a-common-mistake-is-to-notice-this-itch"
    },
    {
      "id": "h-10-the-tempting-new-language",
      "type": "heading",
      "label": "The tempting new language",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-the-tempting-new-language"
    },
    {
      "id": "p-10-it-is-easy-to-imagine-a-prettier-notation",
      "type": "paragraph",
      "label": "It is easy to imagine a prettier notation:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-it-is-easy-to-imagine-a-prettier-notation"
    },
    {
      "id": "w69i9s",
      "type": "code",
      "label": "text block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#w69i9s"
    },
    {
      "id": "p-10-this-is-attractive-it-looks-like-a-query",
      "type": "paragraph",
      "label": "This is attractive. It looks like a query. It removes the repeated person. It gives the problem a language of its own.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-is-attractive-it-looks-like-a-query"
    },
    {
      "id": "p-10-but-now-the-text-is-not-javascript-javascript",
      "type": "paragraph",
      "label": "But now the text is not JavaScript. JavaScript cannot run it. We need tokens, grammar rules, a parse tree, a translator,",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-but-now-the-text-is-not-javascript-javascript"
    },
    {
      "id": "p-10-again-this-can-be-a-good-trade-sql",
      "type": "paragraph",
      "label": "Again, this can be a good trade. SQL earns its border. A query string that can be sent to a database server, optimized, ",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-again-this-can-be-a-good-trade-sql"
    },
    {
      "id": "p-10-our-little-array-of-people-does-not-need",
      "type": "paragraph",
      "label": "Our little array of people does not need that much ceremony yet. The bill would come due before the language had earned ",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-our-little-array-of-people-does-not-need"
    },
    {
      "id": "p-10-so-lets-try-a-smaller-spell",
      "type": "paragraph",
      "label": "So let's try a smaller spell.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-so-lets-try-a-smaller-spell"
    },
    {
      "id": "h-10-a-question-can-be-a-function",
      "type": "heading",
      "label": "A question can be a function",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-a-question-can-be-a-function"
    },
    {
      "id": "p-10-javascript-functions-are-themselves-values-that-fact-gives",
      "type": "paragraph",
      "label": "JavaScript functions are themselves values. That fact gives us a useful opportunity.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-javascript-functions-are-themselves-values-that-fact-gives"
    },
    {
      "id": "oa4e35",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#oa4e35"
    },
    {
      "id": "p-10-startswith-o-returns-a-function-later-that-function",
      "type": "paragraph",
      "label": "startsWith(\"O\") returns a function. Later, that function can be given a last name and decide whether it matches.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-startswith-o-returns-a-function-later-that-function"
    },
    {
      "id": "p-10-so-instead-of-inventing-syntax-for-every-operation",
      "type": "paragraph",
      "label": "So instead of inventing syntax for every operation, we can carry little pieces of behavior around as JavaScript values.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-so-instead-of-inventing-syntax-for-every-operation"
    },
    {
      "id": "p-10-this-is-not-a-dsl-yet-but-it",
      "type": "paragraph",
      "label": "This is not a DSL yet, but it opens the door to making one.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-is-not-a-dsl-yet-but-it"
    },
    {
      "id": "h-10-a-shape-can-be-a-question",
      "type": "heading",
      "label": "A shape can be a question",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-a-shape-can-be-a-question"
    },
    {
      "id": "p-10-the-next-step-is-to-stop-writing-the",
      "type": "paragraph",
      "label": "The next step is to stop writing the whole predicate by hand.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-next-step-is-to-stop-writing-the"
    },
    {
      "id": "p-10-suppose-we-write-the-question-as-an-object",
      "type": "paragraph",
      "label": "Suppose we write the question as an object:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-suppose-we-write-the-question-as-an-object"
    },
    {
      "id": "rt25sv",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#rt25sv"
    },
    {
      "id": "p-10-this-object-looks-like-the-data-that-is",
      "type": "paragraph",
      "label": "This object looks like the data. That is the trick. A pattern shaped like the data can describe what we want from the da",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-object-looks-like-the-data-that-is"
    },
    {
      "id": "p-10-static-values-mean-this-field-must-equal-this",
      "type": "paragraph",
      "label": "Static values mean: this field must equal this value.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-static-values-mean-this-field-must-equal-this"
    },
    {
      "id": "p-10-functions-mean-call-this-function-with-the-field",
      "type": "paragraph",
      "label": "Functions mean: call this function with the field value.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-functions-mean-call-this-function-with-the-field"
    },
    {
      "id": "p-10-nested-objects-mean-go-down-into-the-nested",
      "type": "paragraph",
      "label": "Nested objects mean: go down into the nested object and continue matching there.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-nested-objects-mean-go-down-into-the-nested"
    },
    {
      "id": "p-10-here-is-a-small-matcher",
      "type": "paragraph",
      "label": "Here is a small matcher:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-here-is-a-small-matcher"
    },
    {
      "id": "v9dzxh",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#v9dzxh"
    },
    {
      "id": "p-10-and-now-we-can-use-it-with-normal",
      "type": "paragraph",
      "label": "And now we can use it with normal filter():",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-and-now-we-can-use-it-with-normal"
    },
    {
      "id": "x4l9yb",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#x4l9yb"
    },
    {
      "id": "p-10-still-not-a-dsl-but-the-question-is",
      "type": "paragraph",
      "label": "Still not a DSL, but the question is already easier to see.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-still-not-a-dsl-but-the-question-is"
    },
    {
      "id": "h-10-the-result-also-has-a-shape",
      "type": "heading",
      "label": "The result also has a shape",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-the-result-also-has-a-shape"
    },
    {
      "id": "p-10-filtering-is-only-half-the-problem-we-also",
      "type": "paragraph",
      "label": "Filtering is only half the problem. We also want to say what the result should look like.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-filtering-is-only-half-the-problem-we-also"
    },
    {
      "id": "p-10-we-need-one-tiny-marker",
      "type": "paragraph",
      "label": "We need one tiny marker:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-we-need-one-tiny-marker"
    },
    {
      "id": "sr68jo",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#sr68jo"
    },
    {
      "id": "p-10-in-the-real-jaqt-which-this-is-inspired",
      "type": "paragraph",
      "label": "The is just a placeholder, so we can use the existing javascript object notation, it only means: copy the property with ",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-in-the-real-jaqt-which-this-is-inspired"
    },
    {
      "id": "p-10-now-we-can-describe-the-result",
      "type": "paragraph",
      "label": "Now we can describe the result:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-now-we-can-describe-the-result"
    },
    {
      "id": "ndpu66",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#ndpu66"
    },
    {
      "id": "p-10-this-says-copy-firstname-copy-lastname-copy-address",
      "type": "paragraph",
      "label": "This says: copy firstName, copy lastName, copy address.city, and calculate label by calling fullName.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-says-copy-firstname-copy-lastname-copy-address"
    },
    {
      "id": "p-10-a-small-projector-can-interpret-that-shape",
      "type": "paragraph",
      "label": "A small projector can interpret that shape:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-a-small-projector-can-interpret-that-shape"
    },
    {
      "id": "h502kl",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h502kl"
    },
    {
      "id": "p-10-and-again-we-can-use-it-without-leaving",
      "type": "paragraph",
      "label": "And again, we can use it without leaving JavaScript:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-and-again-we-can-use-it-without-leaving"
    },
    {
      "id": "wmlcgg",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#wmlcgg"
    },
    {
      "id": "p-10-we-are-now-close-to-a-query-language",
      "type": "paragraph",
      "label": "We are now close to a query language, but every part of it is still JavaScript. We did not create a new border--we've ex",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-we-are-now-close-to-a-query-language"
    },
    {
      "id": "h-10-giving-the-shape-a-few-words",
      "type": "heading",
      "label": "Giving the shape a few words",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-giving-the-shape-a-few-words"
    },
    {
      "id": "p-10-the-code-still-uses-filter-and-map-directly",
      "type": "paragraph",
      "label": "The code still uses filter() and map() directly. There is nothing wrong with that, but the query would be easier to read",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-code-still-uses-filter-and-map-directly"
    },
    {
      "id": "p-10-we-can-wrap-the-array",
      "type": "paragraph",
      "label": "We can wrap the array:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-we-can-wrap-the-array"
    },
    {
      "id": "xk67tk",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#xk67tk"
    },
    {
      "id": "p-10-that-is-almost-embarrassingly-small-where-wraps-filter",
      "type": "paragraph",
      "label": "That is almost embarrassingly small. where() wraps filter(). select() wraps map(). value() gives the array back.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-that-is-almost-embarrassingly-small-where-wraps-filter"
    },
    {
      "id": "p-10-but-the-words-matter-where-select-and-value",
      "type": "paragraph",
      "label": "But the words matter. where, select, and value are not decoration. They are the little language becoming visible.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-but-the-words-matter-where-select-and-value"
    },
    {
      "id": "p-10-now-the-query-can-read-like-this",
      "type": "paragraph",
      "label": "Now the query can read like this:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-now-the-query-can-read-like-this"
    },
    {
      "id": "p036fn",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p036fn"
    },
    {
      "id": "p-10-the-result-is",
      "type": "paragraph",
      "label": "The result is:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-result-is"
    },
    {
      "id": "g2h23j",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#g2h23j"
    },
    {
      "id": "p-10-this-is-not-real-jaqt-it-is-a",
      "type": "paragraph",
      "label": "The code you've seen so far is a small sample of a larger library, called JAQT. This is not JAQT. It is a small wooden m",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-is-not-real-jaqt-it-is-a"
    },
    {
      "id": "p-10-the-point-of-the-model-is-the-shape",
      "type": "paragraph",
      "label": "The point of the model is the shape.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-point-of-the-model-is-the-shape"
    },
    {
      "id": "aside-10-this-trick-was-inspired-by-lisp-in-lisp",
      "type": "aside",
      "label": "This trick was inspired by Lisp. In Lisp, a macro can receive a piece of program before it is evaluated, inspect its sha",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#aside-10-this-trick-was-inspired-by-lisp-in-lisp"
    },
    {
      "id": "h-10-the-whole-exhibit-version",
      "type": "heading",
      "label": "The whole exhibit version",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-the-whole-exhibit-version"
    },
    {
      "id": "p-10-here-is-the-complete-tiny-version-in-one",
      "type": "paragraph",
      "label": "Here is the complete tiny version in one place:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-here-is-the-complete-tiny-version-in-one"
    },
    {
      "id": "jaqt-mini-complete",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#jaqt-mini-complete"
    },
    {
      "id": "p-10-it-is-small-enough-to-be-disappointing-which",
      "type": "paragraph",
      "label": "It is small enough to be disappointing, which is usually a good sign.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-it-is-small-enough-to-be-disappointing-which"
    },
    {
      "id": "h-10-composing-inside-the-host-language",
      "type": "heading",
      "label": "Composing inside the host language",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-composing-inside-the-host-language"
    },
    {
      "id": "p-10-the-reward-for-staying-inside-javascript-is-that",
      "type": "paragraph",
      "label": "The reward for staying inside JavaScript is that composition keeps working.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-reward-for-staying-inside-javascript-is-that"
    },
    {
      "id": "p-10-we-can-make-little-pieces",
      "type": "paragraph",
      "label": "We can make little pieces:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-we-can-make-little-pieces"
    },
    {
      "id": "g2ce8l",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#g2ce8l"
    },
    {
      "id": "p-10-and-combine-them-with-javascript-itself",
      "type": "paragraph",
      "label": "And combine them with JavaScript itself:",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-and-combine-them-with-javascript-itself"
    },
    {
      "id": "ucz6xq",
      "type": "code",
      "label": "js block",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#ucz6xq"
    },
    {
      "id": "p-10-the-spread-operator-did-not-need-to-be",
      "type": "paragraph",
      "label": "The spread operator did not need to be added to our DSL. It was already in JavaScript. Arrow functions did not need to b",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-the-spread-operator-did-not-need-to-be"
    },
    {
      "id": "p-10-every-piece-of-it-is-still-javascript-so",
      "type": "paragraph",
      "label": "Every piece of it is still JavaScript, so it works with all the other JavaScript you already have. It can be tested and ",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-every-piece-of-it-is-still-javascript-so"
    },
    {
      "id": "h-10-the-border-question",
      "type": "heading",
      "label": "The border question",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#h-10-the-border-question"
    },
    {
      "id": "p-10-this-does-not-mean-every-dsl-should-be",
      "type": "paragraph",
      "label": "This does not mean every DSL should be embedded in a host language.",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-this-does-not-mean-every-dsl-should-be"
    },
    {
      "id": "p-10-sometimes-you-want-the-hard-border-a-database",
      "type": "paragraph",
      "label": "Sometimes you want the hard border. A database server cannot run arbitrary JavaScript helper functions every time someon",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-sometimes-you-want-the-hard-border-a-database"
    },
    {
      "id": "p-10-a-host-language-dsl-has-its-own-dangers",
      "type": "paragraph",
      "label": "A host-language DSL has its own dangers. If the conventions are too weak, it dissolves back into ordinary code. If the t",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-a-host-language-dsl-has-its-own-dangers"
    },
    {
      "id": "p-10-so-the-question-is-not-whether-separate-dsls",
      "type": "paragraph",
      "label": "So the question is not whether separate DSLs are bad and embedded DSLs are good. The question is where the boundary belo",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-so-the-question-is-not-whether-separate-dsls"
    },
    {
      "id": "p-10-a-parser-version-of-a-dsl-puts-the",
      "type": "paragraph",
      "label": "A parser version of a DSL puts the boundary around a new query language. The JAQT-shaped version moves the boundary inwa",
      "chapter": "10-code-exhibit-extending-javascript-with-jaqt",
      "url": "chapters/10-code-exhibit-extending-javascript-with-jaqt.html#p-10-a-parser-version-of-a-dsl-puts-the"
    },
    {
      "id": "h-11-the-knitted-castle",
      "type": "heading",
      "label": "The knitted castle",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#h-11-the-knitted-castle"
    },
    {
      "id": "p-11-why-is-it-so-difficult-to-make-reusable",
      "type": "paragraph",
      "label": "Why is it so difficult to make reusable software?",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-why-is-it-so-difficult-to-make-reusable"
    },
    {
      "id": "p-11-the-famous-wizard-alan-kay-once-said",
      "type": "paragraph",
      "label": "The famous wizard Alan Kay once said:",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-famous-wizard-alan-kay-once-said"
    },
    {
      "id": "aside-11-whatever-we-in-computing-do-is-more-like",
      "type": "aside",
      "label": "\"Whatever we [in computing] do is more like what the Egyptians did. Building pyramids, piling things on top of each othe",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#aside-11-whatever-we-in-computing-do-is-more-like"
    },
    {
      "id": "p-11-i-think-the-situation-is-more-dire-than",
      "type": "paragraph",
      "label": "I think the situation is more dire than that. We're not stacking bricks, instead we're knitting castles.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-i-think-the-situation-is-more-dire-than"
    },
    {
      "id": "aside-11-aside-ive-stolen-the-knitted-castle-example-from-rich",
      "type": "aside",
      "label": "Aside: I've stolen the knitted castle example from Rich Hickey. He uses the image in Simple Made Easy, a talk every wiza",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#aside-11-aside-ive-stolen-the-knitted-castle-example-from-rich"
    },
    {
      "id": "p-11-lets-take-a-step-back-first-go-back",
      "type": "paragraph",
      "label": "Let's take a step back first, back to when you first discovered programming. I hope it isn't too hard to remember the he",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-lets-take-a-step-back-first-go-back"
    },
    {
      "id": "p-11-then-if-you-are-like-me-you-got",
      "type": "paragraph",
      "label": "Then, if you are like me, you got serious about writing software, your darling program grew up and grew big. And adding ",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-then-if-you-are-like-me-you-got"
    },
    {
      "id": "p-11-you-cannot-win-the-problem-is-complexity-in",
      "type": "paragraph",
      "label": "You cannot win. The problem is complexity. In software development, growing complexity appears to be as harsh a law as t",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-you-cannot-win-the-problem-is-complexity-in"
    },
    {
      "id": "p-11-most-software-projects-at-some-point-end-up",
      "type": "paragraph",
      "label": "Most software projects at some point end up looking like this:",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-most-software-projects-at-some-point-end-up"
    },
    {
      "id": "image-11-a-knitted-castle",
      "type": "image",
      "label": "A knitted castle",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#image-11-a-knitted-castle"
    },
    {
      "id": "p-11-a-pyramid-is-at-least-made-of-separate",
      "type": "paragraph",
      "label": "A pyramid is at least made of separate stones. They may be heavy, badly placed, and difficult to move, but you can still",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-pyramid-is-at-least-made-of-separate"
    },
    {
      "id": "p-11-a-knitted-castle-is-different-every-part-is",
      "type": "paragraph",
      "label": "A knitted castle is different. Every part is made out of the same thread as every other part. The wall continues into th",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-knitted-castle-is-different-every-part-is"
    },
    {
      "id": "p-11-this-is-funny-when-it-is-yarn",
      "type": "paragraph",
      "label": "This is funny when it is yarn, it is less funny when it is your application.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-this-is-funny-when-it-is-yarn"
    },
    {
      "id": "h-11-the-dream-of-lego",
      "type": "heading",
      "label": "The dream of Lego",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#h-11-the-dream-of-lego"
    },
    {
      "id": "p-11-the-dream-is-obvious-we-want-software-pieces",
      "type": "paragraph",
      "label": "The dream is obvious. We want software pieces that behave like Lego bricks.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-dream-is-obvious-we-want-software-pieces"
    },
    {
      "id": "p-11-a-lego-brick-does-not-care-whether-it",
      "type": "paragraph",
      "label": "A Lego brick does not care whether it is used in a castle, a spaceship, a bridge, or a thing a small child insists is de",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-lego-brick-does-not-care-whether-it"
    },
    {
      "id": "p-11-that-boringness-is-part-of-the-magic",
      "type": "paragraph",
      "label": "That boringness is part of the magic.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-that-boringness-is-part-of-the-magic"
    },
    {
      "id": "p-11-a-lego-brick-is-reusable-because-it-makes",
      "type": "paragraph",
      "label": "A Lego brick is reusable because it makes very few assumptions about the thing you are building. Most software component",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-lego-brick-is-reusable-because-it-makes"
    },
    {
      "id": "p-11-most-software-components-are-more-like-a-beautifully",
      "type": "paragraph",
      "label": "Most software components are more like a beautifully carved castle tower with a bit of wall still attached, some electri",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-most-software-components-are-more-like-a-beautifully"
    },
    {
      "id": "p-11-you-can-reuse-it-but-now-your-project",
      "type": "paragraph",
      "label": "You can reuse it, but now your project must have the right hill.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-you-can-reuse-it-but-now-your-project"
    },
    {
      "id": "h-11-every-useful-thing-grows-threads",
      "type": "heading",
      "label": "Every useful thing grows threads",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#h-11-every-useful-thing-grows-threads"
    },
    {
      "id": "p-11-you-dont-end-up-with-a-mess-of",
      "type": "paragraph",
      "label": "You don't end up with a mess of yarn because you set out to do so. You end up there because you just want to add a littl",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-you-dont-end-up-with-a-mess-of"
    },
    {
      "id": "p-11-none-of-these-changes-are-absurd-that-is",
      "type": "paragraph",
      "label": "The annoying part is, none of these changes are absurd. A knitted castle is usually not built by foolish decisions. It i",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-none-of-these-changes-are-absurd-that-is"
    },
    {
      "id": "rule-11-wizards-ninth-rule",
      "type": "rule",
      "label": "Wizard's ninth rule",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#rule-11-wizards-ninth-rule"
    },
    {
      "id": "h-11-packages-are-not-the-same-as-parts",
      "type": "heading",
      "label": "Packages are not the same as parts",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#h-11-packages-are-not-the-same-as-parts"
    },
    {
      "id": "p-11-you-install-one-small-package-it-needs-a",
      "type": "paragraph",
      "label": "You install one small package. It needs a framework plugin, a state library, a build step and three neighbouring package",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-you-install-one-small-package-it-needs-a"
    },
    {
      "id": "p-11-javascript-has-one-of-the-largest-ecosystems-of",
      "type": "paragraph",
      "label": "JavaScript has one of the largest ecosystems of reusable packages ever created. npm is both a miracle and a warning labe",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-javascript-has-one-of-the-largest-ecosystems-of"
    },
    {
      "id": "p-11-it-proves-that-reuse-is-possible-you-can",
      "type": "paragraph",
      "label": "It proves that reuse is possible. You can install a parser, a date library, a test runner, a bundler, a color picker, a ",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-it-proves-that-reuse-is-possible-you-can"
    },
    {
      "id": "p-11-but-a-package-is-not-automatically-a-lego",
      "type": "paragraph",
      "label": "But a package is not automatically a Lego brick.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-but-a-package-is-not-automatically-a-lego"
    },
    {
      "id": "p-11-a-package-is-a-unit-of-distribution-it",
      "type": "paragraph",
      "label": "A package is a unit of distribution. It says: here is a thing you can download and import.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-package-is-a-unit-of-distribution-it"
    },
    {
      "id": "p-11-that-is-not-the-same-as-saying-here",
      "type": "paragraph",
      "label": "That is not the same as saying: here is a thing whose assumptions fit naturally into your problem.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-that-is-not-the-same-as-saying-here"
    },
    {
      "id": "p-11-a-package-can-be-reusable-as-a-whole",
      "type": "paragraph",
      "label": "A package can be reusable as a whole and still be impossible to take apart. You may like its parser but not its data mod",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-package-can-be-reusable-as-a-whole"
    },
    {
      "id": "p-11-we-have-become-very-good-at-shipping-bundles",
      "type": "paragraph",
      "label": "We have become very good at shipping bundles of software around the world. We are less good at making the insides of tho",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-we-have-become-very-good-at-shipping-bundles"
    },
    {
      "id": "h-11-reuse-has-a-direction",
      "type": "heading",
      "label": "Reuse has a direction",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#h-11-reuse-has-a-direction"
    },
    {
      "id": "p-11-one-reason-the-lego-dream-fails-is-that",
      "type": "paragraph",
      "label": "One reason the Lego dream fails is that we talk about reuse as if all reuse were the same.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-one-reason-the-lego-dream-fails-is-that"
    },
    {
      "id": "p-11-it-is-not",
      "type": "paragraph",
      "label": "It is not.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-it-is-not"
    },
    {
      "id": "p-11-a-pure-function-is-often-easy-to-reuse",
      "type": "paragraph",
      "label": "A pure function is often easy to reuse because it asks for little. Give it input. Receive output. It does not need to kn",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-pure-function-is-often-easy-to-reuse"
    },
    {
      "id": "p-11-a-file-format-can-be-reusable-because-many",
      "type": "paragraph",
      "label": "A file format can be reusable because many programs can agree on it without sharing the same code.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-file-format-can-be-reusable-because-many"
    },
    {
      "id": "p-11-a-protocol-can-be-reusable-because-different-systems",
      "type": "paragraph",
      "label": "A protocol can be reusable because different systems can meet at a boundary and then go their separate ways again.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-protocol-can-be-reusable-because-different-systems"
    },
    {
      "id": "p-11-a-ui-component-is-harder-it-often-wants",
      "type": "paragraph",
      "label": "A UI component is harder. It often wants data, styling, events, state, and then some. You need to carefully carve a plac",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-ui-component-is-harder-it-often-wants"
    },
    {
      "id": "p-11-an-application-feature-is-harder-still-a-shopping",
      "type": "paragraph",
      "label": "An application feature is harder still. A shopping cart is not just a list of products. It touches pricing, stock, ident",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-an-application-feature-is-harder-still-a-shopping"
    },
    {
      "id": "p-11-so-lets-rephrase-the-question-the-useful-question",
      "type": "paragraph",
      "label": "So let's rephrase the question. The useful question is not:",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-so-lets-rephrase-the-question-the-useful-question"
    },
    {
      "id": "aside-11-can-this-be-reused",
      "type": "aside",
      "label": "Can this be reused?",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#aside-11-can-this-be-reused"
    },
    {
      "id": "p-11-the-useful-question-is",
      "type": "paragraph",
      "label": "The useful question is:",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-useful-question-is"
    },
    {
      "id": "aside-11-in-what-direction-can-this-be-reused",
      "type": "aside",
      "label": "In what direction can this be reused?",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#aside-11-in-what-direction-can-this-be-reused"
    },
    {
      "id": "p-11-can-the-calculation-be-reused-without-the-ui",
      "type": "paragraph",
      "label": "Can the calculation be reused without the UI? Can the data format be reused without the database? Can the protocol be re",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-can-the-calculation-be-reused-without-the-ui"
    },
    {
      "id": "p-11-dont-ask-for-universal-reuse-that-is-how",
      "type": "paragraph",
      "label": "Don't ask for universal reuse. That is how most reusability ideas become enormous.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-dont-ask-for-universal-reuse-that-is-how"
    },
    {
      "id": "p-11-instead-look-for-the-boundary",
      "type": "paragraph",
      "label": "Instead, look for the boundary.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-instead-look-for-the-boundary"
    },
    {
      "id": "h-11-the-boundary-is-the-component",
      "type": "heading",
      "label": "The boundary is the component",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#h-11-the-boundary-is-the-component"
    },
    {
      "id": "p-11-this-is-the-part-that-is-easy-to",
      "type": "paragraph",
      "label": "This is the part that is easy to miss.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-this-is-the-part-that-is-easy-to"
    },
    {
      "id": "p-11-the-reusable-thing-is-not-only-the-code",
      "type": "paragraph",
      "label": "The reusable thing is not only the code. It is the boundary around the code.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-reusable-thing-is-not-only-the-code"
    },
    {
      "id": "p-11-the-boundary-is-where-the-bargain-is-made",
      "type": "paragraph",
      "label": "The boundary is where the bargain is made. This data may cross. These names matter. This part stays hidden. This part is",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-boundary-is-where-the-bargain-is-made"
    },
    {
      "id": "p-11-a-bad-boundary-leaks-the-whole-world-a",
      "type": "paragraph",
      "label": "A bad boundary leaks the whole world. A good boundary is boring in the right places.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-bad-boundary-leaks-the-whole-world-a"
    },
    {
      "id": "p-11-this-is-why-small-libraries-often-age-better",
      "type": "paragraph",
      "label": "This is why small libraries often age better than clever frameworks. A small library can sometimes say: give me this val",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-this-is-why-small-libraries-often-age-better"
    },
    {
      "id": "p-11-a-framework-often-says-live-here",
      "type": "paragraph",
      "label": "A framework often says: live here.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-a-framework-often-says-live-here"
    },
    {
      "id": "p-11-this-is-also-why-standards-matter-a-standard",
      "type": "paragraph",
      "label": "This is also why standards matter. A standard creates a boundary that does not belong to one package. HTML, URLs, JSON, ",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-this-is-also-why-standards-matter-a-standard"
    },
    {
      "id": "p-11-the-web-itself-works-because-many-different-pieces",
      "type": "paragraph",
      "label": "The Web itself works because many different pieces agree just enough to meet each other.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-web-itself-works-because-many-different-pieces"
    },
    {
      "id": "h-11-fighting-for-the-lego-castle",
      "type": "heading",
      "label": "Fighting for the Lego castle",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#h-11-fighting-for-the-lego-castle"
    },
    {
      "id": "p-11-you-cannot-defeat-complexity-once-and-for-all",
      "type": "paragraph",
      "label": "You cannot defeat complexity once and for all. That is the sort of promise that sells books, frameworks, and conference ",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-you-cannot-defeat-complexity-once-and-for-all"
    },
    {
      "id": "p-11-but-you-can-fight",
      "type": "paragraph",
      "label": "But you can fight.",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-but-you-can-fight"
    },
    {
      "id": "p-11-keep-asking-what-assumptions-each-part-carries-decide",
      "type": "paragraph",
      "label": "Keep asking what assumptions each part carries. Decide which assumptions belong inside it, and which should stop at the ",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-keep-asking-what-assumptions-each-part-carries-decide"
    },
    {
      "id": "p-11-keep-the-stable-rules-of-your-program-away",
      "type": "paragraph",
      "label": "Keep the stable rules of your program away from browsers, databases, networks, and other things that change. Pass plain ",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-keep-the-stable-rules-of-your-program-away"
    },
    {
      "id": "p-11-make-the-boundaries-simple-enough-that-another-implementation",
      "type": "paragraph",
      "label": "Make the boundaries simple enough that another implementation can cross them. A component should not need to know the hi",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-make-the-boundaries-simple-enough-that-another-implementation"
    },
    {
      "id": "p-11-sometimes-a-small-language-helps-jaqt-gives-the",
      "type": "paragraph",
      "label": "Sometimes a small language helps. JAQT gives the stable idea—the shape of a query—a place to live apart from the machine",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-sometimes-a-small-language-helps-jaqt-gives-the"
    },
    {
      "id": "p-11-also-accept-that-some-things-should-not-be",
      "type": "paragraph",
      "label": "Also accept that some things should not be reusable. Software fitted closely to one situation may be valuable precisely ",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-also-accept-that-some-things-should-not-be"
    },
    {
      "id": "p-11-the-lego-castle-is-not-built-from-magic",
      "type": "paragraph",
      "label": "The Lego castle is not built from magic universal parts. It is built by choosing where the studs go, making those connec",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-lego-castle-is-not-built-from-magic"
    },
    {
      "id": "p-11-the-knitted-castle-is-always-waiting-every-useful",
      "type": "paragraph",
      "label": "The knitted castle is always waiting. Every useful feature wants to add another loop. The wizard's work is not to preven",
      "chapter": "11-the-knitted-castle",
      "url": "chapters/11-the-knitted-castle.html#p-11-the-knitted-castle-is-always-waiting-every-useful"
    },
    {
      "id": "h-12-boundaries-data-behavior-and-time",
      "type": "heading",
      "label": "Boundaries: Data, behavior, and time",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#h-12-boundaries-data-behavior-and-time"
    },
    {
      "id": "p-12-in-the-previous-chapter-we-looked-at-the",
      "type": "paragraph",
      "label": "In the previous chapter we looked at the knitted castle: the strange tendency of software to grow threads. Every useful ",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-in-the-previous-chapter-we-looked-at-the"
    },
    {
      "id": "p-12-object-oriented-programming-is-one-of-the-great",
      "type": "paragraph",
      "label": "Object-Oriented Programming is one of the great historical answers to that problem. Perhaps the most successful one.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-object-oriented-programming-is-one-of-the-great"
    },
    {
      "id": "p-12-it-promised-a-way-to-make-software-out",
      "type": "paragraph",
      "label": "It promised a way to make software out of reusable pieces. Pieces that were not just functions, but little things that c",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-it-promised-a-way-to-make-software-out"
    },
    {
      "id": "p-12-that-promise-was-powerful-enough-that-oop-took",
      "type": "paragraph",
      "label": "That promise was powerful enough that OOP took over much of the programming world. For many programmers, programming bec",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-that-promise-was-powerful-enough-that-oop-took"
    },
    {
      "id": "p-12-and-yet-the-knitted-castle-did-not-go",
      "type": "paragraph",
      "label": "And yet the knitted castle did not go away.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-and-yet-the-knitted-castle-did-not-go"
    },
    {
      "id": "p-12-so-i-will-not-start-with-a-definition",
      "type": "paragraph",
      "label": "So I will not start with a definition of OOP. Definitions are where this subject goes to become religious. I will start ",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-so-i-will-not-start-with-a-definition"
    },
    {
      "id": "p-12-where-should-behavior-live",
      "type": "paragraph",
      "label": "Where should behavior live?",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-where-should-behavior-live"
    },
    {
      "id": "p-12-if-you-have-data-in-one-place-and",
      "type": "paragraph",
      "label": "If you have data in one place and all the code that works on that data somewhere else, the distance between the two beco",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-if-you-have-data-in-one-place-and"
    },
    {
      "id": "p-12-oops-answer-is-bind-the-behavior-to-the",
      "type": "paragraph",
      "label": "OOP's answer is: bind the behavior to the data. Put the methods where the state is. Make the thing responsible for its o",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-oops-answer-is-bind-the-behavior-to-the"
    },
    {
      "id": "p-12-this-is-a-good-direction-its-not-the",
      "type": "paragraph",
      "label": "This is a good direction. It's not the whole answer, but it's not nothing either.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-this-is-a-good-direction-its-not-the"
    },
    {
      "id": "h-12-classes-and-objects",
      "type": "heading",
      "label": "Classes and objects",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#h-12-classes-and-objects"
    },
    {
      "id": "p-12-a-class-is-often-explained-as-a-blueprint",
      "type": "paragraph",
      "label": "A class is often explained as a blueprint. An object is the thing built from that blueprint. This is good enough for a f",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-a-class-is-often-explained-as-a-blueprint"
    },
    {
      "id": "p-12-the-more-important-idea-is-that-an-object",
      "type": "paragraph",
      "label": "The more important idea is that an object carries a small world around with it. It has state, and it has behavior that i",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-the-more-important-idea-is-that-an-object"
    },
    {
      "id": "p-12-that-language-can-be-pleasant-it-can-also",
      "type": "paragraph",
      "label": "That language can be pleasant. It can also become a trap.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-that-language-can-be-pleasant-it-can-also"
    },
    {
      "id": "code-12-php-order-pay-payment",
      "type": "code",
      "label": "php block",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#code-12-php-order-pay-payment"
    },
    {
      "id": "p-12-this-code-tells-a-little-story-it-is",
      "type": "paragraph",
      "label": "This code tells a little story. It is better than pushing random arrays through random functions. But the story depends ",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-this-code-tells-a-little-story-it-is"
    },
    {
      "id": "h-12-dependencies",
      "type": "heading",
      "label": "Dependencies",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#h-12-dependencies"
    },
    {
      "id": "p-12-the-real-trouble-often-starts-when-an-object",
      "type": "paragraph",
      "label": "The real trouble often starts when an object needs something from the outside world.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-the-real-trouble-often-starts-when-an-object"
    },
    {
      "id": "p-12-for-example-an-order-may-need-to-save",
      "type": "paragraph",
      "label": "For example, an order may need to save itself. The tempting thing is to let it create the thing it needs.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-for-example-an-order-may-need-to-save"
    },
    {
      "id": "code-12-php-class-order",
      "type": "code",
      "label": "php block",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#code-12-php-class-order"
    },
    {
      "id": "p-12-this-looks-convenient-and-convenience-is-one-of",
      "type": "paragraph",
      "label": "This looks convenient, and convenience is one of the most dangerous forms of magic. The Order class now decides not only",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-this-looks-convenient-and-convenience-is-one-of"
    },
    {
      "id": "p-12-the-dependency-is-hidden",
      "type": "paragraph",
      "label": "The dependency is hidden.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-the-dependency-is-hidden"
    },
    {
      "id": "p-12-a-cleaner-version-is-to-ask-for-what",
      "type": "paragraph",
      "label": "A cleaner version is to ask for what you need.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-a-cleaner-version-is-to-ask-for-what"
    },
    {
      "id": "code-12-php-class-order-2",
      "type": "code",
      "label": "php block",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#code-12-php-class-order-2"
    },
    {
      "id": "p-12-or-even-better-inject-the-dependency-when-the",
      "type": "paragraph",
      "label": "Or even better: inject the dependency when the object is created.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-or-even-better-inject-the-dependency-when-the"
    },
    {
      "id": "code-12-php-class-orderservice",
      "type": "code",
      "label": "php block",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#code-12-php-class-orderservice"
    },
    {
      "id": "p-12-forget-the-frameworks-the-annotations-and-the-containers",
      "type": "paragraph",
      "label": "Forget the frameworks, the annotations, and the containers with configuration files so large that they need their own we",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-forget-the-frameworks-the-annotations-and-the-containers"
    },
    {
      "id": "p-12-instead-the-useful-idea-is-simple",
      "type": "paragraph",
      "label": "Instead the useful idea is simple:",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-instead-the-useful-idea-is-simple"
    },
    {
      "id": "aside-12-the-place-that-uses-a-dependency-does-not",
      "type": "aside",
      "label": "The place that uses a dependency does not have to be the place that chooses it.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#aside-12-the-place-that-uses-a-dependency-does-not"
    },
    {
      "id": "p-12-that-lets-you-bind-later-the-simplest-version",
      "type": "paragraph",
      "label": "That lets you bind later. The simplest version of this is:",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-that-lets-you-bind-later-the-simplest-version"
    },
    {
      "id": "code-12-php-orders-new-sqlorderrepository-database",
      "type": "code",
      "label": "php block",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#code-12-php-orders-new-sqlorderrepository-database"
    },
    {
      "id": "p-12-or-encapsulated-in-a-factory-function",
      "type": "paragraph",
      "label": "Or encapsulated in a factory function:",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-or-encapsulated-in-a-factory-function"
    },
    {
      "id": "code-12-php-function-createorderservice-databaseconnection-database",
      "type": "code",
      "label": "php block",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#code-12-php-function-createorderservice-databaseconnection-database"
    },
    {
      "id": "p-12-the-key-idea-the-factory-is-separate-from",
      "type": "paragraph",
      "label": "The key idea: the factory is separate from the SqlOrderRepository and the OrderService. You can replace it or add differ",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-the-key-idea-the-factory-is-separate-from"
    },
    {
      "id": "h-12-binding-time",
      "type": "heading",
      "label": "Binding time",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#h-12-binding-time"
    },
    {
      "id": "p-12-we-dont-think-enough-about-time-but-ignoring",
      "type": "paragraph",
      "label": "We don't think enough about time. But ignoring it doesn't make it disappear. Instead it infects your careful design in u",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-we-dont-think-enough-about-time-but-ignoring"
    },
    {
      "id": "p-12-when-do-we-decide-which-database-to-use",
      "type": "paragraph",
      "label": "When do we decide which database to use? When do we decide which template renders this page? When do we decide which imp",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-when-do-we-decide-which-database-to-use"
    },
    {
      "id": "p-12-if-you-decide-too-early-your-code-becomes",
      "type": "paragraph",
      "label": "If you decide too early, your code becomes rigid. If you decide too late, your code becomes vague. Wizardry is not alway",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-if-you-decide-too-early-your-code-becomes"
    },
    {
      "id": "rule-12-wizards-tenth-rule",
      "type": "rule",
      "label": "Wizard's tenth rule",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#rule-12-wizards-tenth-rule"
    },
    {
      "id": "p-12-this-is-where-factories-dependency-injection-containers-service",
      "type": "paragraph",
      "label": "This is where factories, dependency injection containers, service locators, configuration files and plugin systems all c",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-this-is-where-factories-dependency-injection-containers-service"
    },
    {
      "id": "p-12-some-of-them-help-some-of-them-merely",
      "type": "paragraph",
      "label": "Some of them help. Some of them merely move the mess to a more impressive room.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-some-of-them-help-some-of-them-merely"
    },
    {
      "id": "p-12-passing-a-container-into-every-object-looks-flexible",
      "type": "paragraph",
      "label": "Passing a container into every object looks flexible, but it hides what each object actually needs. The dependencies bec",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-passing-a-container-into-every-object-looks-flexible"
    },
    {
      "id": "h-12-binding-reveals-boundaries",
      "type": "heading",
      "label": "Binding reveals boundaries",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#h-12-binding-reveals-boundaries"
    },
    {
      "id": "p-12-dependencies-are-not-a-problem-if-they-live",
      "type": "paragraph",
      "label": "Dependencies are not a problem if they live their entire life inside the boundary of a single part. They become a proble",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-dependencies-are-not-a-problem-if-they-live"
    },
    {
      "id": "p-12-it-is-your-job-to-identify-potential-boundaries",
      "type": "paragraph",
      "label": "It is your job to identify potential boundaries, and keep the threads from crossing.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-it-is-your-job-to-identify-potential-boundaries"
    },
    {
      "id": "p-12-a-potential-boundary-appears-when-two-things-change",
      "type": "paragraph",
      "label": "A potential boundary appears when two things change for different reasons. The rules of an order change when the busines",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-a-potential-boundary-appears-when-two-things-change"
    },
    {
      "id": "p-12-look-for-code-that-knows-something-only-because",
      "type": "paragraph",
      "label": "Look for code that knows something only because two other parts need to meet. That code may be a bridge. Look for decisi",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-look-for-code-that-knows-something-only-because"
    },
    {
      "id": "h-12-shell-and-core",
      "type": "heading",
      "label": "Shell and core",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#h-12-shell-and-core"
    },
    {
      "id": "p-12-one-useful-boundary-is-the-shell-core-split",
      "type": "paragraph",
      "label": "One useful boundary is the shell/core split.",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-one-useful-boundary-is-the-shell-core-split"
    },
    {
      "id": "p-12-the-core-contains-the-rules-of-the-program",
      "type": "paragraph",
      "label": "The core contains the rules of the program. It should know as little as possible about files, databases, networks, frame",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-the-core-contains-the-rules-of-the-program"
    },
    {
      "id": "p-12-factory-spells-clearly-belong-in-the-shell-this",
      "type": "paragraph",
      "label": "Factory spells clearly belong in the shell. This is where the Lego blocks are connected. I sometimes use the term \"glue ",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-factory-spells-clearly-belong-in-the-shell-this"
    },
    {
      "id": "p-12-boundaries-are-not-found-by-drawing-boxes-first",
      "type": "paragraph",
      "label": "Boundaries are not found by drawing boxes first. They appear when you notice that two things know too much about each ot",
      "chapter": "12-objects-binding-data-behavior-and-time",
      "url": "chapters/12-objects-binding-data-behavior-and-time.html#p-12-boundaries-are-not-found-by-drawing-boxes-first"
    },
    {
      "id": "h-13-architecture-arches-and-change",
      "type": "heading",
      "label": "Architecture: arches and change",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#h-13-architecture-arches-and-change"
    },
    {
      "id": "p-13-i-used-to-think-the-word-architecture-came",
      "type": "paragraph",
      "label": "I used to think the word architecture came from arch, which came from arc, which would have been wonderfully convenient ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-i-used-to-think-the-word-architecture-came"
    },
    {
      "id": "p-13-the-arch-is-still-a-useful-metaphor",
      "type": "paragraph",
      "label": "The arch is still a useful metaphor.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-the-arch-is-still-a-useful-metaphor"
    },
    {
      "id": "p-13-the-egyptians-built-impressive-pyramids-the-basic-trick",
      "type": "paragraph",
      "label": "The Egyptians built impressive pyramids. The basic trick is visible from a distance: a lot of material, arranged so the ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-the-egyptians-built-impressive-pyramids-the-basic-trick"
    },
    {
      "id": "p-13-the-roman-arch-is-a-different-answer-to",
      "type": "paragraph",
      "label": "The Roman arch is a different answer to the same pressure. The arch existed before the Romans, but the Romans were very ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-the-roman-arch-is-a-different-answer-to"
    },
    {
      "id": "p-13-a-software-arch-should-do-something-similar-it",
      "type": "paragraph",
      "label": "A software arch should do something similar. It would not be another layer on top of the pile. It would be a way of arra",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-a-software-arch-should-do-something-similar-it"
    },
    {
      "id": "p-13-which-forces",
      "type": "paragraph",
      "label": "Which forces?",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-which-forces"
    },
    {
      "id": "p-13-the-boring-ones-mostly-the-customer-who-says",
      "type": "paragraph",
      "label": "The boring ones, mostly. The customer who says, six months later, that when they said \"archive\" they did not mean \"delet",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-the-boring-ones-mostly-the-customer-who-says"
    },
    {
      "id": "p-13-and-then-there-is-the-future-which-keeps",
      "type": "paragraph",
      "label": "And then there is the future, which keeps arriving before the system is ready.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-and-then-there-is-the-future-which-keeps"
    },
    {
      "id": "p-13-you-can-answer-all-of-this-by-adding",
      "type": "paragraph",
      "label": "You can answer all of this by adding more stuff. More rules, more checks, more meetings, more glue code, more careful co",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-you-can-answer-all-of-this-by-adding"
    },
    {
      "id": "p-13-but-if-the-same-kind-of-weight-keeps",
      "type": "paragraph",
      "label": "But if the same kind of weight keeps returning, it is worth asking whether the system is saying things the hard way.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-but-if-the-same-kind-of-weight-keeps"
    },
    {
      "id": "p-13-this-is-where-language-comes-back-into-the",
      "type": "paragraph",
      "label": "This is where language comes back into the story. The language of a system decides which thoughts are easy to express, w",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-this-is-where-language-comes-back-into-the"
    },
    {
      "id": "h-13-change-the-language",
      "type": "heading",
      "label": "Change the language?",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#h-13-change-the-language"
    },
    {
      "id": "p-13-alan-kay-did-not-only-complain-about-pyramids",
      "type": "paragraph",
      "label": "Alan Kay did not only complain about pyramids. He spent a good part of his career trying to build software that behaved ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-alan-kay-did-not-only-complain-about-pyramids"
    },
    {
      "id": "p-13-one-later-attempt-came-through-the-viewpoints-research",
      "type": "paragraph",
      "label": "One later attempt came through the Viewpoints Research Institute, or VPRI. One of its projects asked an almost rude ques",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-one-later-attempt-came-through-the-viewpoints-research"
    },
    {
      "id": "p-13-how-much-software-would-it-take-to-build",
      "type": "paragraph",
      "label": "How much software would it take to build a complete personal computing system if you refused to accept the usual piles?",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-how-much-software-would-it-take-to-build"
    },
    {
      "id": "p-13-not-just-an-app-a-stack-graphics-networking",
      "type": "paragraph",
      "label": "Not just an app. A stack: graphics, networking, operating-system-like pieces, user interface, languages. The sort of thi",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-not-just-an-app-a-stack-graphics-networking"
    },
    {
      "id": "p-13-the-vpri-answer-was-the-steps-project-the",
      "type": "paragraph",
      "label": "The VPRI answer was the STEPS project. The numbers in the report are startling:",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-the-vpri-answer-was-the-steps-project-the"
    },
    {
      "id": "table-13-037",
      "type": "table",
      "label": "table",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#table-13-037"
    },
    {
      "id": "p-13-these-are-not-neat-one-for-one-product",
      "type": "paragraph",
      "label": "These are not neat one-for-one product comparisons. The numbers deserve some distrust. But the scale of the attempt is s",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-these-are-not-neat-one-for-one-product"
    },
    {
      "id": "p-13-where-did-all-that-code-go",
      "type": "paragraph",
      "label": "Where did all that code go?",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-where-did-all-that-code-go"
    },
    {
      "id": "p-13-the-trick-was-not-simply-writing-cleverer-c",
      "type": "paragraph",
      "label": "The trick was not simply writing cleverer C. VPRI treated language-making as an architectural tool.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-the-trick-was-not-simply-writing-cleverer-c"
    },
    {
      "id": "p-13-each-domain-got-a-small-language-fitted-to",
      "type": "paragraph",
      "label": "Each domain got a small language fitted to that domain. The project did not ask one general-purpose language to express ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-each-domain-got-a-small-language-fitted-to"
    },
    {
      "id": "p-13-ometa-was-one-of-the-tools-that-made",
      "type": "paragraph",
      "label": "OMeta was one of the tools that made this practical. It is a language for writing languages, based on ideas from Parsing",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-ometa-was-one-of-the-tools-that-made"
    },
    {
      "id": "p-13-ometa-itself-is-not-the-arch-neither-is",
      "type": "paragraph",
      "label": "OMeta itself is not the arch. Neither is every DSL.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-ometa-itself-is-not-the-arch-neither-is"
    },
    {
      "id": "p-13-a-bad-little-language-is-still-a-bad",
      "type": "paragraph",
      "label": "A bad little language is still a bad little language, only with extra ceremony. We have already seen this danger. Every ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-a-bad-little-language-is-still-a-bad"
    },
    {
      "id": "p-13-in-steps-some-of-the-repeated-machinery-became",
      "type": "paragraph",
      "label": "In STEPS, some of the repeated machinery became grammar or vocabulary. A distinction that previously required careful co",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-in-steps-some-of-the-repeated-machinery-became"
    },
    {
      "id": "p-13-changing-the-language-changed-the-amount-and-shape",
      "type": "paragraph",
      "label": "Changing the language changed the amount and shape of the software.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-changing-the-language-changed-the-amount-and-shape"
    },
    {
      "id": "p-13-that-can-be-an-arch",
      "type": "paragraph",
      "label": "That can be an arch.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-that-can-be-an-arch"
    },
    {
      "id": "p-13-sometimes-it-is-just-a-private-dialect-with",
      "type": "paragraph",
      "label": "Sometimes it is just a private dialect with a README and a bad attitude. But when it works, the structure gets lighter b",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-sometimes-it-is-just-a-private-dialect-with"
    },
    {
      "id": "h-13-better-can-still-lose",
      "type": "heading",
      "label": "Better can still lose",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#h-13-better-can-still-lose"
    },
    {
      "id": "p-13-there-is-a-trap-here",
      "type": "paragraph",
      "label": "There is a trap here.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-there-is-a-trap-here"
    },
    {
      "id": "p-13-once-you-see-a-beautiful-arch-you-may",
      "type": "paragraph",
      "label": "Once you see a beautiful arch, you may start believing that the better structure should win. It is smaller, clearer, mor",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-once-you-see-a-beautiful-arch-you-may"
    },
    {
      "id": "p-13-software-history-does-not-have-these-manners",
      "type": "paragraph",
      "label": "Software history does not have these manners.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-software-history-does-not-have-these-manners"
    },
    {
      "id": "p-13-richard-p-gabriel-wrote-the-rise-of-worse",
      "type": "paragraph",
      "label": "Richard P. Gabriel wrote The Rise of \"Worse is Better\". Its uncomfortable claim is that software that is worse in some w",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-richard-p-gabriel-wrote-the-rise-of-worse"
    },
    {
      "id": "p-13-once-it-wins-everyone-else-builds-on-it",
      "type": "paragraph",
      "label": "Once it wins, everyone else builds on it.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-once-it-wins-everyone-else-builds-on-it"
    },
    {
      "id": "p-13-the-better-idea-is-no-longer-competing-with",
      "type": "paragraph",
      "label": "The better idea is no longer competing with the original problem. It is competing with the installed world.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-the-better-idea-is-no-longer-competing-with"
    },
    {
      "id": "p-13-a-useful-imperfect-thing-today-changes-what-tomorrow",
      "type": "paragraph",
      "label": "A useful imperfect thing today changes what tomorrow needs. People write tutorials for it. They build wrappers. They sav",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-a-useful-imperfect-thing-today-changes-what-tomorrow"
    },
    {
      "id": "p-13-a-year-later-the-rough-edge-is-no",
      "type": "paragraph",
      "label": "A year later, the rough edge is no longer merely a rough edge. It is compatibility.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-a-year-later-the-rough-edge-is-no"
    },
    {
      "id": "p-13-this-does-not-mean-bad-software-is-noble",
      "type": "paragraph",
      "label": "This does not mean bad software is noble. It means timing is part of architecture.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-this-does-not-mean-bad-software-is-noble"
    },
    {
      "id": "p-13-an-arch-that-arrives-too-late-may-be",
      "type": "paragraph",
      "label": "An arch that arrives too late may be admired, studied, and ignored. You are not only arranging code. You are arranging c",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-an-arch-that-arrives-too-late-may-be"
    },
    {
      "id": "h-13-being-wrong-without-breaking-everything",
      "type": "heading",
      "label": "Being wrong without breaking everything",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#h-13-being-wrong-without-breaking-everything"
    },
    {
      "id": "p-13-software-changes-the-world-and-is-changed-by",
      "type": "paragraph",
      "label": "Software changes the world, and is changed by it.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-software-changes-the-world-and-is-changed-by"
    },
    {
      "id": "p-13-any-useful-program-will-eventually-meet-new-machines",
      "type": "paragraph",
      "label": "Any useful program will eventually meet new machines, new uses, new libraries, new laws, new attacks, new expectations, ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-any-useful-program-will-eventually-meet-new-machines"
    },
    {
      "id": "p-13-this-is-one-of-the-problems-with-comparing",
      "type": "paragraph",
      "label": "This is one of the problems with comparing software to buildings. The ground usually does not rewrite the laws of stone ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-this-is-one-of-the-problems-with-comparing"
    },
    {
      "id": "p-13-architecture-cannot-mean-certainty",
      "type": "paragraph",
      "label": "Architecture in software is not something you do at the start and then enshrine in a set of design documents. Architectu",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-architecture-cannot-mean-certainty"
    },
    {
      "id": "p-13-architecture-is-how-you-survive-being-wrong",
      "type": "paragraph",
      "label": "Architecture is how you survive being wrong.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-architecture-is-how-you-survive-being-wrong"
    },
    {
      "id": "p-13-you-will-choose-the-wrong-database-sometimes-you",
      "type": "paragraph",
      "label": "You will choose the wrong database sometimes. You will give a private thing a public name, or a public thing no name at ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-you-will-choose-the-wrong-database-sometimes-you"
    },
    {
      "id": "p-13-that-is-not-a-moral-failure-it-is",
      "type": "paragraph",
      "label": "That is not a moral failure. It is what happens when you have to work before the future has finished introducing itself.",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-that-is-not-a-moral-failure-it-is"
    },
    {
      "id": "p-13-if-one-piece-is-wrong-can-it-be",
      "type": "paragraph",
      "label": "If one piece is wrong, can it be replaced without dragging half the system behind it? If the data has to move, did you l",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-if-one-piece-is-wrong-can-it-be"
    },
    {
      "id": "p-13-diagrams-may-help-vocabulary-may-help-layers-may",
      "type": "paragraph",
      "label": "Diagrams may help. Vocabulary may help. Layers may help, if they are honest layers and not just lines drawn through a pi",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-diagrams-may-help-vocabulary-may-help-layers-may"
    },
    {
      "id": "p-13-but-architecture-is-not-the-diagram-it-is",
      "type": "paragraph",
      "label": "But architecture is not the diagram. It is the structure that allows the system to change when the diagram turns out to ",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#p-13-but-architecture-is-not-the-diagram-it-is"
    },
    {
      "id": "rule-13-wizards-eleventh-rule",
      "type": "rule",
      "label": "Wizard's eleventh rule",
      "chapter": "13-architecture-arches-pyramids-and-change",
      "url": "chapters/13-architecture-arches-pyramids-and-change.html#rule-13-wizards-eleventh-rule"
    },
    {
      "id": "h-14-the-web-as-commons-innovation-happens-elsewhere",
      "type": "heading",
      "label": "The Web as commons: innovation happens elsewhere",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#h-14-the-web-as-commons-innovation-happens-elsewhere"
    },
    {
      "id": "p-14-there-is-an-old-open-source-book-by",
      "type": "paragraph",
      "label": "There is an old open source book by Ron Goldman and Richard P. Gabriel called Innovation Happens Elsewhere. The title is",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-there-is-an-old-open-source-book-by"
    },
    {
      "id": "p-14-no-matter-how-clever-your-team-is-most",
      "type": "paragraph",
      "label": "Even if you have a team of the smartest people around, many more smart people will live and work outside your team. You ",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-no-matter-how-clever-your-team-is-most"
    },
    {
      "id": "p-14-you-cannot-compete-with-the-world-you-cannot",
      "type": "paragraph",
      "label": "You cannot compete with the world. You cannot build the world.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-you-cannot-compete-with-the-world-you-cannot"
    },
    {
      "id": "p-14-a-closed-system-can-still-be-wonderful-sometimes",
      "type": "paragraph",
      "label": "Closed systems have their own advantages, but many of those advantages belong to the 'owner' of that system. As a user y",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-a-closed-system-can-still-be-wonderful-sometimes"
    },
    {
      "id": "p-14-if-the-owner-of-the-system-does-not",
      "type": "paragraph",
      "label": "If the owner of the system does not build it, it doesn't exist there. An outside wizard with a better idea must convince",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-if-the-owner-of-the-system-does-not"
    },
    {
      "id": "p-14-that-is-a-dangerous-place-to-put-the",
      "type": "paragraph",
      "label": "That's not a system built to grow, or to allow change at scale.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-that-is-a-dangerous-place-to-put-the"
    },
    {
      "id": "h-14-the-bazaar-needs-streets",
      "type": "heading",
      "label": "The bazaar needs streets",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#h-14-the-bazaar-needs-streets"
    },
    {
      "id": "p-14-eric-s-raymond-wrote-the-cathedral-and-the",
      "type": "paragraph",
      "label": "Eric S. Raymond wrote The Cathedral and the Bazaar, contrasting carefully planned cathedral-style development with the m",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-eric-s-raymond-wrote-the-cathedral-and-the"
    },
    {
      "id": "p-14-a-bazaar-still-needs-streets-a-stall-needs",
      "type": "paragraph",
      "label": "A bazaar still needs streets. A stall needs somewhere to stand. People need to know where the entrance is. Someone has t",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-a-bazaar-still-needs-streets-a-stall-needs"
    },
    {
      "id": "p-14-open-source-works-the-same-way-code-needs",
      "type": "paragraph",
      "label": "Open source works the same way. Code needs names, interfaces and conventions. A patch needs somewhere to land. A bug rep",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-open-source-works-the-same-way-code-needs"
    },
    {
      "id": "p-14-the-linux-kernel-is-built-by-thousands-of",
      "type": "paragraph",
      "label": "The Linux kernel is built by thousands of people, but those people do not all edit every part at will. It has maintainer",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-the-linux-kernel-is-built-by-thousands-of"
    },
    {
      "id": "p-14-innovation-can-come-from-elsewhere-only-when-the",
      "type": "paragraph",
      "label": "Innovation can come from elsewhere only when the structure gives it a place to arrive.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-innovation-can-come-from-elsewhere-only-when-the"
    },
    {
      "id": "h-14-standards-are-public-boundaries",
      "type": "heading",
      "label": "Standards are public boundaries",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#h-14-standards-are-public-boundaries"
    },
    {
      "id": "p-14-a-closed-system-can-coordinate-through-ownership-one",
      "type": "paragraph",
      "label": "A closed system can coordinate through ownership. One organization controls the pieces and can make them fit.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-a-closed-system-can-coordinate-through-ownership-one"
    },
    {
      "id": "p-14-in-a-commons-the-boundary-itself-must-be",
      "type": "paragraph",
      "label": "In a commons, the boundary itself must be public. Independent tools, people and organizations need agreements they can r",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-in-a-commons-the-boundary-itself-must-be"
    },
    {
      "id": "p-14-standards-are-often-boring-that-is-part-of",
      "type": "paragraph",
      "label": "Standards are often boring. That's not a bug, but a feature. A standard should not require everyone to admire the same l",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-standards-are-often-boring-that-is-part-of"
    },
    {
      "id": "p-14-a-stable-system-does-not-keep-change-out",
      "type": "paragraph",
      "label": "Together, those agreements form infrastructure.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-a-stable-system-does-not-keep-change-out"
    },
    {
      "id": "p-14-at-the-bottom-is-infrastructure",
      "type": "paragraph",
      "label": "Infrastructure is not built for the next release. It is built for decades, perhaps longer. Its language must stay smalle",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-at-the-bottom-is-infrastructure"
    },
    {
      "id": "p-14-infrastructure-speaks-in-small-words",
      "type": "paragraph",
      "label": "A URL identifies, HTTP sends messages, and HTML describes a document. None of them knows whether that document is a shop",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-infrastructure-speaks-in-small-words"
    },
    {
      "id": "p-14-on-top-sits-the-platform",
      "type": "paragraph",
      "label": "On top of infrastructure lives the platform. Browsers and web servers turn those small agreements into places where soft",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-on-top-sits-the-platform"
    },
    {
      "id": "p-14-then-come-the-applications",
      "type": "paragraph",
      "label": "Then come the applications. This is where purpose enters. And diversity. A calendar knows about appointments. A shop kno",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-then-come-the-applications"
    },
    {
      "id": "p-14-the-same-shape-can-appear-inside-an-application",
      "type": "paragraph",
      "label": "The pattern repeats. An application framework is an inner platform: built on the browser or server, but providing anothe",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-the-same-shape-can-appear-inside-an-application"
    },
    {
      "id": "p-14-each-step-upward-allows-more-meaning-and-change",
      "type": "paragraph",
      "label": "Each step upward allows more meaning and more change. Each step downward makes an idea harder to remove. An application ",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-each-step-upward-allows-more-meaning-and-change"
    },
    {
      "id": "p-14-this-is-not-a-hierarchy-of-importance",
      "type": "paragraph",
      "label": "A stable system does not keep change out everywhere. It gives each kind of change a place.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-this-is-not-a-hierarchy-of-importance"
    },
    {
      "id": "h-14-the-web-was-built-this-way",
      "type": "heading",
      "label": "The Web was built this way",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#h-14-the-web-was-built-this-way"
    },
    {
      "id": "p-14-the-web-did-not-require-one-owner-to",
      "type": "paragraph",
      "label": "The Web did not require one owner to finish the whole idea. Its infrastructure did not contain a search engine, a shop o",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-the-web-did-not-require-one-owner-to"
    },
    {
      "id": "p-14-a-new-server-could-appear-without-asking-every",
      "type": "paragraph",
      "label": "A new server could appear without asking every browser for permission. A new browser could read existing pages. A new pa",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-a-new-server-could-appear-without-asking-every"
    },
    {
      "id": "p-14-people-built-search-engines-blogs-shops-forums-wikis",
      "type": "paragraph",
      "label": "People built search engines, blogs, shops, forums, wikis, maps, webmail and many things nobody had thought to include in",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-people-built-search-engines-blogs-shops-forums-wikis"
    },
    {
      "id": "p-14-the-important-point-is-that-the-web-did",
      "type": "paragraph",
      "label": "The important point is that the Web did not have to predict all of it first.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-the-important-point-is-that-the-web-did"
    },
    {
      "id": "p-14-it-had-reachable-boundaries-a-link-could-be",
      "type": "paragraph",
      "label": "It had reachable boundaries. A link could be shared. A page could be inspected. A server could be replaced. Someone else",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-it-had-reachable-boundaries-a-link-could-be"
    },
    {
      "id": "p-14-the-web-as-we-live-in-it-is",
      "type": "paragraph",
      "label": "The Web as we live in it is not entirely open ground. Search engines, social networks, app stores, cloud platforms, ad n",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-the-web-as-we-live-in-it-is"
    },
    {
      "id": "p-14-castles-are-convenient-they-reduce-friction-they-give",
      "type": "paragraph",
      "label": "Castles are convenient. They can be built quickly, and functionality can be added without committee meetings about the e",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-castles-are-convenient-they-reduce-friction-they-give"
    },
    {
      "id": "p-14-but-the-open-ground-still-matters-without-it",
      "type": "paragraph",
      "label": "But the open ground still matters. Without it, the castles would be the whole world.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-but-the-open-ground-still-matters-without-it"
    },
    {
      "id": "h-14-the-outside-needs-a-way-in",
      "type": "heading",
      "label": "The outside needs a way in",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#h-14-the-outside-needs-a-way-in"
    },
    {
      "id": "p-14-this-is-how-small-reusable-software-becomes-possible",
      "type": "paragraph",
      "label": "The open ground does more than preserve what already exists. It gives new ideas somewhere to begin. A new idea can first",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-this-is-how-small-reusable-software-becomes-possible"
    },
    {
      "id": "p-14-if-it-has-to-own-the-data-identity",
      "type": "paragraph",
      "label": "If many applications need it, a platform may learn to provide it. But only the smallest and most durable agreements shou",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-if-it-has-to-own-the-data-identity"
    },
    {
      "id": "p-14-small-reusable-software-needs-the-opposite-assumption-it",
      "type": "paragraph",
      "label": "Keep an idea as high in the stack as it can live.",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-small-reusable-software-needs-the-opposite-assumption-it"
    },
    {
      "id": "p-14-instead-of-designing-the-entire-world-you-design",
      "type": "paragraph",
      "label": "Instead of designing the entire world, you design where another thing can meet it. What needs a public name? Which forma",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-instead-of-designing-the-entire-world-you-design"
    },
    {
      "id": "p-14-the-address-is-outside-it-the-protocol-is",
      "type": "paragraph",
      "label": "That gives outsiders somewhere to act. People are no longer captives in your castle; they become a community. They can b",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-the-address-is-outside-it-the-protocol-is"
    },
    {
      "id": "p-14-open-source-is-one-way-to-let-the",
      "type": "paragraph",
      "label": "Open source is one way to let the outside world in, but it is not the only one. Protocols, data formats, permissive lice",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-open-source-is-one-way-to-let-the"
    },
    {
      "id": "p-14-a-wizard-should-not-be-ashamed-of-using",
      "type": "paragraph",
      "label": "A wizard should not be ashamed of stealing other people's magic. That is how the world improves. The shame is building a",
      "chapter": "14-the-web-as-commons",
      "url": "chapters/14-the-web-as-commons.html#p-14-a-wizard-should-not-be-ashamed-of-using"
    },
    {
      "id": "h-15-the-web-as-data-things-should-have-addresses-too",
      "type": "heading",
      "label": "The Web as data: things should have addresses too",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#h-15-the-web-as-data-things-should-have-addresses-too"
    },
    {
      "id": "p-15-portability-is-not-interoperability",
      "type": "paragraph",
      "label": "Portability is not interoperability.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-portability-is-not-interoperability"
    },
    {
      "id": "p-15-portability-means-that-data-can-leave-one-application",
      "type": "paragraph",
      "label": "Portability means that data can leave one application. Interoperability means that another application can understand an",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-portability-means-that-data-can-leave-one-application"
    },
    {
      "id": "p-15-json-is-portable-it-can-carry-almost-any",
      "type": "paragraph",
      "label": "JSON is never just JSON. It is portable and can carry almost any kind of data, but it does not tell another program what",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-json-is-portable-it-can-carry-almost-any"
    },
    {
      "id": "p-15-json-is-an-interesting-piece-of-infrastructure",
      "type": "paragraph",
      "label": "That is not an accidental omission. JSON is infrastructure, and almost aggressively small. It has objects, arrays, strin",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-json-is-an-interesting-piece-of-infrastructure"
    },
    {
      "id": "p-15-its-smallness-helped-it-spread",
      "type": "paragraph",
      "label": "Its smallness helped it spread. It also made JSON difficult to extend. When people need identity, dates, references, typ",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-its-smallness-helped-it-spread"
    },
    {
      "id": "p-15-a-contacts-app-calendar-app-and-photo-app",
      "type": "paragraph",
      "label": "A contacts app, calendar app and photo app may all know something about the same person. Unless their names line up, the",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-contacts-app-calendar-app-and-photo-app"
    },
    {
      "id": "h-15-the-private-name-problem",
      "type": "heading",
      "label": "The private-name problem",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#h-15-the-private-name-problem"
    },
    {
      "id": "p-15-imagine-two-systems-store-the-same-fact",
      "type": "paragraph",
      "label": "Imagine two systems store the same fact.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-imagine-two-systems-store-the-same-fact"
    },
    {
      "id": "p-15-the-contacts-app-says",
      "type": "paragraph",
      "label": "The contacts app says:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-contacts-app-says"
    },
    {
      "id": "contacts-private-name",
      "type": "code",
      "label": "text block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#contacts-private-name"
    },
    {
      "id": "p-15-the-calendar-app-says",
      "type": "paragraph",
      "label": "The calendar app says:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-calendar-app-says"
    },
    {
      "id": "calendar-private-name",
      "type": "code",
      "label": "text block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#calendar-private-name"
    },
    {
      "id": "p-15-both-records-have-the-same-rough-shape-something",
      "type": "paragraph",
      "label": "Both records have the same rough shape. Something has a property with a value, but the names are private.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-both-records-have-the-same-rough-shape-something"
    },
    {
      "id": "p-15-person-17-only-means-something-inside-the-contacts",
      "type": "paragraph",
      "label": "person-17 only means something inside the contacts app. attendee-4 only means something inside the calendar app. They ma",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-person-17-only-means-something-inside-the-contacts"
    },
    {
      "id": "p-15-the-properties-have-the-same-problem-one-application",
      "type": "paragraph",
      "label": "The properties have the same problem. One application says city. Another says town. Another says addressLocality. Anothe",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-properties-have-the-same-problem-one-application"
    },
    {
      "id": "p-15-inside-one-application-private-names-are-fine-you",
      "type": "paragraph",
      "label": "Inside one application, private names are fine. You control the dictionary. But when you cross a border, a boundary, eac",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-inside-one-application-private-names-are-fine-you"
    },
    {
      "id": "p-15-instead-imagine-if-names-inside-the-data-could",
      "type": "paragraph",
      "label": "What if names inside the data could cross the same boundaries as documents?",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-instead-imagine-if-names-inside-the-data-could"
    },
    {
      "id": "h-15-names-that-can-travel",
      "type": "heading",
      "label": "Names that can travel",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#h-15-names-that-can-travel"
    },
    {
      "id": "p-15-the-web-already-gave-documents-addresses",
      "type": "paragraph",
      "label": "The Web already gave documents addresses.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-web-already-gave-documents-addresses"
    },
    {
      "id": "document-address",
      "type": "code",
      "label": "url block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#document-address"
    },
    {
      "id": "p-15-linked-data-extends-that-trick",
      "type": "paragraph",
      "label": "Linked data extends that trick:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-linked-data-extends-that-trick"
    },
    {
      "id": "aside-15-things-can-have-web-addresses-too",
      "type": "aside",
      "label": "Things can have Web addresses too.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#aside-15-things-can-have-web-addresses-too"
    },
    {
      "id": "p-15-hilda-can-have-an-identifier",
      "type": "paragraph",
      "label": "Hilda can have an identifier:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-hilda-can-have-an-identifier"
    },
    {
      "id": "hilda-uri",
      "type": "code",
      "label": "url block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#hilda-uri"
    },
    {
      "id": "p-15-manchester-can-have-one",
      "type": "paragraph",
      "label": "Manchester can have one:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-manchester-can-have-one"
    },
    {
      "id": "manchester-uri",
      "type": "code",
      "label": "url block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#manchester-uri"
    },
    {
      "id": "p-15-the-relationship-lives-in-can-have-one",
      "type": "paragraph",
      "label": "The relationship lives in can have one:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-relationship-lives-in-can-have-one"
    },
    {
      "id": "lives-in-uri",
      "type": "code",
      "label": "url block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#lives-in-uri"
    },
    {
      "id": "p-15-now-the-fact-can-be-written-as-three",
      "type": "paragraph",
      "label": "Now the fact can be written as three pieces:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-now-the-fact-can-be-written-as-three"
    },
    {
      "id": "triple-shape",
      "type": "code",
      "label": "text block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#triple-shape"
    },
    {
      "id": "p-15-or-with-web-names",
      "type": "paragraph",
      "label": "Or with Web names:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-or-with-web-names"
    },
    {
      "id": "linked-triple",
      "type": "code",
      "label": "text block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#linked-triple"
    },
    {
      "id": "p-15-this-is-not-pretty-it-is-meant-to",
      "type": "paragraph",
      "label": "This is not pretty. It is meant to be unambiguous and able to cross boundaries.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-this-is-not-pretty-it-is-meant-to"
    },
    {
      "id": "p-15-the-resource-description-framework-rdf-gives-this-shape",
      "type": "paragraph",
      "label": "The Resource Description Framework, RDF, gives this shape a formal name: a subject-predicate-object triple. Many triples",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-resource-description-framework-rdf-gives-this-shape"
    },
    {
      "id": "p-15-in-less-specification-shaped-language-rdf-lets-you",
      "type": "paragraph",
      "label": "In less specification-shaped language: RDF lets you write small facts that can join other small facts.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-in-less-specification-shaped-language-rdf-lets-you"
    },
    {
      "id": "p-15-here-is-the-same-data-in-a-friendlier",
      "type": "paragraph",
      "label": "Here is the same data in a friendlier syntax, Turtle:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-here-is-the-same-data-in-a-friendlier"
    },
    {
      "id": "turtle-example",
      "type": "code",
      "label": "turtle block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#turtle-example"
    },
    {
      "id": "p-15-json-ld-is-another-spelling",
      "type": "paragraph",
      "label": "RDF is a model for the data, not one particular spelling. Turtle is one spelling. JSON-LD is another.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-json-ld-is-another-spelling"
    },
    {
      "id": "p-15-some-people-make-another-format",
      "type": "paragraph",
      "label": "JSON-LD takes a slightly strange route. It keeps the familiar JSON shape, then gives names such as @id and @context an e",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-some-people-make-another-format"
    },
    {
      "id": "p-15-breaking-knowledge-into-small-statements-is-not-new",
      "type": "paragraph",
      "label": "Breaking knowledge into small statements is not new. Databases and logic languages have done versions of it for a long t",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-breaking-knowledge-into-small-statements-is-not-new"
    },
    {
      "id": "p-15-the-web-contribution-is-that-the-names-inside",
      "type": "paragraph",
      "label": "The Web contribution is that the names inside those statements can be Web names.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-web-contribution-is-that-the-names-inside"
    },
    {
      "id": "h-15-a-graph-without-a-centre",
      "type": "heading",
      "label": "A graph without a centre",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#h-15-a-graph-without-a-centre"
    },
    {
      "id": "p-15-a-table-usually-has-a-home-it-lives",
      "type": "paragraph",
      "label": "A table usually has a home. It lives in a database, under one schema, inside one system.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-table-usually-has-a-home-it-lives"
    },
    {
      "id": "p-15-a-graph-can-be-assembled-from-facts-written",
      "type": "paragraph",
      "label": "Together, triples form a different shape: a graph. A graph can be assembled from facts written in different places.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-graph-can-be-assembled-from-facts-written"
    },
    {
      "id": "p-15-i-can-say-something-about-hilda-in-an",
      "type": "paragraph",
      "label": "I can say something about Hilda in an address book. You can say something about Hilda in a calendar invitation. A photo ",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-i-can-say-something-about-hilda-in-an"
    },
    {
      "id": "p-15-none-of-us-has-to-own-the-complete",
      "type": "paragraph",
      "label": "None of us has to own the complete record.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-none-of-us-has-to-own-the-complete"
    },
    {
      "id": "distributed-facts",
      "type": "code",
      "label": "turtle block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#distributed-facts"
    },
    {
      "id": "p-15-if-the-names-line-up-software-can-follow",
      "type": "paragraph",
      "label": "If the names line up, software can follow them.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-if-the-names-line-up-software-can-follow"
    },
    {
      "id": "p-15-this-is-where-linked-data-gets-its-name",
      "type": "paragraph",
      "label": "This is where linked data gets its name. The data is not only structured. It points. A fact can point to a thing, which ",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-this-is-where-linked-data-gets-its-name"
    },
    {
      "id": "p-15-tim-berners-lee-described-linked-data-with-deliberately",
      "type": "paragraph",
      "label": "Tim Berners-Lee described linked data with deliberately simple rules: use URIs as names for things, use HTTP URIs so the",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-tim-berners-lee-described-linked-data-with-deliberately"
    },
    {
      "id": "p-15-this-is-the-url-chapter-returning-in-another",
      "type": "paragraph",
      "label": "This is the URL chapter returning in another costume.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-this-is-the-url-chapter-returning-in-another"
    },
    {
      "id": "p-15-a-url-lets-one-document-point-outside-itself",
      "type": "paragraph",
      "label": "A URL lets one document point outside itself. Linked data lets one fact point outside itself.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-url-lets-one-document-point-outside-itself"
    },
    {
      "id": "h-15-meaning-needs-names-too",
      "type": "heading",
      "label": "Meaning needs names too",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#h-15-meaning-needs-names-too"
    },
    {
      "id": "p-15-giving-hilda-an-identifier-is-not-enough-the",
      "type": "paragraph",
      "label": "Giving Hilda an identifier is not enough. The properties need identities too.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-giving-hilda-an-identifier-is-not-enough-the"
    },
    {
      "id": "p-15-if-i-write",
      "type": "paragraph",
      "label": "If I write:",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-if-i-write"
    },
    {
      "id": "unclear-term",
      "type": "code",
      "label": "turtle block",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#unclear-term"
    },
    {
      "id": "p-15-what-does-knows-mean",
      "type": "paragraph",
      "label": "what does knows mean?",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-what-does-knows-mean"
    },
    {
      "id": "p-15-met-once-friends-with-can-recognise-in-a",
      "type": "paragraph",
      "label": "Met once? Friends with? Can recognise in a police lineup? Has a phone number for? Once shared a tram in Manchester?",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-met-once-friends-with-can-recognise-in-a"
    },
    {
      "id": "p-15-a-word-that-looks-obvious-to-a-human",
      "type": "paragraph",
      "label": "A word that looks obvious to a human may be vague to software. It may even be obvious in two different ways to two diffe",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-word-that-looks-obvious-to-a-human"
    },
    {
      "id": "p-15-linked-data-therefore-uses-vocabularies-shared-sets-of",
      "type": "paragraph",
      "label": "Linked data therefore uses vocabularies: shared sets of terms with public identifiers and definitions. Different applica",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-linked-data-therefore-uses-vocabularies-shared-sets-of"
    },
    {
      "id": "p-15-this-is-where-your-eyes-may-start-to",
      "type": "paragraph",
      "label": "This is where your eyes may start to gloss over. Vocabularies, ontologies, IRIs. This all sounds abstract and academic, ",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-this-is-where-your-eyes-may-start-to"
    },
    {
      "id": "p-15-when-independent-tools-can-recognise-the-same-names",
      "type": "paragraph",
      "label": "When independent tools recognise the same names for the same kinds of facts, they can work on those facts independently.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-when-independent-tools-can-recognise-the-same-names"
    },
    {
      "id": "p-15-linked-data-is-not-fairy-dust-you-can",
      "type": "paragraph",
      "label": "Linked data is not fairy dust. You can make a knitted castle out of triples. You can invent private vocabularies nobody ",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-linked-data-is-not-fairy-dust-you-can"
    },
    {
      "id": "p-15-the-boundary-is-the-point-names-and-meanings",
      "type": "paragraph",
      "label": "A format will not solve all these problems. What matters is that names and meanings can survive the application that fir",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-boundary-is-the-point-names-and-meanings"
    },
    {
      "id": "h-15-what-linked-data-does-not-solve",
      "type": "heading",
      "label": "What linked data does not solve",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#h-15-what-linked-data-does-not-solve"
    },
    {
      "id": "p-15-linked-data-lets-applications-work-with-the-same",
      "type": "paragraph",
      "label": "Linked data lets applications work with the same meanings, but the data can still be trapped behind a locked gate. It do",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-linked-data-lets-applications-work-with-the-same"
    },
    {
      "id": "p-15-a-company-can-keep-rdf-in-a-private",
      "type": "paragraph",
      "label": "A company can keep RDF in a private database. A locked service can offer a Turtle export button.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-company-can-keep-rdf-in-a-private"
    },
    {
      "id": "p-15-a-shared-storage-system-without-shared-meaning-becomes",
      "type": "paragraph",
      "label": "A shared storage system without shared meaning becomes a folder full of files that only their original applications unde",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-shared-storage-system-without-shared-meaning-becomes"
    },
    {
      "id": "p-15-shared-meaning-without-control-over-storage-leaves-the",
      "type": "paragraph",
      "label": "Shared meaning without control over storage leaves the application holding the only useful copy.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-shared-meaning-without-control-over-storage-leaves-the"
    },
    {
      "id": "p-15-we-need-both-boundaries-but-they-are-not",
      "type": "paragraph",
      "label": "We need both boundaries, but they are not the same.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-we-need-both-boundaries-but-they-are-not"
    },
    {
      "id": "h-15-the-boundary-moves-again",
      "type": "heading",
      "label": "The boundary moves again",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#h-15-the-boundary-moves-again"
    },
    {
      "id": "p-15-think-again-about-small-reusable-software",
      "type": "paragraph",
      "label": "Back in the knitted castle, the useful question was not whether something could be reused, but in what direction. A file",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-think-again-about-small-reusable-software"
    },
    {
      "id": "p-15-a-small-calendar-tool-can-stay-small-if",
      "type": "paragraph",
      "label": "Linked data moves that boundary further.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-a-small-calendar-tool-can-stay-small-if"
    },
    {
      "id": "p-15-the-application-does-not-need-to-own-all",
      "type": "paragraph",
      "label": "Two applications do not need to share code if they can recognise the same things, use the same names and work with the s",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-the-application-does-not-need-to-own-all"
    },
    {
      "id": "p-15-it-can-become-an-editor-viewer-filter-search",
      "type": "paragraph",
      "label": "The shared part is not hidden inside either program. It is in the names and data they agree to use.",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-it-can-become-an-editor-viewer-filter-search"
    },
    {
      "id": "p-15-linked-data-makes-that-shape-possible-it-does",
      "type": "paragraph",
      "label": "Linked data gives names somewhere to meet. It lets work done by one application become useful to another that was writte",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-linked-data-makes-that-shape-possible-it-does"
    },
    {
      "id": "p-15-if-the-meaning-can-live-outside-the-application",
      "type": "paragraph",
      "label": "If the meaning can live outside the application, why should the application own the only copy of the data?",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-if-the-meaning-can-live-outside-the-application"
    },
    {
      "id": "p-15-where-should-a-persons-data-live",
      "type": "paragraph",
      "label": "Where should a person’s data live?",
      "chapter": "15-the-web-as-data",
      "url": "chapters/15-the-web-as-data.html#p-15-where-should-a-persons-data-live"
    },
    {
      "id": "h-16-the-web-as-home-who-owns-your-home-directory",
      "type": "heading",
      "label": "The Web as home: who owns your home directory?",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#h-16-the-web-as-home-who-owns-your-home-directory"
    },
    {
      "id": "p-16-earlier-we-saw-the-network-becoming-the-operating",
      "type": "paragraph",
      "label": "Earlier we saw the network becoming the operating system.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-earlier-we-saw-the-network-becoming-the-operating"
    },
    {
      "id": "p-16-but-where-is-the-users-home-directory-and",
      "type": "paragraph",
      "label": "But where is the user's home directory, and who controls it?",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-but-where-is-the-users-home-directory-and"
    },
    {
      "id": "p-16-linked-data-gave-us-names-and-meanings-that",
      "type": "paragraph",
      "label": "Linked data gave us names and meanings that can cross application boundaries, but it did not give that data a home.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-linked-data-gave-us-names-and-meanings-that"
    },
    {
      "id": "p-16-on-a-normal-computer-the-home-directory-question",
      "type": "paragraph",
      "label": "On a normal computer, the home-directory question has an obvious answer, at least in theory. Your documents, photos, mus",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-on-a-normal-computer-the-home-directory-question"
    },
    {
      "id": "p-16-you-can-install-another-text-editor-without-rewriting",
      "type": "paragraph",
      "label": "You can install another text editor without rewriting every document. You can open an image in a different program. You ",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-you-can-install-another-text-editor-without-rewriting"
    },
    {
      "id": "p-16-the-web-grew-up-differently",
      "type": "paragraph",
      "label": "The Web did not follow that example.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-the-web-grew-up-differently"
    },
    {
      "id": "p-16-your-mail-lives-in-the-mail-application-your",
      "type": "paragraph",
      "label": "Your mail lives in the mail application. Your photos live in the photo application. Your calendar lives in the calendar ",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-your-mail-lives-in-the-mail-application-your"
    },
    {
      "id": "p-16-when-an-application-owns-the-interface-account-data",
      "type": "paragraph",
      "label": "That is convenient for the maker of the application. Everything can be designed as one system. It is often convenient fo",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-when-an-application-owns-the-interface-account-data"
    },
    {
      "id": "p-16-software-moved-into-the-network-the-users-home",
      "type": "paragraph",
      "label": "Software moved into the network. The user's home did not come with it.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-software-moved-into-the-network-the-users-home"
    },
    {
      "id": "h-16-a-sideways-look",
      "type": "heading",
      "label": "A sideways look",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#h-16-a-sideways-look"
    },
    {
      "id": "p-16-one-way-to-describe-the-modern-web-is",
      "type": "paragraph",
      "label": "One way to describe the modern Web is:",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-one-way-to-describe-the-modern-web-is"
    },
    {
      "id": "app-owned-world",
      "type": "code",
      "label": "text block",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#app-owned-world"
    },
    {
      "id": "p-16-the-application-is-the-starting-point-you-choose",
      "type": "paragraph",
      "label": "The application is the starting point. You choose an application, create an account inside it, and your data begins to a",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-the-application-is-the-starting-point-you-choose"
    },
    {
      "id": "p-16-there-is-another-possible-shape",
      "type": "paragraph",
      "label": "There is another way to organize the same elements:",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-there-is-another-possible-shape"
    },
    {
      "id": "user-owned-world",
      "type": "code",
      "label": "text block",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#user-owned-world"
    },
    {
      "id": "p-16-the-person-is-the-starting-point-the-data",
      "type": "paragraph",
      "label": "The person is the starting point. The data lives near that person. Applications receive permission to read or change par",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-the-person-is-the-starting-point-the-data"
    },
    {
      "id": "p-16-the-elements-have-not-changed-only-their-order",
      "type": "paragraph",
      "label": "The elements have not changed. Only their order has.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-the-elements-have-not-changed-only-their-order"
    },
    {
      "id": "p-16-in-the-first-shape-replacing-an-application-means",
      "type": "paragraph",
      "label": "In the first version, replacing an application means moving your life from one system to another.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-in-the-first-shape-replacing-an-application-means"
    },
    {
      "id": "p-16-in-the-second-replacing-an-application-can-be",
      "type": "paragraph",
      "label": "In the second, replacing an application can be closer to changing tools on a workbench.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-in-the-second-replacing-an-application-can-be"
    },
    {
      "id": "p-16-sometimes-moving-the-boundary-changes-the-problem-more",
      "type": "paragraph",
      "label": "Sometimes moving the boundary changes the problem more than solving it ever could.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-sometimes-moving-the-boundary-changes-the-problem-more"
    },
    {
      "id": "p-16-for-this-second-shape-to-work",
      "type": "paragraph",
      "label": "For this second shape to work, the important things cannot all be owned by the application.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-for-this-second-shape-to-work"
    },
    {
      "id": "p-16-linked-data-helps-different-tools-understand-the-same",
      "type": "paragraph",
      "label": "Linked data helps different tools understand the same things. But by itself, it does not organize the world differently.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-linked-data-helps-different-tools-understand-the-same"
    },
    {
      "id": "h-16-connecting-to-solid",
      "type": "heading",
      "label": "Connecting to Solid",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#h-16-connecting-to-solid"
    },
    {
      "id": "p-16-there-is-a-project-called-solid-that-explores",
      "type": "paragraph",
      "label": "There is a project called Solid that explores this kind of world.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-there-is-a-project-called-solid-that-explores"
    },
    {
      "id": "p-16-solid-separates-identity-and-data-from-applications-a",
      "type": "paragraph",
      "label": "Solid separates identity and data from applications. A person has an identity on the Web. Their data can live in storage",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-solid-separates-identity-and-data-from-applications-a"
    },
    {
      "id": "p-16-the-solid-protocols-are-an-attempt-to-put",
      "type": "paragraph",
      "label": "The Solid protocols add shared infrastructure for identity, storage and permissions to the Web. They do not prescribe a ",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-the-solid-protocols-are-an-attempt-to-put"
    },
    {
      "id": "p-16-solid-servers-and-libraries-can-form-platforms",
      "type": "paragraph",
      "label": "Solid servers and libraries provide a platform on top of those agreements. A notes application can write a note without ",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-solid-servers-and-libraries-can-form-platforms"
    },
    {
      "id": "p-16-linked-data-describes-what-the-data-means-and",
      "type": "paragraph",
      "label": "Linked data describes what the data means and how it relates to other things. Solid decides where that data lives, who c",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-linked-data-describes-what-the-data-means-and"
    },
    {
      "id": "p-16-solid-does-not-replace-the-web-it-enhances",
      "type": "paragraph",
      "label": "Solid adds to the Web rather than replacing it. It can be useful without becoming the answer to everything.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-solid-does-not-replace-the-web-it-enhances"
    },
    {
      "id": "h-16-applications-as-visitors",
      "type": "heading",
      "label": "Applications as visitors",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#h-16-applications-as-visitors"
    },
    {
      "id": "p-16-once-data-and-identity-live-outside",
      "type": "paragraph",
      "label": "Once data and identity live outside the application, the application no longer has to become a kingdom before it can be ",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-once-data-and-identity-live-outside"
    },
    {
      "id": "p-16-a-calendar-can-concentrate-on-appointments",
      "type": "paragraph",
      "label": "A calendar can concentrate on appointments. A contacts tool can concentrate on people. A notes editor can concentrate on",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-a-calendar-can-concentrate-on-appointments"
    },
    {
      "id": "p-16-an-application-can-arrive-do-useful-work",
      "type": "paragraph",
      "label": "An application can arrive, do useful work, and leave without taking the user's world with it.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-an-application-can-arrive-do-useful-work"
    },
    {
      "id": "p-16-a-library-lets-another-program-reuse-code",
      "type": "paragraph",
      "label": "A library lets another program reuse code. Shared data lets another application reuse what a person has already made. Th",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-a-library-lets-another-program-reuse-code"
    },
    {
      "id": "p-16-reusable-software-is-not-only-software-that-can",
      "type": "paragraph",
      "label": "Reusable software is not only software that can be imported into another program. It can be software that can be replace",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-reusable-software-is-not-only-software-that-can"
    },
    {
      "id": "p-16-a-better-tool-does-not-first-have",
      "type": "paragraph",
      "label": "A better tool does not first have to persuade you to abandon everything you made with the old one. It can ask for access",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-a-better-tool-does-not-first-have"
    },
    {
      "id": "p-16-innovation-can-arrive-from-elsewhere-because-your-world",
      "type": "paragraph",
      "label": "Innovation can arrive from elsewhere because your world is not sealed inside the original application.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-innovation-can-arrive-from-elsewhere-because-your-world"
    },
    {
      "id": "h-16-where-the-complexity-goes",
      "type": "heading",
      "label": "Where the complexity goes",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#h-16-where-the-complexity-goes"
    },
    {
      "id": "p-16-none-of-this-removes-complexity",
      "type": "paragraph",
      "label": "None of this removes complexity.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-none-of-this-removes-complexity"
    },
    {
      "id": "p-16-permissions-can-be-confusing",
      "type": "paragraph",
      "label": "Permissions can be confusing. Applications may disagree about data. Vocabularies can drift. Two tools may change the sam",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-permissions-can-be-confusing"
    },
    {
      "id": "p-16-centralised-services-hide-many-of-these-problems",
      "type": "paragraph",
      "label": "Centralised services hide many of these problems by making one organization responsible for the whole system. That can b",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-centralised-services-hide-many-of-these-problems"
    },
    {
      "id": "p-16-moving-the-boundary-does-not-make-the-problems",
      "type": "paragraph",
      "label": "Moving the boundary does not make the problems disappear. It makes them shared problems instead of private details hidde",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-moving-the-boundary-does-not-make-the-problems"
    },
    {
      "id": "p-16-that-is-harder-in-some-ways",
      "type": "paragraph",
      "label": "Those problems are the point. They show where the real work needs to be done. They are the price of giving independent t",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-that-is-harder-in-some-ways"
    },
    {
      "id": "p-16-solid-may-fail-for-social-reasons",
      "type": "paragraph",
      "label": "Solid may fail for social reasons, business reasons, usability reasons, or because another system finds a better shape. ",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-solid-may-fail-for-social-reasons"
    },
    {
      "id": "p-16-final-forms-have-not-done-well",
      "type": "paragraph",
      "label": "Final forms have not done very well in this book.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-final-forms-have-not-done-well"
    },
    {
      "id": "h-16-small-tools-not-kingdoms",
      "type": "heading",
      "label": "Small tools, not kingdoms",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#h-16-small-tools-not-kingdoms"
    },
    {
      "id": "p-16-back-in-the-knitted-castle",
      "type": "paragraph",
      "label": "Back in the knitted castle, the reusable thing turned out not to be only the code. It was the boundary around the code.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-back-in-the-knitted-castle"
    },
    {
      "id": "p-16-solid-moves-that-boundary-around-the-whole",
      "type": "paragraph",
      "label": "Solid moves that boundary around the whole application. The application itself can become one of the replaceable parts.",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-solid-moves-that-boundary-around-the-whole"
    },
    {
      "id": "p-16-a-private-application-asks",
      "type": "paragraph",
      "label": "A private application asks:",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-a-private-application-asks"
    },
    {
      "id": "aside-16-how-can-we-keep-the-user-inside",
      "type": "aside",
      "label": "How can we keep the user inside?",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#aside-16-how-can-we-keep-the-user-inside"
    },
    {
      "id": "p-16-a-personal-web-asks",
      "type": "paragraph",
      "label": "A personal Web asks:",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-a-personal-web-asks"
    },
    {
      "id": "aside-16-how-can-this-tool-remain-useful-after-the",
      "type": "aside",
      "label": "How can this tool remain useful after the user replaces it?",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#aside-16-how-can-this-tool-remain-useful-after-the"
    },
    {
      "id": "p-16-the-second-question-does-not-require-solid",
      "type": "paragraph",
      "label": "The second question does not require Solid as its only answer. But Solid is a serious attempt to build the answer into t",
      "chapter": "16-the-web-as-home",
      "url": "chapters/16-the-web-as-home.html#p-16-the-second-question-does-not-require-solid"
    },
    {
      "id": "h-17-epilogue-the-margin-you-have-been-using",
      "type": "heading",
      "label": "Epilogue: the margin you have been using",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#h-17-epilogue-the-margin-you-have-been-using"
    },
    {
      "id": "p-epilogue-you-may-have-written-notes",
      "type": "paragraph",
      "label": "You may have written notes in the margins of this book.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-you-may-have-written-notes"
    },
    {
      "id": "p-epilogue-to-the-reader-the-margin",
      "type": "paragraph",
      "label": "To the reader, the margin is simply part of the book. Underneath, it is provided by a small software component that can ",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-to-the-reader-the-margin"
    },
    {
      "id": "p-epilogue-at-first-the-notes",
      "type": "paragraph",
      "label": "At first, the notes are stored in your browser. You do not need an account, and the book does not receive everything you",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-at-first-the-notes"
    },
    {
      "id": "p-epilogue-browser-storage-is-useful",
      "type": "paragraph",
      "label": "Browser storage is useful, but it is not much of a home directory. The notes remain tied to one browser on one device. C",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-browser-storage-is-useful"
    },
    {
      "id": "p-epilogue-that-is-why-the-margin",
      "type": "paragraph",
      "label": "That is why the margin also lets you connect to Solid.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-that-is-why-the-margin"
    },
    {
      "id": "p-epilogue-once-connected-the-component",
      "type": "paragraph",
      "label": "Once connected, the component can store your notes in your pod. The margin remains here in the book, but the notes no lo",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-once-connected-the-component"
    },
    {
      "id": "p-epilogue-open-the-book-on-another-device",
      "type": "paragraph",
      "label": "Open the book on another device and they can still be there. Use the same component on another website and it can work w",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-open-the-book-on-another-device"
    },
    {
      "id": "p-epilogue-each-passage-in-the-book",
      "type": "paragraph",
      "label": "Each passage in the book has a stable address. A note can say which passage it belongs to without becoming part of the b",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-each-passage-in-the-book"
    },
    {
      "id": "p-epilogue-solid-determines-where-the-note",
      "type": "paragraph",
      "label": "Solid determines where the note lives, which identity it belongs to, and which applications may read or change it. Linke",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-solid-determines-where-the-note"
    },
    {
      "id": "p-epilogue-if-you-have-connected",
      "type": "paragraph",
      "label": "If you have connected the margin to your pod, you were not only reading about this architecture.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-if-you-have-connected"
    },
    {
      "id": "p-epilogue-you-were-using-it",
      "type": "paragraph",
      "label": "You were using it.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-you-were-using-it"
    },
    {
      "id": "h-17-sharing-one-note",
      "type": "heading",
      "label": "Sharing one note",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#h-17-sharing-one-note"
    },
    {
      "id": "p-epilogue-private-notes-are-useful",
      "type": "paragraph",
      "label": "Private notes are useful, but sometimes a reader writes something that should become part of the wider book.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-private-notes-are-useful"
    },
    {
      "id": "p-epilogue-perhaps-you-notice-an-error",
      "type": "paragraph",
      "label": "Perhaps you notice an error. Perhaps you know a better example. Perhaps a chapter reminds you of a paper I missed, or yo",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-perhaps-you-notice-an-error"
    },
    {
      "id": "p-epilogue-innovation-happens-elsewhere",
      "type": "paragraph",
      "label": "Innovation happens elsewhere.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-innovation-happens-elsewhere"
    },
    {
      "id": "p-epilogue-the-notes-component-can-let",
      "type": "paragraph",
      "label": "The notes component lets you share one selected note with the book.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-the-notes-component-can-let"
    },
    {
      "id": "p-epilogue-not-the-whole-notebook",
      "type": "paragraph",
      "label": "Not the whole notebook. Not every unfinished thought in the margin. One note, deliberately chosen.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-not-the-whole-notebook"
    },
    {
      "id": "p-epilogue-that-note-is-sent",
      "type": "paragraph",
      "label": "That note is sent to the book's inbox. It can be read and curated by me, or by a suitably impressive artificial imitatio",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-that-note-is-sent"
    },
    {
      "id": "p-epilogue-accepted-notes-can-be-indexed",
      "type": "paragraph",
      "label": "Accepted notes can be indexed and made visible to readers who opt in to the shared notes layer.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-accepted-notes-can-be-indexed"
    },
    {
      "id": "p-epilogue-you-own-the-private-note",
      "type": "paragraph",
      "label": "You own the private note collection. The book owns its curation. Sharing is the act that crosses between them.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-you-own-the-private-note"
    },
    {
      "id": "p-epilogue-a-separate-tool-can-manage",
      "type": "paragraph",
      "label": "A separate tool can manage the inbox. Another can build the index. Another can display approved notes beside the relevan",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-epilogue-a-separate-tool-can-manage"
    },
    {
      "id": "h-17-the-book-follows-its-own-advice",
      "type": "heading",
      "label": "The book follows its own advice",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#h-17-the-book-follows-its-own-advice"
    },
    {
      "id": "p-17-the-margin-component-stays-small-because-it-does",
      "type": "paragraph",
      "label": "The margin component stays small because it does not have to become a publishing platform, identity provider, storage co",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-the-margin-component-stays-small-because-it-does"
    },
    {
      "id": "p-17-the-book-stays-a-book-it-does-not",
      "type": "paragraph",
      "label": "The book stays a book. It does not need to contain every reader's private notebook.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-the-book-stays-a-book-it-does-not"
    },
    {
      "id": "p-17-the-book-and-the-component-meet-at-the",
      "type": "paragraph",
      "label": "The book and the component meet at the address of a passage. The component and the pod meet through Solid. A selected no",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-the-book-and-the-component-meet-at-the"
    },
    {
      "id": "p-17-this-is-not-an-example-added-after-the",
      "type": "paragraph",
      "label": "This is not an example added after the argument. It has been part of the book all along.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-this-is-not-an-example-added-after-the"
    },
    {
      "id": "p-17-solid-is-not-the-inevitable-final-shape-of",
      "type": "paragraph",
      "label": "Solid is not the inevitable final shape of the Web. The margin component is not the one true way to write notes. The bou",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-solid-is-not-the-inevitable-final-shape-of"
    },
    {
      "id": "p-17-that-is-allowed",
      "type": "paragraph",
      "label": "That is allowed.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-that-is-allowed"
    },
    {
      "id": "p-17-this-book-has-tried-to-show-why-notation",
      "type": "paragraph",
      "label": "This book has tried to show why notation matters, why programs grow languages, why assumptions become threads, and why b",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-this-book-has-tried-to-show-why-notation"
    },
    {
      "id": "p-17-the-point-is-not-to-follow-the-rules",
      "type": "paragraph",
      "label": "The point is not to follow the rules in this book.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-the-point-is-not-to-follow-the-rules"
    },
    {
      "id": "p-17-the-point-is-to-notice-the-rules-you",
      "type": "paragraph",
      "label": "The point is to notice the rules you are already following, understand why they are there, and decide whether they still",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-the-point-is-to-notice-the-rules-you"
    },
    {
      "id": "p-17-the-future-is-not-bound-by-our-rules",
      "type": "paragraph",
      "label": "The future is not bound by our rules.",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#p-17-the-future-is-not-bound-by-our-rules"
    },
    {
      "id": "rule-17-wizards-final-rule",
      "type": "rule",
      "label": "Wizard's final rule",
      "chapter": "17-rule-zero-there-are-no-rules",
      "url": "chapters/17-rule-zero-there-are-no-rules.html#rule-17-wizards-final-rule"
    },
    {
      "id": "h-18-acknowledgements",
      "type": "heading",
      "label": "Acknowledgements",
      "chapter": "18-colophon.md",
      "url": "chapters/18-colophon.md.html#h-18-acknowledgements"
    },
    {
      "id": "h-18-a-note-on-ai",
      "type": "heading",
      "label": "A note on AI",
      "chapter": "18-colophon.md",
      "url": "chapters/18-colophon.md.html#h-18-a-note-on-ai"
    },
    {
      "id": "p-18-i-used-ai-extensively-while-writing-this-book",
      "type": "paragraph",
      "label": "I used AI extensively while writing this book: as a sounding board, critic, editor and, occasionally, a source of first ",
      "chapter": "18-colophon.md",
      "url": "chapters/18-colophon.md.html#p-18-i-used-ai-extensively-while-writing-this-book"
    },
    {
      "id": "p-18-i-did-not-publish-its-answers-as-they",
      "type": "paragraph",
      "label": "I did not publish its answers as they arrived. I chose the ideas, rewrote the text and made the final decisions. Whateve",
      "chapter": "18-colophon.md",
      "url": "chapters/18-colophon.md.html#p-18-i-did-not-publish-its-answers-as-they"
    },
    {
      "id": "h-Bio-about-the-author",
      "type": "heading",
      "label": "About the author",
      "chapter": "about-the-author",
      "url": "chapters/about-the-author.html#h-Bio-about-the-author"
    },
    {
      "id": "p-Bio-auke-van-slooten-is-the-founder-of-muze",
      "type": "paragraph",
      "label": "Auke van Slooten is the founder of Muze, a web software studio built around a stubborn belief: the Web should stay a pla",
      "chapter": "about-the-author",
      "url": "chapters/about-the-author.html#p-Bio-auke-van-slooten-is-the-founder-of-muze"
    },
    {
      "id": "p-Bio-his-work-focuses-on-small-understandable-tools-for",
      "type": "paragraph",
      "label": "His work focuses on small, understandable tools for the open Web: libraries, editors, teaching material, and experiments",
      "chapter": "about-the-author",
      "url": "chapters/about-the-author.html#p-Bio-his-work-focuses-on-small-understandable-tools-for"
    },
    {
      "id": "p-Bio-programming-for-wizards-grew-out-of-that-work",
      "type": "paragraph",
      "label": "Programming for Wizards grew out of that work. It is written for people who suspect that computers are not magic, but al",
      "chapter": "about-the-author",
      "url": "chapters/about-the-author.html#p-Bio-programming-for-wizards-grew-out-of-that-work"
    }
  ]
}
