Guest User

Untitled

a guest
Jul 19th, 2025
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 161.10 KB | None | 0 0
  1. Please join me in welcoming the one, the only, the irreplaceable, Casey Muratori!
  2. Okay, okay. Way too big, Sam. Sam made it way too big.
  3. I feel like before we start we should also thank Sam for putting this together.
  4. It's been a very long time since I've been really excited to give a talk, and a lot of
  5. that is because the speaker list of this talk is, of this conference is absolutely amazing,
  6. and I just, I don't know, I'm really excited to be here, and I'm excited to give this talk,
  7. so I'm just going to jump right into it.
  8. So I would like to talk about something that happened in 1998 at a company called Looking
  9. Glass, which normally, like back in the day, contemporaneous with this, if I had said
  10. Looking Glass, everyone would know who they were, because they were an incredibly influential
  11. game company that did a lot of firsts in gaming. One of their games, Ultimate Underworld, started
  12. kind of the 3D revolution in PC gaming, and they were an incredibly innovative company
  13. at the time. And a lot of people today, I mean, there's people in the audience here
  14. who weren't even born then, right? So a lot of people today might not know who they were,
  15. but they're incredibly important. And one of their games was called Thief the Dark Project,
  16. It's a franchise that lived on, it was one of the first stealth action games, and it
  17. looks pretty primitive by today's standards, obviously, but this was engine contemporaneous
  18. with things like Quake, for example, so this was sort of state of the art at the time.
  19. Now I'm not going to talk about graphics, because I'm not qualified to talk about graphics
  20. anyway, I'm not a graphics guy.
  21. What I want to talk about instead is how they modelled entities, and normally the way you
  22. would do things in games at this time, and in fact the way that Ultima Underworld 1 and
  23. and then later System Shock was another one of their games.
  24. The way that they did things was actually the way
  25. that like me and, for example, Ryan Fleury
  26. who's gonna be interviewing me after,
  27. we would say that this is a good way
  28. to do things even today.
  29. They were sort of fat structs, if you will.
  30. They just put everything in one structure
  31. and when you were going to do things
  32. like have different types of entities,
  33. really all you had was some kind of a type field in there
  34. or flags or things like that that would let you know
  35. what you were supposed to do with it.
  36. But these were very, very limited resource times.
  37. I think the systems, you would expect
  38. to have something like two megabytes of memory
  39. or something total to run in.
  40. So you're talking about fixed blocks of small size
  41. and everything has to work in that.
  42. So that's just what you did because that's what worked.
  43. And in this time frame, right, you know,
  44. during the 80s and then later 90s when this game was made,
  45. this is the sort of thing that was in vogue
  46. in like the architecture world.
  47. This has nothing to do with how they were doing things
  48. at Looking Glass.
  49. This is what we would kind of think of as a normal
  50. like OOP programming model now,
  51. where you have a hierarchy of things.
  52. Like there's an entity class
  53. and then you have an NPC and item subclass derived from it,
  54. and then things below that and so on.
  55. And that was not something that Lookingglass
  56. had ever really used in that lineage of games
  57. and their RPGs, and they decided not to go that route
  58. even though that was sort of what was in vogue at the time.
  59. That was what was, you would have seen pushed
  60. if you were reading like architecture things
  61. in Oops! Law or the kinds of papers
  62. that would have been published on software architecture.
  63. So they did something very different.
  64. What they did is said, look, we want all of our systems
  65. to be the primary thing that we're going to think about.
  66. We want to think about physics and combat
  67. and those sorts of things.
  68. The same things that were in our Fatty Strux.
  69. When we do a more serious architecture here,
  70. we're doing more architectural work,
  71. we want to put things in terms of their system,
  72. not in terms of the entity.
  73. And so what they did is they came up with a system
  74. where they would use an ID,
  75. like if I have a particular object
  76. that I'm trying to model in the world, one of these entities,
  77. I just have an ID for it.
  78. And it doesn't really have any data associated with it at all.
  79. It's kind of the polar opposite of a fat struct.
  80. So they would just say, we're going
  81. to use the IDs to represent things.
  82. And then the way that we form the entity's data
  83. is we just use that ID to look up into a system
  84. and say, what's the physics like for this thing?
  85. What's the combat like for this thing?
  86. This fuel system I have, I'm just imagining systems
  87. you might have in a game.
  88. And in so doing, in 1998, when they shipped Thief,
  89. Dark Project, they shipped, to the best of my knowledge, the first instance of an actually
  90. commercially released entity component system. That's what we call it today, right? People
  91. call it this. This is now an in-vogue architecture in much the way that those hierarchy kinds
  92. of architectures were in vogue at the time, and still to some extent are today, but not
  93. necessarily in the game industry. So this is the first time I'm ever aware of anyone
  94. shipping this kind of model. And in fact, it's the first time I'm aware of anyone even
  95. talking about this kind of model. I'd never heard of it before. This was the first time.
  96. And there is a pretty interesting thing that you have to understand about this, and I know
  97. this may seem like beating a dead horse here, but those red lines that I've drawn there
  98. are basically encapsulation boundaries. And this is a very important theme throughout
  99. this talk. I just want to really make sure I hammer it home. Encapsulation boundaries
  100. are really what we care about when we're doing architecture. What we care about is where
  101. we make it difficult to access things and where we make it easy, right? And so what
  102. they chose to do that was very different than that sort of inheritance hierarchy model is
  103. they chose to draw the encapsulation boundaries around the systems. Now, this is very different
  104. because the traditional OOP model, right, is you draw the encapsulation boundaries around
  105. the objects. So the encapsulation boundary in a normal OOP-like hierarchy is I have whatever
  106. where the object is, like a mech,
  107. and the encapsulation boundary is around
  108. all of the things that the mech knows about.
  109. But that's very different than this.
  110. This is about all of the things
  111. that are related to a system,
  112. not all the things that are related to a mech.
  113. Now it's important to remember,
  114. this is not like not-oop.
  115. You could easily call this object-oriented programming,
  116. it still obeys a lot of the principles
  117. you might recognize from object-oriented programming,
  118. so it's not like they were saying,
  119. we're getting rid of object-oriented programming.
  120. They were saying something very different.
  121. And they were saying, effectively,
  122. what Mark Blank said, he's the person who actually
  123. implemented a lot of the system.
  124. And what he said was, for some reason,
  125. OOP has gotten into this mindset
  126. of compile-time hierarchies that match the domain model.
  127. Meaning, if you think about what you're trying to model
  128. in the real world, like entities and guards
  129. and things like this, or even if you're just thinking
  130. like the natural world, we're gonna think about birds
  131. and is it a mammal or is it an avian thing, right?
  132. You're thinking about this domain model
  133. that you're trying to model in the real world,
  134. and you're bringing it into the software world.
  135. And what he was basically saying is like,
  136. why are we pushing this?
  137. Why is that the idea, right?
  138. And he says we can still do OOP style stuff,
  139. and we can just do it by changing our paradigm
  140. of what we're thinking about
  141. in terms of our domain model, right?
  142. Don't make the domain model be in the code,
  143. make that be something the user experiences,
  144. but the code is done in a way
  145. that makes sense for the code.
  146. So this is really brilliant,
  147. and it's a great way to summarize it.
  148. It's one of my favorite crystallizations of that concept.
  149. So I would only add one thing to it,
  150. and that's that word encapsulation.
  151. Because I think sometimes people think hierarchy,
  152. they just think the relationships.
  153. But it's the encapsulation that's really important
  154. because that's what really determines
  155. whether or not the code is easy to write or hard to write.
  156. It's are those boundaries in the right place?
  157. So this is crucial.
  158. And this talk is kind of about mistakes, as you'll see.
  159. And I made a mistake one time.
  160. I went on this thing, you may have seen it,
  161. it's called the internet.
  162. It's like this series of tubes
  163. that connects people around the world,
  164. and it's kind of complicated,
  165. I'm not 100% sure how it works,
  166. but they have a thing on it called social media
  167. where what you can do is there's like a box,
  168. and you can type anything you want into the box.
  169. It doesn't have to be correct,
  170. it doesn't have to be coherent,
  171. it certainly doesn't have to be polite.
  172. And then you have to push this button,
  173. there's usually a button next to it,
  174. but the button says different things sometimes.
  175. You push the button,
  176. and everyone in the world has to read it.
  177. Like, everybody.
  178. And that's an amazing invention.
  179. And I was probably doing something like that at the time when I saw some people talking,
  180. having a discussion about this sort of thing, discussion in quotes, let's say.
  181. And they were thinking about this.
  182. They were thinking about, you know, we have old things that were maybe not quite architecture
  183. like those things, and at some point people started saying, you know, there's
  184. this other architecture we could do, which is this hierarchy thing, and that's much cleaner,
  185. it's much better organized, it's better architecture, and they started to push this, right?
  186. And it definitely got adopted.
  187. It got adopted everywhere.
  188. And it's a very standard paradigm, even to this day.
  189. And they were sort of responding to people
  190. who were saying this is bad,
  191. that this hierarchical thing is not a good idea,
  192. the encapsulation boundaries are in the wrong place,
  193. as I would say.
  194. And they're saying, okay, there's no way
  195. that all of these smart people who pushed this stuff
  196. and who created this, there's no way
  197. they could possibly be wrong about it, right?
  198. Like, surely this comes from all kinds of academic studies
  199. and ways of looking at things,
  200. and we definitely have great examples
  201. this working perfectly I'm sure and it all got translated to us and you guys
  202. just don't understand and you know we don't understand either because we're
  203. not really sure what we're saying but we're basically saying that someone must
  204. have known and those people were smart so there you go right so could you
  205. really be saying all you naysayers that it doesn't make sense it didn't come
  206. from a logical place and so the short answer to that is absolutely that's what
  207. we're saying that's 100% where we're saying and the long answer to this is
  208. is the rest of this talk.
  209. Welcome to the Better Software Conference,
  210. the inaugural Better Software Conference.
  211. This is the big oops,
  212. which is my sort of attempt to go back
  213. over 35 years of history
  214. to
  215. figure out where we went wrong.
  216. Like, how did this happen?
  217. Okay? Now, just get some
  218. things out of the way first, and this is mostly
  219. for the people. I don't know where I'm looking. Is there a
  220. camera out there? That. This is mostly for the people.
  221. The people in this room are probably already
  222. already bought in, right?
  223. Low-level programming, that sort of thing,
  224. you're probably like, OK, I like where this is going.
  225. People on the internet, as I said before,
  226. maybe that was a mistake.
  227. But they're going to have some issues with this.
  228. They have some bones to pick.
  229. So I just want to say first, when
  230. I say the big oops anatomy of a 35-year mistake,
  231. I'm not talking about OOP as a whole.
  232. I'm talking about looking for very specific things in it.
  233. And because whenever you talk about OOP,
  234. it's always this thing where people are like, well,
  235. whatever you're talking about, that's
  236. not really OOP.
  237. Like, you're talking about these things,
  238. you're using the terminology wrong,
  239. or that's not how I write code.
  240. It's like, OOP is just a thing where it's like,
  241. it's how I like to write code.
  242. And whatever they're thinking at the time,
  243. that's what OOP is or something.
  244. And I don't necessarily blame them
  245. because it's a nebulous term
  246. and they have their own definition for it.
  247. I mean, I probably have my own definition for it.
  248. That's totally fair, right?
  249. But I just wanna say,
  250. we're not gonna be dealing with any of that here,
  251. so I don't wanna hear the whole like,
  252. you know, I don't know.
  253. It's sort of like wine, which I got the slide up in here.
  254. It's like, if you have like a designated origin,
  255. You're not allowed to call it certain things,
  256. and it's that kind of feel, right?
  257. It's not like, it's not actually oop,
  258. it's sparkling code or something like this,
  259. you have to use the right term for it.
  260. So I just want to be clear,
  261. I'm talking about something very specific,
  262. and it's the thing that I just said.
  263. Very, very specific, and I'm not saying oop was a mistake,
  264. I'm saying this was a mistake.
  265. The idea that you're going to draw encapsulation boundaries
  266. around these compile time hierarchies
  267. that are based off of whatever you're trying to write.
  268. Now, second thing we want to get clear
  269. is I don't want to hear any complaints that no one ever
  270. pushed this model, because I know that's going to happen.
  271. I'm looking at UI Combinator.
  272. I know that this is going to be a thread.
  273. So anticipating that, let's just say
  274. we have a lot of historical evidence.
  275. When I was doing the research for this talk,
  276. I read so many things from the historical record.
  277. It is so obvious that everyone actually 100% meant
  278. you should look at the domain model
  279. and you should code that directly
  280. in your compiled hierarchy.
  281. For example, here is literally Bjarne Stroustrup's paper,
  282. What is Object-Oriented Programming,
  283. to tell you what it is.
  284. And he starts off with a shape example
  285. that I've used before that everyone said,
  286. well, that's totally ridiculous.
  287. You're just cherry picking out of an introductory book.
  288. This is where he was trying to explain this and sell this
  289. to people in his industry who were experts.
  290. And he says, look, if we're going
  291. to write something like this that has kind k as an enumerant
  292. there of what the kinds of shapes are, right?
  293. If we're going to write something like this,
  294. we end up with code that has a switch statement in it.
  295. So when we want to draw something,
  296. we have to say, oh, what is this?
  297. And I have to say, OK, case circle, case triangle,
  298. and have the different drawings for that.
  299. And he's like, this is a mess.
  300. You could never do something like that.
  301. Instead, what you want to do is make a hierarchy where
  302. it matches the domain model.
  303. I've got a shape class, and then he
  304. derives from it the triangle class,
  305. and it has a virtual function, and all those sorts of things.
  306. This is right in the first papers
  307. where people are selling this concept
  308. in certain programming languages, right?
  309. And I guess I should also point out
  310. that he says things like,
  311. when we're talking about object-oriented programming,
  312. literally what we're talking about
  313. is inheritance hierarchies with virtual function calls.
  314. Like, he says that, and he says object-oriented programming
  315. is programming using inheritance.
  316. So hammering home that this is literally
  317. what we are talking about.
  318. There's so much evidence, and I'm just picking one paper.
  319. Now, a lot of people will talk about, say, Alan Kay,
  320. because he was a big father of object-oriented programming.
  321. He's the one who coined the term, as far as anyone knows.
  322. And he talks about this sort of idea
  323. that OOP only means like messaging
  324. and a few other things, right?
  325. He said this.
  326. And so some people might be like,
  327. well, that's what object-oriented programming was
  328. really about.
  329. No one was ever pushing it.
  330. And OK, whatever.
  331. C++ is terrible.
  332. Don't listen to that guy, despite the fact
  333. that he made the language that's one of the most prevalent.
  334. It's the one that we all use, mostly, or at least
  335. have for the past 20 years.
  336. And so, this is the truth, this is the actual truth here.
  337. It's like, yeah, he said that in 2003, right?
  338. He said that after a very long time.
  339. So, why'd he say it?
  340. It's because 10 years earlier,
  341. he was already saying he kinda soured on it.
  342. He's like, inheritance was like really powerful,
  343. but people just didn't know how to use it.
  344. Novices and experts apparently both couldn't use it, right?
  345. It was just, you know, it's really good,
  346. but no one can figure out how to use it, I guess.
  347. So that's a little bit weird, I don't know.
  348. Maybe Alan Kay, he still comments on stuff,
  349. Maybe he'll come to tell us what he actually
  350. was trying to say there exactly.
  351. But if you go back earlier, because small talk is a lot
  352. earlier than that, if you go back
  353. and look at what they were actually
  354. talking about when they were talking about small talk,
  355. in the times before they had a chance to reflect and say
  356. that it didn't work, well, here's what they were saying.
  357. Inheritance programming shows the power
  358. of differential description, right?
  359. They're like, you can take an object,
  360. and I can say, I'm going to start with this completely
  361. undifferentiated object, and then I'm
  362. going to derive a rectangle.
  363. I'm going to drive, drive, drive.
  364. And in fact, here is a diagram from one of his articles
  365. talking about cool things, computer architectures,
  366. like we can have a generic object,
  367. and then we can drive from that a rectangle,
  368. and we'll drive a window, and a pane window, and a browser.
  369. Look, everyone is talking about literally representing
  370. in the hierarchy what your domain model is.
  371. That's what they're talking about.
  372. And if you need further proof, look at what's
  373. actually in Smalltalk.
  374. We have all the data for this.
  375. All of the papers exist.
  376. Here is an example from the art and science of Smalltalk
  377. where they're talking about some stuff that's
  378. needed to adapt values, like I want
  379. to convert values between things and actually exchange
  380. values between objects and stuff like this.
  381. And here's just a hierarchy that they
  382. drew of stuff that they were using for implementation.
  383. That's the hierarchy, right?
  384. And if you look, it actually says, well, it's
  385. only part of the hierarchy for this thing
  386. because we couldn't fit it on the diagram.
  387. We had so many classes we were inheriting here, right?
  388. And guess what?
  389. If you liked the shape example that keeps coming up,
  390. that everyone says, well, no one would ever actually
  391. suggest that you use this sort of ridiculous shape example.
  392. You know, you're just cherry picking,
  393. except it exists absolutely everywhere.
  394. It's in Smalltalk.
  395. There it is.
  396. They have a path class, and from that path class,
  397. they have different shapes derived from it.
  398. That's what the path looks like.
  399. That's in the base language of Smalltalk
  400. that Alan Kay and Robson shipped,
  401. and Adele Goldberg was the person who documented it.
  402. These are the original authors of Smalltalk, right?
  403. And if you don't want to take my word for all of that,
  404. You can take Bjarne's word for it.
  405. He criticizes Smalltalk for being all about inheritance,
  406. that that's all it was and you had to actually use it
  407. to get anything done in that language, right?
  408. And he's actually saying C++ at least
  409. doesn't make you do it that way.
  410. You only have to do it that way
  411. when you think it's a good idea, right?
  412. Which, by the way, I agree with him on that.
  413. That's why we were able to,
  414. that's why I'm still able to use C++ to this day
  415. is because Bjarne Stroustrup was actually really smart
  416. about a lot of things and he didn't try to force you
  417. to do things only his way, whereas Smalltalk kind of did.
  418. All right, so now that we've got that out of the way, let's talk about the origin story
  419. for this guy right here, who has caused me so much pain, you know, I won't even go into
  420. it.
  421. Anyway, let's talk about the origin story.
  422. So we'll start with C++, because obviously that's the most impactful language that really
  423. promulgated this inheritance hierarchy concept out to the world in a way that we all kind
  424. of experienced.
  425. only in programming C++, but obviously languages like Java, which are incredibly prevalent
  426. in not exactly our circles, maybe, but obviously in business world and that sort of thing.
  427. So it's not even just C++. It's like the knock-on effects of C++ also. So this is really, really
  428. important as an entry into where this came from. So let's start in 1978 and looking at
  429. that. And Bjarne Stroustrup is actually in the he's in university at this point. He hasn't
  430. actually gotten to Bell Laboratories, where he would do the later work on C++. So he is
  431. working on his PhD thesis. And again, as I'm going through the historical record here,
  432. I really want to try and give you a mindset of what the people were thinking as far as
  433. I could get it from their writings, right? I went only through primary sources for this,
  434. and I tried to figure out what were these people feeling, like what were they doing
  435. when they were coding? And so he is actually working on distributed systems. He's not a
  436. a languages guy. He's not there researching languages or anything like that. He's working
  437. on distributed systems. And what he wants to know is, look, we've got some stuff where
  438. we want to know about hardware protection, like, you know, if you kind of think of virtual
  439. memory or things like that, where you have hardware features that are designed to protect
  440. different parts of your program from other different parts of your program or different
  441. processes from each other or different nodes in a system, all those sorts of things. So
  442. he's doing distributed architecture work. And what he wants to do is run simulations
  443. is because at the time, again, putting you in the mindset
  444. of where we are in computer history,
  445. you don't just have computers lying around
  446. like we do today, right?
  447. It's not like, oh, I can just buy a bunch of computers
  448. and set up a network and do testing on it.
  449. It's like, no.
  450. There's no way he was gonna get things
  451. like a distributed multiprocessor system
  452. to just play around on in 1978
  453. unless he was extremely important
  454. in working for the military or something like that, right?
  455. So what he had to do was write a simulator.
  456. And what he decided to do to write the simulator,
  457. because earlier in his career,
  458. He had been in university, early in his education, I should say.
  459. He had been at university, and he learned from a person named Kristen Nygaard,
  460. who was actually one of the creators of Simula.
  461. He learned the language Simula directly from one of its authors, basically.
  462. He was actually there at the time when the author was also there,
  463. and this was how he knew what Simula was and how to use it.
  464. And so what he did was he wrote a simulator for distributed systems in Simula,
  465. which is kind of exactly what it's designed for, right?
  466. It's a simulation language.
  467. language. And he had a great time doing it. He was like, this was so much better than
  468. what I'm used to. I really liked the experience of writing that. So he ended up with this
  469. thing where he had like little programs that were simulating what was happening in a distributed
  470. network or distributed system, I should say, not necessarily on a network. And he found
  471. that it was really easy to debug the little programs by themselves, and the language made
  472. it really easy to do that. Now, again, it's important to remember, keeping all this in
  473. your head if you can. I know it's a lot. It was a lot of reading, right? So I'm trying
  474. to convey it to you, and just pointing out,
  475. it's important to remember that that's the domain model he was
  476. working with, is lots of little programs
  477. that were talking to each other, right?
  478. So anyway, he says that the class concept the Simula had,
  479. because it had the same sort of idea of a class
  480. as C++ would later have, he said that that class concept
  481. that Simula had was really good for direct mapping, right?
  482. Remember I said compile time hierarchy that
  483. exactly models the domain, right?
  484. He said that was working really well when he was implementing.
  485. He was just saying, oh, this is the thing
  486. I'm trying to simulate, and so I'm literally
  487. going to create classes in Simula that model that directly.
  488. And that was working really well for him in Simula.
  489. And we can kind of start to see how this is breaking down.
  490. He happens to be working on something that is literally
  491. a domain model of things that are encapsulated.
  492. The computers can't talk to each other.
  493. The different processes in the computer
  494. can't talk to each other.
  495. It's an exact fit for what a class actually does.
  496. This is important to remember.
  497. OK.
  498. So we used hierarchies for this.
  499. They weren't necessarily particularly deep,
  500. but they were the kind of thing where it's like,
  501. I have a computer.
  502. I derive different things from the computer.
  503. And those things are just kind of self-contained.
  504. And he had a really great time doing this.
  505. Again, he said very positive things about it.
  506. And one of the things that he really liked
  507. was the fact that the type system, when
  508. you have these hierarchies, that type system
  509. would catch errors for you.
  510. exactly the kind of thing that we maybe take for granted today,
  511. because most languages, even JavaScript now
  512. has TypeScript, right?
  513. Most things that we work with today
  514. have the ability for you to do this kind of type
  515. checking that catches a lot of errors at compile time.
  516. That was relatively new at the time.
  517. And I don't mean new in the terms
  518. of no one had ever thought about it before,
  519. but I just mean a lot of languages
  520. you might be using at this time still
  521. had very weak type systems.
  522. And in fact, Stroustrup complains directly
  523. when he's talking about this that using Pascal kind of sucked
  524. And he didn't really like it because the type system didn't
  525. work very well for expressing things and for catching errors.
  526. He felt it was kind of more trouble than it was worth.
  527. So that forms his basis for this idea
  528. that classes are really good and type checking on classes
  529. is really good, right?
  530. And just to split those down the middle,
  531. I do think the type checking part's pretty good.
  532. It's maybe the class part or rather the hierarchy part
  533. that I'm like a little bit suspicious of, right?
  534. But at least half of it I'm with him on already even.
  535. OK, so that's sort of what you will
  536. see if you read the Wikipedia or something, right?
  537. That's the simple part, and they often leave a lot of stuff out.
  538. So I thought, because this is the Better Software Conference,
  539. I would include a much more interesting aspect
  540. of this story, because you would think,
  541. if you saw a thing that's like, hey, what happened
  542. was Bjarne Stroustrup was doing stuff
  543. with distributed systems, and he wrote this thing in Simula,
  544. and it was a great time.
  545. And so what he decided to do when he got to Bell Labs
  546. was make C++, and it would just have the classes in it
  547. from Simula.
  548. It was great.
  549. No.
  550. So what actually happened was the entire thing completely
  551. rolled over and died.
  552. He tried to run the Simula program,
  553. and he had all sorts of problems with it.
  554. And it started even before he tried
  555. to run the Simula programs that he was writing.
  556. What actually happened is, first, he
  557. hit the same things we hit with C++ today.
  558. Build times were through the roof.
  559. And it was almost impossible to make changes to the program.
  560. So much so, and I'm going to let this sink in for a second
  561. because it's really awesome.
  562. So much so, I mean, I almost want you to read it.
  563. If you compiled 1.30 of the program and tried to link it,
  564. it was slower than just recompiling the entire thing.
  565. OK?
  566. Let that sink in because it means
  567. that Bjarne was talking about Unity builds in 1994.
  568. He was like, we can speed this up by not doing incremental.
  569. Incremental builds sucked that long ago.
  570. Anyway, but I digress.
  571. Anyway, the runtime also was lousy.
  572. He couldn't get the thing to run fast enough
  573. because Simulo was extremely slow.
  574. Anyone want to guess why it's slow?
  575. It's a rhetorical question.
  576. I'm going to tell you why it's slow.
  577. It was slow because of the garbage collector.
  578. Same reason things are slow today half the time.
  579. The garbage collector was taking 80% of the runtime,
  580. apparently, even though there was no actual garbage that
  581. needed to be collected.
  582. Because I guess at that time, garbage collection
  583. was even very, very primitive, obviously.
  584. So it was probably running all the time
  585. just to see if there was any garbage.
  586. And it was like, yeah, no garbage.
  587. And that was happening a lot, so 80% of the time.
  588. He had the experience with Stimula
  589. that we have with C++.
  590. The chain continues, right?
  591. The garbage collection, obviously not so much.
  592. So that's what happened.
  593. He had to rewrite the whole thing from scratch in a different language called BCPL, which
  594. has no type checking whatsoever.
  595. I mean, that's not entirely true.
  596. It has very, very minimal, but none of those class things and that sort of thing.
  597. So that's the actual story of what happened.
  598. So it's kind of interesting.
  599. It presages everything, right?
  600. The whole thing is almost like a microcosm.
  601. So if we reflect on this for a second, again, I think I've tried to highlight the important
  602. points there, but the other thing to remember is a lot of people talk about these things.
  603. They talk about those compile time hierarchies
  604. and all that sort of stuff.
  605. And they say, you know, here's the thing
  606. that you just don't understand.
  607. It's all about large teams.
  608. You know, it's all about these large teams.
  609. It's just that you've got to have large teams.
  610. And if you had large teams, then you
  611. would understand the magic of the compile time hierarchy
  612. stuff and the encapsulation.
  613. It's amazing, right?
  614. How big was the team that Bjarne Stroustrup was working
  615. with when he figured this stuff out and thought it was good?
  616. One.
  617. He's doing the same thing we're doing.
  618. So these ideas don't come from some kind of analysis
  619. of what we're gonna do with lots of people.
  620. So you could argue maybe they turn out to be good for that,
  621. but you certainly can't argue
  622. that he was designing it for that,
  623. because they weren't.
  624. They were doing it for themselves.
  625. Strucci was doing it for the protection,
  626. the type protection, the error tracking,
  627. that sort of thing.
  628. He wasn't doing it to,
  629. and also like the virtual function kind of stuff.
  630. He wasn't doing it for large teams
  631. because everyone at Cambridge University
  632. helping out in the project. No, he was a lone wolf coder, he really was. So anyway, he goes
  633. to Bell Labs, he makes C with Classes, which is the first thing that, the original name
  634. of C++, called C with Classes, because that's what it's going to be. It's going to be taking
  635. stimulus type system and putting something like that into C, and the reason for that
  636. is pretty obvious. He goes to Bell Labs, and C would be like a lingua franca there probably,
  637. right? Because they're the people who make Unix, they're the people who make C, like
  638. the people who are at Bell Labs, the people making these technologies. So he is tasked
  639. when he gets to Bell Labs with doing the same sorts of distributed systems analysis that
  640. he was trying to do at Cambridge. He's trying to do those things for Unix. He wants to analyse
  641. certain behaviours of it and that sort of thing, and he finds the same exact things.
  642. He would like to write in something like Simula. He doesn't want to have the same disaster
  643. that he had where he had to rewrite everything in BCPL. So he's like, could I take C, add
  644. classes to it and get the best of both worlds. Something that actually runs and doesn't fall
  645. over, right? But that has some of these features that I've been enjoying. And so that's what
  646. he's doing, and he's doing it for the same reason, right? That sort of modularity and
  647. concurrency analysis kind of stuff. He's trying to figure out how these things work and run
  648. simulations of them. Same exact thing is happening, and it's happening over again. And what he
  649. kind of complains about with C, if you didn't have these things, some of it's a little
  650. confusing. He talks about the fact that he says all program parts can poke into all of
  651. the memory, and C++ doesn't really change that, but I think he's just kind of talking
  652. about private declarations, right? He's just like, well, you know, obviously I don't think
  653. you can stop programs from poking into the memory by putting private on it, but it will
  654. stop programmers from typing it into the compiler, and that's sort of the same thing, right?
  655. And where that comes from, this sort of idea that we're going to protect things, that actually
  656. comes again from his distributed systems sort of OS thinking background. Because he's looking
  657. at hardware, and he's looking at things like virtual memory and protection that you get
  658. between processes and those sorts of things, and he's saying, that's kind of what I want
  659. for programming. I don't really want to make those mistakes where I access the private
  660. part of things. I want to be able to wall those off. And he's thinking about actual
  661. hardware, computer hardware. That's where that idea comes from. Again, it doesn't even
  662. It doesn't come from working on large teams
  663. or anything like that.
  664. It comes from thinking this might be a nice feature,
  665. just like the computer stops it from happening,
  666. the compiler could stop it from happening.
  667. And that's where const comes from too.
  668. It comes from an OS metaphor.
  669. He's thinking about whether or not files
  670. have write permissions to them.
  671. Are they read-only or are they writable?
  672. That's what const is to him.
  673. That's where he thinks about it first.
  674. So again, all these things come from a very different place
  675. than what you would think if you didn't go back
  676. and read the historical documents.
  677. And by the way, these aren't hard to find.
  678. These just come from the D&E, which is a very popular book that he wrote
  679. that's just a collection of his papers, right?
  680. So a lot of this stuff in the first part of the talk,
  681. you don't have to dig that hard for.
  682. All right.
  683. So anyway, we get to sort of a second wrinkle at this point.
  684. And what happens when he starts using this stuff is it's important to...
  685. I shouldn't really say what starts happening.
  686. Let's say one of the things he does is he uses the inheritance
  687. that he puts into this sort of C with classes because he's just going to do the same thing
  688. that was happening in Simula. He uses that inheritance in a way that would generally be
  689. frowned upon even by him today. And that is to do things like implement a linked list and reuse it.
  690. So what he does is he says, okay, I'm going to take a block that's like the linking part of things,
  691. and I'm just going to inherit stuff from it so that all the things that inherit from it can go
  692. in a list, right? Now, he would never say to do that today. He would say use a template or
  693. or something like that, like a parameterized type, right?
  694. So, but it's important to remember,
  695. at that time, this was a thought.
  696. And this thought actually does come from Simula as well.
  697. We'll get to that later.
  698. But, so it's important to say,
  699. in addition to the modeling part,
  700. they're using inheritance for the purpose of code reuse,
  701. even if it really doesn't have much to do with anything.
  702. That's sort of an adjunct split.
  703. And I just want to include it here
  704. so that you understand all of the things
  705. that were being thought about with inheritance
  706. at the time when it was actually being put
  707. into more mainstream languages.
  708. So that's one of the things he was doing with it in addition
  709. to the domain modeling part, which
  710. is more of a direct mapping.
  711. And you can see him here criticizing it
  712. just to hammer this home.
  713. He doesn't think you should do that anymore.
  714. And he said as much in parameterized types
  715. for C++, which is where he started to talk about templates.
  716. As soon as templates, as soon as he got his answer
  717. to how we were going to do these sort of things,
  718. as soon as he got a parameterized type model,
  719. because that wasn't new to C++.
  720. There were languages like Ada and Clue and stuff
  721. that had that in there.
  722. He started to say, OK, C++ has never had a good way
  723. to do this because you had to do the inheritance thing.
  724. That's not fabulous.
  725. Parameterized types are the way to go.
  726. So he knows that, too.
  727. It just takes a while to get there.
  728. OK, so that's kind of the end of it.
  729. And virtual functions come in a little bit later.
  730. The first version of C with classes,
  731. when he's first starting on it, doesn't actually
  732. have virtual functions.
  733. He eventually does put virtual functions in.
  734. And when he does, this is what he says about it.
  735. He says, it was borrowed from Simula
  736. and presented in a form that was intended
  737. and efficient. So he was thinking primarily about, I want something kind of like what
  738. Simula has for this ability to call functions without knowing the type on them, but I want
  739. to make sure it's very fast, because that was a concern that he always had, again, because
  740. of the disaster he had experienced directly with Simula. So again, reflecting on this,
  741. it's totally different from what you would think if you just read the capsule summary.
  742. He's not talking about large teams still. He's talking about literally we're just working
  743. on this thing, I'm using inheritance for some reuse of code, and I'm using it to directly
  744. model the compile time. I add a compile time and use it to directly model the actual domain
  745. that I'm working in, which happens to be distributed systems analysis yet again.
  746. So we have to jump at this point because that's pretty much all we can get out of C++. I mean,
  747. you kind of got the picture now. Everything else is like after the fact. Everything else
  748. is post hoc. Anything else about C++ was people making stuff up after that, or adding
  749. things to it after that. But that's where it comes from. So if we want to actually know
  750. where these ideas started from, we've got to go back to Simula. We've got to say, okay,
  751. if all this stuff came from Simula and him using Simula, well, where did it come from
  752. in Simula? Did they just make it up? And Simula originally comes from something called the
  753. Norwegian Computing Centre. We are here very close to Norway, I suppose. Some of you may
  754. have known this place. I didn't know anything about it until I was reading up on Simula.
  755. It's a quasi-private public institute for doing computing research. It's in Oslo, Norway,
  756. and in 1962, these saucy gentlemen right here, and I'm apologising, Sweden is the worst place
  757. to give this talk because now I have to pronounce their names in front of people who probably
  758. know Norwegian pronunciation very well, and so I'm going to butcher it and I apologize.
  759. It's Ole Johan Dahl, maybe I can pronounce that correctly, and Kristin Nygaard. And you
  760. already know Kristin Nygaard's name because this is the person who Bjarne Stroustrup learned
  761. the Simula from originally. He interacted with him a lot when he was at his previous
  762. university before Cambridge. So these are the folks who make Simula. They're the people
  763. who actually are kind of like the masterminds behind it.
  764. And the first reference we have to it
  765. is in private correspondence that has now
  766. been published from Nygaard to another person who
  767. was working on operations research.
  768. And these folks' operations research,
  769. if you don't know what that is, it's
  770. when you look at how systems are behaving in order
  771. to optimize them, basically.
  772. So you can think about things like we're
  773. trying to plan how the military is going to organize some
  774. things, like what is their process going to be,
  775. and we want to maximize the throughput of like how we're manufacturing this thing
  776. or how we're going to load planes onto an aircraft carrier.
  777. I mean, I don't know anything like that, but a lot of it's military
  778. because that's where the funding comes from, but it's for anything really.
  779. It's also in business, operations research, things like the Simplex algorithm,
  780. if you've ever heard of that, that's operations research, et cetera, et cetera.
  781. So anyway, he says like, I got this idea.
  782. What I'm going to do is I'm going to make this language
  783. that makes it very easy to describe one of these systems,
  784. and then what I will do is use it to describe these problems in a way that
  785. allows it to do the simulations automatically so it's like almost like a
  786. scripting language for system simulation and if you look this is some code you
  787. can find when they talk about the history of it this is in 1963 the
  788. similar language would have looked like this it's one of the earliest snippets I
  789. could find and so this is not the way the final
  790. look, this is sort of how they started out, and you can see what it essentially is, and
  791. you don't need to understand exactly what's going on in this for the talk, so I'll spare
  792. you the details, but essentially what you're doing is you're setting up these various things
  793. like customers and stations, it's like things, we're imagining like entities moving between
  794. parts of a system, and we write little pieces of code that's like how they will be processed
  795. when they get there, like will this person, you know, they'll be held for a little bit
  796. of time, and then we'll check to see if they've paid the fee, and if they've paid the fee
  797. We'll send them to this station.
  798. If they haven't paid the fee, we'll send them
  799. to this other one.
  800. And the idea is you just describe that system this way.
  801. You run the simulation, and it presents you
  802. with a bunch of statistics.
  803. So you can kind of see like, OK, this
  804. is where the bottlenecks were, or things like that.
  805. And that was very successful.
  806. They eventually released a thing called Simula 1,
  807. which is the first sort of more widespread version
  808. of this thing.
  809. People loved this.
  810. They could do their system analysis this way.
  811. But Nygaard and Dahl were thinking in their head,
  812. like, we really like this thing, and we
  813. think it has a possibility to be bigger than what it is,
  814. a possibility to be more powerful than just what
  815. we had in that first version.
  816. So they start to make a new version, which eventually goes
  817. on to be called Simulus 67.
  818. And it's like Windows 95.
  819. At this point in time, people are
  820. starting to name languages where you append
  821. the year of the language after the language.
  822. So we have things like ALGOL having that,
  823. or COBOL 60 is the version of COBOL
  824. that was first introduced in 1960.
  825. And so that's what Simulus 67 would eventually be.
  826. And they're trying to figure out what
  827. they're going to do for this new version.
  828. And what happens is they're thinking about code reuse.
  829. They're like, we don't really like
  830. we have to rewrite things a lot of times.
  831. And we're trying to figure out some way
  832. that we could get some of this reuse in there.
  833. We want to reuse these things, and it's not really
  834. working out very well for us.
  835. They're looking for a solution to this,
  836. and they're not really finding one.
  837. But eventually, when they're thinking about this problem,
  838. they're saying, what if we have a bridge with a toll booth
  839. on it and we've got cars going across it
  840. and they might be either trucks or buses,
  841. what could we do so that we could just write this once
  842. and have it work for both the trucks and the buses
  843. so we don't have to duplicate all the stuff we said
  844. for trucks and buses?
  845. That's what they're thinking of.
  846. And this is not me saying this,
  847. this is them saying this is what they were thinking,
  848. this is what they were trying to solve.
  849. Literally, this is what they were trying to solve
  850. when they came up with classes.
  851. And here is what those classes look like.
  852. You can see up at the top there, it's defining link class car.
  853. The link is a thing where they have this linked list
  854. sort of superclass that they're deriving from.
  855. And they're going to have a car.
  856. Then they're going to say underneath cars,
  857. they're going to derive a car class truck and a car class
  858. bus, there's different kinds.
  859. You can see load and capacity are
  860. like two different data members that those have.
  861. So in this one snippet, we can see both things
  862. that not only they are about to do,
  863. but that Bjarne Stroustrup is about to do as well.
  864. We are using this for reuse.
  865. We are deriving from a link class
  866. to get its functionality, not because we
  867. think that we are like a link in the domain model.
  868. But then mostly what we're doing is following the domain
  869. model with our classes.
  870. It is car, and underneath it, it is truck and bus,
  871. exactly like would eventually be promulgated
  872. as how to design OOP systems with those hierarchies
  873. that I was talking about.
  874. So that's what it looked like.
  875. And they literally said, hey, this now
  876. allows us to quickly just say, this thing's a link,
  877. and then it can go in lists.
  878. Awesome.
  879. Now, you'll notice they didn't actually talk at this time
  880. very much when they were counting the history.
  881. And I guess I shouldn't say you'll notice.
  882. I noticed, because I had to read the whole thing.
  883. They don't really talk about the virtual function
  884. part at the outset.
  885. They're kind of talking about just this reuse part.
  886. That's mostly what they're concerned about.
  887. But they do eventually care about that virtual part,
  888. because once they do this subclassing, they're like,
  889. hmm, we want to have ways that the subclasses can do things
  890. in addition to what the parent's doing.
  891. And that's where the idea from virtual functions comes from.
  892. They say, we have these operations
  893. that we were defining, things like what that queuing behavior
  894. was going to be that I showed on the original slide from Simula
  895. back in 1963.
  896. And they're like, we want to have those operations be
  897. modified based on whether this car is a truck or a bus
  898. and things like that.
  899. So that's what happens.
  900. Now, if you look at how this had to actually work,
  901. it works the same way that primitive code reuse works.
  902. If you wanted to use it today, if you
  903. want to use inheritance for things like links,
  904. it worked exactly the same way.
  905. They literally have the sort of class arc,
  906. as I can see in the middle there,
  907. class simset and simset class simulation.
  908. That's basically saying, look, all this stuff
  909. is going to be derived from linked list holder.
  910. That's what simsys would be like.
  911. I'm a person who holds linked lists.
  912. And then we're going to derive the simulation from the thing
  913. that holds linked lists.
  914. That way, it can use that.
  915. So it's almost like a library.
  916. Like, they're using inheritance like a library here,
  917. as well as the domain model, which is under it.
  918. So again, that same double duty.
  919. All right.
  920. So again, just a hammer at home, nothing about teams,
  921. nothing about architecture, none of this stuff, right?
  922. It's all about trying to solve a code reuse problem,
  923. and then something falls out of that.
  924. No analysis is done of any of the things
  925. that you would normally say if you
  926. were trying to promote the use of domain modeling
  927. via those class hierarchies.
  928. That's not what's happening.
  929. So this is where we actually got compile-time hierarchies
  930. of encapsulation that matched the domain model.
  931. Because Simula actually did have encapsulation.
  932. You couldn't refer to things outside of the entities
  933. like that very much.
  934. And so it kind of did have the beginning of that.
  935. It wasn't as rigid as C++, as we'll see.
  936. But that's effectively what it was.
  937. So I don't know how to summarize all of that that we just saw.
  938. Basically, what I'd say is, effectively, what we sort of
  939. were seeing is this came out of sort of an approach
  940. to templates that wasn't very good.
  941. Like, that's sort of what happened.
  942. And it's not their fault, because, I mean,
  943. they're in the wilderness, right?
  944. Like, nobody knows any of this stuff.
  945. We take for granted all the things we know today.
  946. They don't know any of this.
  947. They have to invent everything.
  948. But that's really what they almost wanted.
  949. If you had handed them templates at the time
  950. they were trying to do this, they may never have invented
  951. this class concept at all,
  952. because they just wanted a linked list.
  953. They just wanted a way to say,
  954. I have a list of things going across, right, or whatever.
  955. So that's sort of where they had started,
  956. and they just happened to come up
  957. with a virtual function thing,
  958. which by the way is useful for stuff,
  959. I'm not trying to suggest that it isn't,
  960. but that was sort of a byproduct
  961. of what they were trying to do,
  962. which was just make a list class they could reuse, kind of.
  963. All right, so that's the end, that's the entire story.
  964. Now you know where everything came from.
  965. I mean, of course, if you only wanna do
  966. sort of the capsule version, that's, you know,
  967. again, sort of the Wikipedia version of it.
  968. But you have to kind of ask the question,
  969. I mean, we know that they did those things,
  970. but like, where did they get the idea for those things?
  971. I mean, that's usually how I approach things anyway, right?
  972. I'm like, after I find out that, like,
  973. someone got the idea from someone,
  974. I'm like, well, do we know if that guy
  975. got the idea from someone?
  976. Because I wanna know about following it
  977. the whole way back, right?
  978. So that's the end if you just use a capsule Wikipedia
  979. summary again.
  980. You'd kind of get something like that out of it.
  981. What you probably wouldn't get is this stuff.
  982. So when you actually go digging in here
  983. and you pay attention to every little thing,
  984. and every time you come across something
  985. that someone mentions, you're like, wait, what?
  986. And then you go try to pull the papers
  987. that they're actually referencing.
  988. You start to find out a lot of other stuff.
  989. So if we keep pulling this thread, what we find
  990. is the idea of subclassing is not credited
  991. to Nygaard and Dahl.
  992. They credit it to somebody else.
  993. C.A.R. Hoare, actually.
  994. The guy who invented Quicksort.
  995. That's who they say this idea of subclassing came from.
  996. They don't claim to have invented it.
  997. They claim to have invented a version of it
  998. that was derived, pun intended, from Hoare's work.
  999. And this is the paper that they're referring to.
  1000. This is the paper that I believe they would have read,
  1001. although I'm not sure exactly which version they read
  1002. because different versions were circulated
  1003. and there's actually sort of a further comments one
  1004. that happens after this,
  1005. but they would probably be aware of all of this
  1006. because academics are always very good
  1007. at sharing their information this way,
  1008. putting out publications.
  1009. I mean, it's the thing that is cred for them, right?
  1010. Like your papers are your cred.
  1011. So you're reading papers by other people,
  1012. you're writing your papers.
  1013. So they read this paper for sure.
  1014. Which version exactly, I couldn't tell you.
  1015. But this is the paper, and here's
  1016. what Hoare is talking about in this paper.
  1017. He says, all right, we have in the real world,
  1018. and I want to underline that because it's
  1019. like compile time hierarchy that matches the domain model.
  1020. In the real world, we have objects
  1021. that we want to model, and they have
  1022. different versions of things, and we
  1023. want to model that sort of discrimination that's
  1024. happening there in the subclasses.
  1025. And so he gives the example of an algebraic expression.
  1026. He's like, if you look at algebraic expression,
  1027. I'm trying to model that.
  1028. I want to represent that in the computer.
  1029. I might say I have an algebraic expression.
  1030. And then I have these different things
  1031. that are types of algebraic expressions, right?
  1032. And he says constants, variables,
  1033. dyadic expressions, right?
  1034. He's trying to model language.
  1035. And by the way, this happens a lot.
  1036. I don't really cover it much in this talk because it's not
  1037. relevant, but you'll see a lot of people this time
  1038. were working on things like, how do we parse stuff, right?
  1039. So thinking about how do we parse language,
  1040. how do we parse computer languages,
  1041. how do we parse human languages,
  1042. for thinking about this kind of thing all the time.
  1043. It's like, what if I want to represent an equation?
  1044. How am I going to do it?
  1045. And he's saying, what about these subclasses?
  1046. And he would literally write it just like this.
  1047. So as we can see, Nygaard and Dahl were not lying.
  1048. They 100% did get this idea from that.
  1049. It looks almost exactly like theirs, down to the syntax.
  1050. You can see that he's saying, I'm
  1051. going to have an expression.
  1052. Here are the subclasses of the expression.
  1053. It's going to be constant and variable.
  1054. And so this is what Nygaard and Dahl read.
  1055. And they were like, oh, wait a second.
  1056. What if we just had our cars and trucks and buses under them,
  1057. and then we could just use the car,
  1058. and then we put the car across the bridge?
  1059. OK, that would work.
  1060. Wait, but we don't have to stop at the car.
  1061. We could make something above the car that's
  1062. things that are in a list of stuff,
  1063. and then we could use it for everything.
  1064. It doesn't even have to be the bridge.
  1065. Holy cow, dude.
  1066. Thank you.
  1067. Thank you, Tony.
  1068. So anyway, yeah, Anthony, they call him Tony Hoare.
  1069. He didn't go by Anthony.
  1070. Anyway, sorry, thing I didn't introduce ahead of time.
  1071. It's just up here because I've been reading this stuff
  1072. for, I don't know, months at this point.
  1073. Anyway, so when he presented this in this paper,
  1074. it doesn't stop there.
  1075. And this I found so interesting.
  1076. And we're starting to get into stuff now
  1077. where I had never heard before.
  1078. A lot of this stuff, when I digged into it,
  1079. I was like, how come everyone doesn't know this?
  1080. Because it's super cool.
  1081. When he presented this paper,
  1082. or I shouldn't say presented this paper,
  1083. when he wrote this paper, he included discriminated unions
  1084. in it, tagged unions, whatever you want to call them.
  1085. If there's FP people out there in the audience,
  1086. they're going to scream at me for using the wrong term.
  1087. But you know what I'm talking about,
  1088. something that has a type in it and then subclasses inside it.
  1089. And you don't know which one you have
  1090. until you look at the type.
  1091. And then you can use whichever part makes sense for that type.
  1092. And this is a super powerful programming idiom.
  1093. I use it all the time.
  1094. And I think it's one of the best programming tools
  1095. you have for things like dynamic polymorphism.
  1096. I absolutely love it.
  1097. It's in this paper in 1966, a long, long time ago.
  1098. And this is his way better than anything
  1099. I get to use today in C++ thing he suggested
  1100. for what you would do when you wanted to use one of these.
  1101. He said it's a switch statement, which, of course,
  1102. wouldn't have been called a switch statement at that time.
  1103. But it's basically a switch statement that says,
  1104. I want to use this object.
  1105. I'm going to tell you what each type, whatever
  1106. the subtypes might be.
  1107. I'm going to give you a different block of code to run,
  1108. depending on which one they were.
  1109. Again, functional programming, I believe,
  1110. would really like something like this.
  1111. It's doing that discriminated union thing.
  1112. And furthermore, he gets the fact
  1113. that this adds type safety and prevents errors.
  1114. He gets the fact that the code that
  1115. would come after the then statements
  1116. can now safely refer to the subtypes
  1117. because you know you've checked what the type actually was.
  1118. And he says that right in the paper.
  1119. So he totally got it.
  1120. he knew way better than any of the knock-on languages,
  1121. sort of, I guess, from C++ on,
  1122. he knew way better even at that time
  1123. how cool discriminated unions would be
  1124. if you had the right language constructs
  1125. to work with them in a type-safe way.
  1126. So I thought that was super-duper awesome.
  1127. Now, if you think about it,
  1128. if this was in the paper, and Simula read the paper,
  1129. and that's how they created Simula,
  1130. or the class concept in Simula and the idea of subclass
  1131. Simula.
  1132. And then C++ came out of Simula.
  1133. Well, why don't we have, like, why wasn't this
  1134. a first order feature?
  1135. Like, where did the discriminated union part go?
  1136. And the answer is, well, Nygaard and Dahl actually
  1137. put it in.
  1138. It was called Inspect.
  1139. So Simula actually had this.
  1140. You didn't have to use virtual functions.
  1141. Simula was way better about that.
  1142. When Stroustrup went to do his classes, he took it out.
  1143. He thought that discriminated users were bad because they
  1144. broke modularity, right?
  1145. It's because now someone from the outside
  1146. can tell what class you are.
  1147. So we lost out on one of what I consider
  1148. would be one of the most important features
  1149. I would use in C++ every day because it got removed
  1150. when Simula was playing Telephone with C++.
  1151. All right.
  1152. So there you go.
  1153. That's where the concept actually comes from, right?
  1154. It's this paper by, you know, Anthony Hoare.
  1155. He's sir now, by the way.
  1156. He's been knighted, I believe, right?
  1157. And again, not a single part of it, there's no hint at all that any of this is really
  1158. about compile time hierarchy stuff, or about large teams, or about anything to talk about
  1159. today, it was literally like, hey, I might have a record that wants to have a type field,
  1160. and it would be cool if I could just switch on the type field and do different things
  1161. based on it. How about that, right? And that's what I would have wanted. So we had that already
  1162. back when this paper circulated in 1966. So really the whole string is about us getting
  1163. a really bad version of discriminated unions.
  1164. We had them already, and now we don't have them.
  1165. To this day, I don't even know a standard variant really works as well as this thing
  1166. would have, right?
  1167. And we could have had it from day one if someone had just believed that this was good.
  1168. All right, so that's the actual end.
  1169. We've gotten back to kind of the point of the first part of the talk.
  1170. Here's another half because it goes way further back than that.
  1171. But I want to give everyone a chance to kind of stretch out.
  1172. So I don't know.
  1173. Can we take a break?
  1174. Where is Sam?
  1175. Can we take a break for a few minutes?
  1176. Yes.
  1177. How long do you want?
  1178. I don't care.
  1179. I can keep going if you don't want, but I figured, yeah, I'll give it a stretch.
  1180. Let's go to 25.
  1181. Okay.
  1182. Get everyone back here whenever that is, at 25.
  1183. Okay, so as you saw in the first part,
  1184. you come to the end a lot of times,
  1185. but then it's like, well, is it really the end?
  1186. You keep digging, turns out you didn't really get
  1187. to the actual meat of the origin story.
  1188. You didn't really get to the part where,
  1189. I don't know, I'm bad with comic books,
  1190. but Bruce Wayne and the Falling Pearls
  1191. and the Joker and that kind of stuff.
  1192. We've actually gotten back to that scene,
  1193. and that's the scene that everyone wants to see
  1194. in the movie, it's like, how did he become Batman?
  1195. So what we're gonna do here in the second half,
  1196. I promise there's only, there's only this one more half,
  1197. there's two halves, I'm not gonna, it's like, yet again.
  1198. What we're gonna do here is,
  1199. we're going looking for Batman, right?
  1200. So, we left off, we've got this paper
  1201. on record handling by horror, right?
  1202. famous for Quicksort, like I said,
  1203. one of the fathers of computer science.
  1204. And the interesting thing is,
  1205. and this was really hard to figure out,
  1206. but I was trying to, like, where did he get the idea?
  1207. Like, did he come up with the idea?
  1208. Was he sitting around?
  1209. What was he working on, right?
  1210. And it was really hard to find this.
  1211. I wish that I could find a document
  1212. where he talks about it.
  1213. If any of you out there ever find a document,
  1214. because, you know, I did the most research
  1215. that I could do in the time that I had
  1216. to figure out where these things came from,
  1217. but I'm sure I missed something somewhere.
  1218. So if I'm not gonna actually figure this out,
  1219. I would love to see it.
  1220. But after a lot of digging,
  1221. I figured out something pretty interesting,
  1222. which was that actually,
  1223. there was this committee
  1224. that was supposed to update ALGOL.
  1225. Now, ALGOL was a programming language
  1226. that was very popular at the time.
  1227. It was in use since the early 60s, actually.
  1228. Actually, it might even have been before that.
  1229. I don't remember,
  1230. it's not that relevant to this particular timeline.
  1231. But what they were going to do is,
  1232. much like Simula had an update from Simula 1 to Simula 67,
  1233. here there's going to be an update of ALGOL up
  1234. to this new version that would eventually be called ALGOL 68.
  1235. And the people who are working on this,
  1236. it's like a who's who of computer science fame, right?
  1237. So horror is on this, and so are a lot of other people,
  1238. like Nicholas Wirth and that kind of people.
  1239. The person invented Pascal or created Pascal, right?
  1240. So on this committee, there was another guy,
  1241. and his name was Douglas T. Ross.
  1242. And this is a name that I had never seen mentioned
  1243. ever before, I have no idea who this guy is.
  1244. And I'm like, wait, what?
  1245. And, oops, sorry.
  1246. And when I was talking about it, it was like,
  1247. oh, you know, in some private correspondence,
  1248. because Alan Blackwell and Kerry Rodden,
  1249. not really a part of the story,
  1250. but they're like, we talked to Hoare privately
  1251. about where he got those ideas,
  1252. And he said that they actually, a lot of them
  1253. came from this guy named Ross, who he had conversations with
  1254. when they were on the committee.
  1255. And I'm like, OK, so what's this about?
  1256. And Ross had this thing he called
  1257. a plex, which is a record-like data structure.
  1258. And apparently, this was something
  1259. that really influenced Hoare's record handling paper, which
  1260. would eventually go on to create the rest of the chain
  1261. that we just went through.
  1262. So that's one thing.
  1263. And another thing is if you look at the other branch,
  1264. the branch that I'm not really covering very much
  1265. in this talk, because again,
  1266. we don't program in small talk these days, right?
  1267. The closest thing you would get
  1268. is maybe something like Objective-C.
  1269. If there's some people out there using Objective-C,
  1270. you know, like Apple was using that for a little while,
  1271. so Objective-C kind of came
  1272. from a small talk background as well.
  1273. So, but it's another huge branch
  1274. of object-oriented programming.
  1275. Small talk was very important.
  1276. It's influential, at least in the research
  1277. or in the understanding of OOP, right?
  1278. It was very pure OOP language.
  1279. It pushed OOP a lot further
  1280. than a lot of other languages by saying everything
  1281. is going to be object-oriented and that sort of thing.
  1282. And of course, it invented the term object-oriented.
  1283. So everything is going to be like Smalltalk, which
  1284. is what object-oriented was, right?
  1285. If you look at what Alan Kay talks
  1286. about for his inspirations, like where did he
  1287. get his ideas from Smalltalk?
  1288. He lists some things.
  1289. And there's something like the Burroughs B5000
  1290. and this file system from an Air Force base
  1291. that had to do mostly with dispatches.
  1292. We could go into that in the Q&A if anyone cares.
  1293. But one of the things he talks about
  1294. is Simula, which we've already covered.
  1295. And the other thing is Sketchpad.
  1296. He talks about Sketchpad all the time.
  1297. This was a hugely impactful thing for Alan Kay.
  1298. And Sketchpad was like this drawing program, right?
  1299. I was aware of Sketchpad.
  1300. Maybe some of you are aware of Sketchpad.
  1301. It's pretty famous.
  1302. You can look up demos of it on YouTube, for example.
  1303. So we've got this Ross guy that I want to look into more.
  1304. I'm like, what's going on?
  1305. And then we've got the Sketchpad thing.
  1306. And I'm like, hmm, I think I remember Sketchpad,
  1307. but I don't really know why that would have inspired Alan Kay
  1308. to do Object-Memory Prize.
  1309. So I'm going to look into this more.
  1310. I want to see, just make sure I've got the whole story
  1311. before I really say the end like I fake did in part one.
  1312. So let's go back even further.
  1313. 1952 now.
  1314. There's this place called the Servomechanisms Laboratory
  1315. at MIT, which is kind of an amazing name.
  1316. I would love to be able to tell people
  1317. that I worked at a Servomechanisms
  1318. library, a laboratory rather.
  1319. But this fellow right here, that is Douglas Ross,
  1320. who now I know exactly who he is and what he did.
  1321. He goes there and he's first on the job in 1952.
  1322. He gets to this laboratory.
  1323. And what their sort of whole mission was,
  1324. this was Department of Defense,
  1325. United States Department of Defense research stuff.
  1326. What they were trying to do is build a system
  1327. where someone from like the Air Force
  1328. could describe a part that they were going
  1329. to try to manufacture, and the computer would just make it.
  1330. It's almost like the birth of 3D printing.
  1331. And they actually did demos of this,
  1332. they had stuff working where you could type in
  1333. a description of an ashtray in this sort of pseudo language
  1334. that they had that was meant to be kind of more,
  1335. it's sort of almost like in a Grace Hopper sense,
  1336. like something that's sort of,
  1337. we're trying to get closer to human language,
  1338. but it's really not human language
  1339. because they don't have the ability to parse that yet.
  1340. I mean, until large language models,
  1341. we didn't have the ability to parse that, right?
  1342. So, when you look at something like this,
  1343. what they're trying to do is say,
  1344. pseudo-language and our milling,
  1345. our automated milling system produces
  1346. like this object out of it, right?
  1347. And they actually have working,
  1348. it's not, they've got it working,
  1349. they have instances of objects
  1350. you can actually look at that they made.
  1351. So they're accomplishing this as well,
  1352. and you have to remember how early this is.
  1353. 1978 is, you know, I date these
  1354. by when the person's talking about it.
  1355. This is the 1950s that they're doing it.
  1356. So they're working on this simulation stuff,
  1357. I'm sorry, this processing stuff where
  1358. they're trying to take language and turn it into sort of CAD,
  1359. the birth of CAD.
  1360. And just to show you how early this
  1361. is in the thinking about what's going on in computing,
  1362. COBOL is generally like, again, in the kind of low effort
  1363. Wikipedia search version, COBOL would
  1364. be the first thing you'd see referenced
  1365. as having things like record-like structs.
  1366. Like, we all take a struct for granted.
  1367. We're like, a struct is like the simplest possible thing.
  1368. It doesn't have inheritance, or it
  1369. doesn't have virtual function calls, or any of that stuff.
  1370. We would just say, if we're just talking about a bare struct,
  1371. a basic vanilla struct, that doesn't really exist.
  1372. No one's thought about that, really.
  1373. They have sort of an idea of data records
  1374. that comes more from data processing,
  1375. like in the old IBM sense of the term.
  1376. So they do have an idea of more of the database version
  1377. of like I've got some fields that comprise like a record.
  1378. But people aren't really thinking like when I program,
  1379. the computer program is also going to be written
  1380. in terms of records that it's using purely for computation,
  1381. not to store a particular piece of data
  1382. like on magnetic tape or something like this, right?
  1383. But it's just purely an artifact
  1384. of the implementation of this program.
  1385. I've defined other records.
  1386. They're not thinking about that.
  1387. And even in this, in 1960, when this was printed,
  1388. this first version of COBOL, even in that 1960 timeframe,
  1389. this COBOL didn't really have that.
  1390. All of its record stuff was pretty much still
  1391. about data on tape kind of things.
  1392. It was in memory as well when you had a mirror of one,
  1393. but it wasn't, no one was thinking really about that
  1394. as far as I could tell.
  1395. They were just thinking of it as storing data.
  1396. Now, Pedants will say that PlanCalcul has this,
  1397. but it was a purely theoretical language,
  1398. just written down on paper.
  1399. It was an early German programming language.
  1400. It's very forward thinking,
  1401. so I don't want to disparage it at all,
  1402. but it doesn't count if you just sort of wrote down,
  1403. well, maybe we'll have this way to put multiple things.
  1404. It's like, no matter how rigorously defined on paper,
  1405. you don't get credit unless you've actually
  1406. got this working and you're actually programming,
  1407. making programs in it that you run, right?
  1408. So really, it's kind of not there at the time.
  1409. So what people are actually thinking about is this, right?
  1410. Lisp is gaining some traction here
  1411. because it's developed over the course of the 1950s as well.
  1412. It gets published officially in 1960
  1413. in this paper by John McCarthy, who obviously was one of the,
  1414. I believe he's sort of the person who designed Lisp.
  1415. And actually, a different person at MIT actually implemented it.
  1416. But that has nothing to do with any of this.
  1417. Point being, he's obviously the father of Lisp,
  1418. because he's the one who had the idea.
  1419. And he's the one that designed it.
  1420. And he's starting to talk about Lisp
  1421. and saying, this is a way that we
  1422. could do symbolic computation.
  1423. Now, remember, Lisp doesn't really
  1424. have any concept of records at this point
  1425. or anything like that.
  1426. It's just sequential bags of stuff.
  1427. So it's like, OK, we're going to have a list of symbols.
  1428. And to the extent that you're ever
  1429. going to do processing on something that's like a record,
  1430. it's just up to you to kind of remember that the symbols will
  1431. go in a particular order.
  1432. And that's how you're doing your processing.
  1433. So they haven't really gotten this idea yet
  1434. of structured data, like this is what the computer's
  1435. going to process.
  1436. They're thinking in terms of processing lists, right?
  1437. Because again, there's no high level languages.
  1438. We've got Fortran coming in this time.
  1439. We've got LISP coming in this time.
  1440. And then these experimental languages, stuff like that.
  1441. We don't have all these languages
  1442. that we know about today.
  1443. So Douglas T. Ross, he's also working on stuff like this.
  1444. They have a programming language that they're working on
  1445. for this computer-aided modeling stuff that they're doing.
  1446. And he's actually thinking, what if we did structured data?
  1447. What if we were computing on things that actually
  1448. had a fixed size?
  1449. And this is all throughout the 1950s.
  1450. They're developing this.
  1451. And in 1960, contemporaneous with that Lisp paper,
  1452. he publishes a paper.
  1453. And in this paper, he keeps it classy.
  1454. Right out of the gate, he basically
  1455. throws shade at Lisp.
  1456. He's like, look, Lisp is kind of dumb.
  1457. Why would we compute only on things that basically
  1458. have a next and previous pointer,
  1459. or like a tree where it just has a left and a right?
  1460. What would give you the idea that the things
  1461. you want to compute on only consist of two things?
  1462. What you're doing is you're just using that,
  1463. and then you're constantly building up
  1464. these structures of two pointer things
  1465. to represent bigger things.
  1466. Why don't we just store the bigger things directly?
  1467. And he knows why.
  1468. He gets it.
  1469. He says, look, not only does it take more space,
  1470. but it also takes more processing power.
  1471. Because we've got to reconstruct the data we actually
  1472. want by plowing through these lists all the time.
  1473. And furthermore, we have to store them
  1474. by keeping all of that interstitial stuff in there.
  1475. And that's no good either, right?
  1476. So he is 100% on point, and this is published in 1960.
  1477. Contemporaneous with the list publication,
  1478. contemporaneous with something like Algol 60.
  1479. So way, way ahead of the curve here, right?
  1480. Because that means they had it running
  1481. throughout the 1950s.
  1482. Now, he calls this a plex.
  1483. He doesn't call it a structure.
  1484. He calls it a plex.
  1485. Because I'm guessing he's bad at self-promotion,
  1486. he never gets this term to stick anywhere,
  1487. so we don't type Plex in front of our thing.
  1488. But to be completely honest,
  1489. as far as I can tell from history, we should.
  1490. It should be called a Plex.
  1491. We should pound to find Plex to be struct,
  1492. because that's where the credit actually goes to.
  1493. It's this guy right here,
  1494. and the other people that were on that team.
  1495. So what does it look like?
  1496. This is one of the great things about this era.
  1497. Everyone publishes everything.
  1498. It's really nice.
  1499. And it has to be condensed down into a paper
  1500. because there's no YouTube.
  1501. So I don't have to watch hours and hours and hours of things
  1502. to find out what the heck is going on.
  1503. This is an example of a complicated Plex.
  1504. This is in the original paper in 1960.
  1505. And what does it have in it?
  1506. Well, it has some data, an x and y coordinate, for example.
  1507. Just things that you might store
  1508. like you would normally data members.
  1509. It also has pointers already.
  1510. These are basically things that are linking it to other things.
  1511. So we've got data members.
  1512. We've got linkage members.
  1513. And hold onto your butts, because what is this stuff
  1514. down here?
  1515. What is that?
  1516. And I'm loving this, by the way, when
  1517. I find this stuff in papers.
  1518. Because I don't like to just read the abstract.
  1519. I want to read the whole paper.
  1520. I paid my money, and I want to see the whole movie to the end.
  1521. Even with the end credits, even if the movie sucks,
  1522. I kind of want to know.
  1523. I'm just curious right now.
  1524. So I'm looking at this.
  1525. I'm like, what the heck is that?
  1526. TRA 562?
  1527. Like some secret code stuff going on.
  1528. So what these actually are, and this is awesome,
  1529. is check and fast are basically flags.
  1530. And what Ross says is, look, when
  1531. we're processing this stuff, think of it this way.
  1532. We could run one subroutine, and just
  1533. based on what we stick in the Plex,
  1534. we could change how we're processing it.
  1535. So if we do want this thing to go through a particular path,
  1536. we set it.
  1537. And if we don't want to go through a particular path,
  1538. we don't set it, right?
  1539. Just pausing for effect on that one.
  1540. What's TRA 562?
  1541. What's TRA 467?
  1542. Those are addresses.
  1543. That's an instruction.
  1544. It's saying what we're going to do there
  1545. is jump to a subroutine.
  1546. Those are function pointers.
  1547. So he basically says, sometimes, we
  1548. don't really want parameterization
  1549. of what's going to happen.
  1550. We just want a completely different thing to happen.
  1551. And there is where you basically have your virtual function
  1552. staring you right in the face right there in 1960,
  1553. contemporaneous with Lisp.
  1554. So I'll just say, our team, yeah, I was clapping for him, too.
  1555. I was clapping for him, too.
  1556. Ryan, Team Fat Struct, we started in 1960 right here.
  1557. We're like the old sort of thing at a university, like the old sort of the club, right, that's been going forever.
  1558. We got roots, man.
  1559. Roots, we've got hardcore stuff on our side.
  1560. All right.
  1561. So he throws up an example.
  1562. He's like, hey, let's suppose we want to model a line.
  1563. Because remember, he's working on CAD.
  1564. He wants to be able to type in, this
  1565. is the shape of the airplane engine.
  1566. And out comes the engine.
  1567. So we're trying to think about things, how do we model lines,
  1568. how do we model surfaces, that sort of thing.
  1569. He's like, well, one thing we could do
  1570. is we could take the data for the line
  1571. and we could put it in there.
  1572. So those are like names of things and x and y
  1573. coordinates things for like points.
  1574. And then we could have connected up with pointers.
  1575. So a line would have a pointer to two different points.
  1576. And the points would point back to the line.
  1577. And we'd make basically a winged edge data structure, right?
  1578. I mean, these guys were off the charts
  1579. with what they were doing.
  1580. It's kind of crazy, but it doesn't stop there.
  1581. So that is at the Servo Mechanisms Lab, which later
  1582. gets renamed to Electrical Systems or something.
  1583. It's a lab that's still around today, I believe,
  1584. but it has a slightly different name.
  1585. I think it might have said it was even one of the longest
  1586. running labs.
  1587. Anyway, so hardcore.
  1588. But there's another MIT, it's not on the main campus
  1589. in Cambridge.
  1590. It's off in Lexington.
  1591. It's called the Lincoln Laboratory, also very prominent.
  1592. And this is the other side of a story.
  1593. Remember I said we have this thing where
  1594. C.A.R. Horace saying, I got these ideas from Ross.
  1595. He was pretty cool.
  1596. And then we also have that Alan K. part
  1597. where he's talking about, hey, Sketchpad.
  1598. So we haven't talked about Sketchpad.
  1599. We found out about Ross, and he was hardcore.
  1600. What about Sketchpad?
  1601. How hardcore is that?
  1602. Well, this is Ivan Sutherland.
  1603. He's the guy who made Sketchpad, largely by himself,
  1604. like he pretty much wrote it, again, lone wolf style.
  1605. And he comes to the Lincoln Laboratory
  1606. in the summer of 1960 as an intern originally.
  1607. But he ends up doing his PhD at MIT here.
  1608. So this is what he's doing.
  1609. And in the course, there's these computers
  1610. called the TX series.
  1611. There's like TX0 and TX2.
  1612. And they're basically made by this guy named Wes Clark.
  1613. He's at MIT, and they're making the computers, right?
  1614. I mean, that's the way this stuff worked back then,
  1615. is the university actually had to make computers
  1616. that they would use, because nobody knows what a computer
  1617. even is yet, and they're building different versions
  1618. of them, figuring out what the heck's going on.
  1619. And this TX series of computers, they
  1620. were pretty unusual, because they actually had a display.
  1621. Like, we're back in the 1950s, right?
  1622. So the idea that a computer was going to draw a picture for you
  1623. that wasn't on a plotter that would draw on a piece of paper
  1624. is completely unheard of.
  1625. No one's doing anything like that.
  1626. It's very rare.
  1627. And so there's only a few places in the world
  1628. that even have a computer that can display something.
  1629. But the TX series of computers can.
  1630. And this guy who was architecting them,
  1631. that Wes Clark guy, he was very forward-thinking as well.
  1632. And he was basically saying, I think there's something here.
  1633. I'm going to make it so it can integrate with a light pen that
  1634. can see what's on the CRT, and I'm
  1635. going to have the CRT be able to display stuff
  1636. that the computer has.
  1637. So he makes this new computer called the TX2,
  1638. which is an iteration of TX0.
  1639. There's no TX1, I'm told.
  1640. I don't know the story behind that.
  1641. But he makes a thing called the TX2.
  1642. And obviously, when you make something like this,
  1643. it's hard to get time on it, because there's
  1644. this one that was built.
  1645. But he makes this, and it's under a thing for the Air
  1646. Force, the US Air Force, where they don't really
  1647. care what you do with this computer.
  1648. They were funding it not because they
  1649. wanted MIT to compute something for them,
  1650. but because they wanted MIT to figure out
  1651. what happened with large arrays of transistors for computing.
  1652. Like, if we make big computers, what happens?
  1653. So this is very helpful, because it
  1654. means that the computing time on the computer
  1655. isn't necessarily being taken up by some specific grant thing
  1656. that they have to do.
  1657. It's more flexible.
  1658. So, Ivan Sutherland manages to convince Wes Clark
  1659. that he's got this idea for being able to draw
  1660. on the surface of the thing, make like a drawing program.
  1661. Could he have a slot on the TX2?
  1662. And thank god Wes Clark said yes.
  1663. Because, from then on, Sutherland went in
  1664. at four in the morning,
  1665. because that was the slot that was open,
  1666. to work on this thing.
  1667. That's the TX2.
  1668. And that right there is actually Sketchpad running.
  1669. And so he would work on this.
  1670. And I mean, when I say work on this,
  1671. you'll notice it's not like a keyboard.
  1672. You're not typing in code into an editor.
  1673. It still had to be manually entered in various ways.
  1674. There was actually a secretary who would enter some of it.
  1675. He entered some of it.
  1676. So it's very laborious to develop things in the 1950s,
  1677. again, just to kind of hammer that home.
  1678. These guys did not have much to work with.
  1679. So he's working on this Sketchpad program.
  1680. And what you could do with it is stuff
  1681. that we completely take for granted today,
  1682. as something you could just do.
  1683. You could do things like draw lines with the light pen,
  1684. just like we would with a mouse.
  1685. And it's actually fairly intelligent.
  1686. It knows things like snapping.
  1687. Like if you go and you're going to connect back to a point,
  1688. it knows that.
  1689. It's not stupid, right?
  1690. So it's not just doing random line drawing.
  1691. It's thinking about those lines as well.
  1692. We'll talk a little bit more about that,
  1693. because there's a lot more to cover there.
  1694. But Alan Kay, who I said was the person who's
  1695. got us into this in the first place,
  1696. the reason we're looking into it,
  1697. he calls Sketchpad, the eventual thesis
  1698. that Ivan Sutherland would publish on it,
  1699. he calls it the most significant single thesis ever done.
  1700. He says that it was like so impactful and so important,
  1701. not just to him, but to everybody,
  1702. and honestly, he's probably right.
  1703. Out of Sketchpad comes a lot of research
  1704. in computer graphics, it comes the whole
  1705. object-oriented concept from Alan Kay,
  1706. the whole idea of interacting with the computer
  1707. in this way is very, very new.
  1708. CAD, and the idea of a CAD program,
  1709. kind of comes out of this as well.
  1710. Now, it's so early in computing,
  1711. I just wanna hammer home one more time,
  1712. the kinds of things that Sutherland talks about
  1713. if you read about his experience with Sketchfab Developing
  1714. at the time when he published the thesis,
  1715. no one's ever even thought about like,
  1716. if I want to draw a line and then change where it is,
  1717. I don't have to erase the line anymore.
  1718. I could just move where it is.
  1719. This is a completely new concept
  1720. that no one's ever thought about before
  1721. because for the rest of history,
  1722. if you drew a line, you had to at least remove that line
  1723. before you drew it again, right?
  1724. So they're literally figuring out here in real time
  1725. the kinds of paradigms that we just take
  1726. completely for granted when you sit down
  1727. and use a computer.
  1728. The fact that you can move things around
  1729. by pointing at them, completely new.
  1730. That's what we're talking about here.
  1731. Another example of that is rubber banding.
  1732. They were thinking, oh, when you draw a line,
  1733. you must have to move the light pen along the line
  1734. to draw the line, just like you would with a T-square
  1735. or something like that, right?
  1736. And they were like, wait a minute.
  1737. We could just have the light pen attach
  1738. the end of the line and move it around
  1739. until you got it where you want it,
  1740. and then you could let go and that would be where it was.
  1741. So even basic stuff like this was news to them.
  1742. They were discovering it, right?
  1743. So it's really, really early.
  1744. That's how early we're talking about.
  1745. Now, as fate would have it, when he's working on this program,
  1746. who walks in but Mr. Douglas Ross.
  1747. They were at separate laboratories,
  1748. but they did talk to each other a lot.
  1749. And the reason for that was because Ross's group
  1750. is working on CAD.
  1751. They're not displaying much about it, right?
  1752. They're not working interactively,
  1753. but they're trying to do these machined creations that
  1754. are based on human input.
  1755. So because Sutherland's pretty new to this stuff,
  1756. he talks to Ross and he's like,
  1757. how do I make stuff like lines?
  1758. How do I do that kind of data modeling in the computer?
  1759. Do you guys have ideas?
  1760. And Douglas Ross is like, have I got an idea for you?
  1761. It's called a Plex, right?
  1762. And as we saw, a Plex is pretty awesome.
  1763. And Ivan Sutherland is probably one of the smartest people
  1764. on planet Earth, so he recognizes right away
  1765. this is a good idea too.
  1766. So he's like, all right, we're doing it, right?
  1767. He says, what I'm going to be making this program to do
  1768. is have a bunch of primitives, like I've
  1769. got lines and things like that that I'm going to create.
  1770. And I don't have that many types of things.
  1771. I'm just going to have lines.
  1772. And later, actually, it was Claude Shannon,
  1773. the father of information theory,
  1774. who says you should put circles in it, too.
  1775. So there's all these kind of little answers.
  1776. If you actually go read this yourself,
  1777. you'll find there's so many things
  1778. I couldn't fit in this lecture because it would have been
  1779. like eight hours.
  1780. But anyway, so he's saying we're going
  1781. to have all these instances of things, lots of lines
  1782. and stuff like that.
  1783. So I don't really need anything more
  1784. than just this end component thing,
  1785. and I'll just have lots of those,
  1786. and that's how we'll do it.
  1787. This is how I'm gonna write the program.
  1788. And here's his diagram from his thesis
  1789. about how he's going to structure, right,
  1790. or how he did structure lines and points, right?
  1791. And there's some information missing from this,
  1792. because, you know, I mean,
  1793. if you're sketching things in Sketchpad
  1794. with that light pen and it's very slow, right,
  1795. it's not, he can't make slides with software
  1796. like we have today.
  1797. Not that the software I used to make the slides
  1798. was particularly better than Sketchpad,
  1799. but you get the idea.
  1800. So it's not completely documented in here,
  1801. but you can see here it's got the line,
  1802. it's got a pointer to each of the points and so on
  1803. in accordance with sort of sketching that out.
  1804. And hey, it's exactly like that paper from Doug Ross, right?
  1805. And Doug Ross published this in 1960,
  1806. so Ross and his team were already thinking
  1807. along these lines before Sutherland even got to the lab,
  1808. right, and started working on Sketchpad
  1809. in the later, a little bit later in the early 60s.
  1810. So that's how this whole thing ties together.
  1811. Ross and Sutherland are having a huge party here,
  1812. and it's awesome.
  1813. And if you remember, we had these things in the Plex that
  1814. were basically like jumps, right?
  1815. They were like subroutines.
  1816. They were the virtual functions of the time,
  1817. or we maybe would call them not so virtual functions.
  1818. Well, you could implement that way.
  1819. We just called them function pointers, right?
  1820. And you can do all the same things
  1821. you can do with a function pointer.
  1822. That was something that Doug Ross was talking about
  1823. in his Plexes in the original paper,
  1824. and it's right there in Sketchpad as well.
  1825. This is how he did things like, I
  1826. want to go ahead and draw this shape,
  1827. but I don't want to bother having
  1828. actual different data types be completely specialized,
  1829. having the routines completely specialized.
  1830. So what I'll do is I'll just have
  1831. a few entries in the data type that say, how will I display it?
  1832. What would I jump to display it to figure out how big it was
  1833. or to move it?
  1834. So again, virtual functions right there.
  1835. They come from the plexus.
  1836. He puts it in, and that is how he actually
  1837. implemented that kind of parametric behavior
  1838. in this program, in Sketchpad.
  1839. Now, because we've already got one applause line
  1840. before for this kind of thing, I'll just point out,
  1841. there's empty space in between these things here.
  1842. And on the previous one, I was like,
  1843. well, the reason that there's empty space on those
  1844. is because we probably didn't have time to draw it out.
  1845. And that was true for that diagram,
  1846. because I know more about the data structure
  1847. because I've spent way too much time looking at this program.
  1848. But in this one, those are actually space in the struct.
  1849. Those fields there, there's gaps.
  1850. So why are there gaps?
  1851. Why are there gaps in this thing?
  1852. And I wanted to know, so I'm combing through this.
  1853. This is like, what are the gaps about?
  1854. Is it just the same as the other one,
  1855. where it was like you just didn't draw it in there
  1856. or something?
  1857. What are the gaps about?
  1858. I found it.
  1859. At present, all generic blocks still
  1860. carry space for all the information in any of them
  1861. simply because of historical reasons.
  1862. This accounts for the spaces seen in figure 3-7.
  1863. What this means is Sketchpad is on Team Fatstruck, right?
  1864. In 1963, he was still doing the same thing
  1865. that the Plex was doing.
  1866. He was just saying, look, I don't really
  1867. maybe I should have gone back and tried
  1868. to figure out some way to compact these.
  1869. But you know what?
  1870. We didn't end up doing that.
  1871. And so he kind of just has that mention there.
  1872. It's like, yep, all of them are the same size,
  1873. and we just leave those fields out
  1874. if they weren't going to be there, right?
  1875. So I'm bending it a little bit there,
  1876. because in the Sketchfab paper, it's
  1877. very hard to tell exactly the way,
  1878. because he doesn't give explicit data layouts for a lot
  1879. of things.
  1880. It's hard to tell whether or not he was using things that always
  1881. had fat struct, or whether it was more
  1882. like semi-discriminated unions, so there
  1883. were pairs of things that would have been used differently.
  1884. So it's either team fat struct or team overlay fat struct,
  1885. but it's one or the other.
  1886. All right, so we've come to the part where we can build our tree.
  1887. As far as I can tell, it doesn't go any deeper than this.
  1888. This is where it actually started for reals this time.
  1889. Doug Ross and his team, this idea of plexes.
  1890. It goes to Ivan Sutherland because he works there,
  1891. and he asks us for their advice on how
  1892. to build the stuff in Sketchpad, and he picks up the plex
  1893. concept.
  1894. It also goes to CAR Horror.
  1895. That plex concept goes to him because they sit on the ALOL
  1896. committee together.
  1897. So that's our first branch.
  1898. We then have that horror paper was read by Dahl and Nygaard,
  1899. who decide to use it to create their Simula class idea.
  1900. And both of those, the Simula and Sketchpad,
  1901. influence Alan Kay to create the Smalltalk branch of OOP.
  1902. Meanwhile, the experience with Simula
  1903. influences Bjorn Stroustrup to create C with classes,
  1904. and then C++.
  1905. Now, by the way, this is an inheritance hierarchy
  1906. that matches the domain model.
  1907. But there's a fun part of it.
  1908. Some of you may know this, some of you may not, because, I mean,
  1909. why would you?
  1910. Obviously, we know C++ has multiple inheritance.
  1911. It got multiple inheritance not right away,
  1912. but it got it eventually.
  1913. Smalltalk never did.
  1914. Single inheritance.
  1915. However, single inheritance will get you C++.
  1916. but it won't get you small talk.
  1917. You need two parents, right?
  1918. What can I say?
  1919. So that's the actual end.
  1920. Now we've built our tree, we're finally done,
  1921. we know where this stuff came from, whew, right?
  1922. It was long.
  1923. Of course, there is a personal angle to this as well,
  1924. so I should probably say
  1925. that the reason I decided to go do all this,
  1926. it probably wouldn't be, you know,
  1927. I'm on that thing called the internet all the time.
  1928. And most of the time, I'm just gonna post something snide
  1929. as a reply and not think about it again.
  1930. So why did I actually go and do all this research
  1931. just for this?
  1932. Why didn't I just say, who cares about these things?
  1933. I don't use those compile time hierarchies
  1934. and just post something mean on Twitter.
  1935. Why didn't I do that this time?
  1936. It would have saved me a lot of time.
  1937. Of course, I wouldn't have had anything to present today,
  1938. but it would have saved me a lot of time.
  1939. Well, here's why.
  1940. Back in 1997, which by the way is right around
  1941. the same time that we started this talk, right?
  1942. The Looking Glass stuff that they did
  1943. with Entity Component Systems was 1998,
  1944. which means they would have been working on it in 1997.
  1945. It would have been up and running at that time,
  1946. so it's right at the same time.
  1947. I'm working with a fellow called Chris Hecker,
  1948. And I'm brand new.
  1949. I am literally out of high school.
  1950. So I don't know anything.
  1951. I programmed a ton as a kid.
  1952. But if you asked me my thoughts on computer architecture
  1953. or something like that, I obviously
  1954. would have answered very confidently
  1955. and been completely wrong about everything.
  1956. So he says, we're going to need a level editor.
  1957. This is basically a game that we're working on.
  1958. We need a level editor that does CSG on spheres.
  1959. So the idea was you take these spheres
  1960. and you build a level up out of unioning them together,
  1961. like a standard CSG modeling kind of stuff.
  1962. But of course, I don't really know any CSG stuff.
  1963. I really know how to do that.
  1964. So I go using, I think it was Sightseer at the time.
  1965. Nowadays you might use Google Scholar or something
  1966. to search for papers.
  1967. So I go to use Sightseer, I think was up at the time,
  1968. or maybe there was a precursor to it,
  1969. and I can't remember the actual one,
  1970. but there were things at the time, even then, this early,
  1971. because the internet's only been available to the public
  1972. for a short time, really.
  1973. Like it was ARPANET until the mid-90s, right?
  1974. So when we're looking at this, I go to crawl papers
  1975. and I'm like, okay, CSGN spheres,
  1976. like to try to type some things in,
  1977. read some papers, what am I gonna do?
  1978. And I come across this thing called alpha shapes.
  1979. And alpha shapes are just the name
  1980. that someone in a paper had given to something
  1981. that was basically implicit services.
  1982. I don't really know why they call it alpha shapes
  1983. because it escapes me now.
  1984. I'm sure I knew at the time
  1985. because I had just read the paper,
  1986. but for somebody that were talking about these alpha shapes,
  1987. I looked at them and was like, oh, it's like spheres,
  1988. But when you move them together, they
  1989. make this nice, smooth joint.
  1990. They don't make that hard edge.
  1991. And I was thinking, oh, for levels,
  1992. that would be really cool.
  1993. That might be way better than if we did CSG on spheres,
  1994. because it would have this really cool effect.
  1995. So it was going to be on the inside of these things, which
  1996. are typically called metaballs.
  1997. And it was going to be the negative space
  1998. of the metaballs.
  1999. So I made a modeler for this, and I
  2000. called it MegaMan, which has nothing
  2001. to do with MegaMan, completely legalistic from that.
  2002. It's kind of changed one letter, and maybe it's the same.
  2003. But nothing to do with this.
  2004. It's just negative space metaballs.
  2005. And this is what it looked like.
  2006. And effectively, what you did is you picked things in it.
  2007. You can see those spheres there are metaballs.
  2008. They're the kind of spheres you put together.
  2009. And they form these kind of surfaces.
  2010. And we're seeing the inside of what you're creating, right,
  2011. because it's a negative space.
  2012. So that's why it looks kind of weird.
  2013. You would normally see the outside in a metaball modeler.
  2014. But this is what I was working on.
  2015. Well, I mean, and it's finished.
  2016. You can use it.
  2017. I still have it to this day, you can model stuff around.
  2018. It's pretty janky, but it does what it's supposed to do.
  2019. And so the way that you interacted with it
  2020. is you picked those spheres and you could move them around
  2021. by dragging the mouse and that sort of stuff.
  2022. The same sort of things that Sketchpad was doing,
  2023. only with much better hardware and much more advantages
  2024. in terms of development, same kind of idea
  2025. because Sutherland was so far ahead.
  2026. And so if you wanted to create stuff,
  2027. you might select things like here,
  2028. I don't know if you can see it,
  2029. I've selected those two meta balls at the top,
  2030. and then I've just like, there's a thing
  2031. you could like rapidly stamp them down,
  2032. I kind of just drag them, like stamp, stamp, stamp, stamp,
  2033. and you can create more of the level,
  2034. just kind of like blobbing things together.
  2035. So it was a selection-based UI, like most programs are,
  2036. where I select a bunch of things,
  2037. and then I wanted the program to basically
  2038. have a nice architecture for being able to do that,
  2039. and then present the user with the user interface
  2040. that would be appropriate for that selection.
  2041. And this is actually a really hard architecture problem
  2042. if you're not experienced, which I wasn't.
  2043. Because it's like, well, if what you've been told
  2044. is that you make these hierarchies,
  2045. like these class hierarchies and things like that,
  2046. and what we're really saying is,
  2047. I'm gonna select all these things
  2048. that are really derived types of things,
  2049. but now I want this higher level thinking thing
  2050. to look across everything that you've selected
  2051. and come up with a plan for what the unified interaction
  2052. would be across those things.
  2053. And then when you actually wanna do the interaction,
  2054. it's gotta make sense for what's going on.
  2055. And this is really tricky, because the Inheritance Hierarchy
  2056. thing doesn't help you at all for this.
  2057. It fights you.
  2058. You're constantly like, oh, do I just
  2059. add a bunch of functions to the base class that's
  2060. anything you might want to do to a class?
  2061. You basically fatty struct your interface,
  2062. but leave the hierarchy in place.
  2063. There's all these things you might think to do,
  2064. and they just don't work very well.
  2065. But I was pretty gung ho at the time.
  2066. I'm not old like I am now.
  2067. So at the time, I don't mind typing a lot.
  2068. So I go to town on this.
  2069. I'm like, all right, I'm going to try
  2070. to figure out how to do this cleanly, quote unquote,
  2071. and we end up with crap like this.
  2072. Now a lot of times I try to convince people.
  2073. I'm like, look, everyone thinks that I was
  2074. like some C-only programmer.
  2075. I just don't know anything about like huge, crazy, hairy,
  2076. object-oriented programming or anything like that.
  2077. It's just like you don't understand.
  2078. It's like, no, dude, I wrote some of the most ridiculous
  2079. oops stuff you have ever seen when I was, like, 20.
  2080. I was doing crap like this all the time.
  2081. It was awful.
  2082. I'm not proud of it.
  2083. But here is what's going on, right?
  2084. So the way I chose to solve this problem,
  2085. never mind the fact that I'm doing the implementation
  2086. inheritance thing up there with a template on the class.
  2087. Have you ever seen this trick?
  2088. It's an old school.
  2089. So it's like, there's so much stuff in this code base,
  2090. you would, it's a nightmare.
  2091. But anyway, so if you look at what's going on here,
  2092. I have get and set functions like you're supposed to have
  2093. on any proper object.
  2094. And you can get the center, you can set the center,
  2095. that sort of thing, get the service radius,
  2096. set the service radius, right?
  2097. And now what I want to do is I want to have some way
  2098. that these can be interacted with in a unified way.
  2099. So what do I do?
  2100. Anytime you create one of these things,
  2101. I build a parallel structure.
  2102. I create a property list that basically is callbacks
  2103. using, this is called a rich hickey functor.
  2104. I'm not kidding.
  2105. It was a callback that you could use
  2106. to do type-safe callbacks back in the early days of C++.
  2107. I'm trying to tell you, where's the camera?
  2108. Seriously, I have done ridiculous OOP stuff.
  2109. If you don't believe me after seeing this,
  2110. I do not know what to tell you.
  2111. We can post more of this code if we need to.
  2112. So anyway, so basically, when it's created,
  2113. it creates a parallel hierarchy that's just,
  2114. it's not actually the properties.
  2115. It's just callbacks that would get and set the properties.
  2116. And then, this is what that class looked like.
  2117. Here's the get and set callbacks abstracted into a property.
  2118. And then, if you wanted to use it,
  2119. you could loop over the properties.
  2120. You could create a modification that
  2121. was typed on the property to do the changes you actually
  2122. wanted to do.
  2123. OK, and that's the support like dragging and undo
  2124. and things like that.
  2125. So this is what it looked like if you drew it out.
  2126. I have a metaball with a radius and center.
  2127. The data's in the metaball, just like a good object-oriented
  2128. programming thing would tell you to do.
  2129. It's encapsulated inside the metaball.
  2130. I create parallel, I call them property universes.
  2131. I create property universes, all of the center properties,
  2132. all of the radius properties, and they
  2133. are callbacks to modify or retrieve
  2134. the data in the actual entity here, right, the meta ball.
  2135. And then when you interact with it,
  2136. you use modifications to interact.
  2137. And this way, when I wrote the code,
  2138. I could think about things in terms of the center
  2139. or in terms of the radius.
  2140. So what I'd do is when you multi-selected,
  2141. I'd go, what are all the property types that you've had?
  2142. And I'll just make interactions that
  2143. work with those property types.
  2144. And I'll put up little UI elements
  2145. that work with those property types.
  2146. If the diagram looks familiar to you,
  2147. it's because you have a good memory,
  2148. because this talk is very long.
  2149. If I had a brain, I would have realized you don't need that.
  2150. Just put the properties in the actual universes themselves
  2151. and use an ID for lookup, and it's an entity component
  2152. system.
  2153. It's the same architecture.
  2154. It's just I sucked at it, and Looking Glass was good.
  2155. That's the difference, right?
  2156. So anyway, this was the slide I showed at the beginning.
  2157. This is the slide that I did.
  2158. You see what I'm talking about, right?
  2159. My bad, right?
  2160. This was my bad.
  2161. I screwed up.
  2162. I say that I don't blame myself because I was a kid, but really, I mean, I should have
  2163. thought it through.
  2164. So anyway, in 2024, when I was accidentally on the internet
  2165. like I should not have been, I'm thinking to myself,
  2166. how the heck did Sketchpad do this anyway?
  2167. Because they must have had the same problems that I had,
  2168. because he could do all this stuff.
  2169. It wasn't just a shape drawing program.
  2170. I withheld some information from you
  2171. if you've never seen Sketchpad before.
  2172. I apologize.
  2173. It's for dramatic effect.
  2174. worth it, trust me.
  2175. It could do a lot of other stuff than just draw.
  2176. The just drawing stuff is the stuff
  2177. that Adobe copied or things like that,
  2178. because that was the part that they could understand.
  2179. The hardcore stuff, only Sutherland knows how to do.
  2180. And here's what that looks like.
  2181. You could say I want these lines to be
  2182. perpendicular to each other, and it would do it.
  2183. You could take a drawing like this
  2184. and pick a point that's not even a point.
  2185. It's the intersection of two lines.
  2186. And not just snap, but say, I want this radius from now on
  2187. to always have its center point, like the circle arc,
  2188. it's going to be drawn around that intersection.
  2189. And not for snapping, but for always.
  2190. So that if I then go do some constraints on this thing,
  2191. which Sutherland's about to do, he's
  2192. going to say make that perpendicular to that,
  2193. perpendicular to that, perpendicular to that, which
  2194. you can't do in anything from Adobe.
  2195. You have to go get AutoCAD or something for this.
  2196. And by the way, AutoCAD didn't add it till like 2007
  2197. or something like this.
  2198. They didn't have it in AutoCAD.
  2199. When you tell it those things, you say, OK,
  2200. that's what I want my shape to be.
  2201. It'll just solve it for you.
  2202. And if you move it, move the points around,
  2203. it'll solve it again into whatever the closest shape is,
  2204. using like a relaxation least squares kind of thing.
  2205. And I'm like, what the heck?
  2206. I remember this, because I'd seen this demo before.
  2207. And I'm sitting there thinking, you
  2208. know, that whole compile time hierarchy thing,
  2209. and Alan Case, he saw a sketch pad.
  2210. So I'd known those parts, all the details
  2211. I had to learn for this talk.
  2212. But I'm like, what the heck did he do?
  2213. He's working on this crap computer.
  2214. I get that he's way smarter than me, so fair enough.
  2215. But he still had to do something, right?
  2216. So what did he do?
  2217. What does a really smart person do
  2218. when they're faced with this situation?
  2219. Because he's creating stuff that people
  2220. who came after him, who have crazy debuggers and WYSIWYG
  2221. editing and the ability to run things quickly and iterate,
  2222. they don't have to go in at 4 in the morning
  2223. and enter things manually into a computer.
  2224. How did he do it?
  2225. Because no one did it afterwards for decades.
  2226. So let's take a look.
  2227. If we go in and we look at how he represented
  2228. constraints.
  2229. He represented constraints by saying,
  2230. there's going to be variables that are constrained.
  2231. So I'm going to have some variables.
  2232. Things like this point or this line, that sort of thing,
  2233. would be considered a variable in the system, something
  2234. that is like a very primitive element of the system.
  2235. So it could do that.
  2236. You'd pick those, and then you would
  2237. have a certain type of the constraint,
  2238. essentially, which is like, what am I actually
  2239. going to be doing with this particular constraint?
  2240. But they're relatively generic in this way.
  2241. And then the things you could constrain, scalars, points,
  2242. instances, text, digits, and dummies,
  2243. these are the different things you could constrain.
  2244. They're sort of all, again, almost team fat struct there.
  2245. They're kind of like all things you can reference
  2246. as a variable without needing to know
  2247. which one you're looking at.
  2248. And so you can remember when we were talking about
  2249. here's how those lines and points are,
  2250. the line would not necessarily be something
  2251. that was constrained, right?
  2252. Because it's a bigger thing than these are.
  2253. But the points would potentially be something
  2254. that was constrained, right?
  2255. So you might say things about them in that way.
  2256. And I don't know all the specifics
  2257. of how the constraints work,
  2258. because he doesn't publish,
  2259. like in the thesis it only talks about to a limited degree.
  2260. So I can't give you a perfect breakdown
  2261. of exactly every piece of the system,
  2262. but I mined as much out of it as I could.
  2263. And he goes on to talk about how this thing was architected
  2264. so that he could solve things.
  2265. He said, the ring structure,
  2266. which we have not looked at yet,
  2267. was designed to permit rapid constraint satisfaction.
  2268. So what is this ring structure?
  2269. What does he mean by that?
  2270. But he's pinning it on that.
  2271. He's saying the ring structure was really important,
  2272. and that's what's letting us do this stuff.
  2273. He also says, all references made to a particular end
  2274. component element or block are collected together
  2275. by a string of pointers which are written
  2276. to that block, which is kind of a type of ring structure.
  2277. And he says, this, which really throws you for a loop
  2278. when you're first reading this thesis, in the data storage
  2279. the separation of general and specific
  2280. is accomplished by collecting all things of one type
  2281. together as chickens, which belong to a generic hen.
  2282. Now I will save you the trouble, those of you
  2283. who want to read this thesis, about what those mean.
  2284. A hen is a sentinel of a linked list.
  2285. A chicken is a link in a linked list
  2286. that points back to the Sentinel, essentially.
  2287. So here is how the data is laid out.
  2288. Type is a chicken.
  2289. Link, quote unquote.
  2290. Spec B is a hen.
  2291. So now when we go back to this type
  2292. that we've already looked at, we can see them up there
  2293. at the top.
  2294. Type is the chicken.
  2295. Spec B is the hen.
  2296. This is sort of the workhorse of the structural elements
  2297. of this system.
  2298. And the way that it works is that chicken at the top
  2299. links it into a giant linked list
  2300. with all of its siblings at its level of whatever it's doing.
  2301. And the spec b hen is the sentinel
  2302. for the list of all the things that are subordinate
  2303. to this thing.
  2304. So it's like an up and down kind of a thing
  2305. that's going on there.
  2306. So chicken and hen.
  2307. Here is how he actually draws it.
  2308. You can see it's just a linked list, exactly like we expect.
  2309. Key or hen threw me for a long time until I got it.
  2310. Key or hen just means hen.
  2311. For some reason, in the paper, he has,
  2312. he never says what a key is until this one part
  2313. where he's like, sometimes I also call a hen a key.
  2314. So anyway, okay.
  2315. He then goes on to present this.
  2316. And this is the runtime structure of Sketchpad.
  2317. You start with a universe, and it has a sentinel, or hen, right?
  2318. It has a sentinel that has a ring inside of which is variables, holders, constraints, and topos.
  2319. Again, not a compile-time hierarchy, actually a runtime set of rings, right?
  2320. So this is not baked into the compilation of this program in any particular way.
  2321. It's just how the rings are structured at runtime when they are built.
  2322. There are variables, holders, constraints, and topos, the ones we care about in this case.
  2323. We don't really care about the holders much for understanding,
  2324. But the topos, the line circles and pictures,
  2325. pictures are just like copies of things,
  2326. like copies of other drawings, right?
  2327. So the topos are the things that we're actually
  2328. sort of the users interacting with at a higher level.
  2329. The variables sometimes, like they see points
  2330. and things like that, or text things they can edit.
  2331. The topos are made up of those variables, right?
  2332. A line is made up of points.
  2333. And then the constraints are things that you apply to them.
  2334. Now it's important to notice,
  2335. this is sort of, you could say,
  2336. the opposite of encapsulation.
  2337. What this structure implies is that at any time,
  2338. any part of the system can go looking at anything.
  2339. It's almost like a complete introspection system
  2340. for what's going on.
  2341. A topo, for example, that is a line
  2342. is not encapsulated at all.
  2343. The two points that make it up are just
  2344. floating in the breeze over there that you can go just grab.
  2345. And you can do whatever you want to those points
  2346. without that thing even knowing that it happened.
  2347. So it's almost like the most unencapsulated thing
  2348. that you could possibly imagine, which is probably
  2349. why it was so cool.
  2350. But if we draw it, it kind of looks like this.
  2351. The topos, you have a circle, it's got a radius and a center.
  2352. It has pointers out to those actual things,
  2353. which we call variables.
  2354. Those are the scalars, those are the points.
  2355. And if we have something like constraints
  2356. operate on them, it just points into those things.
  2357. And all of these pointers are typically bidirectional.
  2358. That ring structure is allowing you to walk in both directions
  2359. if you want to.
  2360. But this is the way that you're actually conceptualizing
  2361. the link in those cases.
  2362. Once again, the same diagram, more or less,
  2363. than what I had to write, which is the same diagram more or less
  2364. than an entity component system is,
  2365. because you are able to iterate over all of the properties
  2366. you want to work with, which lets you implement things
  2367. like a constraint, or in my case, a modification,
  2368. in this generic way that operates
  2369. on the pieces of things or components in any component
  2370. system language in a way that doesn't require
  2371. this sort of weird abstraction thought
  2372. where you're trying to figure out
  2373. how to get things out of something
  2374. in order to work on them.
  2375. That was in 1963.
  2376. So, to a first approximation, Ivan Sutherland was at the same level of closeness to an anti-component
  2377. system in 1963 as I was in 1997.
  2378. And then people from there didn't notice.
  2379. That's the only thing I can figure out.
  2380. I have not found anything except for one quote that I'll show you
  2381. that explains why the heck no one realized how important this was.
  2382. They didn't think about the fact that the power of this system
  2383. is coming from the fact that you can look at these components of things
  2384. and architect around that instead of architecting around the bag,
  2385. which who cares?
  2386. Again, still object-oriented in its thinking,
  2387. You don't have to claim it's not OOP.
  2388. It can still be OOP.
  2389. It's just where are those encapsulation boundaries?
  2390. Where are the boundaries, right?
  2391. Instead of looking at it and going,
  2392. oh, the important place to put the boundary was around this.
  2393. That's where the power is coming from.
  2394. They're looking over here.
  2395. They're like, the power of this system was that.
  2396. The ability to have virtual functions on it, right?
  2397. The ability to say, if I want to draw this a different way,
  2398. I change the subroutine.
  2399. Now, I'm not trying to say that isn't useful.
  2400. It's function pointers are good in certain circumstances, but what inevitably happens is
  2401. They're only gonna get you the simple stuff
  2402. The only reason that even worked for Sutherland in the display case is because his display was simple
  2403. He didn't have to do things like intersecting stuff for hidden line removal or doing some kind of calling on it or who knows what?
  2404. So he could just have an abstract display function because it never interacted with any other part of the system
  2405. It's the least interesting part of this architecture
  2406. Yes, it's cool. It's Doug T. Ross's idea about plexes. It's where it comes from, right? And that
  2407. was a great idea, and we should keep it, but it's not the cool part of Sketchpad at all, right?
  2408. It's the most trivial part of it. So that is the 35-year mistake. Oops, right? We had the answer.
  2409. We could have been so far ahead if we just studied that and figured that out, because it's so much
  2410. more powerful to think about systems that way, especially the hardest kinds of systems
  2411. like editors. This is the quote I was talking about. So, you can see here, this is Alan
  2412. Kay, father of Smalltalk, and this quote breaks my heart because I like Alan Kay. I think
  2413. everyone likes Alan Kay. Probably, I don't know, maybe not. There's probably someone
  2414. out there who hates Alan Kay. Alan Kay is very, he's trying all kinds of cool things.
  2415. Xerox PARC is awesome.
  2416. I'm not gonna say something negative about Alan Kay.
  2417. I'm just not gonna do it.
  2418. This quote breaks my heart because what he says
  2419. in this quote is basically that the constraint solver,
  2420. which he obviously knew about, so he,
  2421. because I happen to know that Alan Kay read the thesis.
  2422. That's documented, Alan Kay says he read the thesis.
  2423. And he paid attention to the constraint solver part.
  2424. And he paid attention to it enough to know
  2425. that what he called it omniscient.
  2426. He was calling it omniscient, right?
  2427. This idea that it could look at the properties like that
  2428. and work on them.
  2429. And Kay thinks it's a bad thing, right?
  2430. He says, hey, there's this thing called Allen-Borning's Thing
  2431. Lab, which is another program that was made later,
  2432. a first-team attempt to go beyond such-and-such.
  2433. And he devised a nice approach for dealing
  2434. with constraints that didn't require the solver
  2435. to be omniscient.
  2436. The omniscient part was the good part, right?
  2437. That was the thing that was so powerful.
  2438. It's why it's kind of torturous to make things in small talk.
  2439. I have dabbled in it a little bit.
  2440. It's like, no, the encapsulation needs
  2441. to be in the right place.
  2442. You don't want to think of everything
  2443. as these small, little objects.
  2444. So why did they?
  2445. Why was Alan Kaso focused on that stuff?
  2446. Why was Strewstrup's show focused on that stuff?
  2447. And honestly, from reading it, this is my best guess.
  2448. Their backgrounds predisposed them not to want this, right?
  2449. You look at where they come from,
  2450. Strucif comes from distributed systems.
  2451. Alan Kay had a degree in molecular biology.
  2452. They're both thinking of little tiny cells
  2453. that communicate back and forth,
  2454. but which do not reach across into each other's domain
  2455. to do different things.
  2456. And so they're certain, Alan Kay especially,
  2457. that that is the future of how we will engineer things.
  2458. They're going to be like microorganisms,
  2459. where they're little things that we instance, right?
  2460. And they just talk to each other.
  2461. So everything will be built that way from the ground up.
  2462. But the problem with that is,
  2463. it doesn't seem to work in practice.
  2464. It's a great idea when thinking about systems
  2465. that are actually separated in that way,
  2466. like actual computers talking over a network,
  2467. it makes perfect sense,
  2468. because they do look like microorganisms.
  2469. And most of Alan Kay's ideas actually
  2470. map very well to things like the internet writ large,
  2471. where you really do have to just pass messages back and forth.
  2472. So again, not going to say something negative about Alan
  2473. Kay.
  2474. The ideas are good, and they do have very good applications.
  2475. It's smart.
  2476. It really is.
  2477. But when you're talking about code
  2478. that's working inside one computer in the same core
  2479. memory that's meant to work together, it's too limiting.
  2480. It's way too limiting.
  2481. It's not the right model, and it forces
  2482. is to do way too much work to accomplish the same thing.
  2483. So just to underscore, reading this history
  2484. actually gave me a nice perspective on these things.
  2485. And I think there's reasons why C++ was adopted,
  2486. even after all the stuff I just said
  2487. about how the compile time stuff wasn't very good.
  2488. One of the things that I didn't really appreciate
  2489. was it kind of sounds to me like Shrewstip was really
  2490. important in getting type checking for us.
  2491. Like, C did not even type check function calls
  2492. at the time the was making C with classes.
  2493. And he recognized, because of his background in Simula,
  2494. he's like, this is ridiculous.
  2495. I think he gave an example like, if I do square root,
  2496. like SQRT in C, parentheses 2, that doesn't work right now.
  2497. Because it passes the integer 2, and it
  2498. doesn't check that square root's taken a double or something,
  2499. or whatever it was taking in that particular version
  2500. of the library he was using.
  2501. He's like, that cannot be something
  2502. that we have to catch at runtime,
  2503. especially not in those days when debuggers are worse
  2504. and everything is worse, right?
  2505. Iteration time is slower.
  2506. So you get this situation where you're like,
  2507. I kind of see why these things took off.
  2508. Some of these things, like the compile time encapsulation
  2509. hierarchies, they're coming in at the same time
  2510. that C++ is making positive contributions that actually
  2511. do help you program for real, right?
  2512. And it's not like we can't think
  2513. of uses for things like virtual function in classes.
  2514. interfaces, just that bare concept, is a place where we still use those things today, even
  2515. new languages, those things. So there is that, too, if it's used responsibly, right? It's
  2516. just that compile-time hierarchy that was a problem. And this is a quote that I also
  2517. want to include just to give Shrewsworth credit. He's also on the same team. He wants the fast
  2518. thing, right, to be easy for people to do. You don't want your definition of good code
  2519. to be slow, right?
  2520. So anyway, when you read through all this stuff,
  2521. you're kind of rooting for everybody,
  2522. to be completely honest.
  2523. Even after all the suffering that C++ has caused me
  2524. in my life, I was kind of like, oh, all right, I get it.
  2525. I get it, man, I do.
  2526. So that's the 35-year mistake.
  2527. It's the distance between those two years.
  2528. The year in which we could have had
  2529. the Entity Component System,
  2530. because the first person has sort of done something
  2531. that was almost that, and the year in which we actually got
  2532. the Entity Component System, which I'm not even saying
  2533. is a good design or not.
  2534. I don't even have an opinion on something like that,
  2535. to be completely honest with you.
  2536. But I think it was a really cool idea
  2537. and an interesting architectural idea to explore.
  2538. And so I'm really glad that we got there either way.
  2539. But I wish we could have gotten there a little bit sooner.
  2540. So unfortunately, the mistake, if that's 35 years,
  2541. it does unfortunately not end there.
  2542. Because if you do a search on Google right now,
  2543. and you're like, I need an OOP tutorial.
  2544. I need an object-oriented programming tutorial.
  2545. What will you see?
  2546. Hit number one, we'll have a domain model
  2547. that has encapsulation that matches,
  2548. or sorry, you'll have a compile time hierarchy
  2549. that matches the domain model exactly like we don't want.
  2550. This person imagines, this is the number one hit.
  2551. He imagines something called a special Iron Man
  2552. that's slightly different from a regular Iron Man
  2553. because I guess in his mind, or whoever wrote it,
  2554. I don't even know, it might be a team of people,
  2555. there's some kind of a specialized Iron Man
  2556. that I didn't, I mean I don't read comics,
  2557. maybe that's a thing.
  2558. Hit number two, Java OOP, this is from W3Schools.
  2559. Again, not only is it a compile-time hierarchy that
  2560. matches the domain model, but it's one of the ones
  2561. that you can actually find in those early papers.
  2562. Shrewsup talks about vehicles sending cars.
  2563. And if you remember, cars crossing a bridge,
  2564. it could be trucks or buses, was in Simula day one.
  2565. It's where they came up with that subclassing thing
  2566. that they were going to do.
  2567. So we're still pushing it today on hit number two.
  2568. Hit number three is three types of bicycle
  2569. that come off a bicycle, right?
  2570. Ugh!
  2571. And don't ask me why there are spaces in that
  2572. and not in the mountain, but I mean, I don't even know.
  2573. That's the top three hits.
  2574. I stopped looking after that, because I'm just like,
  2575. I give up.
  2576. So one thing that we could do to keep this mistake
  2577. from propagating is just get this idea out there
  2578. that compile-time hierarchies of encapsulation that match
  2579. the domain model are not that good.
  2580. Sometimes they work, like with distributed systems,
  2581. or maybe microbiology.
  2582. But a lot of times, they're just more work than they're worth.
  2583. And that would help.
  2584. It would help a lot.
  2585. And I would bolster that here at finally the end of the talk
  2586. with this quote, which I think is the best one to end on.
  2587. It's that the most treacherous metaphors are the ones that
  2588. seem to work for a time because they
  2589. can keep more powerful insights from bubbling up.
  2590. We got this thing in place.
  2591. It was this compile-time hierarchy
  2592. that matched the domain model idea.
  2593. And it was stopping all of our other architectural development
  2594. because everyone was saying it was going to work,
  2595. and it was going to be great.
  2596. And we just must be doing it wrong, right?
  2597. But actually, that wasn't the case.
  2598. And this is a hard quote to find.
  2599. If you search for it, I'm not sure if you will find it.
  2600. But if you read through, you will find it.
  2601. It comes from Alan Kay.
  2602. He's the one who said it, right?
  2603. That's him sitting at his, you know,
  2604. I think that must be one of the original Palo Alto computers,
  2605. right?
  2606. The Alto, I think is what that one is, from Xerox PARC.
  2607. So that's the actual end of my talk.
  2608. Thanks, everyone, for listening.
  2609. I'm surprised I was able to remember
  2610. all of that stuff for this.
  2611. You've been a wonderful audience.
  2612. And I guess, now, Ryan Fleury will
  2613. be coming up on stage to interview me and take
  2614. questions from the audience.
  2615. Is this correct?
  2616. Sam?
  2617. What?
  2618. SAM TSE-CHIEN PAN- Sam, is that true?
  2619. the organizer ladies and gentlemen
  2620. please welcome to the stage ryan flurry everyone
  2621. okay well yeah thank you for that talk that was really good it was a lot of fun putting together
  2622. yeah so um i guess the first comment that i would have is that it seems like uh i'm a little bit
  2623. glad to see that people in the six there's two things i'm glad to see that people in the 60s were
  2624. like using these techniques that seem to be re-emergent it kind of makes it feel like
  2625. there's like uh maybe like some degree of gas lighting since then like there's like all these
  2626. you rediscover these things they seem to be useful um and then for some reason like uh
  2627. we haven't actually that information has been lost i guess do do you find i mean i assume you find
  2628. the same thing to be true yeah i mean i i guess the problem so i don't even know if it's like
  2629. gaslighting in that sense right because it's like i don't necessarily know i didn't find a lot of
  2630. evidence that people were like intentionally obviously like it wasn't like somebody was
  2631. like i would rather promote my thing than this thing in sketchpad that i noticed that quote from
  2632. alan k is kind of instructive in this case he honestly believed that having the thing be
  2633. omniscient was bad he's saying that this is bad right and you see the same thing from strewship
  2634. saying that this you know switch you know this basic switch on a type is bad and so i i think
  2635. they just honestly believe that they they believe that these were bad for modularity and in their
  2636. minds, because they're so focused on the modularity, they were just saying, this isn't good. And
  2637. so it just kind of doesn't get propagated. This is the thing that you see all the time,
  2638. right? If someone isn't a good PR, isn't good PR for their thing, it doesn't get propagated.
  2639. Yeah, that makes sense. So in your own personal programming, like, journey, you started with,
  2640. like, learning the traditional object-oriented sort of, or, like, C++ templatization of compile
  2641. time hierarchies of encapsulation and so on you uh i mean i i have an idea of where you change or
  2642. where you developed but i'm curious about where you learned to not do that and furthermore from
  2643. where you learned it where did they learn not to do it did they did they learn from the original
  2644. papers or did the simple ideas just reemerge or what what is the story there uh so that's kind
  2645. kind of interesting so when I was younger like so when I started programming when I was very little
  2646. right I didn't know any of the things I wouldn't know anything about architecture C++ wasn't even
  2647. invented uh and I don't think would have been invented so C so C with classes would have been
  2648. but C++ wasn't even like out in the world the time when I would have started in like basic or
  2649. something like that right so I definitely uh started without any of these notions but then
  2650. when I first went out into like you know professional I mean my first job was
  2651. hardly professional but when I went out into the world of like commercial
  2652. programming I I definitely like thought that everyone was gonna be right about
  2653. this I just didn't know and so I tried programming in this model and learned
  2654. all those things because you know it kind of has a Magic the Gathering feel
  2655. to it it's like you're learning a lot of intricacy and it's just magic gathering
  2656. it's something people made up that was fictional but you know you don't know
  2657. that you think it's real right but you're getting into it in the same way you might get into magic
  2658. gathering like oh i figured out the template can do this thing and it becomes its own little game
  2659. right so i think it kind of went that way for me and at the time it was very obvious that this was
  2660. stupid like if i'd actually thought about it but i chalked it up to me just not knowing how to do
  2661. it right which i don't think was actually true i think it was just like no this is actually just
  2662. worse than what you're doing because what i noticed was things that would have taken me only
  2663. a few days before were taking like months to like figure out all of the ways that i would have to do
  2664. it in order to make it fit these things. And I think I was just too stupid to realize that
  2665. probably just means it's just a bad approach, right? So you had a second part of the question,
  2666. which was, how did I undo it? That part is a little more concerning, I guess, because the
  2667. only reason that happened was I happened to then program with people who had never done that. So
  2668. there were people who never had the experience of being told to do this architecture or just
  2669. ignored it and continued to program the old school way. And I was like, oh, these people
  2670. are very successful and very important programmers so maybe it's not the case that i just don't
  2671. understand it maybe there's actually something to keep doing this way the reason that's more
  2672. concerning to me is it's like it means if those people aren't around if they weren't around maybe
  2673. i would never have that experience right and so you kind of need this generational overlap of
  2674. people who still remember the good things about the previous way to tell you that the new way
  2675. kind of sucks right and do you know like um when you worked with those other programmers
  2676. were they were they informed by this older generation like the 1960s papers of
  2677. how they were doing these things did they just take those lessons or
  2678. no i think it's just a case of like the
  2679. if you were using programming resources from that era of even just the 1970s
  2680. you wouldn't be seeing like it was more academic the places where oop would have been talked about
  2681. right small talk was a thing that would have been in research stuff right and
  2682. similar was a thing with papers and stuff like that but the person who
  2683. learns to program like you know in the game industry and something that the
  2684. person who learns to program on an Apple to is not being exposed to those things
  2685. right so they just learned in an environment and using reference
  2686. materials that did presumably kind of come through that culture but it wasn't
  2687. like they were you nobody was like oh yeah Doug T Ross man and flexes like
  2688. that's that's the stuff right it's like no like so I think it's just more that
  2689. they hadn't have had that idea pushed down on them
  2690. in a way that they believed.
  2691. So, I had it in my head,
  2692. but I gotta check my notes here.
  2693. So I think that, I was curious about,
  2694. I have a collection of like,
  2695. not exactly related questions or discussions.
  2696. Hit me.
  2697. So one of the things, you introduced this subject
  2698. by saying like, one of the arguments that people
  2699. will use to promote sort of object-oriented these,
  2700. or I shouldn't say object-oriented,
  2701. I should say compile-time hierarchies.
  2702. If someone out there wants to come up
  2703. with a catchy moniker for that, it is hard to say.
  2704. So we need something like OOP for that, right?
  2705. And it would be nice, because again, like I said,
  2706. I think it's pretty important to draw that distinction,
  2707. because like Mok, who I quoted at the beginning of the thing,
  2708. who did that entity component system,
  2709. he's thinking of it in terms of object-oriented.
  2710. He's not thinking this is not object-oriented, right?
  2711. So you can still, you can easily call yourself
  2712. an object-oriented programmer,
  2713. and want object-oriented principles
  2714. to apply to your code base,
  2715. and just not think about that compile time thing.
  2716. And it seems to work pretty well.
  2717. Yeah, it kind of seemed like
  2718. the object-oriented part of drawing boundaries,
  2719. it doesn't actually, it's not,
  2720. it might be descriptive of a system,
  2721. but it's not prescribing
  2722. where to put those boundaries exactly.
  2723. Yes, exactly.
  2724. And also, furthermore,
  2725. it's something I think we could all agree about, right?
  2726. I don't know that a hardcore object-oriented person,
  2727. like certainly not Alan Kay probably,
  2728. would never agree that making like an API boundary
  2729. around something was that object-oriented
  2730. if the thing was fairly large, although he might.
  2731. But we can all agree that that's a thing we want to do.
  2732. Like, I don't consider myself an object-oriented programmer,
  2733. but I consider that to be a good thing to do,
  2734. and I think that's certainly a point of commonality.
  2735. And I think most object-oriented programmers
  2736. would call that an object-oriented thing to do,
  2737. even though it really predates that.
  2738. you could just think of object oriented programming.
  2739. One of the principles is sort of crystallizing that idea
  2740. into one of their core concepts.
  2741. And I think that's a good core tenant to have, right?
  2742. To do that at the appropriate size.
  2743. That's where I tend to part ways.
  2744. It's like what that size is.
  2745. So on the large team subject,
  2746. you were digging through all of these historical papers
  2747. and records and everything.
  2748. Did you actually find any research
  2749. about what people actually do for large teams?
  2750. So one of the things is I was focused
  2751. on figuring out where these ideas came from.
  2752. So I didn't go looking for where the, I don't want to call them excuses, it's too disparaging,
  2753. but where the justifications came from, right?
  2754. So what I can tell you, so I don't know, that's another, that'd be a whole other topic.
  2755. This thing took two hours or something like that, right?
  2756. So that's a whole other question.
  2757. It would be very interesting to answer.
  2758. But what I can tell you is during the course of the development of these core ideas,
  2759. I never once saw anyone talk about that.
  2760. and they were always like one person doing a team,
  2761. doing a thing by themselves,
  2762. or two people developing things by themselves.
  2763. And to the extent that like larger teams
  2764. would have been involved at all,
  2765. it might have been on the Simula side.
  2766. Like some of their opinions may have been influenced by,
  2767. you know, in ways that they didn't directly,
  2768. like they didn't attribute any of those things to it,
  2769. but maybe they were seeing people use Simula
  2770. out in the world that had something to do with it.
  2771. But I don't think there were that large teams
  2772. working on Simula either, I don't know.
  2773. Yeah, it's kind of interesting alone
  2774. that the history of computing,
  2775. it's always large teams or small teams
  2776. pushing large improvements like successively.
  2777. So it's interesting to optimize for large teams in that way.
  2778. Well, and you might even say it creates a bit of a problem
  2779. because it means that like,
  2780. if the innovation happens in small teams,
  2781. but we do need large teams of people to do certain things,
  2782. it's like, it's kind of hard to figure out
  2783. where the innovation in that comes from,
  2784. because if we're all at risk
  2785. because of these few people doing something,
  2786. they're not having the same experience as the large team.
  2787. So maybe it's like small teams doing something
  2788. on the side of a big team
  2789. is where we get some of that innovation.
  2790. I don't know.
  2791. So I'm kind of curious about like,
  2792. so a few programming ideas that a lot of people use,
  2793. like that you regularly use in your programming came up,
  2794. one being like discriminated unions or tag unions
  2795. as sort of like forming this like mutually exclusive
  2796. branching structure, as opposed to like the fat struct
  2797. model where it's like a just it's one unified type i'm i'm kind of interested to hear like what
  2798. you think about like um both of those things are you've said are like good in their respective
  2799. situations i'm curious about like when you know that introducing boundaries of mutual exclusion
  2800. like in a discriminated type is useful whereas the uh the the sort of uh large fat struct thing
  2801. stops being useful in those cases so I don't really think of them as distinct I think of them
  2802. as sort of the same things I'm just trying to use terms that other people think in to communicate
  2803. that so the way that I normally think about it is there are two types of situations I might find
  2804. myself in one is where the domain model itself like literally the thing is telling me clearly
  2805. that these things are mutually exclusive and that might be a place where I you know have more in
  2806. common with the oops side of things because I'm like,
  2807. I see why you guys were thinking about
  2808. if that was true about this thing.
  2809. So in those cases, I would use a discriminated union
  2810. because I prefer to write code in like a verb oriented way,
  2811. not an object oriented way.
  2812. But I'm just doing the flip side of what they're doing
  2813. with their virtual function in those cases, right?
  2814. I just think it works out better in my way,
  2815. but that's just, you know, that's my personal opinion.
  2816. It also has to do with what type of system you're making,
  2817. whether or not people are gonna be adding types
  2818. to the system more frequently
  2819. or whether they're gonna be adding actions.
  2820. I tend to find that people add actions more frequently.
  2821. That's why I focus on that.
  2822. But either way.
  2823. That makes sense.
  2824. So if I can see that this is by definition
  2825. mutually exclusive, then I'm discriminated union.
  2826. And the reason for that is the exact same reason
  2827. for strewstrip and everybody else to catch errors.
  2828. I don't wanna be using,
  2829. I don't wanna make that a fatty struct
  2830. where I'm accidentally doing code
  2831. that's gonna do both things.
  2832. So I try to basically replicate that Simula-style thing,
  2833. or really it's Tony Hoare's, right,
  2834. Sir Tony Hoare's idea of that.
  2835. I try to replicate that and it's just unfortunately
  2836. US Plus doesn't really have good support for that.
  2837. Like I said, Santa Fe is not very good, in my opinion.
  2838. The real thing that Tony Hoare wanted would have been great.
  2839. So I would love that feature.
  2840. The Fatty Struct, Qua Fatty Struct,
  2841. and like I said, I mixed these two together,
  2842. so I don't think it's that distinct to me,
  2843. but the idea of feature flags or something like that,
  2844. right, like I'm gonna hit this bit
  2845. and then it means that this path might be taken,
  2846. what the Plex guy, right, what Doug T. Ross
  2847. would have called those switches, right?
  2848. That, to me, is for mix-in, as they call it, right?
  2849. When I know I'm combining lots of things together, right?
  2850. Like a tasty stew that's going to be delicious, and it's going to taste fabulous when you
  2851. use these entities, right?
  2852. That's when I reach for that.
  2853. And I think those are really, they're very simple.
  2854. You can teach them to someone in an afternoon, and they can apply them pretty directly right
  2855. away.
  2856. And that's one of the reasons why I think they're so much better than things like the
  2857. compile-time hierarchies, where, you know, I've seen programmers tie themselves in knots
  2858. and spend months trying to do something
  2859. that literally that approach,
  2860. it would take them 30 minutes, right, so.
  2861. And I'm a little confused about the,
  2862. like exactly what, so Looking Glass,
  2863. you introduced them as using like
  2864. sort of the fast track model,
  2865. but it sounded like they ended up with an entity
  2866. like component system thing
  2867. where they split everything out into,
  2868. like they pulled out common parts of entities
  2869. and put them, isolated their storage.
  2870. Did they make that transition
  2871. or did they use one early and then the second later?
  2872. Can I ask a question to the audience?
  2873. Yes.
  2874. Sam, how much time we got?
  2875. We still have time right now.
  2876. Maybe, well, it depends.
  2877. There are multiple paths that could be taken.
  2878. And the split point is in about 25 minutes.
  2879. How badly do you want a complete version
  2880. of that answer versus a summary answer?
  2881. Because I can answer that very accurately.
  2882. Yeah, let's go with the accurate one.
  2883. Okay.
  2884. Deleted scenes to keep this talk somewhat under two hours,
  2885. which hopefully we did and now won't do.
  2886. So I'll skip some of this just to keep it relatively quick.
  2887. So inside Ultima Underworld,
  2888. an entity was basically a fatty struct overlay.
  2889. So the way that it worked is you had an entity
  2890. and then if there were two separate things
  2891. like hit points and fuel
  2892. that were generally mutually exclusive,
  2893. meaning an entity probably can't have both of them
  2894. because fuel is used only for like lanterns
  2895. and lanterns don't have hit points,
  2896. then we'd put them in the same place, right?
  2897. That was Ultima Underworld, right?
  2898. And of course this is rough because it's like,
  2899. it means that when you're accessing one of these,
  2900. you're secretly also accessing the other, right?
  2901. they're in the same place and so you could have an error where you were doing something
  2902. where like you're checking the fuel or you're checking the hit points in this case like you're
  2903. checking the hit points but you're secretly checking the fuel and then you delete the entity
  2904. you know because that's what it was thinking right and this is mock he didn't his picture didn't make
  2905. it in i'm glad i get to show him now he's the guy who did a lot of the implementation on the dark
  2906. object system he came on the scene in ultimate underworld 2 and he's the one who coined that
  2907. phrase that quote i put up that's him the compile time hierarchy he's the one who crystallized that
  2908. right he comes on because the uh in the earlier earlier ones like it was doug church and dan
  2909. schmidt and a bunch of people who did ultimate underworld one he comes on of underworld two
  2910. and he actually literally had the that bug that fuel bug he wrote a thing for damage where if
  2911. you threw an empty lantern at a wall it would enter the damage system because it was supposed
  2912. to take damage from hitting the wall and it would be like how many hit points does the lantern have
  2913. it'd be like zero it's like well i guess it's out of here and so empty lanterns thrown at walls
  2914. would just disappear right and so we had to fix that bug by doing exactly what you expect he'd
  2915. have to like check you have to manually add that code and so you know they didn't like this because
  2916. remember these guys and again much like you know ivan sutherland and doug ross these guys were
  2917. super smart mit people and and sutherland's also carnegie mellon and caltech right it's like kind
  2918. of nuts going through the whole gauntlet there uh the folks at looking glass are mit graduates
  2919. they're super super smart guys they do all this amazing stuff so they don't want to they don't
  2920. want to have this happen right they just don't know what else to do because they have these
  2921. like really hardcore memory constraints and furthermore they talk a lot about the um the
  2922. sort of uh trade-offs you have to make so if you have a fuel system that needs to store stuff and
  2923. you have a combat system you store stuff and you do make space for them um it means that if you do
  2924. you know if you're using that overlap it means that if you then decide you need an entity that
  2925. has combat and fuel because we wanted to add that it's like crap i've got this overlap i can't do
  2926. it so now i have to make a trade-off like maybe i shrink the amount of data that the combat system
  2927. can store and that sucks right because now i'm forced into this this decision i didn't want to
  2928. have to make and that's just you know what the kind of situation they're working on working
  2929. under the kind of constraints they're working under when they go to do system shock which is
  2930. the rpg so they do ultimate underworld one two and they do system shock i'm just following their
  2931. lineage they also they have terra nova and flight unlimited which i won't cover because they're not
  2932. the same uh in terms of like lineage really for the teams and how they were doing rpgs it's just
  2933. It's just the RPGs from Looking Glass.
  2934. So it kind of looks like that.
  2935. I'll skip this because it's not part of the talk.
  2936. They go to an outlinking kind of structure.
  2937. So what they do is they say,
  2938. all right, we kind of want something better than that,
  2939. so what we're going to do is we'll have our entities,
  2940. we have a little bit more memory to work with now,
  2941. so we'll have the entities have their shared part up front
  2942. that everyone roughly has, so it's kind of fatty,
  2943. but not that fatty, and then everybody gets
  2944. one pointer out to something, right?
  2945. And we'll try to make those things be things
  2946. that don't have to combine together,
  2947. but it's still a limitation, right?
  2948. they can't have two of them which they would have liked to have had so that's how they got there
  2949. that's that's what system shock was it was like one outlink per entity that could extend it and
  2950. now that solves their growing problem right it's like we can just grow things arbitrarily and they
  2951. don't like overlap some unrelated system or something like that but it doesn't really allow
  2952. them to combine them in that way that they would have liked so it's still almost the same
  2953. limitation it's just more of a memory optimization at this point right um but it also catches this
  2954. error because now you sort of have a discriminated union going on so you can't access fuel off the
  2955. base entity because it doesn't have it so you have to do something like this where like if it's a
  2956. light source i can get the light source or better yet i can only return a light source pointer if
  2957. it was a light source and so that i it's kind of more foolproof that i can just check one pointer
  2958. and good to go right again i'm blowing through these but yeah this was me making fun of standard
  2959. variant yeah um so uh flight unlimited this was i'm just going into because it sets up the
  2960. to the entity component system thing,
  2961. Flight Unlimited actually had,
  2962. it was the first thing to use C++
  2963. really heavily in the company.
  2964. And so they were using new and delete
  2965. like you're supposed to do in C++.
  2966. And unfortunately, that totally fragmented memory,
  2967. totally like thrashed out memory and fragmented memory.
  2968. So I don't know if this is well known,
  2969. but basically, Flight Unlimited is a game
  2970. where you like fly around, you know,
  2971. in a thing and whatever.
  2972. It was a very popular flight some of the time actually.
  2973. And you'll notice that in the cockpit here,
  2974. there's gauges, but there's no fuel gauge, right?
  2975. There's no fuel gauge on there.
  2976. It's just, it's other stuff.
  2977. There's no fuel gauge at all.
  2978. But sometimes it would say out of fuel,
  2979. which would be like out of fuel, right?
  2980. And what out of fuel was was actually
  2981. the memory's too fragmented.
  2982. So what it would do is it would say out of fuel,
  2983. it would close, it had like an executable
  2984. that was sort of running as sort of a batch restarter
  2985. for the main executable.
  2986. It would just close the whole rest of the executable,
  2987. so it would still save the game state,
  2988. close the executable, reload the game state,
  2989. And you know, then you were, there you're back to good.
  2990. This is Tom Leonard.
  2991. So Thief the Dark Project comes on the heels of this.
  2992. This is Tom Leonard.
  2993. He's actually the guy who, as far as anyone can remember,
  2994. that I've been able to, you know,
  2995. that I've been able to get a solid story about.
  2996. He's the guy who actually comes up with the idea
  2997. of sort of the entity component model switch.
  2998. And I didn't really call it, again,
  2999. too much stuff getting cut that we're going into now,
  3000. so you know, I guess six of one, half dozen of the other.
  3001. But the idea of saying, okay,
  3002. instead of entity.getHitPoints,
  3003. we're gonna say HitPoints.getEntity.
  3004. It's a big, like that's a big switch
  3005. if you've never thought about it before, right?
  3006. Here's the one that like mock says,
  3007. I think it was Tom who came up with that.
  3008. And the reason is so that the types line up.
  3009. So like now, instead of having like either tons of functions
  3010. like get a HitPoints-like thing, get a this,
  3011. that are on, you know, an entity, which would suck,
  3012. now we just ask the actual thing, the HitPoint system,
  3013. and it's only gonna return one type,
  3014. which is like a HitPoints type to us, right?
  3015. And so, anyway, this is what they're thinking about when they make the entity component
  3016. system.
  3017. And it comes from all of those experiences that they've had.
  3018. They want to avoid fragmentation because they just had to make a thing that, like, restarts
  3019. the game, right?
  3020. Which was Flight Unlimited.
  3021. They want arbitrary sized properties, right?
  3022. Because they don't want to make those tradeoffs between combat systems and fuel and whatever.
  3023. They also had additional things, which is, like, they wanted designers to be able to
  3024. create types at runtime.
  3025. So they kind of want bags of properties that they can have designers create.
  3026. They want designers to be able to do things like create domain model hierarchies in the
  3027. editor because they're thinking in terms of the domain model and it's just not implemented
  3028. that way, right?
  3029. So they do those things.
  3030. And then finally, the how fast is the fastest case thing.
  3031. That was from Doug Church.
  3032. He was like, okay, if we're doing all this pie in the sky stuff, we have to figure out
  3033. some way that it's still going to be as fast for like physics to compute and stuff as what
  3034. we used to do.
  3035. And so what he did there was he was basically forcing them to go, we have to consider some
  3036. way that this is all going to work.
  3037. was the system boundary drawings part so that's the really fast part of this and
  3038. by the way this is what it looks like inside the dark object system if you
  3039. want to create a property type right it's like I said it's still looking
  3040. right like like you could pass this by an OOP person and they would be fine
  3041. with it I think so it's like again not not OOP it's just not that hierarchy
  3042. thing right yeah so so there you go I think that's everything
  3043. All right. Let's see what else I've got.
  3044. Yeah, so I guess one interesting thing about what you were saying
  3045. is that what it has to do with, like, the object-oriented,
  3046. the original object-oriented work came from these, like,
  3047. distributed systems and everything.
  3048. And I know you've talked a lot about in the past, like, Conway's Law
  3049. and how, like, introducing these boundaries,
  3050. or not introducing these boundaries,
  3051. it's the fact that when these boundaries arise they cause friction or difficulty and i guess um
  3052. would you characterize this object-oriented thing as like creating those boundaries unnecessarily
  3053. so they didn't arise from the problem and so they're causing they're causing difficulty in
  3054. that way um i would sort of say that i guess the only the only like caveat i can think of there is
  3055. i think that the part where you said the problem arrived like the problem doesn't arise from it
  3056. or whatever or the you know it doesn't arise from the problem i think that's how you phrase it
  3057. i think a person who thinks in terms of object-oriented programming and is an aficionado
  3058. of that would claim that it is arising from the problem because the domain model looks like this
  3059. right and so i don't agree with that but i don't know what they would agree with right and so from
  3060. my perspective i agree with you these are things that just because as a human you're going i like
  3061. to categorize things into groupings because that's something that we do right linguistically
  3062. it's all quantum physics at the end or something right bro so it's like these are arbitrary
  3063. categories that we're drawing there's no reason to think you know just like i don't think the laws of
  3064. the universe think of you as ryan flurry in a computational sense but i think of you that way
  3065. it might not make sense for you to have the computational version of ryan flurry
  3066. be about ryan flurry instead of just a collection of things that produces to the end user the effect
  3067. of ryan flirt right so to me anyway that's sort of the difference there right it's like i don't
  3068. see that the model inside the computer may have very little to do with the model experienced by
  3069. the user which again is in direct conflict with like what alan k wanted to do he wants and again
  3070. you have to remember the mindset he also comes he wants to do education he wants to teach people
  3071. about computing he wants it to he wants it to feel like you're programming in the same way that you
  3072. see the real world and in some ways i think if we could just get to the point where and maybe he
  3073. does think about this now i'm not sure just at the point where he says thinks oh well that's just
  3074. that's just when you use an application that's what it feels like it's not what it is under the
  3075. hood then i think i'd be right there with him right so yeah interesting um all right i'll
  3076. I'll check my list, and then maybe if anyone in the audience has questions,
  3077. then I will ask.
  3078. But I'll check my list first since I'm up here talking about it.
  3079. Okay.
  3080. I had two pages.
  3081. I did that one.
  3082. Oh, yeah, I guess another thing.
  3083. So I guess some of these are, like, not exactly questions,
  3084. but they're, like, I formed a mental model given your talk,
  3085. and I want to run it by you and see if it makes sense.
  3086. So one of the things, another thing that I guess is implied
  3087. by introducing these boundaries between parts of your program
  3088. when you could have not done that in the architecture,
  3089. but you did for one reason or another.
  3090. The interesting thing is that you were talking about a sketch,
  3091. is it Sketchpad?
  3092. Yeah, Sketchpad.
  3093. You have some layer which is like, quote unquote, omniscient.
  3094. like it knows it it has full context of what's actually happening and in my mental model i'm
  3095. like that's similar to when like an actual like civil engineer or something is like going and
  3096. building a bridge like they they're not like how do i build a bridge without knowing what
  3097. the landscape looks like kind of thing so it's like um in that in that so a lot of the design
  3098. decisions in c++ or in in all of the other paths that you that you iterated it seems like they're
  3099. about like removing context or trying to find the minimal set of context but i assume like that
  3100. doesn't seem how i haven't found that to be helpful because of you what you have taught
  3101. basically but but i'm i'm curious i kind of feel like you're on your own orbit now and you totally
  3102. know exactly what it is right i mean like yeah honestly you're one of the best system architects
  3103. i've ever seen full disclosure right well folks at home seriously like it's insane so you don't need
  3104. me all right well thanks i i appreciate that but um uh so i guess uh you know i think that's
  3105. probably it i'm having to turn through these two pages here uh but well to answer that question
  3106. though like about the like removing that context right i do think like that's part of why it's
  3107. frustrating to maybe look at the history a little bit yeah because what it looks like to me
  3108. from like the the bird's eye view is like instead of asking how do we achieve code reuse
  3109. and modularity while preserving our ability to solve the hardest problems it looked more like
  3110. it was like let's just redefine the problem to be simpler and solve that yeah and to me that that
  3111. was one of the big things about the sketchpad thing as well where it's like okay you had working
  3112. examples of this that are pretty well documented i mean if i can go figure out most of it now
  3113. looking back than at the time when you could have actually talked to Ivan Sutherland fresh off of
  3114. the implementation when you remembered it all, right? And so it does really feel like, I feel
  3115. like there's a failure to engage with the hardest problems. And I think one of my takeaways from it,
  3116. which, you know, from reading the history, which is not, it didn't really change my mind about this,
  3117. it just reinforced kind of like my feeling about it, which is, I think when you're designing new
  3118. things, you should focus on the hardest stuff. You should say, what solves the hardest problems?
  3119. because we can always then take that and scale it down and remove things from it or dumb it down
  3120. for an e for people to use in cases where that aren't as hard but it's almost impossible to
  3121. take something that only solves simple problems and scale it up into something that solves hard
  3122. ones and so that was that's really the thing and i don't i don't blame anyone in this uh that i
  3123. covered here for that at all because the conditions they were working under are awful right i mean they
  3124. have no they have none of the benefits we have today they were working with
  3125. computer systems they barely got time on half the time it was hard to debug
  3126. print all that stuff and they're having to invent all this stuff themselves
  3127. right they have nothing to fall back on so it's nobody's fault but going forward
  3128. it's like when we have good tools let's attack the hardest problems and that
  3129. will be where we get our really good architectures that's my feeling about it
  3130. anyway do you blame Y Combinator at all for like the Internet I'm about to
  3131. blame them when I see what they post about this talk and somehow managed to
  3132. to miss all of the good arguments you might have about it
  3133. and argue about something else,
  3134. like whether or not that was the right use
  3135. of discriminated union, which 100% will happen, right?
  3136. And you're just like, guys, who cares?
  3137. Like that does not matter right now, right, but okay.
  3138. Yeah, because I think like actually programming,
  3139. that tends to be one of the harder problems is no,
  3140. like, well, I don't know.
  3141. You've said it a hundred times already in the talk,
  3142. but where you draw those boundaries,
  3143. because it's not that modularity stops being useful,
  3144. it's that it's a wall you're introducing
  3145. that makes something more difficult.
  3146. And so if you put that right into the middle
  3147. of the hard problem, like you say, yeah.
  3148. And I think that is the fundamental struggle.
  3149. It's why architecture is so hard.
  3150. And it's also why architecture
  3151. is potentially difficult to reuse.
  3152. Architecture, not like reuse inside an architecture.
  3153. And it's because when you draw
  3154. those encapsulation boundaries properly
  3155. for a particular problem,
  3156. you save orders of magnitude of work
  3157. when you do it properly.
  3158. And the way you draw them could very well be different
  3159. for different types of things you're trying to solve.
  3160. And that makes it hard to say,
  3161. okay, here's an architecture that just works across things.
  3162. Or one of the reasons the compile-time hierarchy thing
  3163. I think is a bad idea is not just because
  3164. I don't think it's very useful in general,
  3165. but it's also because it's Procrustean.
  3166. It's like this one-size-fits-all approach
  3167. that I don't think really even fits that many problems,
  3168. but it certainly doesn't fit all problems, right?
  3169. And so teaching architecture,
  3170. I think it would be better to focus
  3171. on more flexible thinking
  3172. and thinking about drawing the encapsulation boundaries
  3173. with intent, not with a fixed model in mind.
  3174. And if that intent leads you to a very unusual placement
  3175. of the boundaries, as long as you can prove
  3176. that it's actually getting you that leverage
  3177. and not introducing cuts in places
  3178. where it makes programming difficult,
  3179. that then you should do that.
  3180. You should follow that sort of weird structure
  3181. because that is probably right.
  3182. Yeah, that makes sense.
  3183. Okay, well, I think I've exhausted all the questions
  3184. discussion topics um or they would be rehashing things that you like i wrote them down and then
  3185. you covered them in the talk and i was like okay um so i'll ask the audience does anyone
  3186. have should we also should we just cut now is that good time to stop because
  3187. okay okay shoot sorry sorry everyone um okay uh uh rafael do you ever do you have a question
  3188. you could just speak out yes like um if we had the solution in the 60s and we saw the power of
  3189. of Sketchpad, and why was, let's call it Dark Oop,
  3190. still able to gain foothold and catch on,
  3191. suppress the good solution?
  3192. Was it because, was it a successional knowledge transfer
  3193. problem, or was it just because Dark Oop is such a
  3194. catnip for programmers, which is a lot of interesting
  3195. problem, how would it represent that,
  3196. or was it something else?
  3197. Why did it catch on?
  3198. I mean, it's very speculative to try and guess
  3199. something like that, obviously.
  3200. I think you touched on some of the answer there,
  3201. which is that I do think people want to divide things
  3202. into hierarchical categories kind of naturally.
  3203. I mean, we did that with the natural world
  3204. when we were trying to do biological classifications
  3205. long before we had really any basis to do so,
  3206. like before we knew about DNA or anything like that
  3207. or how those things might have happened.
  3208. So I think it's a natural thing for people
  3209. who want to do to make those classifications,
  3210. so there's some of that.
  3211. And thinking that there's this easy sort of model
  3212. that just goes from what you see,
  3213. it's like WYSIWYG architecture,
  3214. like what I see in the real world
  3215. is just what the code looks like and we're done, right?
  3216. So I think there's a little bit of that,
  3217. but I think the real story is just that history
  3218. is very messy and in order for something to gain traction,
  3219. somebody has to champion it,
  3220. someone has to do the work of implementing it
  3221. into a system and doing a good job of that, right?
  3222. One of the reasons we got
  3223. the sort of compile-time hierarchy thing
  3224. is because that's what Strewstrip kind of took away
  3225. from Simulets, what he implemented first
  3226. into a language that became very popular.
  3227. And he wasn't trying to do anything nefarious, right?
  3228. He wasn't trying to do anything dark.
  3229. He's just like, I like this type checking thing.
  3230. I used Simul, it was kind of cool.
  3231. He did the work, right?
  3232. I mean, you could say that about things
  3233. that we see happening today as well.
  3234. It's like, you know, in order for something like, you know,
  3235. Rust or something to gain popularity,
  3236. somebody has to build Rust first.
  3237. Somebody has to have an idea of what it's going to be.
  3238. Is that idea good or bad?
  3239. Who knows, but in order for it to even get judged
  3240. in the marketplace, someone has to do that.
  3241. And the bottom line is nobody who looked at Sketchpad
  3242. was thinking in terms of architecture
  3243. other than what I said,
  3244. which is like the virtual dispatch basically.
  3245. And you know, I didn't go into the talk,
  3246. but Alan Kay was, he was predisposed also
  3247. to think about that virtual dispatch
  3248. as being very important
  3249. because the other references that I didn't mention,
  3250. but they were in that quote,
  3251. I said we're not gonna cover them.
  3252. They're like the Burroughs 5000 series computers
  3253. and there's this Air Force,
  3254. this guy who wrote a file system thing
  3255. where you put the way that you use the files
  3256. in the file system were subroutines
  3257. that were stored in front of the files in the file system,
  3258. so it was kind of like a virtual dispatch thing.
  3259. The Burroughs 5000 system also had
  3260. this kind of virtual dispatch,
  3261. where there were tables and things,
  3262. and so for Alan Kay, who we didn't really cover in here,
  3263. the other three hours of slides, they're all there, right?
  3264. But what he actually was seeing was
  3265. he was seeing commonality there.
  3266. He was like, oh, the Burroughs 5000
  3267. that Air Force thing that I thought was cool,
  3268. Simula and Sketchpad are all doing this dispatch table thing
  3269. and they're all like making classes
  3270. with these dispatches on them.
  3271. And then he's thinking about your biology
  3272. and this messaging, like you're gonna respond
  3273. to these messages, that's what these dispatches are,
  3274. they're like how you're responding to different messages.
  3275. And he just goes down that path
  3276. because he's thinking that that's the core thing, right?
  3277. Because he's predisposed to see it
  3278. because he's encountered this idea multiple times
  3279. and so he's predisposed, I think,
  3280. I think that that's where the power of Sketchpad comes from.
  3281. Because, like let's face it,
  3282. would we have recognized that power at all
  3283. if we hadn't had all of this experience
  3284. and like, you know, I just randomly kind of
  3285. stumbled upon this like, oh wow, wait, okay.
  3286. Like that's really kind of interesting.
  3287. If I had never seen an ND component system before,
  3288. would I ever even have thought of that?
  3289. Probably not.
  3290. So I think it's just, it's really hard,
  3291. it's a really big ask.
  3292. It's a tremendous ask to ask someone who's like
  3293. inventing C++ or inventing Simula
  3294. to somehow get all of that.
  3295. It's just not, it's just not plausible.
  3296. You know, it's not plausible.
  3297. It's a hindsight thing, I think.
  3298. We have a question right here.
  3299. So, it seems to me that the pattern is always the same.
  3300. Like, you kind of come from school,
  3301. it was my pattern too, and it seems that it's yours, right?
  3302. You learned a certain way, and in school,
  3303. everything's kind of tied to business stuff, right?
  3304. So it's very easy to think about,
  3305. you have a client with an invoice with items, right?
  3306. And usually, it's not even,
  3307. It doesn't go that deep into very high hierarchies,
  3308. but we kind of just learn that pattern,
  3309. and then we just start using it,
  3310. and you have a hammer that is a melee weapon
  3311. that is a weapon and whatever.
  3312. And then we have to have the luck
  3313. of finding somebody along on our path
  3314. that kind of snaps us out of this
  3315. and shows us a different path.
  3316. But also, these people are kind of disappearing
  3317. from the industry.
  3318. So my question is like, how do we fix this problem?
  3319. How can we improve this?
  3320. Because it kind of feels like
  3321. You're trying to get smokers from stock smoking long after they're smoking, you know what I mean?
  3322. Well, I guess I would say you're at the right conference.
  3323. I mean, that's all I...
  3324. I mean, I don't know.
  3325. You start doing stuff like this and you try to go through the history and show how it happened and stuff like that.
  3326. And that's it.
  3327. The best you can do is put these ideas out there, suffer the hacker news thread that you will then have to endure or whatever else has to happen.
  3328. and then you hope that maybe some of those ideas get picked up
  3329. and people think about it more critically.
  3330. I think we're out of time, correct?
  3331. Yeah.
  3332. There is coffee.
  3333. We're going on break now.
  3334. We'll be back at 20 past for Dennis.
  3335. All right.
  3336. Well, I hope all will be in the audience anxiously watching this talk.
  3337. This is from Teardown, right?
  3338. I think so.
  3339. Okay.
  3340. I'm excited to see this one.
  3341. I'm really looking forward to it, Dennis.
  3342. All right.
  3343. So we'll be back here at 20.
  3344. Thank you, Ryan.
  3345. Yep.
  3346. Thank you.
Add Comment
Please, Sign In to add comment