字幕列表 影片播放 列印英文字幕 MALE SPEAKER: Thank you for coming to Edmond Lau's talk. He will be talking about how to be a more effective engineer. I met him about four months ago or so, and it was also during one of his talks. And I was just blown away by it. And I thought it would be so useful to share his experience and knowledge with the rest of Google. He is actually also an ex-Google. So, he worked at Google before. He also worked at various startups. And this talk will be based on his experience as well as everyone he interviewed with, and what makes for an effective engineer and for an effective team. So without further ado, let me introduce to you Edmond Lau. [APPLAUSE] EDMOND LAU: Yeah, it's great to be back. I think it's been maybe 10 years since I first joined Google right out of school. I joined the search quality team. And since leaving Google, I've worked at a bunch of different startups, including Ooyala, Quora, and Qup. And two of those were actually founded by former Googlers. And so, even though I've been away from Google for quite some time, Google culture has actually been a large part of the various startups that I worked at. And earlier this year, I did publish a book, "The Effective Engineer." And what I like to do during this talk is share with you some of the stories and lessons that I've collected during these experiences. And so my promise to you during this talk is that you sort of walk away with a framework and a set of actual strategies that you can apply to your day to day job on how to become more effective as an engineer. But, before we dive into the meat of the talk, I want to do a quick poll and get a show of hands. Who here has pulled a long night on a project for work before? Who here has done that-- who's done work on the weekends before? A large number. Who here has worked multiple months on a project, only to see maybe it not actually launch? What about working multiple months on a project and then see it launch, but not actually sort of seeing the impact or the effect that you actually wanted? And let's do one more. Who here has to do pager duty? And how many of you have been paged in the middle of night or over the weekends before? Yeah, so it's a good number of people. And when this stuff happens, a lot of times we sort of wonder, was all this time and energy, was it worth it? Was this actually the best use of my time? And this isn't a question that you just sort of ask at Google. It's also questions that we ask at other places as well. I remember when I left Google, the week immediately afterwards, I jumped-- dove head first into my first startup. I didn't even take a week of break. And this first startup was Ooyala. It was an online video company focused on building a platform for the enterprise. It was founded by a former Googler. I remember my very first week, the CTO told me, you're responsible for building this feature that's already been promised to a paying customer. And the video player has written an actionscript, because it was a Flash based video player. And it was a language that I didn't know. The servers were all written in Ruby on Rails, which I had no familiarity with. And there was not a single unit test across the entire codebase. And so, I was really scared of just accidentally breaking something production. And so, my first two weeks there, I ended up pulling 70 to 80 hour weeks to try to get that done. And when I want to talked to my CTO about how intense this felt, his response was sink or swim. There's no life preserver coming. You're just going to have to work hard. And that was a very intense and very stressful time in my career. And so, the next startup I joined wasn't all that different. When I join Quora, which was a question answer site, the jobs page actually read, you should be ready to make this startup the primary focus of your life. That's sort of how intense the culture was. And that time, all of these narratives about how you need to work hard to succeed sort of really lined up with how we were thinking. My team and I, we really wanted to succeed. But at the same time, we knew we were the underdogs. While we were building an online video platform for the enterprise, YouTube was free. Our biggest competitor, Brightcove, dominated most of the market. And so we thought, one of our secret weapons was that we're just going to outwork everyone else. We're going to work so hard that we're going to overcome all these obstacles and actually succeed. And it took a while before I started wondering, was this actually the best use of our time? Because we worked on projects where we'd spend multiple months building a future for a paying customer, but then they would never use it. Or at Quora, we'd build content tools. And it just wouldn't get the adoption from users that we actually wanted. There were all these things where we spent so much time on these projects, by the end of day, it didn't really lead to any impact. And so, we started sort of wondering, can we actually work smarter? Can we deliver significantly more value while working fewer hours? And it's sort of like after doing years of actually working these crazy hours before I had this key insight that effort doesn't really equal impact. You may have good intentions, but those good intentions don't actually lead to results. Think about a staff engineer at Google. They probably produce more than twice the impact or twice the output of a more junior engineer, but they're probably not working 2x the hours. Or think about Jeff Dean. So, I heard Google had to sort of invent some new engineering level for him, like senior Google fellow. He probably produces more than 10x the impact of most of us in this room. But he's not working 10x the hours because that's physically impossible. There aren't that many hours in the day. And so, the notion that effort is sort of what determines our impact isn't really a correct one, and we need a better framework for the really understanding and thinking and reasoning about impact and effectiveness. And so, that's sort of where I sort of came upon this principle of leverage, where leverage is defined as impact that you produce for the time that you invest. It's the rate of return on your investment of time and energy. It's the ROI. It's the rate of impact. If you think about the Pareto Principle, the 80-20 Rule, it's the 20% of work that actually produces 80% of the results. Those are the tasks, those are the activities that actually are extremely high leverage. Now, sort of a central thesis that I want you to take away from this talk is that this central concept of leverage is really the guiding metric that effective engineers should use to determine how and where to spend their time. Now, it might seem a little obvious and maybe a little simple to some of us, but the same time, oftentimes we're so engrossed in what we're doing, we're so focused on the project that we're working on that we don't really take the time to ask, are we working the right thing? We're attending meetings. That might not be the best use of our time. Or we're fixing the next urgent bug, or we're just fighting the next fire. Or we're working on projects that end up not shipping or not going anywhere. And we don't really take a step back to think about, was our time on these projects actually well spent? Were those activities actually high leverage? And you can think about if you're walking along the road and you see a boulder, that boulder is really hard to move. But if you can find the right lever, then you can apply just a little bit of force and move that boulder out of the way, because that lever amplifies your output. In a similar way, in software engineering, we're looking for those levers where we can amplify our energy, our time and produce massive gains. And so, the next question we might ask ourselves, given that we have this framework, is how do we actually apply it to engineering? What are the highest leverage activities for engineers? This is a question that I really personally wanted to answer. I knew that working 60 to 80 hour weeks simply wasn't sustainable. It wasn't going to help us win in our different markets. Also, I'd spend a lot of time on engineering hiring and recruiting. And I'd screen thousands of resumes or interview maybe 500 candidates. And I really want to know, how do we actually identify the most effective engineers to hire for our team? I'd also spent about maybe a year and a half building the on boarding and training programs for engineers at Quora. This was basically what every new engineer at Quora would go through. And I wanted to know, how do we actually train engineers and teach them to be more effective? And so, I really wanted to know the answer to this question. And so, that's what started me on a quest where I quit my job at Quora and then basically took two years to explore this question. And I went around Silicon Valley. I interviewed a bunch of engineering leaders from different companies. So, VPs, directors, managers, tech leads, people from larger companies like Google, Facebook, LinkedIn, Twitter. A few were from more medium size companies like Dropbox, Square, Airbnb, Box, Etsy. And even smaller startups: Instagram, Reddit, Lyft at the time was pretty small. And I grilled them. I asked them really hard questions. Asked them, what separates the most effective engineers you've worked with from everyone else? What are the most valuable lessons that you've learned in the past year? What investments have you made for your team that have paid the highest returns? I really wanted to know what from their experiences proved out to be the highest leverage activities that engineers everywhere should be focusing on. And now 22 months later, I basically had a collection of stories, lessons, and actual strategies on how to be more effective engineer. Now, everyone's story was different, but there were a lot of common themes. And in this book, this is still a lot of those common themes through actual strategies that you and I can apply in our day to day jobs as engineers. And so, what I'd like to do for the rest of this talk is actually share with you five of those high leverage activities for engineers that I think would be really useful for us to incorporate in our day to day jobs. The first high leverage activity really starts in our own mindset, how we think about our own development as engineers. And that activity is optimizing for learning This Mantra is something that has guided all of my own career decisions. Every change I made from company to company or from company to writing a book was because I saw an opportunity to actually increase my learning rate. And this is really important because learning is something that actually compounds over time. What you learn today sets you up for other opportunities and other learning that you might have in the future. And when I say that it compounds over time, I actually mean a few things. One, this curve of learning is actually exponential. Just like if you were investing in your financial investments, your investment portfolio, your financial investments compound over time exponentially. In a similar way, investments in yourself also do the same thing. So, the second implication is that the earlier on in your career that you invest in yourself, the more time that learning has to compound the long run. And thirdly even small deltas in your learning rate can have tremendous impact on how much knowledge and how much learning you have in the long term. And so, it's really hard actually to quantify how much we're learning, but suppose you actually could. Suppose you could actually improve yourself by 1% per day. What would that mean? Well, it would mean by the end of the year, after 365 days, you'd actually be 37 times better than you were at the being of the year. That's a huge difference. And the best engineers and the best engineering leaders actually aggressively and relentlessly optimize in their own learning. One of the pieces of advice Tamar Bercovici, who is a senior engineering manager at Box, tells all of the engineers he manages, is to own your own story. What she means by that is that you need to take control and take ownership of your own learning and growth, rather than waiting for opportunities to come to you and find opportunities to really invest in yourself. Read books, take classes, work on side projects, attend talks. These are all ways that you can invest in yourself and then those investments will compound in your career in the long run. And so, when you think about growing your career, ask yourself how might you improve yourself every single day? And commit to making a habit out of that. Now learning is one thing that compounds. But another thing that also compounds and that also is very high leverage is actually investing in your own iteration speed, how quickly you can get things done. The faster we can get things done, the more impact we'll have in the long run. And because we're all engineers, one of the best ways that we can invest in our iteration speed is actually by investing in tools. When I was talking with Bobby Johnson, who's the former engineering director at Facebook, he made the observation to me that he found that people who are successful, almost all of them wrote a lot of tools. He said the strongest engineers and his team spend probably a third of their time working on tools. Tools to do monitoring, tools to make debugging easier, tools to just glue the system together. But the surprising thing was that he said this wasn't actually obvious on his team. Because a lot of engineers, we like working on the new shiny tool. We want to be the author of some new system. We want to build this new data storage system and be the author of that. When in reality, even more mundane tasks, such as investing in tools and investing in your own iteration speed, can be extremely high leverage and have huge payoffs. This is sort of the reason why a lot of big companies, Google, Facebook, Twitter, LinkedIn, Dropbox, they all have teams the focus on development tools. Because if you can decrease bill times by, say, even one minute per day and engineers are building, say, 10 times per day, and you have 1,000 engineers, that's a one engineering month saved per day. I remember when I joined Google back in 2006 and I was compiling in a Google web server on search quality team. It was something that you kicked off and then you went home and it compiled itself overnight. That's how long it took. And by the time I left in 2008, sort of when Blaze was getting introduced, bill times I think dropped to around 20 minutes. And that was huge. I'm sure it's probably dropped down even further since then. I'm not sure how fast it is now. I see I see some shakes of the head. But all of these investments in bill times are extremely high leverage. Because it means that you can, instead of doing things in large batches, you're doing them more iteratively over time. One of the proudest accomplishments that we did while at Quora was we had a system where we could actually deploy code production 40 to 50 times per day. For every time an engineer pushed to commit to get, it would automatically kick off a suite of a few thousand unit tests. And if all those tests passed, that code would then ship to a canary machine, that would then run another battery of tests. And if that passed, the code would be automatically shipped to all our webmachines production. And that entire process only took six or seven minutes, which meant that we could push code production 40, 50 times a day. And that changed deployments which, from any team to this one off event that they have to do maybe every week, maybe even every day, to something that was a very normal part of a development. And it meant if we had a question, how often is this feature that's on our web page actually being used, it means that an engineer could just add a simple log line, push that code to production, and then start getting some data back within minutes. So, a lot of these questions that are impossible with a slower workflow, we were able to do because of a system of continuous deployment. And you might wonder, when does it make sense for us to invest in tools? And a good rule of thumb that I got from Raffi Krikorian, who grew the infrastructure team at Twitter from about 50 engineers to 450 engineers, used to tell his team that if you have to do something more than twice manually, you should build a tool for the third time. And that's a good rule of thumb, because we tend to underestimate how often we're going to need to manually do certain tasks. Sometimes we get started, we do things manually because it seems to be simpler. And then requirements change, or we mess up during our manual steps. And then we end up spending a lot more time than we actually could have. Instead, if we had invested in tooling and automation sooner, we could save ourselves a lot of time. And so, when you're working on a project, you should also always ask yourself, what are the events? What are the bottlenecks that you face during development? How can you speed those things up? Because all of those improvements will sort of compound in how fast or how quickly you can get things done. You can also ask same question when you're debugging, as well. Say you're building an Android app and you're debugging this photo sharing flow that's a few clicks away from the home screen. Could you wire up your flow so that when you start the app, you land right on that screen? Simple tweaks like to optimize your own debugging flow to really optimize your iteration speed can have a huge difference in the long run in how productive and effective you are I've talked a lot about how to get things done quickly. But another important question to think about is not only how to get things done quickly, but how to get the right things done quickly. And so, that's another key high leverage activity is actually validating your ideas aggressively and iteratively. And a good example of how to do this right as well as how to do this wrong actually comes from Etsy. Etsy is a company that sells handmade goods online, and last year they hit almost $2 billion in revenue. And they had this one project where they were trying to build infinite scrolling on the results page. So, when you type a query at Etsy, you see a bunch of product products. And the product page is paged. And they were exploring, maybe we should add infinite scrolling. Similar to how on Google Images, if you scroll down on the image search page, results just sort of keep loading onto that page. And so they'd spent many months building this out, ironing bugs, and just when they were about to ship, they decide, we should probably test this. And so, they ran an AB test. And they found that click through rates actually dropped by 10%. Purchase rates actually dropped by nearly 25%. So, there was no way they were going to actually launch this product. Then they actually spent some time trying to figure out why this wasn't working. And they realized that for this product change to actually work, it sort of relies on two assumptions. One is that if we show more results to users, they'll be more likely to buy products. And the second is that if we show results faster to the users so that they don't actually have to page, they would also choose to buy more. But the key insight is that each of these assumptions could have been independently validated with much less work. If the assumption is that if we show more results to users, they will buy more, they could have just increased the page size. And in fact, when they did that after the fact, they found that that really had no impact on purchases. An assumption that maybe a faster page will lead to more purchases, that's something a little bit harder to test. But they got a little creative. They artificially added some latency to some fraction of users, made the page slower. And when they tried that test, they found out that also didn't have much of an impact. Each of those tests were much easier to run. Very little engineering effort required. And if they had run those tests first, then they would have realized their basic assumptions behind infinite scrolling didn't even prove out in the wild. And so, there was no real reason to actually invest all that time and effort to build infinite scrolling. They sort of took these lessons to heart when they worked on a different project, which was rebuilding the product page when you click through on a search result. They actually went through 14 different iterations of this page when they were redesigning it. And they broke down the redesign project into a number of different testable assumptions. Does showing more related products on the page actually decrease bounce rate? Does showing the price in your native currency, does that increase purchases? Does showing a default shipping option and the price of a default shipping option make a difference? Does swapping sides of the page make a difference? They broke down each of these assumptions, each of these hypotheses, and tested each one. And there were a bunch of ones that didn't work. They failed. But, all of the information that they collected from these 14 different tests helped them build confidence in theories about which changes did matter, which ones did make an impact. And so with that, they were able to launch a redesign that when I talked to Mark Hedlund, who was the former VP of product engineering at Etsy, he said that this was actually the single largest experimental win in Etsy's history. It was the most successful project that they launched in terms of purchasing performance. And it was only possible because they learned that experiment driven product design is a very powerful tool. Now, this is something that I think, at least when I was in search quality, Google did pretty well. They run a lot of AB tests. They sort of validate a lot of changes to prove these changes are actually improving searches and improving the bottom line. But another take away from Etsy is that incrementally validating your assumptions is a very high leverage technique. If you can break down a large problem into smaller testable hypotheses, and then evaluate each one, you can really build confidence in what works and what doesn't work. Or if a test proves that your assumption is correct, then you have more confidence that the path you're going down is the right path. If it proves your assumption is incorrect, then that means you maybe need to revise your project plan. At the very least, this could save you months of effort. And in startups, there is this idea of focusing on the minimal viable product. What's the smallest version of the product that takes the least amount of effort to build that you can show to real users and get feedback and validation that what you're building, what you're designing is actually the right thing to do? That's a very powerful idea. Now something, while Google, especially search, it does a good job with their AB testing, I think the idea of building this minimal viable product is an idea that they can definitely leverage more. Because a lot of times at Google, we sort of build products for speed. We optimize for performance, we optimize for scale rather than really focusing and asking a question. Like, is this product actually the right thing to build in the first place? Because it doesn't matter if something is really performance if it's not the right thing that users actually want. One of the good rules of thumb that I got from Zach Brock, who was an engineer manager at Square, is that he would constantly ask his engineers, what's the scariest part of the project that you're working on? That's the part of the most unknowns, the most risks. That's the part you should actually tackle first. Because you want to reduce and tackle the risk head on so that if it proves that these risky areas are there aren't doable or don't impact your bottom line, you can cut your losses short and move on. And so, when you're working on projects, you should really ask yourself, can you break this down into smaller testable hypotheses? Can you use an inexpensive test to validate that what you're doing is the right thing? How might you expend 10% of your effort upfront to validate that the project you're working on will actually work? Because that 10% is a very high leverage use of your time. It can save you months of wasted effort further on. Validation definitely is very important and can save you wasted effort. But another powerful technique, another high leverage activity that can help you reduce wasted effort, is this idea of minimizing operational burden. A lot of times, we spend so much time maintaining and operating our software that we don't really have time to actually build new things. And if we can minimize the operational burden that we actually have on a day to day basis, we can spend a lot more time actually focusing on impact. And a great story which really illustrate this point comes from Instagram. When they were acquired in 2012 by Facebook for a billion dollars, they actually only had a team of 13 employees. And of those 13 employees, only five of them were engineers. They had a really small team supporting over 40 million users. So by any metric, this was a pretty effective team. And I was curious, what was it that allowed the Instagram team to be that effective? And so, I sat down with Mike Krieger, the co-founder of Instagram, and I asked him, was there any secret sauce to this? What was your key technique? And he said one of the most important mantras that they had on Instagram was to do the simple thing first. They actually had this on posters in the office. During design meetings, when someone was proposing a new feature, they would actually challenge each other, is this the simplest thing that we can do? If not, why are we adding all this complexity? The key insight here was that every feature they added, every system they added, was another potential fire that they might have to put out in the future. And with such a small team, they couldn't afford to spend all that time just putting out fires. And they were very aggressive and very stringent about cutting sources of complexity. And this actually a very common theme. And I mentioned in the beginning of how I went around and asked a lot of leaders, what's the most valuable lesson you've learned the past year? And it turns out that a lot of engineering leaders, including Mike Curtis, who is the head of engineering at Airbnb, or Chris Lambert, who's the CTO of Lyft, and a bunch of other leaders, all said that they wished they had made things simpler. They wish they hadn't added so much complexity in the last year. And the reason why this was such a common theme is because we often ignore the hidden costs that are associated with complexity. When you introduce sources of complexity, we're actually introducing an ongoing tax that we have to pay as we develop software in the future. And this tax actually comes in a variety of forms. On the most basic level, there's code complexity. That when we're dealing with a very complex code, it's hard to ramp up on. It's hard to understand. It's hard to reason about. And as engineers, sometimes we see complex code and then we tiptoe around it. We decide, we're not going to touch this code base because it's a little hairy. And then, we miss out on opportunities to actually build things that might be impactful. Or we do things in a roundabout way just so that we can avoid the complex piece of code. Besides code complexity, there's also system complexity. So, how many moving pieces are there actually in your system? I was teaching a workshop at Pinterest. It was a five week workshop for engineers on how to be more effective. And one of the stories I gathered from them was that back in 2011 when they were scaling their site, they actually had six different data storage systems. They were running Cassandra, MySQL, Membase, Memcached, MongoDB, and Redis. And they actually only had a team of three back end engineers. That's insane. There were, like, two systems per engineer. Each system on paper set claims that they would solve some scalability problem that they were facing. But in reality, each system just failed in its own special way. It was just another fire that they had to set out. And so, when you make choices that really sort of fragment our infrastructure, that has a lot of ongoing taxes that we have to pay. It means that we're spending-- we're thus able to pull together resources to really strengthen libraries and abstractions for a particular system. It means we have to take time to understand the failure modes of each system that we introduce. It means that every new engineer who joins a team not to ramp up on one additional system. And so, it took a while, but in the end, Pinterest finally learned that it's much simpler to have a system, a scheme, where you can just add more machines to scale. And so, they cut out a lot of the other systems that it didn't really need and ended up with a much simpler system that they could actually maintain. So, we've talked about code complexity and system complexity. Another such complexity is product complexity. Now, that comes when there isn't a clear vision for where the product is going or there isn't enough product focus. Product complexity leads a lot to code complexity and simple complexity because it means you have to write more code and build more systems in order to maintain and support the features that you're building. And when you have a wide surface area in your product, every new feature that you want to add becomes harder to add because you think about how does this fit in to the existing context of all the other features. There's more code branches you have to look over. There's more issues and bugs that are filed. There's more context switching that you have to deal with to go back and forth from feature to feature. And all of the time that you spend doing this context switching is time that you're not investing in abstractions, [INAUDIBLE] paying technical debt. And so, those are all things that end up slowing you down. [INAUDIBLE] last soft of complexity, organizational complexity. Because when you have all of this complexity in your code and your systems and your product, it means that you need a larger team to actually deal and manage with them all. And that means you have to spend more time hiring and interviewing. You spend more time training, onboarding, mentoring new engineers. And so, there's another tax on the organization as well. Now alternatively, some teams decide OK, let's just split our team to smaller teams and each team sort of manage a separate component. Or maybe even have a one person team for each component. And there's cost for that as well. It's less motivating to work on your own. If you get stuck, it can become more demotivating. The quality can go down because it's harder to get feedback from your coworkers if you don't the same shared context. And your bus factor also goes down. I remember when I was working at Ooyala, there was one point in time where I was the only person who was knowledgeable about this piece of software called the logs processor. So, the logs processor was responsible for processing all of our customer's data and then produce the reports that they could actually read and sort of understand what their viewers were doing. And I was taking a much needed vacation down in Hawaii. I was hiking around one of the volcanoes there. And then, I suddenly get a text, and it's from the CTO. And it says, logs processor is down. I said, well that sucks. Unfortunately at that time, I was the only person who knew how to fix it. And also unfortunately, there's no Wifi in volcanoes. And so, that wasn't a great situation. It was bad for me because my vacation was interrupted. It was bad for the team because they depended on me. And it was bad for our customers because they couldn't get the reports and the data that they needed to operate their business. And so, there are all these costs of complexity on these different levels. On the level of code, systems, product, organization. And they all come from this core thing where we added more complexity than we needed. And so, that's why this theme of asking ourselves what's the simplest solution to this problem is so important. Because it allows us to stem off this complexity explosion at its bud at the very beginning. And so, minimizing operational burden is super important. And the last high leverage activity I like to close on is actually building a great engineering culture. I mentioned earlier on how I've spent a lot of time on engineering hiring and recruiting. And one of the questions that I'll ask a lot of the candidates I interview is, what's one thing you like and one thing you dislike about your previous company? And over time, this really helped paint a picture of what exactly attracts an engineer to a company. What are the things that turn them off? And it should actually come as no surprise that engineers, they like to work in environments where they can focus on high leverage activities. They want to work in environments where there's a chance to focus on and optimize on learning. They want to work at places where everyone is very productive and getting a lot of things done, and there's good tooling and good iteration speed. They want to work at places where products aren't going to waste because assumptions and hypotheses weren't being tested earlier on. They want to work at places where they can actually build new features as opposed to just maintain and pay off taxes for old existing ones. Now, Google is a sort of great place in that there's a very strong sense of engineering culture. But this is also something that you can focus on your team, as well. On a team level, you can really ask, what are the highest leverage activities that you can start working on? You can think about how can you invest in your own learning and in your own growth to really sort of further your own career? You can think about what tools can you build or what workflows can you improve for both yourself and for your team to really improve your iteration speed? Or think about a project that you're working on that's a multimonth project. Are there ways that you can break it down into testable hypotheses that you can validate to make sure that you're actually building the right thing for customers, for users, or other members of the team? Or think about if you're working on something that seems a little bit too complex, is there a way to actually make it simpler and pay off these future taxes on complexity? Or think about, how can you improve the engineering culture in your own team so that new engineers who join the team can ramp up much more quickly? All of those high leverage activities will make us more effective engineers. I'll be happy to do some Q&A. Thank you all for coming. [APPLAUSE] I also a few limited copies of books that we're going to hand out. May be Cindy or [? Chang ?] can sort of hand them out as people ask questions. AUDIENCE: Unit tests. I kind of read in your book and it kind of presented unit tests as a high leverage kind of activity. But at the same time, kind of like intuitively when I think about writing unit tests, I feel like it's kind of slow. I got to write all these to cover all this code. And if I want to refactor it, I got to change this unit test. So, iteration speed kind of slows down. Maybe you could talk a little bit about exactly why unity tests are really high leverage in spite of that kind of feeling that I get? EDMOND LAU: Sure. Great question, [INAUDIBLE]. So the question is, how do you reason about unit tests with this framework of leverage? And really, I think it's important to not be religious about unit tests. I think there are some teams that focus on, OK, we need 100% coverage of our code. And I don't think that's necessarily the best approach. It's a lot better think about which types of tests would be high leverage? Which types of tests would be easy to write, and yet pay off high rewards? And the area of code bases that tend to benefit from a lot more tests are code paths that either see a lot of traffic, code paths that a lot of engineers touch, or code paths that are a lot riskier. And so, if something were to go wrong, data would get corrupted or the cost would be large. In each of those areas, it can be really beneficial to actually have a set of unit tests. On the other hand, if you have a piece of code that's sort of off to the side, not many people use it, it's not touched that often, in those cases, writing a unit test there might not have that strong a payoff. And so, I would sort of break down unit tests into different priority buckets and sort of focus on the ones where there is more traffic, people are changing it a lot more often, or it's a lot riskier. Because those will have sort of a better rate of return on your time. AUDIENCE: So, it seems to me you have a lot of experience with working with startups and small companies. And I wonder actually how does your advice translate to a bigger organization such as Google? As you were talking through strategies, I was thinking in my head about a particular example that illustrates this strategy. And for a big company, for example, for the recent problems, organizational complexity kind of becomes unavoidable. So, it seems to me from your presentation, you give advice for the more bottom up approach, which Google is a lot like. But for a big organization, actually maybe some top down strategies are needed as well. For example, for using product complexity and organization complexity. Do you have any thoughts on this? EDMOND LAU: Yeah. So the question, to rephrase a little bit, is how do these ideas of focusing on complex-- or addressing organizational complexity apply to larger companies like Google? And I think it's a great question. I think some of the clarity comes from-- some of the strategies that an individual contributor, an individual engineer where you can sort of influence the complexity in large organizations comes I think a lot from data. So, I know Google is a very data driven company. And a lot of times, if you can ask the right questions and back that up with any data from users, data from activity, you can sort shift organizations or products in a way to sort of streamline it. So, if you see a source of complexity from a feature that you gather data and it seems like it's not actually being used, I think that sort of forms a more compelling case for decision makers that, maybe this is an area of the product that isn't really worth all the engineering effort that's being spent on it. And so, I think data is was definitely one area that can be used to amplify your voice when you are making arguments of that nature. I think another way that you can sort of reduce complexity in these situations is to talk to the decision makers and get clarity on what the focus and what the mission is. And make sure that the projects that you work on are ones that sort of align with that mission and that focus. Because if you're working on something that seems peripheral to that mission or focus, then you're sort of introducing additional sources of complexity to that mission, that focus, that the organization has. So, you want to at least make sure that your own work is aligned with the goals of the rest of the organization has. AUDIENCE: So, I have two questions having to do with the transition between from engineer to engineer manager, so maybe they are within the scope of the book. One is about mentoring, the other is about technical data. So, first would be, what are your thoughts on mentoring in terms of leverage? And the second is, how do you recommend convincing an engineering manager that the code complexity in your project is worth taking a sprint break from delivering to actually refactoring something thing from scratch with a much simpler version? EDMOND LAU: Good question. So the two questions. One is, is mentoring a leverage? Two is how does refactoring and paying off technical debts [INAUDIBLE] into this? So with regards to the first one mentoring, mentoring is definitely I think extremely high leverage. I spent a year and a half when I was at Quora building out the onboarding and mentoring programs because I realize that even if an engineer would have spend and one hour a day training a new hire, that only represents like 1%-- it's like 20 hours. That's like 1% of the new hire's total hours in that year. And yet it can have a dramatic output, a dramatic impact on that engineer's output. And so, it's super valuable, I think, to invest money in training your teammates and making sure that you tell them and teach them what the best practices are before they spend a lot of time writing code that's not following the right guidelines or following bad designs. And so, mentoring is super valuable. And the second question is, how do you convince engineering managers to actually focus on or to budget time for technical debt? And I think some of the best strategies I've seen for teams is to rather than just to have that conversation and spend all that energy convincing your engineering manager after, like say, every project, to instead sort of just set a sort of consistent budget for that. So some teams, for instance, every month will have one week where it's code cleanup week. Or after every sprint, they'll have some number of days where they spend refactoring and cleaning code. That way, it's-- you don't have to have this sort of conversation every time after every project. And in addition, you can use that time and prioritize which areas of the code actually need to be refactored. Which areas of code need to be cleaned up. And so, I think it's more useful to have a more general conversation where to hit the goals for the sprints, we're going to make some trade offs. Those trade offs will lead to some debt. And we want to have a consistent schedule where every so often, we budget some number of days to basically clean up that debt. Yeah, it's a little tricky if you're a new engineer. I would say that even as a new engineer, the way that you should approach technical debt is to focus on the areas where reducing that debt allows you to be more productive. So, if you're reducing debt on errors of the code that you have to deal with yourself, a lot of times doing that making, that investment actually pays off on your own project because you can get your project done sooner. That's sort of, I think, a very easy way to justify that time spent because you can provably demonstrate that it actually accelerates your own project speed. And so, I would start there. AUDIENCE: Some of the advice mentioned tackling unknowns early in the project lifecycle and some of the other advice was focusing on the simple things. I wonder, do you have any advice on how to identify unknowns that could be removed by focusing on simplicity versus unknowns that deserve their own investment and investigation? EDMOND LAU: So, the question is, how do you differentiate between unknowns that need to be investigated and unknowns that you can potentially cut by focusing on a simpler solution? I don't have a simple answer for that but I think some of the approaches that you can take is to think about what are your goals for this certain project? And if you didn't have to design a grand system, what would be the simplest solution that you could think of that could maybe hit most of those goals? Because a lot of times, the complexity comes from trying to address the last 10% or the last 5%. And if you would take a more pragmatic approach, maybe you can ask instead, what covers 80% percent of the use cases? Can I come up with a solution for that? And then maybe for the other cases, can we do something different rather than making the core solution more complicated? And I think that's something that-- that's a theme that I've definitely seen other teams do with success. Because then for the most part, they're dealing with something that is simple to reason about. AUDIENCE: So I have a question, a lot of cases we have dependencies on other teams. For example, my team, sometimes I go, there's a problem in the [INAUDIBLE] Bluetooth stack. Then so I have to make a talk with them or either I'd have to look into the Bluetooth stack by myself. Which sometimes can be harder because I don't really have a lot of expertise on the low level code. So, can you talk a little your experience about how do you deal with team dependencies? How to talk and actually cooperate with other teams? EDMOND LAU: So the question is, how do you deal with interteam dependencies where you're sort of blocked on someone else? So a lot of times when you're blocked on someone else and they're not actually working on this thing that you really care about, that happens because there's a misalignment in incentives. Somehow your team has a certain goal. The other team has a certain goal. And those goals, maybe our priorities don't really align. And so, I think structurally, a good approach is to try to make those goals align. To see if you can agree that a certain focus is a priority for both teams this quarter and sort of agree from that perspective. If they don't align, I think at least having that conversation tells you then where-- the part that you're blocked on, where that fits on their priority list. And so, at least having that conversation, you know that maybe this is only like a medium to low priority for the other team. At that point, then you can make this decision of well, do I wait for them to work on that? Or do I then-- maybe I ramp up on that Bluetooth stack to actually make progress. But I think it really sort of starts from that communication about goals and incentives. If they align, then you can sort of rely more on that team. If they don't align, you do have to make that trade off of, maybe it's worth my time to learn this Bluetooth stack so that I can get the thing out the door sooner rather than waiting for them to get to it on the bottom of their priority list. AUDIENCE: So, you mentioned the 60 to 80 hour work weeks not being sustainable. I was wondering what your typical work week is like? And if you ever work weekends anymore? And you also mention learning. I was wondering how much time per week do you set aside for learning. Is it an hour on the weekend that you spend or is it five minutes a day? How do you incorporate that into your daily routine? EDMOND LAU: So nowadays, I still work at a startup. I work at a startup called Quip. And we actually work very normal hours, so we work maybe 40 hour weeks. I do spend a lot of personal time on just sort of investing in things like the book or these talks or other ways I can teach engineers to be more effective. Mainly because that's something I'm excited to do. In terms of how much time I invest in learning, I personally love to read, so I end up just reading a lot of books. And I think books are a really large source and wealth of information for me. I don't know how much time I spend reading, but I [INAUDIBLE] spend a lot of time reading. MALE SPEAKER: Thank you very much for coming [INAUDIBLE]. [APPAUSE]
B1 中級 美國腔 Edmond Lau:"有效的工程師"|在谷歌的講座 (Edmond Lau: "The Effective Engineer" | Talks at Google) 454 44 黃彰衍 發佈於 2021 年 01 月 14 日 更多分享 分享 收藏 回報 影片單字