Building a Career in Software
by Daniel Heller · read June 6, 2021
Review
Solid collection of practical advice, tips, and strategies for working in software development. It feels funny to be reading a book about how to write an email, but also there are a lot of random useful things to know about the workforce that someone has to teach you! (I actually used his "introductions" email template shortly after finishing the book and it was very helpful.) I thought that parts two and three — day to day life in the office and communication — were the most applicable to me.
Notes
Part 1 — Career
Own your own career — no on else will guide you.
Engineering is about building things and solving problems
Skills used to accomplish this:
- Coding
- Project management
- Communication
- Personal organization and time management
- Architecture
- Leadership and mentorship
- Emotional skills
10 Principles
- Reason about business value
- Unblock yourself
- Take initiative
- Improve your writing
- Own your project management
- Own your education
- Master your tools
- Communicate proactively
- Find opportunities to collaborate
- Be professional and reliable
Resume section order: experience, skills, education
CS fundamentals: linked lists, hash tables, trees, sorting, Bio O analysis of all
Career goal: solve the biggest problems your abilities allow, constantly challenging yourself and nurturing your technical and people skills
Technical study — should be learning technical content every weekday
For mentorship:
- Explain your goals
- Come prepared with 2 recent challenges and notes, advice you want, etc.
- Maintain a shared agenda
- Do your readings and return with questions
If you need to write a self review — construct a narrative that emphasizes your productivity, leadership, autonomy, and impact
Should expect 6 months of struggle when starting a new job, and then reevaluate your situation every 6 months
Choosing projects involves optimizing for learning, resume/advancement, and satisfaction
Part 2 — Day to Day At the Office
Essential methods to project management:
- What needs to be done — list
- How much can be done — dependency graph
Give weekly updates about timeline, what's done, what's not done, implications
Always pad estimates by 2x!
Keep two documents: an infinite scrolling document for every trick and a text file with your most recent commands
Easiest way to identify an effective engineer — they Just Do Something ("bias to action")
Keep track of what you do
Qualities of an effective meeting: owned by someone, has a clear agenda and goal, focused on conclusion, notes afterwards
Dimensions for hiring: coding, architecture, communication, domain knowledge, organized thinking, and attitude (passion and collaboration)
2 Principles of Giving Feedback
- Give people the benefit of the doubt
- Give feedback in the most positive way you can
3 Principles for Receiving Feedback
- Seek it out often
- Receive it with an open mind
- Express appreciation whether you agree or not
To build a good reputation: do good work and treat people right
Enthusiastically help your colleagues when they need it
Reliability is important to your reputation, so:
- do what you say you'll do (don't overpromise), and
- be on time and be available
Know your limits and try to categorize assertions based on your level of confidence (direct observations, beliefs, and suspicions)
5 Dimensions of Technical Leadership
- Vision — choose something valuable, craft a story about it
- QA — high quality work
- Project management
- Harmony
- Mentorship
When assigning work, pick "what they can do, plus epsilon" and give them context (will help them do their job better and believe in it more)
5 Components of Mentorship
- Teaching — sharing tools, practices, and insights
- Support and comfort
- Evaluation — assessing strengths and weaknesses
- Tactical problem-solving — helping them navigate specific situations
- Goal setting
Need a model of your mentee — what are their goals? skills?
Ask them to come to the meeting with their 2 most pressing problems
Dealing with difficult people: warmth, kindness, and assertiveness
Don't complain too much, don't gossip, don't date or get drunk with your coworkers
Part 3 — Communication
Listening is a social and an attention exercise
Main goal is to understand what they mean and why; secondary is to build relationships and make others feel understood
When communicating, keep in mind: relevance, context, clarity, efficiency, sensitivity
What does this person need to get done and what information from me helps?
3 qualities when determining a medium: synchronousness, bandwidth, and formality
The 8 Foundational Principles of Technical Writing
- Be concise
- Emphasize conclusions
- Put yourself in your readers' place
- Use clear structure
- Use simple language
- Provide ample context
- Lead with most important points
- Edit for precision
Start emails with tl;dr for people who don't have time to read every word
Always be respectful and calm in an email — they live forever
When giving an update on a project, break it into subareas and cover background, progress, impact, and schedule
Principles for asking questions:
- Try a reasonable amount to help yourself before taking others' time
- Provide ample context (intentions and observations)
- Express your question precisely
Part 4 — Technical Skills
When staring with a new language, read a book about it and consult a style guide
Objectives of good naming: explicitness, brevity, and consistency
Comments are useful for describing motivation, design, assumptions or invariants, and anything not obvious
High quality code needs tests, preferably with 100% coverage
Cleverness — I'm opposed to it. Favor explicitness and simplicity over cleverness whenever possible. (200)
Be cautious about dependencies (especially open source)
Inject dependencies for better decoupling
Priorities for codebase: correctness, maintainability, development cost, performance
Can use these as a guideline for code reviews as well
Debugging involves refining a mental model of the system using data
2 methods for experiments — make a runbook and record everything
Reliability: what could happen and how will we be ready?
2 major failure resilience techniques — redundancy and graceful degradation
Build observability into your system
Master the command line — it keeps you fast and makes you look like a pro