1. Focus on High-Leverage Activities
Leverage = Impact Produced / Time Invested
Increase Your Leverage in Three Ways:
- By reducing the time it takes to complete a certain activity
- By increasing the output of a particular activity
- By shifting to higher-leverage activities
2. Optimize for Learning
seek work environment conducive to Learning
- fast growth
- autonomy (自主、自治)
- Study code for core abstractions written by the best engineers at your company
- Write more code.
- Go through any technical, educational material available internally.
- Master the programming language that you use
- Send your code reviews to the harshest critics.
- Enroll in classes on areas where you want to improve.
- Participate in design discussions of projects you're interested.
- Work on a diversity of projects.
- Make sure you're on a team with at least a few senior or engineers whom you can learn from.
- Jump fearlessly into code you don't know.
Ten starting points to help inspire a habit of learning outside of the workplace:
- Learn new programming languages and frameworks.
- Invest in skills that are in high demand.
- Read books.
- Join a discussion group
- Attend talks, conferences, and meetups.
- Build and maintain a strong network of relationships.
- Follow bloggers who teach.
- Write to teach.
- Tinker on side projects.
- Pursue what you love.
3 Prioritize Regularly
focusing on what directly produces value, and focusing on the importtant and non-urgent. Track To-Dos in a Single ,Easily Accessible List. Protect your maker's Schedule. Limit the Amount of work in progress Fight Procrastination with If-Then Plans. Make a Routine of Prioritization. being retrospective and making a habit of revisiting your priorities
part2: Execute, Execute, Execute
4. Invest in Iteration Speed
Move Fast to Learn Fast. Conctinuous deployment Invest in Time-Saving Tools Shorten Your Debugging and Validation Loops Master Your Programming Environment Don't Ignore Your Non-Engineering Bottlenecks
5. Measure What you want to Improve
Use Metrics to Drive Progress Pick the Right Metric to Incentivize he Behavior You Want - Hours workd per week vs. productivity per week - Click-through rates vs. long click-through rates. - Averate response times vs. 95th or 99th percentile response times - Bugs fixed vs. bugs outstanding - Registered users vs. weekly growth rate of registered users. - weekly active users vs. weekly active rate by age of cohort.
picking the right mertic applies to your persional goals as well as your professional ones
Instrument Everything to Understand What's Going On. Internalize Useful Numbers Be Sekptical about Data Integrity - Log data liberally, in case it turns out to be useful later on. - Build tools to iterate on data accuracy sooner. - Write end-to-end integration tests to validate your entire analytics pipeline. - Examine collected data sooner. - Cross-validate data accuracy by computing the same metirc in multiple ways. - When a number does look off, dig in to it early.
6. Validate Your Ideas Early and Often
- Find low-Effect wasy to validate your work
- Continuously Validate Product Changes with A/B Testing.Free or open source A/B tesing frameworkds
- Beware the One-Person Team
- Be open and receptive to feedback.
- Commit code early and often.
- Request code reviews from thorough critics.
- Ask to bounce off your teammates.
- Design the interface or API of a new system first.
- Send out a design document before devoting your energy to your code.
- If possile, structure ongoing projects so that there is some shared context with your teammates.
- Solicit buy-in for controversial featurse before investing too much time.
- Build Feedback Loops for your Decisions.
7. Improve Your procject Estimation Skills
- Use Accurate Estimates to Drive Project Planning - Decompose the project into granular tasks.(分解成粗粒度的任务) - Estimate based on how long tasks will take, not on how long you or someone else wants them to take. - Think of estimate as probability distributions, not best-case scenarios. - Let the person doing the actual task make the estimate. - Beware of anchoring bias. - Use multiple appraches to estimate the same task. - Beware the mythical man-month. - Validate estimates against historical data. - Use timeboxing to constrain tasks that can grow in scope. - Allow others to challenge estimates.
- Budget for the unknown
- Define Specific Project Goals and Measurable Milestones. （目标要清晰明确）
- Reduce Risk Early
- Approach Rewrite Projects with Extreme Caution
- Don't Sprint in the middle of a Marathon
Part 3: Build Long-Term Value
8. Balance Quality with Pragmatism
- Establish a Sustainable Code Review Process
- Manage Complexity through Abstraction, good abstractions should be: - easy to learn - easy to use even without documention - hard to misuse - sufficiently powerful to satisfy requirements - easy to extend - appropriate to the audience
- Automate Testing
- Repay Technical Debt
9. Minimize Operational Burden
- Embrace Operational Simplicity
- Build Systems to Fail Fast
- Relentlessly automate mechanical tasks
- Make Batch Processes Idempotent(幂等的) and Reentrancy
- Hone Your Ability to Respond and Recover Quickly
10. Invest in Your Team's Growth
- Make Hiring Evertone's Responsibility
- Design a Good Onboarding Process
- Ramp up new engineers as quickly as possible
- Impart the team's culture and values.
- Expose new engineers to the breadth of fundamentals needed to succeed.
- Socially integrate new engineers onto the team.
- Quora's onboarding program: codelabs. Onboarding talks. Mentorship. Starter tasks.
- Share Ownership of Code
- Build Collective Wisdom through Post-Mortems. Five Whys?
- Why did the site crash. because overloaded
- Why were they overload? a disproportionately high fraction of traffic was hitting a few servers
- Why wasn't traffic more randomly distributed?. Becaues from the same customer
- Build a Great Engineering Culture - Optimize for iteration speed. - Push relentlessly towards automation. - Build the right software abstractions. - Focus on high code quality by using code reviews. - Maintain a respectful work environment - Build shared Ownership of code - Invest in automated testing - Allot experimentation time, eigher through 20% time or hackathons - Foster a culture of learning and continuous improvement - Hire the best.