Submind YouTube summaries
Thumbnail for EmberConf 2024 - Closing Keynote "Our Engineering Values" with Ed Faulkner

EmberConf 2024 - Closing Keynote "Our Engineering Values" with Ed Faulkner

Watch on YouTube

Video summary

Ed Faulkner opens his closing keynote by using Sudoku as an extended metaphor for engineering values within the Ember Community, illustrating how elegant patterns and logical chains emerge from simple constraints. He explains that while solving a puzzle might seem like brute force to some, it actually requires constructing sound inferences step-by-step, much like writing robust software proofs. Faulkner highlights the "uniqueness controversy" in Sudoku—where solvers sometimes rely on the assumption of a single solution rather than deriving every fact from logic—as an analogy for programming abstractions. He argues that true engineering strength lies not just in knowing how things work internally but also in practicing the discipline of compartmentalizing knowledge to treat interfaces as stable contracts, regardless of their internal complexity. The core argument shifts to the nature of meaning itself, positing that shared understanding is a community effort rather than an inherent property of code or static definitions. Faulkner contrasts this with nihilistic views where everything is meaningless, asserting instead that value emerges from consensus around what things *are*, not just what they do. This distinction is crucial for defining breaking changes versus bug fixes; if the meaning of an interface remains stable even when its implementation shifts, it is a non-breaking change. He emphasizes that high leverage in software architecture depends on durable, precise abstractions built upon these shared meanings, allowing teams to evolve sophisticated implementations behind simple interfaces without causing widespread breakage. To demonstrate how this philosophy translates into practice, Faulkner reviews specific successes and challenges within the Ember ecosystem. On one hand, he points to initiatives like Promise.all, ES modules, decorators, and signals as examples where community consensus created broad standards that permeate all of JavaScript. He also praises internal APIs like component managers for enabling flexible experimentation while maintaining stability through well-defined specs. Conversely, he identifies areas like legacy adapters, serializers, and the boot process as "implementation defined" regions lacking clear specifications, which have led to fragility and slow evolution due to feature creep over time. Concluding with a roadmap for improvement, Faulkner outlines how recent efforts are addressing these gaps through projects like Embroider, Warp Drive, and new RFCs aimed at stabilizing the boot process and routing patterns. He introduces concepts like "Route Manager" as an extension of successful manager APIs to allow incremental iteration on core features without forcing a complete rewrite of applications. While acknowledging that some technologies in Polaris are still being polished for broader adoption, he expresses strong optimism about the community's ability to codify specs after initial experimentation and unify around shared abstractions. Ultimately, his message is one of encouragement: by adhering to these engineering values and continuing to "Ember harder," the community can transform its most ambiguous areas into stable, high-leverage foundations for future growth.
Read the full video transcript
so it's been a long day of talks I'm going to give your brains a little bit of relaxation and change we're going to do a little puzzle um it's going to feed into the theme so first just take a look at the puzzle think about the puzzle and we'll get back to this puzzle so um my actual title side is this so I'm going to talk about the engineering values that make our Community our community and uh you know how they're applying where we've done them well where we're where we need to do them even harder keep theming harder um so that previous puzzle is an example of a Sudoku and sidoku is a very popular game um I'm guessing most people have probably heard of sidoku and seen the rules of sidoku but um the rules are simple easy to super simple to State I place the digits one through nine exactly once in every row column and box right very simple bunch of constraints but it leads to a lot of complexities and honestly at first I didn't really get the appeal of Sudoku because I felt like as a programmer my mind jumps immediately to I could brute force that solution like with program why would I spend my time trying to solve that puzzle um but after after a little bit later exposure to seeing the clever ways people solve the puzzles I got a bit hooked um because what you find is there's a lot of really elegant patterns and chains and Fs that people can build and it's just kind of you know puzzles are fun I think a lot of programmers like solving puzzles um so the appeal is you don't have to bruteforce it and um you know you get to find clever connections uh the kind of them kind of tickles the same thing in my brain that I get when I'm solving hard programming puzzles but um one of the things that annoys me about Sudoku is that when newspaper editors tend to say like hey here's our soku they're really careful to tell people don't worry you don't need to do any math I and I that pretty ironic because I mean they mean you don't need to do any arithmetic but solving p is actually the most mathy thing a lot of people get to do because a Sudoku solution is really a proof right you're constructing a bunch of inferences through a bunch of steps and as long as every step is sound you know you got to a good answer um so getting back to um the big puzzle I started with so people who get really into Sudoku might get sucked into the world of variant Sudoku and this is an example of that and these puzzles can appear absolutely baffling the first time you see them there's just nothing to grab on to um but there there is a guiding principle here these puzzles are not randomly generated they're lovingly handcrafted and they usually leave a trail of things for you to find um so there's like a hidden method to the madness and there's a given take between the puzzle makers and the puzzle solving communities as they like trade techniques and get familiar with patterns and then have to one up each other and it's it's a fun thing so um so in this case the this is called a zipper line puzzle and the rule is very simple right it's that as you can read up there um I'm actually going to let's see let's just actually to show you the quick Breakin of this puzzle let's do it together I think it's easier to do this live all right so how would you start this puzzle so we're going to pay attention to uh oh I'm not looking at the same screen as you all right I'm going to do the pre-made version then I have a little screencast I'll just have to narrate at the right speed okay so we notice this Square Right Here Right Now by normal Sudoku rules we want to ask where can it go in this box and it can't go there because it's going to collide in the column and by the zipper line rules right we know that the squares on the zipper line add up to that Central Square so it can't go on its own zipper line so when we look at that box we realize it can't go there it can't go there it can't go there so it has to go there right so we've identified two places where the same number goes and then we do now we're going to move on to the next number here the blue one and we can use that same logic up here we say it can't go there it can't go on its own zipper line it must be somewhere up here we don't know exactly where and that's enough now to rule it out of that whole column in the bottom box so we know it's not there we know it's not there it must be somewhere here and then how about this third colored number call it yellow now we know that yellow has to be bigger than blue because blue plus something equals yellow we know that uh and our blue was already bigger than the red because red plus something equals blue now we're doing the same trick we're repeating it one more time and we're going to decide that yellow has to be somewhere up there so if yellow is on this final zipper line that we're calling green now we know that green has to be bigger than yellow yellow has to be bigger than than blue blue has to be bigger than red and what is the small what is the smallest thing red can be um well red is the sum red is is the sum of each of these different pairs of digits in that box all right so we've got five digits and what's the very smallest thing you could put in those five digits they have to be unique because they're in one box be 1 plus 2 plus 3 plus four plus 5 the fifth triangular number that's 15 we got one more digit on the end to add in so it's at least 16 and that's three pairs adding up to that same zipper number so it's got to be at least six and so therefore we know this thing's at least six but it's got three numbers higher there's only one answer it has to be six come on screencast explain one more time this is why I wanted to do it live we're almost there come on give me the payoff I was too slow when I recorded it okay yes so we know the red is six we know the blue is seven we know the the yellow is eight and we get the nine right so like each of those individual steps when they're explained to you when somebody explains them to you they um each step by itself seems pretty simple right like once somebody shows you you can follow along but knowing where to look is where all of the art in this thing kind kind of thing happens right the art isn't knowing where to look and that really just comes from practice and learning from other people and uh training techniques so I think the analogy to the kind of work we do is quite strong uh like well-designed software abstractions they look really obvious once somebody shows you uh but making them can seem much more mysterious especially when you're starting out right and it really just takes practice and immersion in a community of people who are solving the same kind of problems and practice in the sense of practice makes perfect right and exposure I want to make I want to draw one last analogy from the world of Sudoku because I think it's also interesting so even Sudoku has controversies um and one is called the uniqueness controversy right so the idea here is that the rules of Sudoku don't explicitly say that there's only that there's a unique solution to the puzzle now there effectively always is because it's just bad style for the puzzle maker to give you an ambiguous puzzle but people disagree about whether you're allowed to use that knowledge to solve the puzzle and because of the thing about unique so in this example um these little blue digits are supposed to show you the possibilities of those spaces it's a note saying one of those three numbers fits in the box that says 137 but if you picked a three right that's going to force the other two corners of the square to be sevens and the last to be a three and you'll have two sevens and two threes and the same would go if you pick the seven but in either case that whole thing is so self-contained it doesn't affect the rest of the Grid it's becomes an ambiguous pattern and so knowing guessing that the puzzle maker made a um a sing solution puzzle we can actually just jump directly to the solution and say that square has got to be a one that's uniqueness now some people don't like uniqueness because um it basically gives you if you don't assume uniqueness and you still solve the puzzle you get a stronger confidence you get a stronger more stronger solution and people like the Aesthetics of that you basically proved there was one solution and had there not been you could have actually caught it instead of just like using that extra knowledge um so I drawing here I'm drawing to your attention here is the idea that sometimes um it can be beneficial to not rely on some of your knowledge right sometimes compartmentalizing away something that you know and acting as if you don't know it can let you get a stronger result than you'd get if you rely on knowing the details that you know and that feeds directly into what we do as programmers and it feeds directly into what I see as like part of the core engineering values of this community so one of the hardest things in programming is knowing when to not know things right some of the most effective implementers struggle with this because I've met people who have brilliant memories and like encyclopedic knowledge of how things work and sometimes those people actually struggle because like other normal people can't keep up with them we don't know how everything works we need abstractions and uh like they actually can people who see too much of how everything works can struggle with that sometimes it takes real practice and um of course it's useful to know how things work inside but knowing when not to rely on that knowledge is really important and it takes a lot of practice and you need frequent you need to frequently exercise the mental gymnastics of jumping over the abstraction barrier while and back again to to put yourself in the mind of someone who doesn't know how it works inside but also jump back over to being the person who does know how it works inside so you can go fix the bug inside right so the alternative to knowing how things work when you're in the other mode is knowing what they mean right um so ha you thought this was a programming talk but now that I'm between you and happy hour we're going to do philosophy all right but stick with me because this really is actually about why we as the Ember Community are here right where does meaning come from right to oversimplify thousands of years of philosophy right an eternalist is somebody who thinks meanings are fixed and clear and permanent and a nihilist is somebody who thinks there just are no meanings and everything is meaningless and and they're both wrong uh I I think meaning emerges from a consensus among a community and I think for an example of what I mean by that is just consider our our words right words do exist they do convey meaning uh and new ones get created all the time but you can't just make up when whenever you want and expect it to do anything right it really is an emergent process between not just one person it's it's a it's a community effort when we construct meaning all right so our abstractions are like that right what does this code mean we have a shared understanding of what this means right in in Ember this would be a component invocation right how does it work some people here will know and some people won't and that's that's good actually right we have that whole Continuum and there's multiple levels to understand how it works but even when you don't know you can have that shared understanding of what it is right so this is a very small and simple example but the general value here pervades how we try to think about software right what does that do for us what do you get by focusing on what it is and not what it does for one important example like what's a breaking change versus a bug fix and if anybody ever argued about that right so the nihilist here would say that every change is a breaking change because there's just the code and you change the code and it doesn't do the same thing I love that xkd CD uh comic about breaking changes there's nothing you can touch that won't affect somebody right but when you've built a community consensus around meanings around interfaces around what things are and not just what they do right now um you can have consensus on what is a breaking change because a breaking change is the one that changes the meaning sometimes you want to change the meaning but some a bug fix is one that leaves the meanings alone right I meant it to be the thing that it still is but it had a bug before if you're looking only at the code there's no objectively measurable way to reliably detect the difference between a breaking change and a bug fix right the computer only ever sees the code where's the meaning the code the code feels solid and concrete and knowable and the meaning can sometimes feel more squishy and nebulous and human but meaning is very real and it lives in standards it lives in docs it lives in rfc's and it's passed from person to person all that other stuff that's not just the code is where we do some of our most valuable work right it's it's the clarity of our meanings that makes things like non-breaking changes more possible and it's a central value of our community that we care about that work and we do our best to we aspire to do that work really well right um because all of our power and software comes from Leverage the ratio between that interface that meaning and the implementation right to build ambitious applications you need to control very sophisticated implementations with the smallest simplest interfaces possible for the highest Leverage that really requires a high degree of trust in your abstractions and that's only possible when you have durable and precise and consensus-driven shared meanings so even when you decide to phase out an abstraction that you've been relying on that migration is going to be far easier if everybody has a crisp understanding of what that thing is right if you have a a spec for it and not just an implementation often the shortest path to removing something that is underspecified is actually to do the work to make the spec for it that's how you know how to replace it how to Cod mod it how what is the replacement strategy so many of the successes that our community's been a part of are examples of when we've done this well right and so the Ember Community was there in the middle of things helping standardize Promises End classes and Es modules and decorators which are really nearly there this time and signals which we got to hear about from Dan um these are all examples of these are high degree of success examples this is where we didn't just make an abstract for our community but we were able to participate and make something that is now like broad enough that permeates all JavaScript and uh people can actually just take it for granted which is the highest complement of an abstraction is like people don't even have to think about it anymore use yeah and we've also got examples that are more of the within framework abstract like the durability of our templating language even as we've evolved it in its syntax has been you know a really strong constant um our tra reactivity primitive is just extremely nice building block for all of the things we've talked about in terms of reactivity and also I want to highlight our manager apis which um have really enabled big leaps and functionality without breaking compatibility and I I'm going to zoom in slightly on manager apis because this is a low-level thing that you probably don't have to deal with and that's a good thing but the fact that they exist has been a really big win and it's a pattern that um we've used successfully and want and should use even more so the idea of manage the examples of manager apis we have is component manager helper manager modifier manager this is the low-level but public and thoroughly specked out API for how like what do the framework consider the what is a component what is a helper what is a modifier um the reason it's worth designing those things is that because they're low-level apis you get very different design constraints um because they're lowlevel apis that are really only called by the internals of the framework like day-to-day ergonomics of them is not nearly as important as their flexibility and stability right so you can design something that's verbose but really thorough you could design something that has room to uh like version itself Express capabilities you can do you can focus on the flexibility and for example our modif our manager API are very functional programming esque which is like ideal for flexibility and sometimes has trade-offs in terms of ergonomics but that's perfect for these internal apis right we maximize the flexibility of them um and don't have to worry about the ergonomics because it's not what you're typing day-to-day in your application right but it's a critical API that it exists because it's what lets us um first experiment right it lets us Implement new versions of core things um in ways that are stable you could use them in a big application and not worry that you're going to break because it's all built on uh stable public apis even if they're lowlevel stable public apis and then once the community does get consensus around the new thing that you've been experimenting with it means that you can roll it out very incrementally it will it's going to get guaranteed in operability so for example like when we rolled out glimmer components and redid the component model those interoperate with Ember components right you didn't have to worry about doing them all at once um or for example that you can just use plain fun functions as helpers in templates that's a great feature the helper manager API makes that possible you don't have to worry that it's not going to compose like if you put two helpers together and one is the old way and one is the new way they're going to work because they're both sharing that common low-level API um so this has been this is a good example of a pattern where sometimes you do you didn't have a spec for a thing you just did the first version It's implementation defined but you can capture a spec after the fact codify it as a manager API and then now that you have a spec you can actually iterate as a community against that and do the new highle feature um so um so those these are examples of successes where we've we've risen to the aspirations of of actually building interfaces shared meanings that are not just implementation defined we also have cases of course where we don't always succeed hitting the level we want to and we've got things that are implementation defined and don't have clear interfaces and clear specs so some examples of those would be addons as historically defined V1 add-ons as we're like calling them now that we have V2 addons is an example of that the idea here is that this they're extremely overpowered they can do almost anything there was not really a clear spec for them uh they have a ton of extra hooks that just got added over time so that they're very implementation defined to know everything an add-on can do you really just have to read all the source of Ember CLI um so that's an example of an area where we're uh not hitting the goal yet right I think engines is another example and this one was interesting to me because I went back and looked at the RFC that introduced engines it was only the 10th RFC we ever did so we were still getting good at this process and in the RFC actually it says explicitly it would be really good to make public API defining how these things get built but we're going to do that after we get the implementation in Ember C stabilized right and I think I think knowing what we know now about our process we would we wouldn't do it that way this time we would actually work together on first having the stable lowl apis and then worrying about letting people iterate on top of them to make the high level apis and not the other way around and so we've what we've ended up with is something that's very implementation defined and so it's slower to evolve and harder to change without breakage um the the boot process that emberli uses to boot your application is another example very implementation defined similar to the other things I've talked about um we already heard earlier today about things like the Legacy patterns of adapters and serializers never data these are ones where a lot of features were added over time and they were kind of like the what I I would use a shorthand to say as like the the bad example of O inheritance right it's just like there's a lot of surface area people wanted features people added them you're just supposed to know when to call Super on which things right um our AMD loader leaking so this is the idea that require and Define are things that you can see later around an EMP application even though we've been we helped write the module spec we've been on modules for a long long time we leak the fact that we don't have modules and in a way that was never really like specked out and and and clear when we could stick to the very good es module spec um and I'll kind of put under a bucket pre octane router patterns as well like a bunch of things that the router does that if you were redoing it post Octane and post tract and all you would do it differently right with different lifetimes and more interact more uh use of tract and all that right and so these are examples of places where we haven't yet risen to the bar that we aspire to as a community right and so the wow that was supposed to be overlaid on the previous slide that did not work oh it's going to build in again isn't it haha this is what I get for adding to my slides in the back of the room huh no keep coming so the takeaway of this next one is going to be all the things you've heard about today are things that uh map directly into these areas all right so embroider initiative no I hit the button too many times all right embroider initiative is going to help us is addressing the add-ons right um and engines because we are we have several folks who are working very hard on that who care a lot about that part of the problem we're making sure that Maps into the new world and the modules First World um the boot process of Ember CLI exposing it stabilizing it codifying it um of course we heard about warp drive and how that is you know taking taking care of those Legacy apis on the am data side um our AMD loader as a leaky API that is not fully specked as a stable thing partly embroider takes care of that but also the upcoming strict es modules feature which is currently a draft RFC that is going to that takes care of it even in classic builds if you're not on embroider yet we're going to be offering a fully no AMD loader everything's yes modules the cookie there that uh the incentive is that JavaScript top level of weight would been work everywhere in everybody's apps and um and finally the preac router patterns um the solution here I think is really all about doing more of what we've done successfully like the manager pattern for so here I'm s suggesting route manager and router manager as the implementation strategies that are going to unlock that stuff this this is recent discussions that came out of this week this conference's Associated discussions with the core teams as we're as we were looking at what is the like what is the quick wins that we can ship on the routing part of the story for Polaris um the idea of Route manager is just like component manager let us do iteration of what is a component you can use route manager to iterate what is a route and once you've stabilized that now you can iterate on it and everything at the individual route level would interoperate so you don't have to Port them all at once if you have a thousand routes do one new one and try it out or do 10 new ones and leave the old ones router manager would be at the next higher level to swap a whole router system which would be a later you know the followon step um so these are examples of you know Reasons I'm very optimistic about our community's path over the past year we've seen a huge burst of investment from a lot of different Ember supporting companies and individuals and a lot of that effort is pouring into these really high value areas where like we're really making strategic choices to invest in the really high value stuff which is you know establishing those shared shared abstractions uh shared understandings and trying to do that work right so um I'm really happy with all the progress we we're seeing it is moving very quickly so the takeaway is that our guiding principles they work and we just need to keep embering harder right so uh that's the end of the prepared slides I know some people sent some questions I'm going to try to use some time for that um so we got asked what's the status of app V2 so the blueprint that Chris Manson uh mentioned is effectively that um if the question is when is it RFC as like the official app it's like going to be a question of more people have to use it first and stabilize it um but that's that would be where to look and participate and try it and give feedback on it um the um so the the idea would be that AB V2 is really where similar to how we've already had V2 add-ons for a while and that was intentional because add-ons are really where you you know if add-ons are are holding you back you have a lot less control than things your apps are doing it's where ecosystem wide concerns are really high we really have to hold libraries and add-ons to a more a stricter standard than what you do with your own apps because if your app is is using some feature that turns out not to be great like of course you want to avoid that but it's a bigger problem when it's spread across 15 different packages that you don't control right so we did add-ons first uh but we never really did V2 apps and so this is the idea of like committing to some changes not gigantic changes uh to the app format itself I would summarize them if you heard my Ember talk last year I talked about like categorizing the cost of change these are 01 changes o or cost or one changes in that even a big app is going to have a fixed cost for it so it's about having different dependencies in your package Json a slightly different format for your index.html um and not much else it's not that and there's nothing you'll have to touch in every file it's very important to us that it doesn't scale at that cost um so that that's the the V2 stuff um what are the motivations between between behind hinted at routing changes so I think um a lot of folks can probably think of things that are irksome or um or foot guns in the router that we have for example um had we done it now if we if we' built it now something like your your routes class there would be something with the right lifetime an object where if you used ember's register Destructor lowlevel apis on it it would actually you know come to come to life when you enter a route and then when you finally leave that route get destructed there's no such object with that lifetime like routes have a global life time that's not quite correct that's an example a foot gun that people have had for a long time is model hooks don't always run you got to know about that did you transition to a model or or an ID right so there we have a list of things that we know over the years we would like to change and it's been an area slow to evolve partly just because of prioritization and stuff like it's an area I want to get to but I think inverter is more important for me finish right now um there's a lot of other little things like people have a big wish list of what they want routers to be and that's also partly why like it's easy to make a really long to-do list and then make it take a long time that's partly why I'm excited about you again using our manager pattern to unlock that stuff to make it to stabilize here's how here's how routes hook in show us what you think routes should be uh let us iterate on them together and then ship them so they'll all interoperate um so that's examples of that um had a question about uh life Hearts glimmer next I I think it's great technology demo I think um I think there's definitely stuff in there that could be upstreamed and stabilized but I I would site back also to the what I was saying earlier about it's not just the code that we need right we have to also go through all the other steps to figure out how do you do it together as a community because if it if it works for 80% of the cases but then it then the other 20% is going to tell everybody to rewrite their apps we're not going to be excited about bifurcating the community so I'm sure we could do the work or I think it's likely you could do the work to bring some of those features across or all those features across but the important thing isn't just that like it can run it's that we do all the other steps as a community to make sure we really have stable shared specs and stuff like that um which features in Polaris are fully ready for adoption today as they would ship in a coherent addition I think that that is subjective and people disagree um I can tell you that I am very much using template tag and glint and Embers built in typescript all together in multiple production applications and I've seen teams doing it very successfully um not without some early adopter hiccups and certainly you have to accept that like the docs and guides aren't telling you to do it yet because those are quite are correctly waiting for those features to be at a higher degree of Polish before we say call them recommended um so if you're accepting those caveats those are all very adoptable but definitely there's polish issues uh to go through I think they're rapidly rapidly getting better particularly template tag like in the last um six to eight weeks like has fixed a bunch of the final things that I knew about that were pain super painful um and uh same goes for like V2 add-ons we just closed a long-standing we've been knocking down the dominoes of things that were blocking people Ember data for example going to V2 which just just became possible like last week we knocked the last Domino and they did it right away so it's like lots of good progress on that um let's see Yehuda hinted at server side data loading instead of serers side rendering is there something being cooked up allaha fast to provide this so the idea behind that um I don't have a lot of detail on that but the the general idea would be um it's not fast boot because fast boot is actually the full rendering layer and the theory is that you get a you get most of the value with a lot less headache to not necessarily do full service side rendering but to run just the data fetching part server side or and by server side it could also mean you know Edge compute or one of those things um by separating those and our our data load is already pretty good at being separated from the rendering layer that's part of why routes are not just components they are distinct things with distinct phases that's a good thing to preserve and to improve um so that's the general theory it's not it's not a replacement for server side rendering it's an alternative to it that might be a sweeter spot in terms of the benefit to cost ratio um with that I am over time so I'm not going to do more questions thanks everybody this has been a wonderful emerc comp I'm so excited to be here with you very optimistic for all the energy in this community thank you very much