Submind YouTube summaries
Thumbnail for 03 May 2017: Amdahl's Law

03 May 2017: Amdahl's Law

Watch on YouTube

Video summary

The lecture begins by addressing the importance of rigorous data analysis when evaluating system performance, emphasizing that computer scientists often fall into the trap of relying too quickly on simple summary statistics like averages. The instructor argues that calculating a mean without first visualizing the raw data can be misleading, as two very different distributions—such as a single-peaked curve versus a bimodal one—can yield identical average values while hiding critical information about system behavior. To avoid this pitfall, the speaker advocates for forming hypotheses before running experiments and using graphical tools like histograms to inspect datasets directly. This approach helps identify hidden clusters or code paths that might otherwise go unnoticed, ensuring that engineers understand the full scope of their system's performance characteristics rather than just a single number. A significant portion of the discussion focuses on outliers and the psychological tendency to ignore them as noise or errors. The instructor explains that while some outliers may indeed be experimental artifacts, others often represent real-world corner cases, race conditions, or specific failure modes that are crucial for understanding system robustness. He illustrates this with an anecdote about a test case that exposed severe bugs only when run on a server rather than locally, highlighting the "law of the universe" that software tends to fail under the worst possible conditions when deployed. Consequently, dismissing outliers without investigation can lead to missed opportunities for fixing critical issues, and engineers must learn to distinguish between benign noise and valuable insights into system design flaws. The core of the lecture introduces Amdahl's Law, which dictates that the overall performance improvement of a system is limited by the portion of the system that remains unchanged. Using a clear example where one function takes five minutes to execute and another takes only five seconds, the speaker demonstrates that optimizing the slower function yields massive gains, whereas optimizing the faster one provides negligible results. This principle extends beyond simple speed; it also applies to resource consumption and reliability, suggesting that developers should focus their efforts on the parts of the code that contribute most to the bottleneck or failure rate. The instructor warns against getting stuck optimizing a single component indefinitely, noting that once a part is sufficiently improved, further work there yields diminishing returns, and attention must shift to other areas of the system. The session concludes by introducing a classic paper by Butler Lampson that organizes timeless advice for building computer systems into three main categories: does it work, how fast is it, and does it keep working. The speaker emphasizes that functionality is the primary concern; if a system does not perform its intended task, speed and efficiency are irrelevant. Once reliability is established, performance becomes a trade-off against resource usage, such as minimizing the number of machines required in large-scale cloud environments. Finally, fault tolerance is presented as essential for long-term viability, requiring careful consideration of how systems recover from failures. The lecture ends by encouraging students to read Lampson's paper over the weekend to internalize these principles, which serve as a guide for balancing the complex tensions inherent in system design and optimization.
Read the full video transcript
okay this song is not going to play today that makes me a little sad that's alright oh there's a new table here change something in the matrix okay so today first of all congrats on those that are done with assignment three a couple new names up here recently so a couple more days actually you know you can keep submitting on the leaderboards as long as you want leaderboards don't know anything about the deadline so so yeah hopefully we'll get a few more people up here over the next couple days of course that still they did click outside of here happens okay today we're going to talk about um Dells law we're going to finish talking about performance and then at the end of class I'll start talking about the paper that you guys are going to look at for Monday so it's a reminder there is no class on Friday we will have all day mega office hours going on in and around Davis hall for finishing up last push on assignment three and then Monday Carl will talk about the rest of the paper that we introduced at the end of class so you guys haven't read it yet I just sent it out today but please look at it over the weekend hopefully I can sort of encourage you inspire you today to actually look at the paper because this is a fun paper to read the lessons are timeless some of the examples have gotten a little bit crufty the paper was written a long time ago but there's a lot of good advice in this paper some of which we've talked about throughout the semester but Lampson does a nice job of organizing it all together and presenting it well ok any questions on Carl's what Carl talked about on Monday sort of the start of our discussion brief discussion of performance in benchmark Carl was excited about sharing some of his own experiences with performance testing with you so hopefully you got something out of that ok so let's talk about statistics so once you've actually picked a benchmark to run and figured out how to measure things about the system that you care about at this point what you actually have to start doing is analyzing the results and this is a place where computer scientists can get into trouble can I talk Thanks yeah there's only one right answer to that question so collect results start computing some statistics and I mean how many people in this room enjoy math really why that's not the response I was expecting yeah hands down up here how about how many people enjoy statistics okay still something wrong with you guys somebody was to come into class demented people um maybe you guys are coming because you're waiting for me to talk about math and statistics well today is the day you guys never to come to class anymore anyway I'm definitely in computer science because I was too dumb to do other things I want us to do right which included at one point physics and then math well I guess math was first maybe in physics or Secor but whatever that's why I became a computer scientist because it was better at it so I don't particularly like maths or statistics but these are really useful tools like other things that we do we build system so we have to learn how to use them on the other hand our approach to these things that's not necessarily always ideal so averages for example like I want to summarize a data set hey I'll uh run the experiment a few times well first of all I have to have a data set so that's kind of the first thing actually on a on a on a bad day I just run the experiment once get one number move on you know because clearly that number is exactly right on a good day I might run the experiment a few times see a little bit of performance variation and try to summarize that data set using some sort of summary statistic like an average which is a fantastic statistic about 10 percent of the time and other 9% of the time is a miserable terrible statistic and if I'm you know feeling really frisky that day you know like I've got some extra time you know something good happened to me in the morning I drank a couple of extra espressos or something I might actually put some air ours on the graph so people have some idea about the variance in the underlined data set so we're going to talk today about some of the right things to do right ways to approach this process particularly once again so we're at the point where we're we know how to measure things about the system and we know the things that the system is going to do while we're measuring it so we figured out how to you know measure things given the limitations that Carl talked about Monday and we have some sense of what this workload should be what are the benchmarks we're going to run that produce behavior that we're interested in studying so this is something I always thought my PhD students and I think this is really a important part of this process that people don't always do the first thing before you start writing experiments is is make predictions about what's going to happen in the scientific method people called this a hypothesis I know we're computer scientists right well they say about science any science that has science in the name it's not an actual science right political science the social sciences in general this is true and I didn't say this don't blame me but you're a computer scientists right so you feel the need to emphasize to people that you do science what that means is that you don't formulate hypotheses before you run experiments so why don't we try doing that and actually this is really this is really an easy thing to do so before you produce a graph of a form of a hypothesis it doesn't have to be like 3rd grade science you don't have to write hypothesis : bla bla bla bla bla draw on the whiteboard a picture of the graph that you think is going to result from this particular experiment and and that's your hypothesis now then you collect results graph the data and if the graph has a shape and features that match your original hypothesis then something about your understanding of how the system behaves has been validated this is always a good thing to do because this is a way to help build your intuition you know a lot of particularly when you build computer systems computer systems takes a lot you know building computer systems if you guys have discovered takes a fair amount of time and energy and so something that you build up over time is an intuition about what things are going to work because we can't always try stuff trying things when you build big systems sometimes take years if that thing doesn't work out that's time wasted and so having some intuition about what's going to happen how systems are going to behave and what are general good design ideas is something that comes with time but is worth trying to build up so make a prediction I just said you can compare graphs you know compare your sketches of what you thought the graph would look like with the actual grass themselves has anyone actually ever done this at college have you taken a class where you did experiment just curious okay are you guys like this is these are computer engineers over here this is like them when they make you to chemistry or something like that yeah there we go okay yeah like other fields do this it's not a weird thing you know I run a chem experiment once you start doing what we're talking about you know benchmarking and experimenting with systems this this is important and it's not something that we necessarily always talk about enough in the context of computer science okay and then you know when we talked Carl talked on Monday about various tools that you can use to experiment with systems predictions are also good ways to validate models and simulators so if the simulator doesn't match up with your intuition and produce results at least along the lies that you predicted then there may be a bug in that system that you need to fix okay understanding your data once you have data working with that data understanding that data you know Oliver in our department works a lot on data cleaning thinking about how to take the data and massage it into the format that you want and then mine it for information one of the biggest mistakes people make is that they in my opinion is that people are drawn to computing these sort of summary statistics too soon why do so for example when I talk about summary statistics I'm sorry have other things like means medians standard deviations things like that these are single numbers that are designed to summarize an entire set of data how many people have computed one of things these things before in the last few years okay how many people did that when it didn't involve like a grade in a class okay it's a few heads that didn't go off yeah so no there's there's deep explanatory power in some of these statistics when they're used properly they also can be really misleading if they're used improperly and there are assumptions about the underlying data sets that are implied in the ability of some of these statistics to actually effectively summarize the data that you're trying to use why do people tend to compute these so quickly it could be a data set you know first thing you do is is compute if I give you a data set a lot of things a lot of you the first thing you would do or if I said compute one interesting number about this data set you would probably just compute an average right why yeah it's a good representation of the data it's a representation of the data it's easy it's actually pretty easy you know there's a very easy mathematical definition of average that I can compute you know even if I you know even if Excel makes me vomit in my mouth a little bit it will probably help me to do this if I poke it in exactly the right way and it also avoids doing things like actually graphing datasets that's complicated I don't want to do that but but some of these things looking at full data sets before you jump to summer so just this is actually really important so let me give you the canonical example of this these two experiments these two data sets produce the same mean and median so if I computed the median and the mean of these data sets common summary statistics I get the same result now clearly there are different things going on with these two data sets you know what's like you know it clearly they look different once a one hump camel the other is a two hump camel but other than that what is like if you were a computer systems person and you saw a data set like this let's say that this is like the page fault handling time for your VM like what's what's the difference between these two or what's a difference what's one direction at that second data set that has two clusters and it starts the Lee doing yeah yeah there's something else going there's two different things going on here you know maybe this is one of the code paths in your VM vault handling and and this is the other code path maybe you didn't know that there were two code paths so this is useful information maybe you thought there were three code paths and it turns out there's actually only two because maybe there's some dead code in there that never gets run because one of the corner cases you thought to handle never happens or didn't happen when you ran this particular benchmark so trust me I mean there is nothing that's going to make you feel Dumber then you know going to somebody like your boss in the future and presenting them with these high-level summary statistics and then having to go back a few days later and be like actually whoops by the way that data actually looks like this and it turns out that there's this completely unexpected thing going on in the data so that I didn't realize this makes sense graphing data I mean don't ever compute summary statistics on reasonable sized data sets before you look at the data in some way histograms like this are a nice way of looking at larger data sets if you have small data sets just you know plotting them out a scatter plot or just looking at them you know what's another you know I thought it would at some point when you know I was thinking about new classes to teacher I thought it would be fun to teach about it you could teach a whole class on misleading statistics well it's an example anyone have a favorite yeah what's that starting an Access Oh in accidents oh yeah you see that all the time right ever seen graphs where it's like it looks like there's been this huge change in a variable and then you squint down at the access and it turns out axes axis how do I say that axis you really mess with me I think I'm saying it wrong right you look down at the scale let's put it that I can avoid the word and yeah the scale starts at like five million right but anyone else but but favorite statistics people talk about like highly misleading statistics what else poor statistical practice oh come on I mean you guys how many people here follow sports like there's a fair amount of numbers in sports these days right and of course you know some of the movement in sports like baseball is away from these statistics that are really misleading on certain levels a batting average for example yeah well Tom Brady wins a lot of games so that's just okay okay yeah yeah well so if you don't play baseball for example something like a batting average has been considered to be a four so just like because it doesn't include times where the runner got on base without actually being given a chance to hit the ball this is where this stuff gets weird my favorite is average income in the United States yeah look at the average income who cares what the average income there's some people over there making billions of dollars that are dragging the average way over in that direction I'm serious that people talk about oh you know the average income the United States went up all that means is that Bill Gates made ten times as much more money right like Bill Gates affects the average way more than I do what's a better statistic for a data set like that median the median is an underappreciated statistic you know someone said before said the average is a good way to describe a data set almost never true actually averages are a good way to describe data sets that have a particular distribution to them a data set what's so nice about a media if I told you the average of a data set what do you really know about the dataset very little all I know is that if I add it up and divide by the number of members in it I have this if I tell you the median what do you know about that data set half are bigger half are smaller so they give you the median income in this country you know that half the people in the country make less half the people in the country make more but it's a useful thing to know about a data set not the only thing you might want to know obviously again both these data sets have to say median and mean so the median is not a you know using medians it's not a magic you know thing that's going to save us from looking at the underlined data itself okay outliers what's an outlier yeah so a weird data point it's like most of my data points are over here and then there's one data point that's ten times larger ten times smaller what do people like to do with outliers yeah ignore them all right whoops something must have gone wrong right something must have gone sunk that just happens sometimes right like sometimes you know the Sun doesn't rise at the time that you think it's going to rise it's like an outlier day and it's ignore it you know just go on with your life yeah so outliers are tricky I mean it is possible I'm not saying that you have to at all costs preserve outliers in your data set but it is possible that outliers are real they could just be some sort of noise in the system you know you ran an experiment at a time where somebody else was hogging the machine it was consuming all of the system resources right I would argue that's not a particularly well designed experimental environment but that can happen but outlier sometimes can represent behavior that you really really need to understand some sort of corner case in your code some sort of very very poor interaction between differences some components and and here's the thing so I think you guys have probably figured this out by now by some magic of the configuration of the universe test 161 when we run it on the server exposes lots more bugs than it does when you run it locally right and this is the case of a general sort of law of the universe that says whatever the worst thing your software can do it'll do it when you give it to the client and say that it works right that's the point at which it'll start to act up and there's actually some reasonable reasons for that they're going to run it with a different configuration they're going to provide more load they're going to use it in some way that you didn't understand or expect but it's also just sort of you know the you know one of these laws of the universe so if you see something like this when you're testing a system this is also sort of like those race conditions that you guys run into when you're testing your kernels you know I've been helping people in office hours and they'll hit a race condition like this and they'll start immediately like shut down the system and start I'm like you we're gonna see that bug again it's gone you know like they're only gonna hit that bug once every million times of course again when you run it for grading we're going to hit it once out of one times so but don't stop like you have valuable information like this is a really really critical moment just leave it alone take a deep breath you know start debugging don't stop and hope it doesn't happen again it won't write again until we graded okay so understanding outliers and data is relatable okay any questions before we go on this is sort of about data analysis all right so now we're going to I mean in terms of like material in this class that has significant deep life implications that people tend to ignore that that you know if there's advice that I can give you to take out in the world that's going to improve your life not just in the computer programs that you write this is probably the best stuff coming up here in the next ten much ten slides okay um does law how many people heard of IM dole's log okay good we're going to talk about it again because we should talk about it more so once you've measured things once you understand data remember we're talking about performance improvement here making things go fast deciding on what to improve is the next step what part of my code am I going to try to rewrite in order to make it faster now even if I thought I should work on the slowest part of the code which is not true this is really hard to do and again I think by now you guys have been developing iOS 161 all semester you may have started to see some of these patterns emerge in your own behavior so for example how many people here have just known that a certain part of their code has a bug in it like if there's a problem with your code you just kind of know where it has to be you know it's in that janky thing I wrote at 3:00 in the morning you know that's got like ijk and ellas indices I did see this in someone's code by the way they know who they are four level page tables yeah like the part that has no comments for 300 lines of code you know the part where I decided to stop using the syntax I use everywhere else like the part where I didn't put great statements around my bear if statements because I thought why bother right you know I've only got a certain number of keystrokes Jeff said that so I'm going to just stop using brace statements braces yeah like we have this intuition this happened to me all the time when there's bugs in my code I'm like oh I know where that bug is you start debugging you know and it turns out you're wrong even if you in nan types you have data in front of you that should have led you to some other conclusion but the problem is you were you're nervous about this one piece of code because you don't understand it fully or you forgot what it does or your partner wrote it and you're like hey it has to be the problem and so you start looking there and sometimes you rewrite it and sometimes you spend time you end up trying to you end up wasting time cleaning things up and stuff like that in the meantime the actual problem you're trying to solve is somewhere else you know and so programmers frequently approach performance evaluation performance improvement in the same way they say okay I'm going to work on this one product Co because I know it's the slow part now that's where I did a linear search through this array and I mean now that's going to have to be the part that's low okay but let's come back to talking about hamdullah slaw so so here's an example I've got two functions in my code one is called foo which takes five seconds to execute sorry five minutes execute and the other is called bar which takes five seconds execute so which function is slower not a trick question foo is slower food takes you know sixty times longer to run and bar so clearly I should start working on foo right away right okay somebody has trained you guys a little bit better than in the past so that's good progress is happening in the world so what two things do we need to think about here yeah yes so the first one and this is one I think you guys have probably been told them for how much does foo matter how many times is food being executed maybe foo was some sort of recovery in your file system that only gets run when the file system crashes now I'm not saying that that's not an important time we talked about journaling and why people do that now to speed the process of propping up file systems that have crashed however if we're trying to improve the common case then code that only runs in special circumstances is totally irrelevant there's something else to think about here this we can measure you know this I can run tests that I can run benchmarks that can figure out how much is foo contributing to the performance of the system there's something else though here that that is a little bit more intuition driven and that is how much slack is there in foo how much can I really get out of this right if I worked on foo for an hour how fat much faster am I really going to be able to get it to go and and this is not something that your benchmark is going to be able to tell you this is something that you're going to have to use other information to figure out you might have talked to other people on your team and say hey has anyone ever tried optimizing this and when everybody on the team is like yeah I did it yeah I did it yeah I did it I did last week you know they're like okay I'm not there's no slack there right unless they're really terrible programmers in which case I would find another job first before you optimize this code anymore so how hard is it going to be to do this you also look at the code I mean if Foos like two lines of code you know that are calling into some library that's provided by somebody else's you don't have control over them good luck right I mean it may just be nothing that you can do so but because we're talking about performance improvement and how to use benchmarking and analysis we're going to talk about significance but again difficulty matters so so here's the statement of our dolls law and we'll look at several statements at this so sort of the most mathematical which is that the impact of any effort to improve system performance is constrained by the parts of the system not targeted by the improvement it's kind of weird right and that this isn't my favorite formulation of this so I have a couple more what this means is that if the rest of the system remember when you work on improving the performance of something you're working part of a system usually the rest of the system is staying the same that's what this this law this formulation of the law is saying I can only get the system to go as much faster as the contribution of the part I'm working on because everything else is unchanged so going back to our example if I can reduce the execution time of foo from 5 minutes to 1 minute or reduce the execution time of bar from 5 seconds to 4 seconds what should I do this is more obvious right what's a right we're still stuck here we still don't know what to do right I mean and and this is this is where the human psychology starts to play a role okay because you're going to feel better about yourself at night if you work on food right you're going to be like no honey I made a piece of code today five times faster now hopefully the person that you care about doesn't care about that sort of thing they're like whatever let's have a beer the but you know the improvement to submit it's like oh yeah I spent all day working on this stupid piece of code and only got one second faster that's just not as glorious right unfortunately it still doesn't matter because if you know as Stephen pointed out if the program doesn't ever call who then all of your glorious victory has been for naught right I remember once at Microsoft like reading this totally gnarly nasty piece of code that had to do with weird page table structures for really large memory architectures and then starting to scratch my head and wondering like I just felt like I felt like I was on a wrong path and so what I did is I ran the preprocessor over the Windows kernel code that I was looking at and that file vanished right so for the for the types of machines that I was working on that file didn't even get compiled in right so that was great I'm glad I wasted those few hours of my life right I remember that experience I remember nothing else about the coat so so again I mean in this case and and you know because the in this case the improvement to Fuu is so dramatic you really have to push these numbers pretty hard to get this to happen but this happens okay when I worked at Microsoft I worked on a desktop performance group the first time I worked there I we had people on in the same unit that worked on server performance and the server performance people spend a lot of time thinking about these hot paths so the server performance people can find one instruction that they can get rid of on something like the page fault path the system call handling path they all get several months off and they go on vacation I'm not kidding because these code basket hits so often and usually they're pretty tight already and people spend a lot of time working okay so this is this is my more colloquial formulation of on dual saw which is ignore stuff that looks bad there may be parts of your code that you don't like there may be algorithms that you don't like maybe data structures that you don't like that you think are embarrassing and bad and they may be but no one cares what they care about is whether or not stuff works and goes fast and so if you fix the parts that are going to cause things to go fast the thing that's doing the damage the parts of your code that are actually causing the entire program to feel slow that's what's going to eventually make the most difference and again this is something that you can apply to your life you know most of us spend a lot of time optimizing things that don't really need to get optimized right so you know take the fix that fix the thing that's causing a problem all right and then this is so this is another corollary to on dualsaw which I think it's really interesting that's also important which is that performance improvements to a particular part of a system have to be part of a process because the longer you improve a particular part of the system remember I'm dolls law the rest of the system's not changing so even if you're working on 20% of the problem you can only make the system 20% better at some point you have to loop back start over run your benchmarks again analyze your data again and pick the next thing to do you know people get I've seen people get really wedged into improving one particular thing about a system and they're totally missing the bigger picture it's like that thing stopped mattering a long time ago you you won you made it better now stop you know go back and pick something else to work and of course again there are there are sort of deep psychological reasons that people do this I understand this piece of code really really well and I know everything I want to do and I've got this whole checklist of improvements I'm going to make and it turns out that I actually already fixed all the things that were a problem but think about all the new cool things I can do to this and just don't do that you know at some point stop take a break go back to square one start running experiments again and take the next thing to work all right any questions about this okay so what we're going to start talking about now and Carl will pick this up on Monday so this is this is one of these classic papers this paper is old fun venerable written by a very famous computer scientist this paper contains a variety of hints as he puts it and Balan Epson is very open about the fact that these are suggestions some of them are self contradictory there is no internal consistency some of them tell you to do one thing and other ones tell you to do kind of the opposite of that other thing and taken as a whole these expressed a lot of different tensions that exist in improving the performance of systems one thing that Butler Lampson is very correct about is that systems are more difficult to both understand and improve than algorithms okay systems contain algorithms they use algorithms but systems themself you know the design decisions that you guys make when you figure out how to factor your VM system that's not exactly an algorithm I mean it is kind of I mean at some level if you really want to go there everything's an algorithm but systems as a whole are more complicated to think about analyze and improve then then then algorithms and one of the things about Lampson does early in the paper is he talks about why this is the case so for example the external interface is less precisely defined this is this is pretty particularly when you're building systems for actual people to use an algorithm frequently has a very very specific thing that's supposed to do sort an array of numbers you know take two sets and figure out what members are common to both of them things like this systems the external interface particularly if it's a human interface is subject to change and less precisely defined so this is one of the challenges systems have a lot more internal structure to them than algorithms do systems have subsystems to talk to other subsystems I mean you think about something like Twitter me Twitter probably consist of you know dozens of different components that are talking to each other rather than you know one single piece of code or single sort of piece of pseudo code or single approach how to get things to work properly is frequently less clear now for certain types of systems there are you know certain constraints for example if Twitter didn't deliver tweets for several days that would be a problem so certainly Twitter and other types of systems have constraints about things that they have to do but the overall design success of some of these systems is a little bit less clear okay so Butler Lampson you know wrote this paper because he had accrued wisdom from working on a variety of different types of systems and this is probably the in my opinion the weakest part of the paper at this point in time because you know 40 years ago and by or 30 years ago by and some of the examples of from this paper are sort of great computer history lessons and so actually hopefully he won't bother me he won't mind me teasing him about this but this is a great paper for card will talk about right now Monday because Carl may have actually used some of these systems so you know Butler Lampson doesn't claim that these are original hints these are things that you know a lot of system designers apply sort of naturally his goal is just to colors they're collecting together in organizing well I can't ask you to active and read the paper so but learn Ebsen organizes the hints into three categories so one is and these are three things that you think about when you build computer systems one is does it work does it do the thing that was supposed to do this is probably the most important feature of any computer system no one really cares how fast an operating system is that dun doesn't run user programs yeah you know no one would care about the performance of Twitter if you couldn't send tweets that wouldn't be interesting so until the system works you know the other two things are sort of irrelevant so getting systems to work once systems start to work then speed becomes interesting and you can substitute speed for resource consumption today at the time this paper was written cloud computing was not a big thing so now you know big cloud computing providers big big companies that companies that build big systems think not only about how well they work and how well they perform but how few machines they can be run on you know because that affects your bottom line the fewer machines I can run things on even if you know so for example if you went to Twitter and you said I have a to to improving your computer system that will allow you to use half as many machines but will only increase the delay of a tweet by half a second they would probably do it I shouldn't put money on that but you know all these companies are making trade-offs between performance and the amount of machines they have to rent not of Rackspace they have to use stuff like that capital costs associated with maintaining these big data centers so fault tolerance final thing he talks about is does it keep working how does it recover from failures what are the failure models how are things allowed to fail okay and then in each part of these tasks there are three sorry and each part of these goals there are three parts of the process so part one is ensuring completeness so for example with functionality making sure that the system does everything that it's supposed to choosing interfaces so this is a task that affects all three of these so how fast does it go sometimes has to do with what are the interfaces that you've chosen to build between various parts of the system and actually designing the implementations themselves so you know making sure that you've done everything you need to do figuring out how different parts of the system are going to talk to each other and then figuring out how to implement the parts of the system that you now now need so I mean how many people had to design an internal interface when you did assignment 3 I hope that you guys don't know what I asked you so how many people wrote their entire VM system is inside vm fault just one big function okay Gus is laughing so at least one person huh yeah I mean I hope like you guys wrote some little helper functions did anyone write a helper function okay there we go so fine you use an interface maybe you didn't think about it that way phew okay good I feel better yeah I mean you may not have thought about this way and unfortunately they had to not have designed it very carefully but once you start to refactor your code and write helper functions essentially what you're doing is creating little internal interfaces that you're using and it's usually better to think about those interfaces beforehand spec them out talk about them you know make sure that everybody on your team understands how they're supposed to work but sometimes they just sort of emerge next that's all that's okay - all right so here is a summary this is a figure that's actually drawn from the paper of all of the hints let's see here and some of them end up in multiple categories so you know that this end-to-end principle is connected through you know several different places let's see here it's a good idea again divide-and-conquer cash answers so Karl is going to pick up with these on Monday does anyone have any questions about these before we stop for the day I know it's a little bit of a short short lecture so so again this paper is rich with useful hints about how to build computer system so please look at it over the weekend of course after you finish the sign of three point three we'll have office hours all day Friday good luck wrapping up a Simon three you