The Effective Engineer, Edmond Lau
Nov 7, 2016 · 10 minute read · CommentsPost Tag: bookengineeringcareer
Отличная книга. Об этом недвусмысленно свидетельствует размер “полезных советов” в конце статьи.
Эдмонд Лау(Edmond Lau), проработавший в Google, Quora, Facebook и в куче стартапов поменьше, пишет обо всем понемногу. Советы в основном широко известные, так например, в книге Soft Skills by John Z. Sonmez описываются очень похожие методы обучения и управления временем.
Автор, не только дает большое количество рекомендаций, но, самое главное, приводит логическое обоснвание этих самых рекомендаций. Инженер получает почти пошаговую инструкцию - начиная от личного развития, заканчивая управлением команды. При этом, у автора минимум абстрактных рассуждений и максимум полезной информации. Больших трудов стоило внести в список “заметок” так мало.
Заметки:
Optimize for Learning
-
Study code for core abstractions written by the best engineers at your company.
-
Write more code. If you feel that programming is your weak point, shift time away from other activities like meetings and product design, and spend more of it building and writing code. Over a decade of research on learning has shown that the more effort you expend when retrieving knowledge from memory, the better you’ll learn and retain those ideas.
-
Go through any technical, educational material available internally. If your company maintains design documents or holds tech talks, use them as learning opportunities.
-
Master the programming languages that you use. Read a good book or two on them. Focus on developing a solid grasp of the advanced concepts in that language, and gain familiarity with core language libraries. Make sure that at least one of your languages is a scripting language (e.g., Python or Ruby) that you can use as your Swiss army knife for quick tasks.
-
Send your code reviews to the harshest critics. Optimize for getting good, thoughtful feedback rather than for lowering the barrier to getting your work checked in. Ask for a more detailed review on those implementations you’re not as confident about. Discuss software designs with your company’s best designers in order to avoid writing great code for a design that doesn’t work well.
-
Enroll in classes on areas where you want to improve. These could be courses offered on the company campus, at nearby universities, or online through educational initiatives like Coursera, edX, Udemy or Udacity. Online education is exploding;
-
Participate in design discussions of projects you’re interested in. Don’t wait for an invitation. Ask project leads if they’d mind you being a silent observer or even a participant in a design meeting.
-
Work on a diversity of projects. If you find yourself always doing similar tasks using similar methods, it’s going to be hard to pick up new skills. Interleaving different projects can teach you what problems are common across projects and what might just be artifacts of your current one. Make sure you’re on a team with at least a few senior engineers whom you can learn from. If you’re not, consider changing projects or teams. This will help increase your learning rate for the remaining 80% of your time.
-
Learn new programming languages and frameworks. One of the most exciting aspects of working in software is that the technology landscape changes so rapidly. But this also means that if you’re not continuously learning, your skills might get stale and outdated.
-
Invest in skills that are in high demand. If you’re unsure about what types of skills you should be learning, see what’s being included in job postings you find interesting, or evaluate the current industry trends and demand for skills. For example, as of 2014, 15% of Internet traffic now comes from mobile devices, 26 and global annual smartphone sales are triple that of consumer PCs.
-
Attend talks, conferences, and meetups. Growing technology companies often hold open tech talks, both to share knowledge and to help recruit new engineers. Google even shares many of its on-campus talks on YouTube.
-
Build and maintain a strong network of relationships. I used to avoid coffee meetings and meetups with people I didn’t know. But I’ve since learned that the more people you meet, the more you’ll find serendipitous opportunities. Richard Wiseman captures this idea in his book The Luck Factor, when he writes, “Lucky people dramatically increase the possibility of a lucky chance encounter by meeting a large number of people in their daily lives. The more people they meet, the greater opportunity they have of running into someone who could have a positive effect on their lives.”
-
Follow bloggers who teach.
-
Write to teach. When you write to teach other people, you gain a deeper understanding of ideas you’re already familiar with and pinpoint the details that you didn’t fully understand. That’s the technique that Physics Nobel Prize winner Richard Feynman used to learn faster.
-
Tinker on side projects. Side projects, even ones not related to engineering, provide further opportunities to hone your skills, particularly in areas of interest that you don’t typically engage in at work.
Invest in Iteration Speed
-
Get proficient with your favorite text editor or IDE. There are countless debates over which is the best text editor: Emacs, Vim, TextMate, Sublime, or something else. What’s most important for you is mastering the tool that you use for the most purposes.
-
Learn at least one productive, high-level programming language. Scripting languages work wonders in comparison to compiled languages when you need to get something done quickly. Empirically, languages like C, C++, and Java tend to be 2–3x more verbose in terms of lines of code than higher-level languages like Python and Ruby; moreover, the higher-level languages come with more powerful, built-in primitives, including list comprehensions, functional arguments, and destructuring assignment.
-
Get familiar with UNIX (or Windows) shell commands. Being able to manipulate and process data with basic UNIX tools instead of writing a Python or Java program can reduce the time to complete a task from minutes down to seconds. Learn basic commands like grep, sort, uniq, wc, awk, sed, xargs, and find, all of which can be piped together to execute arbitrarily powerful transformations.
-
Prefer the keyboard over the mouse. Seasoned programmers train themselves to navigate within files, launch applications, and even browse the web using their keyboards as much as possible, rather than a mouse or trackpad.
-
Automate your manual workflows. Developing the skills to automate takes time, whether they be using shell scripts, browser extensions, or something else. But the cost of mastering these skills gets smaller the more often you do it and the better you get at it.
-
Test out ideas on an interactive interpreter. In many traditional languages like C, C++, and Java, testing the behavior of even a small expression requires you to compile a program and run it. Languages like Python, Ruby, and JavaScript, however, have interpreters available allowing you to evaluate and test out expressions. Using them to build confidence that your program behaves as expected will provide a significant boost in iteration speed.
-
Make it fast and easy to run just the unit tests associated with your current changes. Use testing tools that run only the subset of tests affected by your code. Even better, integrate the tool with your text editor or IDE so that you can invoke them with a few keystrokes.
Measure What You Want to Improve
-
Measure your progress. It’s hard to improve what you don’t measure. How would you know what types of effort are well spent?
-
Carefully choose your top-level metric. Different metrics incentivize different behaviors. Figure out which behaviors you want.
-
Instrument your system. The higher your system’s complexity, the more you need instrumentation to ensure that you’re not flying blind. The easier it is to instrument more metrics, the more often you’ll do it.
-
Know your numbers. Memorize or have easy access to numbers that can benchmark your progress or help with back-of-the-envelope calculations.
-
Prioritize data integrity. Having bad data is worse than having no data, because you’ll make the wrong decisions thinking that you’re right.
Validate Your Ideas Early and Often
-
Approach a problem iteratively to reduce wasted effort. Each iteration provides opportunities to validate new ideas. Iterate quickly to learn quickly.
-
Reduce the risk of large implementations by using small validations. Invest a little extra effort to figure out if the rest of your plan is worth doing.
-
When working on a solo project, find ways of soliciting regular feedback. It may be easy and comfortable to keep working in a silo, but you run the huge risk of overlooking something that, if spotted early, could save you lots of wasted effort.
-
Adopt a willingness to validate your decisions. Rather than making an important decision and moving on, set up feedback loops that enable you to collect data and assess your work’s value and effectiveness.
Improve Your Project Estimation Skills
-
Incorporate estimates into the project plan. These estimates should be used as an input to decide whether delivering a set of features by a certain date is feasible. If it is not, they should lead to a conversation about whether to change the feature set or the delivery date. Don’t let a desired target dictate the estimates.
-
Allow buffer room for the unknown in the schedule. Take into account competing work obligations, holidays, illnesses, etc. The longer a project, the higher the probability that some of these will occur.
-
Define measurable milestones. Clear milestones can alert you as to whether you’re on track or falling behind. Use them as opportunities to revise your estimates.
-
Do the riskiest tasks first. Reduce variance in your estimates and risk in your project by exploring the unknown early on. Don’t give yourself the illusion of progress by focusing first on what’s easy to do.
-
Know the limits of overtime. Many teams burn out because they start sprinting before they’re even close to the finish line. Don’t sprint just because you’re behind and don’t know what else to do. Work overtime only if you’re confident that it will enable you to finish on time.
Build Long-Term Value
-
Establish a culture of reviewing code. Code reviews facilitate positive modeling of good coding practices. Find the right balance between code reviews and tooling to trade off code quality and development speed.
-
Invest in good software abstractions to simplify difficult problems. Good abstractions solve a hard problem once and for all, and significantly increase the productivity of those who use it. But if you try to build abstractions when you have incomplete information about use cases, you’ll end up with something clunky and unusable.
-
Scale code quality with automated testing. A suite of unit and integration tests can help alleviate the fear of modifying what might otherwise be brittle code. Focus on ones that save the most time first.
-
Manage your technical debt. If you spend all your resources paying off interest on your debt, you won’t have enough time left to work on new things. Focus on the debt that incurs the most interest.
Minimize Operational Burden
-
Do the simple thing first. Simpler systems are easier to understand, extend, and maintain.
-
Fail fast to pinpoint the source of errors. Make debugging easier by not masking your errors and by not deferring failures until later.
-
Automate mechanics over decision-making. Aggressively automate manual tasks to save yourself time. At the same time, think twice before trying to automate decision-making, which tends to be hard to get correct.
-
Aim for idempotence and reentrancy. These properties make it easier for you to retry actions in the face of failure.
-
Plan and practice failure modes. Building confidence in your ability to recover lets you proceed more boldly.
Invest in Your Team’s Growth
-
Help the people around you be successful. The high rungs of an engineering ladder are reserved for those who make their co-workers more effective. Moreover, the success of those around you will also carry you along.
-
Make hiring a priority. Keep a high hiring bar and play an active role in growing your team.
-
Invest in onboarding and mentoring. The more quickly you can ramp up new team members, the more effective your team will be. The more effective your team, the more freedom you have to tackle different projects.
-
Build shared ownership of code. Increase your bus factor to be greater than one so that you’re not a bottleneck for development. This will give you the flexibility to focus on other high-leverage activities.
-
Debrief and document collective wisdom. Reflect on projects with team members, learn what worked and what didn’t work, and document and share the lessons so that valuable wisdom doesn’t get lost.
-
Create a great engineering culture. This will help you be more productive, streamline decisions, and recruit other strong engineers. You build a great culture by fostering the same habits you need to effectively deliver impact.