字幕表 動画を再生する
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]