Amstelden

Software Engineer's Guidebook - Gergely Orosz

Note: These are my own notes and observations upon reading the book. They serve as a reminder, when I need to rehash some content. I own none of the content. All rights are reserved to Gergely Orosz. You may find the full book (which I strongly recommend reading in depth!) at https://www.engguidebook.com/.

Part I - Developer Career Fundamentals

"... what a difference it makes when a developer takes ownership of their career path -- which also greatly helps their manager to advocate for them."

"Most engineers I met assumed their manager would take care of most things career-related."

Career Paths

1. Types of Companies

2. Typical Software Engineering Career Paths

All career paths are unique, there's no one "right" path. To each his own.

3. Compensation and "Tiers" of Companies

4. Cost Centers, Profit Centers

Differences between the 2:

How to tell if you're in a Cost or Profit center? A few questions to ask:

5. Alternative ways to think about career progress

Other than compensation, title and company name, here're a few things to consider:

"It's not uncommon for long-serving prrofessionals to take a pay cut i norder to get an 'upgrade' in one or more of these areas."

Owning Your Career

1. You're in Charge of Your Career

"Take ownership of your career path if you want to be successful." "There are plenty of ways to own your career, such as telling your manager and peers what you care about, sharing work that you do which they might not notice otherwise, and creating opportunities for people to give you feedback."

2. Be Seen as Someone Who "Gets Things Done"

"Finisht the work you commit to, focus on important tasks, and let others know when you get things done. Then your work won't go unnoticed."

3. Keep A Work Log

"...record key work each week, including important code changes, code reviews, design documents, discussions and planning, helping out others, postmortems, and everything else which takes time and has an impact."

Example Log Template

Why it helps:

At start, it may feel silly. "I've yet to hear someone regret doing it, after resolving to stick with it!"

4. Ask and Give Feedback

Ask for feedback

Asking feedback from others

"Feedback is a gift because it's always much easier to simply not give it." "It's a fact most people don't give feedback when it's not sought." "Asking for feedback is especially helpful when doing something for the first time, or when still figuring things out in a new group or environment"

Give feedback to others

Giving critical feedback

"Decode" poorly delivered feedback

"Feedback is a gift, both given and received. Poorly delivered feedback is also a gift, but some work is needed to turn it into something useful you can act on."

5. Make Your Manager an Ally

What a good engineer looks like from a manager's POV

6. Pace Yourself

"Athletes pace themselves to optimize for peak performance, and for the longevity of their career."

Stretching

"If doing stretch work comes with overtime, then you'll become physically and mentally exhausted." "If being stretched means falling behind in parts of your work, then this can cause anxiety."

Executing

"You keep learning new things at a normal, not accelerated, pace."

Coasting

"This means doing less and lower quality work than you're capable of."

Mix the above for peak performance.

Performance Reviews

1. Start Early: Gather Context and Set Goals

"Every company is different. What's important in your workplace, and what is rewarded? How is impact measured?"

2. The Power of Habit

"Take feedback seriously, but remember that it's opinion and not a directive. Just because people give you feedback, doesn't mean you need to act on it."

3. Before the Performance Review

4. The Review

Promotions

1. How Promotions Are Decided

Other things required for promotion:

2. Types of Promotion Processes

3. "Terminal Level"

The final level where you need to get in time, or get out. Usually peaks at senior engineering level. Note there are other levels above, but you're not expected to fight for it.

4. Promotions at Big Tech

5. Advice for Getting Promoted

6. A Long-Term Career View

  1. Don't let promotions and titles define your self-worth
  2. Avoid "elbowing" people out of the way
  3. Many career investments only pay off much later
  4. Happiness shouldn't be defined by titles and career levels

Thriving in Different Environments

1. Product Teams and Product-Minded Engineers

2. Platform Teams

3. "Peacetime" vs "wartime"

"The sooner you figure out how to be effective in both modes, the better off you'll be."

4. Types of Companies

Switching Jobs

1. Exploring New Opportunities

2. Waiting on a Promotion vs Switching Jobs

3. Preparing for Tech Interviews

4. Down-leveling

"Down-leveling is especially common when joining a Big Tech company for the first time because expectations are typically high, onboarding takes longer than at smaller places, and companies often aim to hire people who 'raise the bar' at a given level."

5. Up-leveling

"A word of caution, after you secure a higher level, be aware that expectations will be raised from day one."

6. Onboarding to a New Job

Takeaways

"No one cares about your career as much as you do. [...] So figure out how much you care about career progression and put the appropriate amount of work into it."

Part II - The Competent Software Developer

"Keep in mind, every company is unique, and no two have identical expectations."

Area Typical expectation
Scope Tasks or smaller projects
Guidance Works with some guidance
Getting things done Seeks help when stuck
Taking the initiative Not always expected and is a bonus
Software development Follows team practices
Software architecture Follows team practices, seeks feedback on designs
Engineering best practices Follows those in place
Collaboration Other developers on the team
Mentoring Seeks mentorship
Learning Hungry to learn
Typical years of industry experience 0-5

Getting Things Done

"[...]getting engineering tasks and projects done is far from trivial."

1. Focus on the Most Important Piece of Work

*"Whether you work at a startup or a large company, lots of things are on your plate. Tasks to complete, projects to work on, code reviews to address, emails to answer, meetings to attend... the list goes on. It's easy to get overwhelmed and feel like you're not making progress -- even while working extra hours.

For this reason, it's good to simplify your work life. Ask what is the most important work; the single most important task on your list? No, really; if you could only do one thing this week, what would it be? Answer this question. Your answer is your #1 priority. When you identify it, make sure you definitely, absolutely delivar that piece of work within the agreed timeframe."*

2. Break Down the Work

3. Estimate the Duration of Your Work

4. Seek Mentors

The tech tribe of mentors

5. Keep Your "Goodwill Balance" Topped Up

6. Take the Initiative

Approaches to taking the initiative

"New initiatives help others see you as a productive person, assuming you get your most important and assigned work done, first. If you must choose between doing something new or finishing your current work, I advise you to finish what's needed."

Coding

1. Practice Coding: A Lot!

"Being a competent software engineer begins with being a good coder"

"Find a balance between writing and reading code without going overboard on either one."

2. Readable Code

"The biggest risk of unreadable code is that it starts a low-readability spiral."

3. Writing Quality Code

Software Development

1. Become Proficient in a Language

2. Debugging

3. Refactoring

"Refactoring is an important, often overlooked part of coding. Getting good at refactoring is similar to learning to code. You can read all you like about a topic, but without doing it, you'll never truly master it."

4. Testing

Reliable developers ensure their code works as it should:

Tools of the Productive Software Engineer

1. Your Local Development Environment

Things to have in a modern IDE:

To look for:

2. Frequently Used Tools

3. Way to Iterate Quickly

Takeaways

"Competent software developers get things done in projects of reasonable complexity, given their experience level."

"'Practice, practice, practice' is the single best advice for growth."

"Time is not 'wasted' at junior levels if you keep learning and growing."

Part III - The Well-Rounded Senior Engineer

Software development

Software engineering

"A software engineer should be invested in the long-term impact of their work, as well as the short-term."

"[...] software engineering is software development (or programming), over a much longer time frame [...]"

Area Typical expectation
Scope Medium-size or more complex projects
Guidance Works independently in most cases
Getting things done Unblocks themselves
Taking the initiative Expected to take the initiative for work within their scope
Software engineering Follows team practices and sometimes improves them. Helps others to understand their value
Engineering best practices Follows those in place and introduces practices which help the team
Collaboration With other engineers and stakeholders on the team
Mentoring Can mentor less experienced engineers and also seek mentorship
Learning Possesses hunger to learn
Typical years of industry experience 5-10+

Getting Things Done

"More inbound requests, conext switches, and more complex work in general, distinguish a senior software engineer's workload from more junior positions."

Same expectations from Software Engineer applies, but there's a few more that are relevant.

1. Getting Things Done: Perception and Reality

"Two things are necessary to be seen as a senior engineer who gets things done: a) Ability to solve complex engineering problems in a pragmatic way b) Communication of work to peers and managers; including progress, roadblocks faced, solutions to roadblocks, and the complexity of the work"

2. Your Own Work

3. When It's Done, It's Properly Done

4. Your Team

5. The Big Picture

Collaboration and Teamwork

"Communication, collaboration, and teamwork are baseline expectations for well-rounded senior software engineers at most companies."

1. Code Reviews

Google code review practices Gitlab code review practices

2. Pairing

3. Mentoring

4. Giving Feedback

5. Working With Other Engineering Teams

6. Influencing Others

Software Engineering

1. Languages, Platforms and Domains

2. Debugging

"The difference between a senior and a non-senior engineer is pretty clear in debugging and tracking down difficult bugs."

3. Tech Debt

4. Documentation

"Which practices should you put in place for your team? Actually, thi sis the wrong question to start with. Instead, ask what the biggest challenges are to shipping things on your team."

Testing

1. Unit Tests

Desirable traits

"There is a compounding benefit of unit testing code, which grows as the system and its development team do. The tests help validate code changes, force you to separate concerns, and help to document the code's behavior."

2. Integration Tests

3. UI Tests (end-to-end tests)

Drawbacks:

4. Mental Models for Automated Tests

Unit Integration UI or end-to-end
Coverage Very Narrow Narrow Broad
Ease to write Easy Medium to hard Medium to hard
Time to maintain Little time Some time A lot of time

"There is no single best approach for how to invest in tests."

5. Specialized Tests

6. Testing in Production

How to do it safely?

The biggest benefits of testing in production:

Challenges to testing in production:

7. Benefits and Drawbacks of Automated Testing

Benefits:

Downsides:

Software Architecture

1. Design Documents, RFCs and Architecture Documents

The goal of RFCs

A few approaches with RFCs

Benefits

Reviewing RFCs -- pick format based on project

"Don't roget the true goal of the RFC process. It's to reduce the time it takes to ship a project, by getting feedback early. Ask yourself which approach saves the most time."

Architecture documents

2. Prototyping and Proof of Concept

Prototyping for exploration

Build with the intent to throw it away

"To develop better architecture approaches, use prototyping to build proofs of concept as a tool."

3. Domain-Driven Design

Benefits of DDD:

Resources:

4. Software Architecture that Ships

Takeaways

"It is at senior level where the impact of your work is more important than the effort you put into it."

"It's reasonable expectation that a relatively complex project will be accomplished when a senior engineer is involved. If issues come up, it is the senior engineer who finds ways to unblock things. And if they get stuck, they flag this, ask for help, and bring options to the table."

Part IV - The Pragmatic Tech Lead

"[...] being a tech lead is more frequently a role than a formal title."

"Expectations of tech leads are usually similar to those of senior engineers, with the addition of leading projects. At some companies, tech lead expectations are closer to those of a staff engineer."

"A high-performing tech lead is usually a prime candidate for an internal engineering manager promotion, or transition. At the same time, tech leads often have the opportunity to stay on the individual contributor path, and grow into staff+ positions."

Project Management

1. Companies Where Engineers Lead Projects

A set of companies would be:

"You know who the best managers are? They're the great individual contributors who never, ever want to be a manager, but decide they have to be a manager because no on else will do as good of a job as them." -- Steve Jobs.

2. Why Do We Do Project Management?

"'Project' is the word many organizations use to coordinate efforts which move the needle of a specific business goal."

Typical parts of projects management (needed when more people are working together):

"Estimates matter because most people and businesses are date-driven. Publicly traded companies plan and budget based on quarters. They also decide how much to invest in projects and people after asking, 'how long does it take to launch?' Private, venture-funded companies try to get new features out in time to help with the next fundraising round. Yes, some businesses are not very date-driven, but they are rare. Private, profitable lifestyle businesses and public bodies are perhaps the best examples of entities that don't care as much about dates."

3. Project Kickoffs and Milestones

"I've observed that a major reason why projects fail is by starting with a misaligned expectations."

"Kickoffs help ensure there's no misunderstandings at the outset, which can later cause large chunks of work to be thrown out, or redone entirely."

Project Kickoffs

  1. Project kickoff -- why? what?
  2. Engineering kickoff -- how?
  3. Milestones and estimates -- when?

The project kickoff

"A successful kickoff is one in which the project lead asks 'are there any questions about what the project is, why we're doing it, or how we are approaching it?"

"I recommend the kickoff to be a meeting. Dedicate ten minutes to reading the proposal document, or for the project lead to walk attendees through it. If running an online meeting, consider asking participants to turn on video, so the meeting facilitator can get visual queues and spot when people could be disagreeing, and when a little nudge could help these people speak up."

The engineering kickoff

Happens after project kickoff, usually via a design doc.

Establishing milestones

"The goal of this step is to align the engineering team with the 'when'."

"The more granular these milestones, the better. This is because all estimates will be off by some degree, and the only way to really know by how much, is to hit a milestone."

"I prefer milestones to be small enough to be achieved in no longer than a few weeks. If milestones involve lengthy chunks of work, I'd challenge the team to set intermediary milestones that capture smaller parts."

Ensure estimates aren't binding

"Software projects are full of unknowns and risks, and the most anyone can reasonably ask of a team is for a rough idea of how long things should take, based on the best information."

"I always prefer to add some pading, but also to educate the business that there's no such thing as a 'fixed date'. Commit to the business that they will get regular updates, and then as the project passes its milestones, you can give dates with increasing confidence."

4. "Software Project Physics"

Timeline <-> People <-> Scope (meant as a triangle)

"If one of these changes, at least one other also needs to change in response."

"If this triangle looks familiar, it's probably because it resembles the project management triangle, which is a commonly used model to describe the connection between cost, time, scope, and quality. For teams in Big Tech and at high-growth startups, I've found quality is rarely up for negotiation: timeline and scope are much more so."

5. Day-to-Day Project Management

What matters:

Taking decisions, as a tech lead

6. Risks and Dependencies

Technology risk

Mitigate with:

Engineering dependencies

Mitigate with:

Non-engineering dependencies

Mitigate with:

**Missing decisions or context dependencies

"Refuse to start work until you understand the context or have the decisions. [...] It's doing a disservice to the team, the company and yourself, to start work on something about which fundamental questions remain unanswered. Ensure you have a clear picture of what to do, and why. Start work only when this is clear."

Unrealistic timeline

Mitigate with:

In general, refuse to accept top-down deadlines.

Not enough people or bandwidth

Mitigate with:

A surprise midway through the project

Mitigate with:

No true idea how long something will actually take

Mitigate with:

7. Wrapping Up Projects

Drawbacks of doing it properly:

A good wrap-up:

What about projects whcih fail more than succeed?

Shipping to Production

1. Extremes in Shipping to Production

YOLO shipping

"YOLO shipping is as fast aas it gets when shipping a change to production. However, it also has the highest risk of introducing new issues into production because there is no safety net."

Thorough verification through multiple stages

Layers:

2. Typical Shipping Process

There are differences between company types:

3. Principles and Tools

4. Additional Verification Layers

5. Taking Pragmatic Risks

6. Additional Considerations

7. Selecting an Approach

Questions to ask:

Stakeholder Management

"Stakeholders are people and groups with an interest in a project's outcome."

"The best time to figure out the key stakeholders in your project is as soon as possible."

1. The Real Goal of Stakeholder Management

"The point of stakeholder management is for the project to succeed by keeping everyone on the same page. [...] It is just a tool to help a project succeed and to ensure everyone agrees what success looks like."

2. Types of Stakeholders

Categorization by dependency

3. Figure Out Who Your Stakeholders Are

4. Keep Them in the Loop

"'Stakehholder manangement' is a fancy phrase for ensuring everyone who needs to know what your team is doing, does know."

Ways to keep stakeholders updated:

5. Problematic Stakeholders

Based on dependency type:

"In each case, the biggest issue tends to be communication and trust."

Ways to improve the situations:

6. Learning from Stakeholders

Ways:

Team Structure

1. Roles and Titles

2. Team Processes

"Which processes should a team have in place? This is actually the wrong question to start with. Processes are not the reason why teams exist; they exist to get things done. Processes can aid this, or they can get in the way."

Sample process to try out for your team:

Don't forget to remove processes, those aren't only additive.

"Don't ask which processes your team should have in place, ask how the team can get stuff done better and faster."

3. Boosting Team Focus

"To help the team focus, be clear what their priorities are, or what a project's priorities are, what the most important thing to get done is, what comes next, and so on."

Push back on sudden changes of focus

"Resist abrupt changes to your team's top priorities, even if these come from above. A team that switches focus frequently can easily become unhealthy and a good tech leads protect their teams from it."

How to push back:

Team Dynamics

1. Healthy Teams

Clarity

"In a healthy team, it's clear why the team exists, what its goals are, and how to achieve them."

Execution

"The team 'gets things done'".

Good morale

"[...] people feel positive about coming to work."

Indicators:

Healthy communication

"Civilized and constructive communication is a baseline for healthy teams."

An engaged team

"Everyone contributes to the team [...]. Nobody is left out or does significantly less than others."

2. Unhealthy Teams

Indicators of unhealthy teams:

Why teams are unhealthy?

Structural reasons teams struggle

3. Teams with Growing Pain

4. Improving Team Dynamics

5. Relationships with Other Teams

Takeaways

In the tech lead role you need to balance several things at once:

"Lead by example"

"The best tech leads don't think they are superior to other engineers"

"A team in which people are more independent will almost always be more efficient than one where everyone waits for the tech lead to decide.

Part V - Role-Model Staff and Principal Engineers

Area Typical expectation
Scope Complex projects within their group and the company
Guidance Works fully independently and guides others around them
Getting things done Unblocks themselves and teams they are on
Taking the initiative Takes the initiative to solve problems, and finds problems worth solving
Software development Establishes and improves best practices across their group
Software architecture Makes practical technology and architecture choices to solve problems at their group's level. Designs systems even when requirements are vague or dependencies are numerous
Engineering best practices Leverages industry practices and introduces those which help the group execute better
Collaboration With product folks, other engineering managers, and software engineers. Common to collaborate with business stakeholders as well
Mentoring Mentors senior engineers and less experienced engineers
Learning Keeps up with their domain, the industry and keeps learning
Typical years of industry experience 10+

"At staff+ level, expectations vary by the company you work at, and are typically more demanding at higher staff+ levels."

"Staff+ is a partner of EMs and PMs"

"For example, at Uber the principal engineer level (L7) is the same career level as the director of engineering (also L7). Also at Uber, principal engineers are expected to be partners to directors of engineering and product. [...] This expectation is oftentimes unspoken, and it's down to the staff+ engineer to put in the work and invest in strengthening this partnership."

Understanding the business

"As a staff+ engineer, there is often more work on your plate than you can easily handle.

1. North Stars, KPIs, OKRs

"[...] most staff+ engineers are partners to engineering managers (EMs) and product managers (PMs) in defining the team's strategy and roadmap. To speak the same language as EMs and PMs: North Starts, KPIs and OKRs are helpful."

Are the right things being measured?

"A noticeable difference between standout engineering teams and average ones is that on standout teams, engineers question KPIs and even OKRs from product folks. For role model staff-and-above engineers, I consider this practice to be a given."

Questions:

2. Your Team and Product

"The best place to start figuring out how the business works, is with the product you and the team are working on. Understand how this product works, why customers use it, what the competition is, and how it contributes to the company's bottom line.

3. Your Company

4. Public Companies

Useful information in quarterly reports and investor calls:

5. Startups

6. Your Industry

Collaboration

"As a staff+ engineer, much of the work involves collaborating [...] in many cases, it isn't you who initiates the collaboration, people come to you"

"The most challenging projects are rarely hard because of the code to be written. Often, the main pain point is working with others [...]"

"Collaboration involves people in your network, while your influence creates opportunities for engineers in your team. It's a differentiator in career success, which is why we're focusing on it."

1. Internal Politics

"[...] Politics and influence often go hand in hand, even though we perceive a 'political' colleague and an influential one differently. Influence is a 'good' form of internal politics."

2. Influencing Others

A few situations where being influential can help:

Earning trust as staff+:

3. Collaborating with Managers

4. Collaborating with Staff+ Peers

5. Expanding Your Network

6. Helping Others

Software Engineering

"As a staff+ engineer, your role incorporates that of a senior engineer, plus a whole lot more. It's common to be responsible for your team's pace of engineering work and its quality, as well as your own -- and often the outputs of other teams, or a whole group."

1. Coding you still do

"[...] you should make time for coding, but less of it."

2. Helpful Engineering Processes

3. Engineering Practices to Iterate Quickly

Tools and processes which efficient engineering groups can use:

4. Tools to Make Engineers More Efficient

5. Compliance and Privacy

6. Secure Development

Reliable Software Systems

1. Owning Reliability

"You almost always need to partner with engineering managers to move the needle on reliability."

2. Logging

"Logs are meant to help an engineering team debug production issues, by capturing missing but necessary information for future reference during troubleshooting."

Logging tool-set:

On logging:

3. Monitoring

"Monitoring alone isn't sufficient to ensure a system is reliable. Alerts need to be fired when the metrics look wrong, which an oncall engineer must receive, investigate and mitigate."

4. Alerting

Which metrics to monitor? Start with business:

On alerting:

5. Oncall

6. Incident Management

7. Building Resilient Systems

Software Architecture

"Software architecture is the baseline for planning complex systems, while good software architecture is the foundation which reliable and maintainable systems are built upon."

1. Keep It as Simple as Possible

"Coming up with complex architecture is often much easier than sketching something simple and efficient."

2. Know the jargon, but don't over use it

"Find a way to organize and learn the jargon for your day-to-day work."

3. Architecture Debt

4. One-Way Door vs Two-Way-Door Decisions

5. The Blast Radius of Decisions

"Figure out ways to shrink the blast radius."

6. Scalable Architecture

7. Architecture Decisions vs Business Priorities

8. Stay Close Enough to Where the Work is Done

9. Software Architect Traits

Takeaways

"The term 'staff engineer', 'principal engineer', and other staff+ engineer titles can mean surprisingly different things at different companies. [...] So intead of just focusing on the title, figure out what the expectations are at your current workplace, and at businesses you want to join."

"At this level, understanding the business is table-stakes, together with working well with a wide range of people, such as EMs, PMs, business folks and other engineers."

Part VI - Conclusion

Lifelong Learning

1. Stay Curious

2. Keep Learning

3. Keep Challenging Yourself

Levels:

"Once you reach 'expert' level, the learning curve tapers off."

4. Keep up with the industry

Way to keep up with pace of change:

5. Give yourself a break