The Coding Career Handbook
The Coding Career Handbook
Along the way, I met developers who’d entered the field from a lot of different
backgrounds. Accountants. Nurses. Soldiers. Fire fighters. But I never met
anyone quite like Shawn Wang. The guy was full of surprises.
For example, I interviewed Shawn for a podcast last year. And I discovered that
before he learned to code, he had worked as a financial analyst on Wall Street.
He left his $350,000 salary behind and started over at the bottom of a new field
as a junior developer.
And this week, I discovered something else about Shawn: he can write a 500-
page book that summarizes an entire profession, all in just a few months of
deliberate effort.
Nobody had written all this down in one place. That is, until Shawn turned his
indomitable will toward this task, sat down at his computer, and grinded it out.
In many ways, a book like this could only be written by someone with Shawn’s
combination of Wall Street pragmatism, Silicon Valley ambition, and a lively
Singaporean upbringing.
Even though I’ve worked as a software engineer for several years – and run a
technology education nonprofit – I still learned quite a few new things from
Shawn’s book.
I recommend this book for anyone who is thinking of getting into the field of
software development. And I also recommend it as a reference for experienced
developers. Shawn has structured this book in a way that you can easily come
back to it and fill in the gaps in your knowledge.
This book is stuffed to the gills with landmark studies and insightful quotes from
developers at the top of their field. Make time to absorb the many articles and
tech talks Shawn links to throughout. Sure, you’ll encounter many of these
canonical works sooner or later in your developer career. But the sooner you
grok their teachings, the longer their insights will compound for you.
Rome wasn’t built in a day. Likewise, it will take you years to build out your
developer career and reach your final form.
This book will help you work smart. How hard you’re able to work is ultimately
up to you. As Shawn is quick to point out, this is a marathon, not a sprint. So
pace yourself.
And remember to slow down once in a while and take in the thrill of creation
that comes with coding something new.
- Quincy Larson
The teacher who founded freeCodeCamp.org
The more I talked to my friends about their careers, and the more I progressed in
my own career, I increasingly realized that the non-code part of coding was both
a hugely important, and under-discussed, topic. It is under-discussed because
nobody else is as invested in your career as you are.
There are a lot of books teaching you specifics of frameworks and languages.
There are a lot of books on quitting your job to do your own thing. There are a
lot of books on becoming an engineering manager. This book is none of those.
This is a book about getting coding jobs, and doing well at coding jobs.
That is an ambitious goal, which presents its own problems. It’s scary writing a
career advice book - I’m just one person, and I haven’t made a career of
coaching developers. I can’t guarantee success, and you can’t verify that
everything I tell you is right. All I have is hundreds of hours of listening to
people’s stories, and living my own. I have biases that make my situation
different from yours - I am a US-based, Asian male web developer, seeing
decent success after career change at age 30.
But I think the bar is very low. I’ve met with developer career success advisors
and read conventional career advice. You deserve a more intelligent discussion
than fits in a 15 minute YouTube video or yet another Medium blog post. That’s
why this is NOT going to be a conventional career advice book.
My job here isn’t to tell you things others already do. I will cover important
points, but if other people do it better, I will simply link to them rather than
regurgitate. My job is to introduce you to things you might take years to
learn, and to honestly discuss this industry like an older brother who is just a
few years ahead of you, acknowledging that what works for me might not work
for you but giving advice anyway.
With all that disclaimed, it’s time to have some Real Talk about your Coding
Career.
Chapter 1: Careers
A linear series of career guides of the three early career roles covered in this
book (Code Newbie, Junior Dev, Senior Dev), and the three major
transitions after each stage.
Chapter 8: Principles
A non-linear list of essays discussing ideas for Always-On Principles that
you can use to supercharge your career.
Contents
Foreword by Quincy Larson
Preface: Real Talk
TL;DR ToC v1.0.0
Chapter 1 Part I: Your Coding Career
5.3.1 Code
5.3.2 Learning
5.3.3 Behavior
5.3.4 Team
5.4 To Stay or To Go
Chapter 6 Senior Developer
17.1 Logic
17.2 Epistemology
17.3 Applications
17.4 Systems Thinking
17.5 Further Reading
Chapter 18 Write, A Lot
18.1.1 Documentation
18.1.2 Career Capital
18.2.1 Scale
18.2.2 Structure
18.2.3 Power
22.1 Explorer
22.2 Settler
22.3 Connector
22.4 Miner
22.5 Why “Gears”?
22.6 What do I do now?
Chapter 23 Specialist or Generalist?
25.1 A Disclaimer
25.2 Definitions
25.3 “Close to The Money”
25.4 Profit Center, Cost Center
25.5 The Developer’s Choice
Chapter 26 Career Ladders
27.4.1 Agencies
27.4.2 Advertising
27.4.3 Subscription
27.4.4 Marketplaces
27.4.5 Gaming
27.5.1 Aggregators
27.5.2 Platforms vs Aggregators
29.1 Definitions
29.2 Examples
29.3 Building Your List of Megatrends
Chapter 30 Part IV: Tactics
Chapter 31 Negotiating
While there are many resources on how to code, from beginner to advanced,
there aren’t enough covering everything else. This book is dedicated to solving
that. It will give you principles, strategies, and tactics for the five stages of your
early coding career:
For most people, this covers the first 4-8 years of their career as a developer.
There are, of course, many titles and stages beyond that, but that is out of scope
for this book. Our primary objective is simply to give you as good a start as
possible, with the expectation that it will compound later into your journey.
We also focus on the coding career. The part of your career where you are
primarily expected to write code as an “Individual Contributor”. Sometimes,
coding careers end as developers move up into management, entrepreneurship,
and other “code-adjacent” roles (Chapter 7).
Welcome to tech, where the roles are made up and titles don’t matter.
- Kelly Vaughn
Everyone is junior at some things, and senior at others. You don’t magically stop
needing to learn new things once you’re a Senior Developer, and even Code
Newbies can practice all of the tactics available to the professionals.
Which is why this is the only part of the book that is linear - offering point-in-
time advice for each career stage - while the rest of the book lets you skim and
jump and revisit it over the next X years of your coding career.
Titles do matter - mainly because that’s how salary and responsibility get
assigned. Companies establish career ladders with specific expectations you
must meet to reach each level (not always true, especially for early stage
startups). But the point remains that you ought to keep working on your
principles, strategies, and tactics throughout your entire coding career.
Whenever you change jobs you will have a chance to jump between one of these
types of companies (of course, there are more types than I listed). It’s important
to learn what kind of environment you thrive in - finding your best fit is going
to be more rewarding for your career in the long-term than chasing pay or
prestige in the short-term.
Tip: See the Intro to Tech Strategy Chapter (Chapter 27) for a deeper
discussion of tech business models and how that translates to what you
work on.
1.3 Career Layers
The third dimension you will want to explore is where in the stack you want to
work.
Here we can explore a mental model inspired by the OSI Model. The OSI
Model provides a mental framework for how different technologies like HTTP,
TCP, IP, and 802.11 come together, each solving their assigned problems, and
(for the most part) seamlessly interoperating (with the help of some Narrow
Waists).
You can divvy up the universe of software jobs along the same lines. I always
think of how the value chain for humans is kind of similar to our underlying
tech. From the folks who write firmware that provides raw Hardware capability,
all the way up to End Users who create software with software, and all the
interesting software jobs in between.
Because I primarily work at the App layer, you may see some bias due to my
lack of knowledge. For example, there are other guides to careers in Data
Science and Cybersecurity. I’ve reviewed many and the advice in this book
represents what stuck.
Descriptively, I see the primary axis of software jobs as adding value from
Machines all the way to End Users:
At the lowest level, we have people who work with Hardware. They still
code, but their task is to design the chips, firmware, and operating systems
to expose raw Capability for us hungry, hungry software devs to eat up.
Then, we have the Cloud/Datacenter people, who are technically not
required but a practical reality these days. Their main job is Availability,
often with Distributed Systems, which also helps offer easy Scalability.
They basically fight CAP theorem for a living. Arguably you could view
them and other Cloud Distros as providing distributed “virtual hardware”
for the rest of us devs to run on.
Next, we have people who make Runtimes. This includes Browser Devs,
Language Designers, and Framework, Tooling, or Infrastructure Devs that
are basically responsible for all the Developer Experience we enjoy.
The assertion is that these jobs get more numerous as we get closer to users, who
are more diverse and therefore require more customization. Work is also
“further away from the metal.” When we code at higher layers, we’re
increasingly encouraged to pretend that the resource constraints of the below
layers don’t exist (for developer experience). This is, of course, a leaky
abstraction – but it works a lot of the time.
Some parts of the software industry are so self-contained that they don’t match
this model at all. For example, with gaming you’re often working with game AI,
procedural generation, physics engines, and massively multiplayer realtime
backends – none of which are common tasks in any other stack. At the end of
the day, software jobs appear whenever there is money to be made writing
software. And they don’t have to conform to any layer model – think of this as
an illustration rather than a precise map.
1.4 Diversity
Often the only people who ignore diversity issues in a career discussion are
cishet white men. For everyone else, it colors every job, every interaction, every
moment of self-doubt. Regardless of your political persuasion, you should
recognize that tech objectively does a worse job at diversity than any other well
paid white collar industry. This isn’t mere perception – it is greatly statistically
significant by any measure.
Today only 17% of Computer Science majors are women. We do worse than
medicine, law, and the hard sciences! This effect worsens once you get into the
industry - industry surveys of programmers regularly come in around 8-12%
non-male. This means there is 40% average attrition of non-male coders
relative to male ones, which is indicative of problems in the industry and a
problem in itself for diversity in senior ranks. You will see this happen in your
own career journey.
It wasn’t always like this. You can see in the chart we used to have twice as
many women in the college pipeline in the 1980’s. The first professional
programmers in the 1940s were female. The first compiler was created by Rear
Admiral Grace Hopper. Before Charles Babbage’s Analytical Engine even
existed, Ada Lovelace was programming for it.
Programming ability isn’t limited by gender or race or sexual orientation or age.
It is far more likely to be human factors – the non-code parts of coding careers –
that systematically alienate our fellow humans from this lucrative, powerful
field.
If you are not part of the underrepresented minority in tech, have the compassion
and empathy to recognize that this problem is an inescapable fact of life for
those who are. First, do no harm: Recognize when you are contributing to the
problem and stop. Then be an ally by calling it out in others and lending your
privilege.
If you are part of the underrepresented minority, know that you are desperately
needed and if your current company doesn’t value you, there are lots of other
inclusive companies that would love to work with you. There are also extensive
support networks by your peers, from dedicated industry groups like Women in
Games International to language groups like PyLadies to framework groups like
Front-End Foxes to more generalist networking and mentorship groups like
BlacksInTechnology, Latina Geeks, and Lesbians Who Tech. You can even find
others with the same background as you like MotherCoders and VetsinTech.
These aren’t mere toothless social groups – before you join a company or
collaborate with someone, it can be very helpful to do a quick reference check,
or you might hear about a perfect job opportunity before anyone else because the
hiring manager values reaching out to communities like yours, or you can just
ask for help from people who’ve been in your exact shoes.
Coding careers are very diverse; you don’t have to do web development, there
are other career paths like Data Science, Cybersecurity, Cloud, Dev Ops or
Mobile Dev. That said, web development is by far the most popular, and you’ll
probably have to learn a bit of it no matter what you do.
The primary artifact you will produce is your portfolio, or as I call it in the
Marketing Yourself chapter (Chapter 39), “Proof of Work” (which can include
a blog). You basically want to demonstrate passion and engagement with your
chosen skill, and Build Cool Shit.
Learn the Lingo: You are the average of the five people you spend the
most time with - so spend your time with other developers by plugging into
talks and podcasts! I keep a list of awesome developer podcasts you can
use, or of course you can find your own. Don’t like podcasts? Be a fly on
the wall on Twitter! You can watch senior devs talk amongst themselves
for free, and catch up by googling and asking for clarifications. This will
serve you well in interviews too - talking the talk helps you walk the walk.
Laurie Barth calls this Talk like an Engineer! Immersion is great but be
careful not to confuse surface familiarity of things with real knowledge of
them - this is just step 1 on a long journey toward mastery.
Make up Levels for Yourself: When you are learning on your own
(especially after your formal learning phase), it can feel a little directionless
since there is an infinite number of things you could be learning. The
counter for this is gamifying learning - when I was learning JavaScript, I
set goals for myself to make a clone of jQuery, then to get good with React
and Redux, then to be able to make a Hacker News clone. You can do the
same for whatever you’re focusing on! Some learning platforms even
award you points and trophies for completing challenges and streaks. Yes,
it’s a little corny. But lean into it!
Explore Paid Learning: Because there is so much free content available, it
can be tempting to learn entirely free. However, in my experience, the level
of curation and quality of paid content is just so much better that it is worth
it. If you can afford it, look into the (reputable!) paid learning courses in
your community. For example Egghead, Frontend Masters, Codecademy,
ACloudGuru and Pluralsight. As for Udemy - just be aware that Udemy
has a very mixed reputation. Stick to the top most reviewed instructors.
Make a Public Commitment: Having a public commitment helps you
build your own team of cheerleaders and community. This helps give you
the feedback you need to not feel alone in your journey, and it forces you to
keep going when you might otherwise have given up on yourself.
Alexander Kallaway’s 100 Days of Code is a popular commitment, while
No Zero Days is what worked for me. If you’re uncomfortable in public,
you can also keep a private learning journal – anything outside yourself
works, so long as it keeps you accountable.
Find a Community: You don’t have to make commitments to get
community - CodeNewbies, FreeCodeCamp, DEV, CareerKarma and
CodingBlocks are great, welcoming communities that keep you company as
you learn. A bootcamp can be a great community, and you can even find
free meetups like Codebar to learn in person, or virtual mentors via Emma
Bostian’s CodingCoach. If you belong to an underrepresented minority in
tech, don’t forget that there are communities and organizations formed
specifically to help people like you, often with local chapters that can give
you the mentors and friends you need to find your place in tech (yes, you
belong here, and don’t let anyone tell you otherwise).
Teach To Learn: If you can find a group of peers, pick a topic and offer to
teach it to them. You only find out all the things you didn’t know about a
topic when you start preparing to teach it, and then have to answer all the
questions you didn’t think to ask. I did this very early on with React, and it
was stressful but highly beneficial for me!
Cover Your Bases: Developer jobs aren’t 100% about coding new features
all the time. Some might say they’re not even about coding the majority of
the time! There are a lot of coding-adjacent things that developers do that
you’ll want to learn about. You should be familiar with (or at least have an
opinion on) everything in the Joel test, which includes source control, code
review, and testing. Have some familiarity with the Testing Trophy or
Testing Honeycomb and understand how to implement it in your language’s
tools. While asking “What happens when you type Google.com into the
browser?” is now a little dated, you should still know it in some detail
because it demonstrates that you know how the Internet works. This
“metacoding” skillset is so important that MIT has even started teaching
this as “the Missing Semester.” In JavaScript, for example, you’ll want to
have some basic familiarity with tools like Webpack, ESLint, PostCSS, and
Prettier. While you’re mostly learning to code by yourself, most developers
work in teams. One way to gain “team” experience for free is to contribute
to open source!
Start Contributing to Open Source: Many open source projects are very
beginner friendly, and you don’t even have to start off contributing code. In
fact, it may not be the best idea to start by contributing code to large
projects like Node or React, despite the bragging rights that might entail. It
might be better to start with a smaller library you use, or to help improve
docs. This gets you involved with the basic mechanics of open source
without needing you to catch up on a lot of context you may be missing.
Since most open source projects are in dire need of good contributors,
you’ll be welcomed with open arms if you show a positive attitude and an
understanding of what they’re looking for. Check out First Timers Only for
projects that specifically reserve issues for first timers!
There are a lot of roadmaps like these that people write to chart out what’s
available, but they can often feed impostor syndrome more than help.
Remember that very few technologies are actually mandatory, and even the
authors of the roadmaps don’t know everything they list on them. They’re just
maps; you don’t have to visit every point on them.
If you are self-teaching, some folks take the “hard” mode and insist on covering
a full computer science curriculum. You can find good paths for these at
TeachYourSelfCS, Open Source Society University and Scott Young’s MIT
Challenge. However, note that this covers a lot of theory that is rarely (if at all)
used on the job for the majority of product developers (If you recall our Coding
Career Layers from Chapter 1, we distinguish between product and platform
developers. It stands to reason that different developer types require different
knowledge!). You do have the choice to get a great developer job without
knowing a lot of academic computer science knowledge, and then fill in your
gaps while you work.
If you’re stressed out by the sheer number of technologies you feel like you have
to learn, you’re not alone. For frontend developers, there’s How it feels to learn
JavaScript, while backend developers have Docker: It’s the Future. Every now
and then you’ll read something in the Why we at $FAMOUS_COMPANY
Switched to $HYPED_TECHNOLOGY genre and feel the fear of missing out.
This is completely normal. It’s good to stay informed, but when it comes to
learning, focus on what you need to make the things you want to make, and to
get the jobs you want.
Chapter 3
The (First) Job Hunt
There are plenty of advice articles (and workshops) out there about landing your
first developer job. I don’t want to repeat them - you can easily google an
endless supply of them for free. But I also cannot ignore that this is the most
critical part of your initial journey.
If I don’t help you get past this stage, there is no coding career!
So I’ll assume you’ve read the common advice out there. My task is tell you
what they don’t.
In general, you should focus on systems (what you are doing to get the job)
rather than goals (getting the job). The former is within your control, the latter is
not. By overly focusing on goals, you might get a developer job, but it may be
the wrong job for you.
But the great thing about jobs is you only need one.
The probability of getting 1 job is higher if you apply to more things. I know
this sounds obvious but when you get discouraged (and I have felt it - in my
initial job search, I spent a whole week not doing any applications because I
didn’t feel motivated) you have to remember to Keep. Things. Moving.
The common framing of this is that it’s a “numbers game”. But people don’t
quantify how much just doing more applications does for you - this is actually an
applied form of Birthday Problem, which is GREAT for you!
If I told you that you have a 4% chance of getting an offer from any
application, that might seem dishearteningly low. But mathematically
that means that 50 such applications will give you an 87% chance of
getting at least one job offer. - Haseeb Qureshi
Instead, try to figure out the intersection of what you like, what you can be good
at, and what the world values (Preferably, the world is -increasingly- valuing this
thing so you have a tailwind behind you - see the Strategy section of this book).
You are most likely to get hired, be valued, and love your work when you find
the company(ies) that closest match those three things.
The obvious problem with this generic advice when you have no experience is:
you don’t really know what you like or are good at.
So: Talk.
Talk to alums of your school or bootcamp. Talk to friends. Ask for intros, then
Talk to friends of friends. Ask for more intros, then Talk to friends of friends of
friends. Talk to people at meetups and coffee chats. Listen to podcasts (here is a
list of awesome dev podcasts). Chat on Reddit, Slack communities, Twitter.
THIS is why you network. Not with the sole intention of “Hey can you put me
in as a referral if I buy you a coffee?”. Rather, you truly want to find out what
people really do, what people think of the industry and their company, and where
in the Coding Career Layers you could fit. People like to talk about
themselves. Don’t ask for a job, or a referral (unless they bring it up) - if you are
genuinely curious they’ll bring it up themselves and it will be their idea.
Your goal is to have fewer companies to apply to, but to have REALLY
FREAKING GOOD reasons for each company because you’ve done your
homework. This way, when you are asked “Why do you want the job?”, you
have a reason. (Lacking a good answer for this has ended presidential
campaigns in the past!) When you need to write a cover letter, the words flow
from you instead of being forced. When you meet your interviewer (and future
boss) face to face, you won’t need to fake interest.
To give you my personal math, in my initial job search I only applied to nine
companies, got to final interviews at three, got two offers, and took the highest
one. Others applied between 200 to 300 times! Everyone’s story is different,
though, you will have to decide what strategy fits you.
Listening to podcast interviews of how people broke into tech can be hugely
motivational. It helps you realize there are thousands of people going through
what you are going through right now. The backlogs of CodeNewbie,
FreeCodeCamp and Breaking Into Startups podcasts were particularly helpful
for me going through this journey.
Time Splits are important. You don’t need to spend 100% of your job hunt
literally hunting for jobs. Here’s a quick breakdown of what worked for me:
2-3 hours of Algorithm practice (arguably, algo questions are going away
for job screens, but at some companies they are a rite of passage and you
don’t want to lose a great opportunity just because you didn’t cover your
bases)
1-2 hours of Job Opp finding and emailing. There are two main sources
of job opportunities – either you find something on a job board, or you hear
about an opportunity from your personal and social network. Many sites
have Job Boards, from Hacker News to CodePen to StackOverflow. If you
belong to an underrepresented minority, don’t forget dedicated boards like
POCIT Jobs, Include.io, Wallbreakers, Ada’s List, Hire Tech Ladies,
Diversify Tech Co, YSYS, and Tech Talent Charter. Put everything into a
tracker like Asana or Trello. Keep juggling those balls. Don’t rely on your
own memory for deadlines. Track them, set alerts.
2-3 hours of structured learning - e.g. through video courses or reading
technical books from cover to cover.
Rest of your time: Build a Side Project. Set a reasonable deadline (1 week
or 1 month) and then just build your idea as best as you can by that
deadline. Resist the urge to perfect it. Just get it to launch, then get
feedback. Build fun stuff, or explorations, or clones (see Chapter 10 for
why Cloning Open Source Apps is a great way to learn). Still don’t know
what to build? Try JavaScript 30 or Just-Build-Websites. We discuss side
projects in greater detail in Chapter 37.
Optionally, Teach. Livestream yourself on Twitch or do a meetup talk. In
particular, try to get practice talking while you code. This is great practice
for technical interviews.
Portfolios. You don’t need an all singing, all dancing portfolio page. You don’t
need a verdant green commit history. People barely look at that. They don’t
have time. You just have to demonstrate that you’ve Done Cool Shit and,
optionally, Covered Your Bases. If your work is less visual in nature, just have
an active blog. It’s more about instantly verifiable Proof of Work. (More in
Marketing Yourself, Chapter 39) One exception - Design/UX positions strongly
benefit from great portfolios.
For folks worried about their contributions… No one cares! You can
impress most hiring managers with only 3 contribs: 1) Something
simple, built flawlessly. Seriously. Like 1 class, or a single js file. 2)
Something complete. A small app / site / lib. Tests. Docs. 3)
Something with a story (my fave!) Could be a single line of code. -
Mekka Okereke
Resumes. You do need to be able to talk well about whatever you put on your
resume so make sure that everything on there is legit. Keep it one page, use this
template for ideas. Use Canva Resume templates to make it visually interesting.
For whatever reason, interviewers often print out your resume and bring it to the
interview and then stare at it instead of talking to you like a normal human
being. Have 2–3 different versions of your resume prepared to tell the story that
you want to tell. Ditto your cold email draft, or self intro, or cover letter. Learn
from modern internet advertising: MORE TARGETING IS ALWAYS GOOD.
Cover Letters. A cover letter shows that you know what the job is about and
have taken the time to personalize your pitch. A good cover letter makes
reviewers sit up and pay attention – sometimes this calls for creative measures.
Cover letters can be componentized:
If you find yourself writing too many custom cover letters, this is a hint that you
may be casting your net too wide and you may not be very sure what you want.
(It’s also exhausting!)
Networking. Don’t be shy – Everybody should know that you are job hunting!
Friends LOVE helping their friends get jobs! Especially if drinks are on you.
Head to meetups and conferences – you might run into someone who can give
you a referral, or even hiring managers who specifically go to these events to
find people like you! Put the fact that you are looking on your site, LinkedIn,
and Twitter bio. In particular, people are very supportive on Twitter, and I’ve
seen junior developers get jobs with a single “I’m Looking! Here’s What I Do!”
tweet. Use what already works and have a good tweet-sized pitch of yourself –
see threads like this for inspiration. Social Media can be great for introverts,
because you don’t need to rely on face-to-face realtime conversation to start your
jobseeking.
For my first job I applied to two jobs, and got one offer. The one I got
the offer for I had a recommendation straight to the CEO from a friend
as well as connections with several employees over twitter, and I made
a custom website for that company specifically for them, as well as a
video of a skateboarding guinea pig. It was enough to stand out and
get me to the top of the interview list. - Jeff Escalante
Mock Interviews. You can get over a lot of nerves by just having a few friends
(or a professional) put you through some mock interviews. You can even find
some videos and podcasts that coach you through a mock interview. Remember
that they’re not merely assessing whether you can come up with the right
solution, they’re also looking for your communication skills, eagerness to learn,
and problem solving process. Some hiring managers are so open that you can
even find out the kind of questions they like to ask, based on their own tweets
and media appearances. Research them and practice answering them.
Algorithms. You don’t have to be an Algorithms God, but you should know the
basics - have passing familiarity with the main ideas in Gayle McDowell’s
Cracking the Coding Interview or Emma Bostian’s De-Coding the Technical
Interview Process, memorize and be able to derive the Big O’s of sorting
algorithms, and so on. Even a Google technical interview is at most 45 minutes
of coding; that is not enough time to write a self-balancing red-black tree, and
barely enough to code up a heap sort from scratch. Just know the basics - Byte
by Byte’s list of 50 Questions is indicative of the difficulty level of algorithm
questions. Paid sites like Leetcode and Algoexpert can help you practice.
Technical Interviews. This topic is well covered by others, and is very domain
specific, so is out of scope for this book, but definitely check out the Mega
Interview Guide and Coding Interview University. But the broad adage of
“Make it work, make it right, and make it fast” applies.
As you tackle the problem, it’s important to explain your thinking process. A
detailed framework you can use is the REACTO model:
If you have a running environment to code in, then it may be a good idea to do
Test Driven Development for your code (flip the Testing and Coding stage). I
once specifically got an offer because I chose to do TDD while trying to
understand the question (it wasn’t a conscious decision!).
You can choose to go all out and risk being messy, showing how you would
work in a real project (including architecting for scale, as well as including
other niceties that they didn’t ask for, but would in real life), with a risk of
failure.
Or you could do a minimal, super clean project that just checks all the
required user stories and nothing more, and just make it extremely well
documented and tested.
The judgment call relies on what they are really hiring you to do. I usually go
for the risky option because it fits the jobs I seek. Note that Take-Home Projects
typically take between 4 hours to 2 days - any longer and the company should be
paying you.
Reverse Interviews. If someone asks if you have any questions, ask a question.
This is known as a “reverse interview”. The most famous of this was the Joel
test, which is a little outdated today. You can consider this updated list instead.
Asking good questions about company culture can both make you look good
(you are serious about the job, and also know how to ask good questions) and
also help you make your final decision. So it makes sense to prepare these
questions beforehand!
“Convince me how you can help me, and you get into a special
shortlist that almost nobody gets into.” - Daniel Vassallo
Open Source. The bar for getting involved in open source is hilariously low
compared to getting hired at companies that depend on the same open source.
“Open Source Hiring” is mostly just a matter of who consistently shows up. You
can quite easily become a maintainer of a core ecosystem project with a few
months of diligent contributions. This then becomes an impressive resume point
at every company that uses that project.
Get your foot in the door: If after all you’ve tried, you’re still not getting
anywhere, remember that you have other skills to offer apart from your coding.
It is much better to spend a year working in a tech-adjacent, nontechnical job,
then internally transfer into a technical role, than it is to spend a year sending out
resumes and getting doors slammed in your face. Plenty of companies want to
hire smart, motivated, technical people for support, documentation, project
manager, and sales support roles. Look to organizations like Digital Project
Masters, Write the Docs, and Support Drive for answers. Warning: I am not
suggesting that you should expect to waltz in. These are specialized roles and
you will have to compete with trained professionals doing these jobs. However,
your coding ability should be a plus in landing these roles.
Once you’re in, nobody will object to you doing a little extra coding on the side -
there are always some issues to pick up, always some internal tooling that could
be better. Great companies will even see the value in paying to help train you.
You can become a professional developer by sheer force of will.
You can find many of these examples of High Agency outside of tech:
All of them started somewhere. The same is true for you. If they aren’t letting
you in the front door, go round the back.
Once the offers start coming in, you’re almost done! In my opinion, negotiation
isn’t that important at this stage. You’re trying to optimize for the employer
that will help you grow the most, not get the highest amount of money in the
short term. You can get your millions later. It’s not unheard of, but you’d be
hard pressed to instigate a bidding war over you for your first job. Just make
sure that you know your worth and get at least your market rate (see
Negotiation, Chapter 31), and don’t be afraid to ask for the things you really
need, within reason.
Chapter 4
Junior Developer
First, welcome to your new life! Ask questions! Find a work buddy
with whom you feel comfortable asking any tech question. Never let
anyone make you feel bad asking a question - there are no dumb
questions. Ask a lot. Draw diagrams. Read code. Reassert your
assumptions. Breathe. — Scott Hanselman
Barring toxic workplaces, most employers who knowingly hire junior or entry-
level developers know what they’re signing up for - giving you all the training
and support you need to succeed in your new job! In fact, a (rare) few
employers actually prefer hiring juniors, because they come without
preconceived notions and are moldable to their methodology.
This is your time to not know anything. Better you ask now than a year from
now. Say “I don’t know” or “Can you elaborate what you mean?” frequently.
Take “My door is open” literally. Indulge your curiosity. Ask questions the
smart way. They have to teach you - in fact, some senior developers are
evaluated on their ability to explain things simply, and to mentor juniors. Return
the favor by taking lessons to heart.
See Lampshading (Chapter 34) for more tips on how to turn
Ignorance to Power!
A powerful and subtle way of asking for help is asking to pair program with your
mentors and peers. It may feel awkward at first, but there are always subtle tips
and tricks to pick up from closely watching how your coworkers solve problems,
and they can understand where you make mistakes and give more context than
normally available in a code review. Knowledge transfer by osmosis is
incredibly powerful and productive. This practice is so beneficial that some
companies (like Pivotal) have adopted the policy of always pair programming -
as part of an Extreme Programming practice. The top two engineers at Google -
Jeff Dean and Sanjay Ghemawat - paired all the way from their time at DEC to
creating MapReduce and TensorFlow. You don’t have to go that far, but in
general most junior developers benefit tremendously from “pairing” with
colleagues, and you should request pair sessions if your company doesn’t yet
make it a norm.
Once you have a good sense of how your coworkers think and work, you can
actually just start “emulating” them in your head. When approaching a task, you
can ask, “What would $COWORKER do?” At a prior job, we had a great code
review feedback grading system, but I found that we could even reduce the
latency of code reviews by pre-emptively reviewing my own code with concerns
that coworkers were likely to raise. If your team wants more ideas for effective
code review, Google’s Code Review guidelines are public. As you gain more
experience, you should also review your old work and think about how you
can comment, document, and design your code better for your own future
readability and extensibility.
Work on your problem solving skills, and understand that we all have
struggled like you are right now. Take some time to learn how to use a
debugger. Debuggers are quite beneficial when navigating new, undocumented
or poorly documented codebases, or to debug weird issues. Do not give up if
Stack Overflow or an issue on GitHub doesn’t have an answer. Sometimes all
you need to solve your problem is taking a short break or trying to explain it to a
rubber duck!
Understand how to help them help you. Saying “I am stuck, but I have tried
X, Y, and Z. Do you have any pointers?” to your lead is much better than saying
“This is beyond me.” When writing up an issue or bug report, help them help
you by writing a good title, providing key details upfront, including error
messages and environment/package versions without asking, providing a
minimal reproduction of your issue, and explaining what you’ve tried and what
you expected. If screenshots speak a thousand words, then recording gifs and
quick explainer videos can speak volumes. See StackOverflow’s guide on “How
do I ask a good question?” for more.
You will have to learn a lot from your senior colleagues, while at the same time
understanding that they can be wrong too. I once had a boss tell me “React is
object oriented because it uses classes” and realized how poorly he understood
React. You will need to develop the judgement, understanding, and persuasive
skill to navigate these confusing early days.
It’s not your job to never make mistakes. It’s the job of your seniors and
managers to ensure that both you and the company can recover from any
mistakes you make. One Junior Software Developer accidentally destroyed
their company’s production database on the first day of the job, and was told
by the CTO that there would be legal implications. Read the story and all the
replies from people who have caused similar incidents. They lived to tell the
tale.
Instagram DDOSed itself on the day of its launch because they forgot a
favicon
Someone at Pixar ran rm -rf on Toy Story 2 and deleted 90% of the
movie (2 years and $100m worth of work)
Pentest against production at a bank faking $5M overnight against customer
instructions
Accidentally taking the iPhone off the Apple Online Store
Literally kicked all of Sierra Leone off the Internet during Ebola
Accidentally deleting the database while teaching someone how not to
accidentally delete the database
Mistakenly emailing 15k users every minute for 2 hours, then repeating the
mistake with the apology email
Every person saving their profile got it deleted instead
Word processor that formatted the hard drive every 1024 saves
Went to the wrong building, took down the network of completely unrelated
company
Steam, Windows, and iTunes deleted all user data.
You might feel intimidated at doing things beyond your comfort zone, but you’re
going to have to get good at it to grow. Fight impostor syndrome by saying
“This is what I do”.
Try to be a work sink instead of a work generator. Proactively ask managers and
product owners what you can take off their plate. Your job is to support them:
when they look good, you look good. Ryan Holiday calls this the Canvas
Strategy – Harry Truman puts it more pithily: “It is amazing what you can
accomplish if you do not care who gets the credit.” Of course, if you feel you are
being exploited, stop.
If you just wait around when you run out of things to do, you look lazy and
unmotivated. Show initiative - there are always more things to do.
It is quite often that doing the things nobody else wants to do often ends up
making you indispensable, because A) it has to be done and B) nobody else
wants to do them. If you figure out a clever way of doing it, you could even
make a career (or startup) out of it!
Important caveat: Don’t let people take advantage of you. Pick your
projects strategically if you can (see the Strategy section), and when
you have wins, Market Yourself internally and externally.
Tests are the most common example of this. In fact, a really great way to start a
new job is to volunteer to write tests:
There are never enough tests. There’s always something more to test, or
tests can be faster, or you can remove/replace unhelpful tests.
Coworkers will be grateful. Tests aren’t user facing, so they are often the
place corners get cut, yet everyone understands the value of testing.
Learn the codebase. To test the code, you’ll have to understand where to
test the code. It’s an art, not a science - If you blanket the codebase in unit
tests, you’ll have a lot of superficial code coverage, but also a lot to refactor
when any minor detail is changed, while also duplicating a lot of
framework tests. The prevailing advice is to “Write tests. Not too many.
Mostly integration.”, after the famous Michael Pollan quote.
You can’t break anything - in fact quite the opposite - tests make code
more resilient!
You will learn things you didn’t know about how your product works.
When you interact with the product, you only see what a user like you sees.
When you look at the code, you will see all the edge cases that are
addressed, and the ugly, hacky code that made it happen!
People have used this strategy at Netflix, Ionic, PayTM and more to get great
starts at their companies, and you should too.
Your code only has value in the context of the business you work in. Understand
the product end-to-end as an end-user. Do not assume things, ask questions and
get things cleared when in doubt.
Ask for what you want. As you gain better knowledge of your company’s
strategic priorities, complemented by better self knowledge of what you prefer
and excel in, you can start to go from reactive to proactive in your project
choice. The job you have right now doesn’t have to be the career you end up
with, and it is much easier to switch focuses internally than as a job seeker.
Actively seek out cross functional exposure to understand how other developers
in your company work, and put yourself in the path of key projects that will have
major impact at your company. Here are some other career development
prompts you can use in 1-on-1’s with your manager.
Don’t memorize everything and trust that you can keep everything in your head.
Start making cheatsheets and repos and blogposts to Open Source your
Knowledge (Chapter 13).
You really only know when you have learned anything when you can teach
what you learn. In the process of writing and speaking, you will discover things
you thought you knew but really didn’t, but also assemble a concentrated useful
resource of everything you know about a particular topic, that you can (and
will!) pull up in future.
All of this learning in public will also help you build your network. The
benefits from your network compound over time, so you might as well start
early.
Finally, you want to stay sharp at doing interviews. This will not be your last
job. Look around and do interviews once a year. You have an upper hand in
everything from networking to company selection to negotiating when your
alternative is simply staying at the job you already have.
Chapter 5
From Junior to Senior
As you become comfortable as a Junior Developer (and, if your company has
one, an intermediate level Developer/Software Engineer), you will naturally start
looking toward the next level: Senior Developer.
What counts as a senior developer is not standardized, and everyone has strong
opinions about it. To some, it is three years at a high growth startup. Others can
take anywhere from two to eight years. Still others say they don’t care about
number of years (and may or may not mean it).
What other people think only counts so much. What really matters is what your
company (or the other companies you interview at) looks for in a Senior, and
whether they pay you commensurate with the market rate for Senior Developer.
After all, a Senior title without the pay is meaningless!
If you’re lucky, the company will have an Engineering Ladder where you can
see their requirements for a Senior. If not, you can check our discussion of
Engineering Ladders in the Strategy section (Chapter 26).
This means that you often have to act like a Senior Engineer before you
officially become one. Fortunately, this is much easier than the chicken-and-egg
problem of getting your first job - most places will be happy to let you take on
more responsibility while in your existing role!
5.1 Acting For the Job You Want
When surveyed, developers almost universally identify a few qualities that you
should develop as you prepare for the next level:
Regardless of what your Engineering Ladder says, you will want to practice,
practice, practice these skills as much as you can. They are just generally agreed
upon qualities of a Senior Engineer that will help you and those around you
throughout your career.
When it comes to your technical skills, consider how you are progressing along
the Dreyfus Model of Skill Acquisition:
In your journey so far, you have likely progressed from Novice to Competent.
As you go towards Expert in your field, you will likely want to pay attention to
the meta-learning skills - focusing on first principles intuition (Chapter 17)
when it comes to learning your trade.
Much of your learning from Junior to Senior involves gaining tacit knowledge.
You can read all the programming books in the world, but, by definition, you are
still limited to things that people can write down. That is explicit knowledge,
and it is usually the tip of the iceberg when it comes to everything you need to
know:
Tacit knowledge in engineering is a real thing. Keep a look out for all the
lessons you don’t learn in classes or from books. To really make your career
explode, make a habit of writing them down for everyone else (Chapter 18 -
Write, A Lot!).
You aren’t alone in this journey – plenty of fellow developers have also written
down their learnings. You can only get so far learning from your own
experience – why not borrow the experiences of others? It’s not the same as
living through it yourself, but for example, reading through publicly published
postmortems can teach you that many outages, even by the most well regarded
companies, come down to error handling, configuration, hardware, lack of
monitoring, and processes that allow human error.
Before you make your big move, make sure you know what you want and take
the time to position yourself accordingly in the preceding 6-12 months. Want to
work on creating GraphQL APIs as a Senior? Better to do it as a Junior first.
The logic here is: You aren’t expected to make that much impact as a Junior, but
you certainly will as a Senior. So it can be worth it to jockey around a little bit
longer as a Junior or Intermediate Developer, just so you are in the perfect spot
for a career-making Senior Developer role you can throw yourself
wholeheartedly into. Better yet, your company can institute formal support for
employees making internal “tours of duty”, to grow you while keeping you!
It can help to make a list of what you’ve enjoyed in your current job. Among
your peers (you have been building your network, right?), make a note of things
that seem particularly exciting to you, and try to get exposure to those within
your company or projects. It’s a two way street - finding out what you like and
are good at, and then positioning so that you can do even more of that.
Note: This is the subject of the entire Strategy section of this book!
By the way - beyond just what you like to work on, you might also take note of
who you like to work with. Here’s an example from Keavy McMinn.
Remember the Dunning-Kruger effect between what you know and what you
know you don’t yet know:
As you start marketing yourself as a Senior Dev, you’ll want to have your
accomplishments and stories in order. Just to give you an example, the AWS
interview process involves asking you for examples of accomplishments and
interactions that demonstrate one of their 14 Leadership Principles. Most
companies may not be this formal about it, but will have some form of “Tell me
a time when you…” question. Portfolios and Proof of Work still matter, but less
so because you can choose to lean on a lot of the production work you
contributed to as a Junior. Pay particular attention to any quantitative results you
can cite – cost savings per year, Monthly Active User increases, Time To
Interactive drops, whatever metrics make you look good.
Note: You can find more ideas in the Marketing Yourself chapter
(Chapter 39) of the Tactics section.
5.3.1 Code
5.3.2 Learning
Juniors make one-off side projects. Seniors use their side projects daily,
often to make themselves more productive at their day job.
Juniors learn to find the right answers. Seniors learn to ask the right
questions.
Juniors know what they need to know. Seniors know what they don’t need
to know.
Juniors should absorb best practices from others. Seniors can derive best
practices from first principles and personal pain.
Juniors get stuck without docs and tutorials. Seniors aren’t afraid to read
specs and view source.
Juniors might have strongly held beliefs. Seniors have had to change
strongly held beliefs.
Juniors question themselves when they fail. Seniors know they just need to
give themselves more time and try again.
Juniors stay on top of news. Seniors keep track of trends (especially
Megatrends – Chapter 29).
Juniors try to avoid mistakes. Seniors have made them all – and know how
to recover.
Juniors laugh at software tropes. Seniors know there’s a grain of truth in all
of them.
5.3.3 Behavior
Juniors seek The Best. Seniors love the Good Enough (Chapter 16).
Juniors should say “Yes” often. Seniors should say “No” more.
Juniors should try to do the jobs they are given. Seniors should redesign
their jobs as needed.
Juniors complain about Open Source. Seniors understand Open Source
only works thanks to contributors, not complainers.
Juniors solve problems. Seniors identify problems before they become
problems.
Juniors start from what others say. Seniors start from what they need.
Juniors know how to build. Seniors know when to buy.
Juniors compare developer experience. Seniors look for hidden costs in
user experience and in abstraction leaks.
Juniors write as an afterthought. Seniors weigh writing as much as coding.
Juniors leave comments. Seniors provide context.
5.3.4 Team
Juniors work within their teams. Seniors know when and how to work
across teams.
Juniors grow their own output. Seniors grow their team’s output.
Juniors pair to learn best practices. Seniors pair to share expertise and see
things in a new light.
Juniors get roped in. Seniors get buy-in.
Juniors must earn trust. Seniors inspire trust.
Juniors seek out mentors. Seniors know how to learn from peers.
Juniors work on improving themselves. Seniors work on improving their
team, being a force multiplier through teaching, mentorship, and
leadership.
Note that these are pithy, idealized comparisons just to get your
imagination going on ways to improve yourself. In no way am I
stating that any quality is unique to Juniors or Seniors, or that all
Seniors or all Juniors practice all these qualities all the time.
5.4 To Stay or To Go
Finally, there’s the question of whether to angle for promotion at your current
company or to make the Senior Developer jump at a different company. That’s a
call you’ll have to make, but you will always be better off at least interviewing
at other companies. When you have an offer in hand from another company,
you have a pretty much airtight case for promotion at your current company.
You’ve done the job hunt before; it’ll be a lot easier this time. Beside hunting
via the regular channels (online posting, networking at meetups and
conferences), you should also be aware of new opportunities available to you at
this stage. For example, recruiters of all stripes from in-house, third party, and
venture capital will be more receptive to your cold emails. You can also tap your
relationships formed online (via your writing or Twitter — you have been
working on those, right?) to find opportunities before they get advertised. A
warm intro of any sort beats applying via the front door and competing with
everyone else on a 5 second glance of your resume. Finally, a big part of selling
yourself as a Senior Developer is being able to communicate your level of
experience in an interview - storytelling becomes a surprisingly big part of any
senior hiring process.
Salary bumps are well known to be higher when you move companies - instead
of a 5-10% bump, you could get a 50-400% bump because you could join a
company with a different pay scale in a different industry at a different level in a
different city. Of course these are major life changes, but higher bumps are more
common when moving companies. There’s also the simple fact that you didn’t
have much leverage when you were a junior dev. Now, you can actually take
your time and practice some Negotiation (Chapter 31).
You may also wish to diversify your resume. If you move from junior to senior
in the same company, you have less exposure to a variety of projects,
technologies, opinions and cultures. If you’re at an agency, you may wish to
consider moving to a startup. If you’re at a startup, you may wish to consider a
BigCo. BigCo experience can net you big bucks at some forms of agency
(including freelancing). So on and so forth. The earlier you are in your career,
the easier it will be to hop around to figure out where you truly fit.
If you currently work at a place that doesn’t have a good developer brand, you
may wish to move to one that does, which will help boost your network and
personal brand. Few people question the technical ability of ex-Google
engineers.
Conversely, if you currently work at a place with a good brand, you may wish to
take more risk in your next gig for more personal growth and financial upside,
because the risk of failure is lower.
Chapter 6
Senior Developer
Congrats! You’ve made it as a Senior Developer!
I’m sure it feels a little different than you imagined, now that you’re in it.
Getting a job as a Senior Developer isn’t the same thing as excelling as a Senior
Developer.
It turns out that “Senior Developer” is a very broad title in this industry. Going
from “ok, this person is technically not entry level anymore” to “anywhere else
this person would be a Staff or Principal, but we believe in a flat hierarchy and
call everyone Senior, deal with it.” It’s a little like a “passport” title. It is
understood almost everywhere, but exactly how one title translates to another
between companies is messy and case dependent.
Knowing how to use your tools is good, but knowing when not to use them is
better. If you define yourself by your tool (“I am a ${FRAMEWORK}
programmer”) - you will try to solve every problem with that tool. This
approach leads you to either fail or come up with unnecessarily convoluted
solutions (still a failure, but way more expensive).
To go past this, you need to understand the underlying design patterns that
inform your tools, and accept that nothing comes truly free. When you have a
wide toolkit of design patterns and a good understanding of what they solve and
what they trade off, you will be able to repurpose tools or build your own. This
knowledge will last regardless of language, and can be reapplied at multiple
levels of your stack. It scales incredibly well and helps you learn faster the
more you learn - one of the core drivers to a superlinear Big L. The Gang of
Four wrote the book on design patterns (see Addy Osmani’s book if you like
JavaScript). But don’t forget other foundational classics like the Dragon book on
Compilers, the Dinosaur book on Operating Systems, and Game Programming
Patterns. All your system design, algorithms and data structures knowledge are
also useful patterns - except instead of just cramming for an interview, you
actually need to use them at work!
As a Junior, your velocity and impact is low. Your main task is to get code
working, with Seniors to catch you when you fall. Improving your own velocity
is a perfectly reasonable thing to prioritize - if you’ve done anything that isn’t up
to code standards, your Seniors will hold you accountable.
But this luxury goes away when you become a Senior. Now you are expected to
be able to independently ship. Part of that independence comes from trust that
you will make the right tradeoffs between velocity and maintainability. It’s less
about pushing the limits of what you can do – anyone can build systems that are
twice as complex as they can easily maintain – and more about creating systems
that last under forward assumptions.
If you don’t write maintainable software, you are just causing future problems
for yourself. So:
Instead of testing because you’re told to, you test because it’s the only way
to scale yourself. You also are much more hesitant to write fragile tests
because they cause more work than they save. They test implementation
detail and hurt migrations (more on Migrations below). You insist that
either production code be merged in together with tests for that code, or not
at all, except under specifically enumerated emergencies.
Instead of only fixing bugs after you create them, you work to avoid them
in the first place. You lean on your past scars, and use tooling and careful
choices in everything from API design to variable naming.
You document and comment your code. Not just for your future self, but
also for the people who take over the code when you move on to bigger,
better things.
Warning: If you fall in love with writing perfect code, your velocity can suffer to
unacceptable levels. Remember that done is better than perfect and Good
Enough is Better than Best (Chapter 16).
However, most organizations create incentives to optimize for velocity over
maintainability. One way to tell is whether equal effort is spent learning from
and tracking mistakes as is spent shipping features. A good first step is to
establish a culture of blameless postmortem (you can borrow AWS’ incident
postmortem template as a starting point). It’s fine to make mistakes, but it is not
fine to repeat mistakes. Critical incidents should act as brakes on velocity.
Don’t view this as a step backwards – your job isn’t just building features,
you’re also building a system to last, scale, and recover from anything. If you
make your postmortems public it can greatly increase customer trust and help
improve the industry.
“Shipping first time code is like going into debt. A little debt speeds
development so long as it is paid back promptly with a rewrite… The
danger occurs when the debt is not repaid. Every minute spent on not-
quite-right code counts as interest on that debt. Entire engineering
organizations can be brought to a stand-still under the debt load of
an unconsolidated implementation.”
Goodness! Debt sounds terrible! Who on earth could want debt? Get debt free
right away!
There are two kinds of Technical Debt. Martin Fowler makes the distinction
between Prudent and Reckless Debt. Hashicorp identifies three categories of
debt: outdated, leverage, and accidental debt, but they map closely enough to
Martin’s thinking that we will stick to those for the purposes of this book.
Juniors loathe this kind of debt. It runs against everything they’ve been taught is
the best way to do things, and of course the best way is the only way.
Seniors understand that only successful codebases live long enough to become
technical debt. They understand this because they have written code that became
debt. They have also tried to replace that debt and learned the same lesson
everyone learns: That technical debt makes money. Not only does it make
money: it is probably superior to any replacement attempt. Old code has been
used. It has been tested in production and at scale. Lots of bugs have been
found, and they’ve been fixed. By definition, only the noncritical bugs remain!
Hyrum’s Law teaches us that all observable behaviors of a program, even bugs,
will be relied on by users. Imagine fixing a bug to get complaints to undo your
fix!
Sometimes you should intentionally load up debt because you don’t yet know
the problem space well. Juniors rush to keep things DRY - but this causes Hasty
Abstractions that they then regret and have to unwind later. Seniors understand
that code is copied, read, moved, and deleted, far more than it is written.
Instead of optimizing for conciseness or cleverness, it is better to optimize for
inevitable change.
The Strangler or Facade Pattern is most often mentioned as part of the Technical
Debt Management toolkit. It is helpful for swapping out underlying
implementations while running-in-place. A good variant of this is the Bridge
pattern, where you abstract over all third party dependencies, instead of only
when upgrading.
But the core skill at hand (especially at the level of systems, not code) is running
migrations. This is especially true at high growth startups, where code becomes
outdated as a direct and frequent side effect of growing yet another order of
magnitude. Here, the playbook is to Derisk, Enable, and Finish strong.
Feature Flags aren’t free though. Uber discovered a ton of stale flags clogging
up its codebase, making it more complex, and possibly slowing down builds and
tests. The problem was so bad they wrote an internal tool to detect and clean
them up, called Piranha. It found 6601 flags and that 17% of them weren’t used.
Your flags themselves can be Technical Debt.
The other kind of Technical Debt doesn’t have anything to do with age or
growth: Reckless Debt. You can think about this as debt resulting from skipped
steps. Here’s Joël Quenneville of Thoughtbot: “(Reckless) Technical Debt is
described as taking shortcuts and cutting corners in code quality in order to
speed up development.”
One popular, but incomplete, way to deal with this is to use automated code
quality systems that don’t let you commit code that worsens metrics beyond an
acceptable point. These tools help bring future debt into the present, and forces
you to deal with them now before you ship, rather than put things off forever
until it becomes an impossible task.
Tools that hold the line and don’t let things get worse are so
powerful. E.g. test coverage, type coverage, bundle sizes, perf
metrics, etc. Much of APIs are about how not to break something that
was once tested. Under-invested in open source and business critical
in Big Tech. - Sebastian Markbåge
You should automate detection of every code quality issue you can, including
build times, build sizes, file length, test coverage, and linting or pretty-printing
your codebase. Every hour spent in code review on automatically detectable
errors is multiple hours wasted in the back and forth between your developers.
Let the machine be the Bad Cop. Conversely, try not to hold too many
opinions that cannot be encoded in your systems, as that adds cognitive load,
invites bikeshedding, and may actively hinder your developers when they face
unanticipated problems.
The other concern with Reckless Debt comes from the mismatch of the financial
debt metaphor:
The Technical Debt analogy suggests a fungible (every debt issue is the
same), predictable increase in cost over time, which you can add
resources to deal with (aka throw people at the problem). It places blame
squarely inside the codebase.
In reality, we experience a loss of predictability (because we skip our
systems, we lose control of our systems). This creates a unique (every
codebase’s problems are unique) scenario where adding resources
increases risk (the Mythical Man Month issue), and the problem is in the
interactions between people and code.
So instead of “Technical Debt”, the better metaphor for Reckless Technical Debt
might be “Increasing Risk”. This happens to help sell the idea of fixing it a lot
better. As Rachel Stephens notes: “Your manager doesn’t care about interest
payments… but they care A LOT about RISK.”
To control the creation of Reckless Debt at the source, it can be prudent to have a
blessed set of technologies everyone at the company uses. Google maintains a
list of “Official Languages” Googlers can use, with dedicated language
infrastructure teams to support them. When you use a standardized toolset and
only allow yourself limited “innovation credits” to experiment with new
technologies or patterns, you have less of an excuse to cut corners. Everything is
familiar and you can even build your own tooling to make adhering to code
standards easier.
Even with all these systems and policies in place, Reckless Debt will no doubt
arise in your codebase. You would do well to have a policy written down
somewhere for identifying and prioritizing this. Use Hashicorp’s Technical Debt
policy if it helps. This not only serves as an approved process for you and your
team to follow, it is also a contract that you can have with management and other
stakeholders, who might be inclined to brush aside issues where they don’t feel
immediate pain.
You might be the smartest person in the company. You might have the deepest
knowledge, write the best code, crush tickets faster and cleaner than anyone else
in the history of programming. It doesn’t matter if you cannot scale yourself.
If you hoard all the knowledge and don’t mentor and collaborate, you are only as
useful to the company as an external hired agency.
Listen to the true story of Rick, a genius developer who did great work but also
became a huge bottleneck and refused to accept any systematic remedy. He was
an individual contributor, alright. He contributed the company’s greatest
problems, and was fired.
The best way to be a 10x developer is to teach 10 people what you know.
Spend time making sure that engineers who are unfamiliar with the tech or
processes not only understand what they are doing, but also why they are doing
it. “Teach them to fish” is a mandatory skill as a Senior Engineer, and that
requires having both patience and a perspective of investment in the rest of the
organization. You should come to preach Apprenticeship Patterns as much as
you do design patterns. Once they are capable, have them do the same.
Encourage a knowledge sharing culture. Senior engineers lift the skills &
expertise of those around them.
Part of the way you will do this is to Write, A Lot (Chapter 18). This scales
your experience across people and time. Just like you document your own code,
you should document your own “API” (for example, by writing a personal
README) and as much context and learned experience as you can articulate.
As someone with a senior title, you have a lot of power to call out unconscious
and systematic bias toward underrepresented minorities in your company. Be an
ally – our industry has tremendous diversity debt accumulated over the past half
century and this is hurting us and society at large now. You don’t have to be
“super woke” to recognize this simple fact. Unintentional sexism and racism
happens from the big things like hiring pipeline, promotion, and project
distribution, right down to smaller things like code review and speaker
representation.
You might agree this is a problem but view this as “not my job”. This severely
underestimates your power and therefore your responsibility to effect change
within your own circle of influence. It starts with you. If we want our industry
to be better in our lifetimes, we need to play an active role, instead of waiting on
some “D&I initiative” to magically fix it for us.
A great list of five things you can do to help, from Karen Catlin of Better Allies:
It’s important to not let the title get to your head. You are still junior in some
things. You do still have things to learn. People junior to you can still tell you
things you don’t know. You are as liable to the same cognitive biases in software
development you spot in others. Stay humble, stay hungry, stay foolish.
“In every man there is something wherein I may learn of him, and in
that I am his pupil.” - Ralph Waldo Emerson
The most valuable engineers are the ones who habitually view their
work through the lens of what the business needs to succeed. Which is
a skill you have to practice and foster and cultivate, just like any
other. - Charity Majors
The final element that everyone expects out of Senior Engineers is having some
sense of the “Bigger Picture”. People are usually vague on what they mean by
that, but by and large, they mean having a sense of where your code and systems
fit into the broader context of how the company makes and spends money.
Outcomes over Features. As a Senior Engineer, you realize that it doesn’t
matter if you deliver the perfect feature if a confounding factor prevents the user
from seeing the desired outcome. Requirements that are given or agreed
upon can be wrong.
If Junior Engineers are hired to find the right answers, then Senior Engineers
should constantly be on the watch to ask the right questions. Your
communication skills, especially your writing skills, are essential here to clarify
and push back with tact. Time spent on ensuring everybody has the same
definitions of terminology, and shares the same context on desired goals, can
save 100x that amount of time down the line, when code is already written. This
concept is called Shift Left:
IBM Research also looked at the relative cost to correct bugs and
defects based on when in the software development lifecycle they
were identified and resolved. The study showed that defects identified
and resolved during the Requirements and Design phase of
development are 60-100X less expensive to fix than those discovered
and fixed after product release. (Source: Infostretch)
In fact, the strategic saying of No can be your single most valuable action.
Having made similar mistakes before, you are able to anticipate potential
problems. Contributing in this way is often even better than suggesting an
immediate solution. Sometimes, this goes as far as redesigning your own job if
you realize you are not working on the right thing. If as a Junior Dev your goal
was to fit in, as a Senior you have the power to stand out when it matters.
Awareness of your impact does extend beyond business toward your industry
and your community. If we believe that technology is powerful, then we must
also believe that the people who wield it have a responsibility for that power.
The medical industry has the Hippocratic Oath, commonly interpreted as “First
do no harm”. The closest version we have is “the Computer Lib Pledge”
articulated by tech pioneer Ted Nelson in 1974’s Dream Machines:
I will not help the computer priesthood confuse and bully the public.
I will not give misleading answers to get people off my back, like “Because
that’s the way computers work” instead of “Because that’s the way I
designed it.”
I will fight injustice, complication, and any company that makes things
difficult on purpose.
I will try not to make fun of another user’s favorite computer language,
even if it is COBOL or BASIC.
Sometimes this is “bad churn”, like the many, many cases of burnout in our
industry. Please pace yourself - if you intend this career to be a long one, you
shouldn’t be running a marathon at sprint pace. Recognize symptoms of
burnout:
Working Late
Irritability
Not asking for help
Wallflowering during technical conversations
Insomnia/Code Nightmares
And look out for these in your coworkers. As technical people we monitor
software and hardware for problems, but often forget the wetware (people) that
are at the root.
Fortunately, the majority of people stop coding for a living for more positive
reasons - they find something that suits them better! If code is at the center of
your universe and this sounds impossible to you right now, consider this: why do
people who don’t code call the shots, and why do they pay you to write code?
They must get more value not coding for a living than you get coding for a
living.
Here, we will briefly discuss what a moderately informed friend (me!) might tell
you about five common paths (without having actually lived through all of them)
of good churn:
Engineering Management
Product Management
Developer Relations
Developer Education
Entrepreneurship
We will not discuss Freelancing or Consulting - those are close enough to coding
jobs, with some solo business management tacked on top - but check out Nader
Dabit’s The Prosperous Software Consultant, Gerald Weinberg’s Secrets of
Consulting and Harry Roberts’ Questions for Consultants if you are keen to try
that.
Our discussions will try to warn you about the bad along with the good - which
is to say, it’s not 100% good. But nothing is. Don’t mistake this as “shitting on
these paths”, they are obviously great career tracks that many enjoy. The intent
is to warn you about potential downsides like any friend would, so you go in
with eyes wide open.
The goal, as in the rest of this book, is not to be 100% correct - it is just to open
your eyes to considerations you may not have thought about before, and point
you the way to learn more or form your own opinions.
Author’s note: This lengthy disclaimer is the only sane way to write a
broad-reaching chapter like this! braces for shitstorm of complaints…
Companies also naturally want to take their best coders and put them in charge
of other coders. Despite the best efforts of companies to create equivalent
Individual Contributor career tracks, the dearth of good managers mean that
most organization incentive structures encourage some form of Peter Principle.
However, heed the advice of basically everybody who has ever gone from
engineering to engineering management: it is a huge career change. You go
from developing software to working on Peopleware. If you are in the right head
space for the role, you will see this as a good thing! Humans are a part of your
systems too!
As an engineering manager:
Your primary output is no longer code, it is teams (and, as you rise up,
teams of teams). Therefore you will spend a huge amount of your time
hiring and managing. The amount of time you spend in high stakes Crucial
Conversations becomes exponentially higher.
You can no longer throw a hack together to get shit done, you need to
follow process and get buy-in more than ever - progress will seem glacial
compared to what you are used to.
You help set technical standards, but must avoid micromanaging code. This
is a very fine line to draw, especially if your identity and sense of self worth
was primarily based on your technical expertise. Nobody likes the EM who
“swoops and poops” on their work. You need to trust your engineers to
make their own judgments and their own mistakes (within reason). In order
to do that you need to hire and train people you trust more than you need to
dictate code typed by someone else. Ultimately, you will also want to help
train your own replacement to progress up.
You lose the ability to be fully open with your friends and coworkers, even
outside of work, because you sit atop a mountain of confidential
information. People look to you for confidence and leadership so you need
to be guarded about your own doubts and feelings.
Nothing is ever complete, or fully resolved, and everything is important.
As middle management, you still have bosses: while you always feel
maximum responsibility for your reports’ gripes, dreams, and careers, your
own impact and ability to change things is limited. This can be a difficult
line to balance.
Before you decide to become a manager, have a read through Charity Majors’
list of 17 Reasons NOT to Be a Manager and go through Nick Caldwell’s
“Voight Kampff test for engineering managers”. Know what you’re signing up
for.
The best individual contributors are the ones who have done time in
management. And the best technical leaders in the world are often the
ones who do both. Back and forth. Like a pendulum.
There is a difference between how this game works for startups vs BigCos. Most
small companies often don’t need more than one truly senior-level engineer, and
they find that they have to switch to consulting or move to a BigCo to have
enough interesting projects. Conversely, at small startups, engineering managers
often double as tech leads, and spend significant amounts of time both coding
and making technical decisions. These are completely different jobs at BigCos,
and this is why you will see a wild diversity of management advice.
I cannot credibly advise you further on this track because I have not done it
myself. Fortunately, many engineering leaders take writing very seriously, so
you can go read their stuff:
Michael Lopp (VPE of Slack)’s books and blog, better known as Rands in
Repose
Charity Majors (CTO of Honeycomb) on the Organizational Leadership
Track
Will Larson (VPE of Calm) on Systems of Eng Management
Kate Matsudaira (VPE of Moz) on The New Manager Guide
Oren Ellenborgen (VPE of Forter) on Software Lead Weekly and Leading
Snowflakes
Camille Fournier (CTO of Rent the Runway) on The Manager’s Path
Gene Kim (CTO of Tripwire)’s fictional novel The Phoenix Project
James Stanier (SVPE at Brandwatch) on Become an Effective Software
Engineering Manager
Greg Skloot (VP Growth at Netpulse) on How to be a Manager
Kamil Sindi (CTO JW Player)’s Manager’s Playbook
Lara Hogan (VPE of Kickstarter) on Resilient Management
Julie Zhuo (VPD at Facebook) on The Making of a Manager
Classic developer leadership books like Becoming a Technical Leader, the
Mythical Man-Month, and High Output Management
Traditional leadership books like Multipliers, Dare to Lead, and The Infinite
Game are also regularly recommended for managers of people.
Of course, don’t spend too much time reading :) Nothing beats lived experience.
If you came into the tech world entirely via coding, PMs may seem like an odd
breed of Bullshit Job from a distance: they show up every couple weeks, tell
everyone what to do, and disappear to do god knows what, get mad when their
meticulously color coded Gantt charts run afoul of reality, and take credit for
everything when stuff is shipped.
I’m kidding. The variety of PM jobs and roles is even more diverse than EM
roles, if that is even possible. PMs are classically regarded as “mini-CEOs of the
product” - entrusted with bridging the gaps between engineering, design, and
business.
Product Management was created in 1931 at P&G, but the modern form of
Product Management in Tech owes its popularity to Marissa Mayer, pre-Yahoo,
when she was a rockstar executive at early Google. Google wanted to cultivate
“home-grown” managers who would be Googley, so the two-year Associate
Product Manager program was created. It spawned an entire generation of great
tech leaders like Bret Taylor, who co-created Google Maps, served as CTO of
Facebook, and is now President of Salesforce. Eric Schmidt has even gone on
record saying an APM alum will run Google someday (not yet true; current CEO
Sundar Pichai was a consultant before PMing for Chrome).
Given all this success, it is unsurprising that every tech company has some form
of PM function (Microsoft calls it “Program Manager”). Having worked at a
company that started with no PMs and eventually got some, it is very reassuring
to know that someone is herding all the cats and watching out for upcoming
blockers and cross-dependencies. Individual departments tend to get tunnel
vision, and tend to view their problems as more important than others. Founders
initially serve as PMs, but as the company scales, founders have other things to
do, so sooner or later they need to hire or promote product managers to “own the
product”.
For products that don’t serve developers (the vast majority of products), PMs
also tend to be the primary user advocates or domain knowledge experts.
Although UX/Design does do user research, Good PMs know everything about
the user personas, right down to what competitor products they use and what
kind of marketing channels work best for each. They will also know when to
ignore what research says - in a world of unambitious incremental
improvements, PMs can serve as “visionaries” that can galvanize a company’s
resources to create something that doesn’t yet exist.
“If I had asked people what they wanted, they would have said faster
horses.” - Henry Ford on the Model T (possibly apocryphal)
PM’s also used to write massive design specs called Product Requirements
Documents that would lay out every detail of how the product was to behave
(therefore a great amount of user research and some sense of engineering cost
was required) - in these days of Agile and Lean development, PRD’s are much
leaner and sometimes even optional. Being able to code up or mock up a quick
MVP for user testing is much more desirable these days.
PM’s being PM’s, every word of what I just wrote is hotly contested. PM’s have
all sorts of alternative Venn Diagrams to describe themselves, and have written
mountains of Medium posts on how they are Not the CEO of Anything. The
preferred framing these days is that PM’s have “All of the Responsibility, and
None of the Authority”, which makes you wonder how much sheer charm and
begging PM’s must subsist on to get shit done.
There is another type of “PM” that actually has little authority: Project
Managers. The Product Manager (sometimes called the “Product Owner”) sets
the vision for the product that needs to be built, gathers requirements, and
prioritizes them, while the Project Manager acts upon this vision and makes
sure that it is executed on time and on budget. In small companies, Product
Managers also serve as Project Managers. A poor or under-resourced “Product
Manager” will functionally regress to Project Manager, because that is the
absolute bare minimum needed to show life. However the long term value of
bumping cells on a spreadsheet or playing Calendar Tetris is not as high.
This was evidently a highly dysfunctional dev team, of course, but the result was
any PM worth their salt would fight for time of these two devs in order to get
stuff done, and play Project Manager with the rest. When I got the job I was sold
on being a “mini-CEO” - but what I got was jockeying for position and weekly
“is it done yet?” calls. That’s the kind of PM you don’t want to be. Eventually I
had enough and decided to become a developer myself - the PM to Dev
transition is rare but I have started calling it “Team #FineI’llDoItMyself”. I
hope you DON’T join us!
The vast majority of PMs don’t also have unlimited license to “visionary” their
way to any cockamamie idea. Usually there is some direction from founders
(sometimes too much!) and major projects have to be agreed upon at the Board
level. In other words, the job does involve a lot more “get shit done” than
“visionary” in the day to day reality, at least until you earn some amount of
authority from successful projects.
Overall, PMing can still be a very rewarding post-coding career. If you have
entrepreneurial ambitions or desire even more impact than in Engineering
Management, the PM path is your best bet. PMs own product-level Objectives
and Key Results, and often have the ear of the highest levels of leadership when
critical goals are at stake. They may even own the Profit & Loss of their
product, if attributable. Products that have their own P&L also often run their
own marketing - this tends to be such a specialized skillset that paired Product
Marketing Managers and Technical Product Managers are common in BigCos.
People who are particularly good at high growth product marketing are known as
Growth Hackers, a term coined by Sean Ellis and popularized by Andrew Chen -
this is a great related discipline talented coders should explore.
Note: PM’s should care a great deal about everything we discuss in the
Strategy section of this book!
So if you’ve read the book and practiced these Principles, Strategies, and Tactics,
we can assume you’re qualified and should easily get the job. Our task now is to
figure out whether you want the job.
There are many names for this job: Developer Evangelist, Developer Relations,
“Devreloper”, Developer Advocate, Developer Experience Engineer. For
convenience, we’ll just say “DevRel”, which is slightly better but not as fun as
“Developer Avocado”. As you might expect, titles aren’t standardized. They are
in theory different roles, but the reality is everyone performs some ill-defined
mix of all these roles. The best you might observe in titling trends is that
“Evangelist” is on its way out (too much of “I’m telling you to use my product”)
and “Advocate” and “Developer Experience” is on its way up (more focus on
being the user’s champion internally, or making the conversation a “two way
street”). However the shift in titles may not track closely with the actual
behaviors and incentives set up by the company.
It’s not a common job by any means - it only makes sense for developer-focused
companies to hire DevRels, and even in a “dev tools” company there might be
100 developers to 1 DevRel - but it is a very visible job (this is a very good
thing for midcareer developers). This means that even as a developer you’ll see
a lot of DevRel folks doing talks and such, and will naturally be curious about
joining their ranks.
This question cuts to the heart of DevRel - does DevRel belong in Product or
Marketing or on its own? Cynics will say Marketing, Users will hope it’s
Product, and DevRel folks want DevRel to stand alone as its own department.
What it actually is depends on how the company is actually run and how much
they walk their own talk. If you call someone a “Developer Advocate”, but they
spend functionally all their time producing content and are measured based on
user growth and have no input on product prioritization, how much are they
really “advocating” for users instead of to users? DevRel programs are
expensive, and the best way we know how to justify ROI on these things are all
Marketing metrics - which turns DevRel into Marketing despite the best
intentions of everyone concerned. What gets measured gets managed, and
DevRel is only just beginning to have an open conversation about how best to
measure DevRel (there may be no answer). Better run DevRel programs will
carefully design to prevent this, but enough DevRels are just “Very Expensive
Affiliates” or rebranded “Developer-friendly Marketing”, that it is worth a quick
warning to you.
There is also the matter of perceptions - first that you are now a paid shill, and
second that you are no longer a “real developer”. Both are a little bit correct,
which is the worst kind of perception to fight. The truth is shades of gray:
Travel used to be a major part of the job, and usually starts as a perk (wow I
visited 40 countries this year!) and becomes a chore (damn I spend more time in
the airport than with my kids). In the post coronavirus world, the focus has
entirely pivoted to online communities, which is great for the environment, but
also DevRel marketing budgets.
Nobody said it was easy. Couple this with the long term reality of DevRel - it
might be a dead end. It may be hard to switch from DevRel back to Engineering
or Engineering Management (although perhaps no harder than other switches,
difficult to say) and to date there is no room in the C-suite for DevRel folks,
while other tracks have clear paths to CTO or CPO.
However the job is still very rewarding - it can often feel like there is nothing
better than to be paid to talk about a tool you already use and love, and to spread
that joy and knowledge to others, who use it to make their lives and jobs better.
The audience and network you get from creating content all day will outlast your
employment - setting you up for success for anything you do next. The value of
this cannot be understated. But if I said more it’d feel like bragging.
As for the “dead end career” fear, Patrick McKenzie has this to say:
I unfortunately have not done this job long enough to have enough data to prove
or disprove this. It’s quite possible nobody has. It is pretty common to see
DevRels go on to other DevRel jobs, though that is neither here nor there. It
does feel like DevRel can be a close kin to Product Management for a technical
product, because of the similar focus on users.
DevRels don’t have a monopoly on speaking or writing about the company. The
less jealously they guard this, the better. In fact, the most successful DevRel
programs will be a great partner for internal engineering teams to speak out with
pride about their work and their products. This basically always works out well -
the eng teams get to brag, audiences see nontrivial work from unquestionably
“real” engineers, and customers get to peek behind the curtain of what they’re
buying. It even makes hiring much easier. Dan Luu has great thoughts on how
good corporate engineering blogs are written. At companies with very engaged
user bases, user groups and community meetups can perform this function too.
Pragmatically speaking, enabling the voices of others to be heard is the only way
to scale DevRel reach beyond a linear growth in DevRel headcount. Being able
to Build Community is therefore the ultimate skill of a DevRel.
Recommended Reads:
You know what this job is, because you’ve probably learned from people who
are full-time educators already. It is quite similar to the DevRel job, except that
the output is usually more productized, with a heavy emphasis on product
marketing, because they quite literally live by what they make from their
courses, workshops and books.
Developer Education is DevRel on Hard Mode, with the accordant risks and
rewards. The money you make as a DevRel is constrained by your company’s
payscale. If you do an AMAZING job and 3x new users, you don’t see a
proportionate dime. This is fine, because if the inverse happens and users fail to
meet targets, you are also (somewhat) protected. One advantage of Developer
Educators over DevRel is that they can focus on foundational technologies that
everybody already uses, whereas the point of DevRel is partially to get people to
try out proprietary things they don’t yet use.
Developer Educators have a 100% stake in their ability to create quality content
and market it - you might make a pittance, or you might be a multi-millionaire,
as many good Developer Educators are. A good Developer Educator might
spend six months building a course and make 500k-1 million, and spend the
remainder of the time audience building and gathering ideas for the next course.
The problem, of course, is that those are the successful ones. The less successful
ones struggle to get attention, and spend hundreds of hours creating content, and
don’t make a dime.
Recommended Reads:
It’s well understood that most startups fail. Bad ideas exist. You might find a
gap in the market, but there may be no market in that gap. You know that you
are supposed to make something people want, but the problem is that people
often don’t know what they want until they see it. You can’t even ask them – as
David Ogilvy once observed: “The problem with market research is that people
don’t think how they feel, they don’t say what they think and they don’t do what
they say”.
Even for those that do succeed, there are long, lean years of nothing while you
build a business. Gail Goodman famously called it the Long, Slow Ramp of
Death. Your opportunity cost - what you might otherwise earn instead as a
Senior Developer if you didn’t try to be a founder - is extremely high, possibly
in the millions. This is one of many reasons why not to start a startup (here is a
longer list, with Paul Graham’s responses). In fact it is often said that you
should not start a startup to get rich, you should do it because you feel compelled
to create something that should exist but doesn’t. Getting rich is a side effect if
you are right.
There are smart ways you can de-risk this, for example by leaving your current
company with a deal that they will become your first customer, or you can get
really desperate and sell politically themed cereal to fund your startup.
As a developer, you must acknowledge that your bias will be to try to code your
way out of any problem because that is what you are good at and enjoy doing.
However this avoids the hard parts of talking to the customer: finding out what
they want (product management), getting in front of them (marketing) and
convincing them to buy (sales). You cannot escape that Entrepreneurship folds
up all the worst of everything we have discussed in this chapter, from people
management to product management to marketing, and makes it your full time
job, on top of which you still have to code. However, the upsides are
accordingly greater.
There are some major forks in the road when it comes to entrepreneurship. The
right answer is usually somewhere between two extremes:
The best advice on starting up comes from the Indiehackers community and
podcast. For developers, there’s no need to go anywhere else.
Chapter 8
Part II: Principles
Principles are ways of successfully dealing with reality to get what
you want out of life. - Ray Dalio
Let’s discuss the Principles that you should consider adopting throughout your
Coding Career:
This is a perfectly fine way to build a career: 99% of developers operate like
this. Scott Hanselman calls them Dark Matter Developers — you can infer their
presence from GitHub stars and package downloads, but it’s hard to find direct
evidence of their work. Their network mainly consists of current or former
coworkers. When job hunting, they start from zero every time. They find
opportunities only from careers pages or recruiters. To get an interview, they
must serialize years of experience down into a one page resume by guessing
employers’ opaque deserialization and filtering algorithms. Then they must
convey enough in 30-60 minute interviews to get the job. Even while on the job,
picking up a new technology is a solitary struggle with docs and books and
tutorials.
What do I mean by learning in public? You share what you learn, as you learn
it. You Open Source your Knowledge (Chapter 13). You build a public record
of your interests and progress, and along the way, you attract a community of
mentors, peers, and supporters. They will help you learn faster than you ever
could on your own. Your network could be vast, consisting of experts in every
field, unconstrained by your org chart.
When job hunting, prospective employers may have followed your work for
years, or they can pull it up on demand. Or — more likely — they may seek you
out themselves, for one of the 80% of jobs that are never published. Vice versa,
you take much less cultural risk when you and your next coworkers have known
each other’s work for years. And when picking up a new technology, you can
call on people who’ve used it in production, warts and all, or are even directly
building it. They will talk to you — because you Learn in Public.
I intentionally haven’t said a single word about “giving back to the dev
community”. Learning in Public is not altruism. It is not a luxury or a nice-to-
have. It is simply the fastest way to learn, establish your network, and build your
career. This means it is also sustainable, because you are primarily doing it for
your own good. It just so happens that, as a result, the community benefits too.
Win-win.
You never have to be 100% public. Nobody is. But try going from 0% to 5%.
Or even 10%! See what it does for your career.
Whatever your thing is, make the thing you wish you had found when you
were learning. Document what you did and the problems you solved. Organize
what you know and then Open Source Your Knowledge.
You catch a lot of friends when you are Helpful on the Internet. It is
surprisingly easy to beat Google at its own game of organizing the world’s
information. Even curating a structured list of information is helpful. I once put
together a list of Every Web Performance Test Tool on a whim and it got
circulated for months! People reshared my list and even helped fill it out.
“But I’m not famous, nobody will read my work!” — you, probably
Don’t judge your results by retweets or stars or upvotes — just talk to yourself
from three months ago. Resist the immediate bias for attention. Your process
needs to survive regardless of attention, if it is to survive at all. Eventually,
they will come. But by far the biggest beneficiary of you helping past you, will
be future you. If (when) others benefit, that’s icing on the cake.
This is your time to suck. When you have no following and no personal brand,
you also have no expectations weighing you down. You can experiment with
different formats, different domains. You can take your time to get good. Build
the habit. Build your platform. Get comfortable with your writing/content
creation process. Ignore the peer pressure to become an “overnight success” —
even “overnight successes” went through the same thing you are.
I get it: We all need feedback. If you want guaranteed feedback, Pick Up What
Others Put Down (Chapter 19). Respond to and help your mentors on things
they want, and they’ll respond to you in turn. But sooner or later, you’ll have to
focus on your needs instead of others. Then you’re back to square one: having to
develop Intrinsic Drive instead of relying on External Motivation.
People think you suck? Good. You agree. Ask them to explain, in detail, why
you suck. Do you want to feel good or do you want to be good? If you keep
your identity small and separate your pride from your work, you start turning
your biggest critics into your biggest teachers. It’s up to you to prove them
wrong. Of course, if they get abusive, block them.
You can learn so much on the Internet, for the low, low price of your Ego.
In fact, the concept of Egoless Programming extends as far back as 1971’s The
Psychology of Computer Programming. The first of its Ten Commandments is
to understand and accept that you will make mistakes. There are plenty of
other timeless takes on this idea, from Ego is a Distraction to Ego is the Enemy.
Don’t try to never be wrong in public. This will only slow your pace of learning
and output. A much better strategy is getting really good at recovering from
being wrong. This allows you to accelerate the learning process because you no
longer fear the downside!
9.4 Teach to Learn
“If you can’t explain it simply, you don’t understand it well enough.”
- Albert Einstein
Did I mention that teaching is the best way to Learn in Public? You only truly
know something when you’ve tried teaching it to others. All at once you are
forced to check your assumptions, introduce prerequisite concepts, structure
content for completeness, and answer questions you never had.
Probably the most important skill in teaching is learning to talk while you code.
It can be stressful but you can practice it like any other skill. It turns a mundane
talk into a captivating high-wire act. It makes pair programming a joy rather
than a chore. My best technical interviews have been where I ended up talking
like I teach, instead of trying to prove myself. We’re animals. We’re attracted to
confidence and can smell desperation.
“With so many junior devs out there, why will they help me?”, you ask.
Because you Learn in Public. By teaching you they teach many. You amplify
them. You have the one thing they don’t: a beginner’s mind. See how this
works?
At some point, people will start asking you for help because of all the stuff you
put out. 99% of developers are “dark” — they don’t write or speak or participate
in public tech discourse. But you do. You must be an expert, right? Your
impostor syndrome will strike here, but ignore it. Answer as best as you can.
When you’re stuck or wrong, pass it up to your mentors.
Eventually, you will run out of mentors and will just have to keep solving
problems on your own, based on your accumulated knowledge. You’re still
putting out content though. Notice the pattern?
Learn in Public.
P.S. Eventually, they’ll want to pay for your help too. A lot more than
you’d expect.
The 1% Rule: “Only 1% of the users of a website add content, while the
other 99% of the participants only lurk.” You stand out simply by showing
up.
Cunningham’s Law: “The best way to get the right answer on the Internet is
not to ask a question; it’s to post the wrong answer.” Being publicly wrong
attracts teachers, as long as you don’t do it in such high quantity that people
give up on you altogether. Conversely, once you’ve gotten something
wrong in public, you never forget it.
Positive Reinforcement: Building in a social feedback mechanism to your
learning encourages more learning. As you build a track record and embark
on more ambitious projects with implicit future promise, your public
activity becomes a Commitment Device.
Availability Bias: People confuse “first to mind” with “the best”. But it
doesn’t matter — being “first to mind” on a topic means getting more
questions, which gives the inputs needed to become the best. As Nathan
Barry observed, Chris Coyier didn’t start out as a CSS expert, but by
writing CSS Tricks for a decade, he became one. This bias is self-
reinforcing because it is self-fulfilling.
Bloom’s Taxonomy is an educational psychology model which describes
modes of learning engagement — the lowest being basic recall. Learning
in Public forces you toward the higher modes of learning, including
applying, analyzing, evaluating, and creating.
Inbound Marketing: Hubspot upended the marketing world by proving you
didn’t have to go out in front of people to sell. Instead, you can draw them
to you by making clear who you are and what you do, offering valuable
content upfront and leaning on the persuasive power of Reciprocity and
Liking.
Productizing Yourself: By creating learning exhaust, you can teach people
and make friends in your sleep. This disconnects your networking, income,
and general Luck Surface Area from your time. Don’t end the week with
Nothing. This is Portable Personal Capital that compounds over time and
that you can take with you from company to company.
I wasn’t the first to benefit from this, and I won’t be the last. The idea is now as
much yours as it is mine. Take it. Run with it. Go build an exceptional
career in public!
Chapter 10
Clone Open Source Apps
I get asked all the time “how do I level up?” My favorite thing to do is
find some OSS thing that seems a little beyond my experience to build
(…) and then try to build it, referring to the OSS source only when
you’re totally stuck. - Ryan Florence
You already know you should be making projects to learn things and potentially
add to your portfolio. You’ve read your Malcolm Gladwell, you know that you
need 10,000 hours of deliberate practice. Given you’re just starting out, I have a
slightly contentious suggestion for you: DON’T make anything new.
Your decision-making is a scarce resource. You start every day with a full tank,
and as you make decisions through the day you gradually run low. We all know
how good our late-late-night decisions are. Making a new app involves a
thousand micro decisions - from what the app does, to how it should look, and
everything in between. Decide now: Do you want to practice making technical
decisions or product decisions?
Ok so you’re coding. You know what involves making zero product decisions?
Cloning things. Resist the urge to make your special snowflake (for now). Oh
but then who would use yet another Hacker News clone? I’ve got news for you:
No one was gonna use your thing anyway. You’re practicing coding, not making
a startup. Remember?
Make the clone on your own, then check the original’s source. Now you have
TWO examples of how to implement something, so you even get to practice
something people only do after years of experience: understanding the tradeoffs
of technical choices!
You’re lucky. You live in an age where companies open source their entire apps:
Spectrum
Codesandbox
FreeCodeCamp
Ghost
DEV
GitLab
Fathom
If those seem like waaay too big of an app for you to clone (they are huge), go
look at the side projects of your mentors. For example, for front-end devs:
Make a clone, then show it to them! You are virtually guaranteed to get free
feedback. It doesn’t have to be someone famous. You can even try clones of
clones:
You don’t even have to work on apps, if you want you can build your own
clones of popular libraries and frameworks. Daniel Stefanovic’s Build Your
Own X repo is a treasure trove of tutorials for these if you need help.
Put a time limit on it. Deadlines work wonders. Also you’re not going for a
pixel perfect clone of something that teams of people, way more experienced
than you, have made. You want to have a set amount of time, get as much of the
interesting features as possible, and then ship it. This guarantees that you will be
freed up for the next clone, and the next. Different projects let you try different
libraries and stacks, and figure out what you like there. Also you get to practice
one of the hardest software engineering skills of all: Project Estimation. You’ll
create many, many opportunities for yourself to see what you can do in a set
amount of time because you’re deliberately practicing making things on the
clock. And none of that time is taken up by product decisions!
When you’ve done enough and start feeling bored, it’s time to let your freak flag
fly. You’ve earned the right to make your app because you’ve made others. You
know what things cost and you have used your tools well enough to get there.
You’re still learning in public, though! Package up your experience into a talk.
Livestream yourself coding. Blog about your game plan, then blog some more
as you execute it. Developers who can Work in Public are in far more demand
than developers who can’t.
Note: See the Side Projects chapter (Chapter 37) for more discussion
on starting and managing side projects.
Chapter 11
Know Your Tools
You skim over a lot in your learning. This is because developer marketing is
heavily incentivized to make things look easy. Look how fast you can do X!
Look how few lines of code it takes to do Y! It works, and you benefited by
getting productive fast.
But soon enough you run into problems. Your “Hello World” stops working
when you deploy it (most tutorials neglect deployment instructions). Your code
is insecure (security makes for slow demos). You are scared to make changes to
your config because it blows up when you so much as look at it.
It’s not your fault, but it’s in your power to fix your gaps. The tutorial/bootcamp
gave you a head start, now you have to go the distance.
If you’re a frontend dev: Learn Webpack. Learn Babel. Learn what the CSSWG
and TC39 do. Heck, learn Javascript and CSS all over again. Did you know you
can use the Chrome Devtools as a profiler and an IDE? Learn bash. Learn git.
Learn CI/CD. Open node_modules. Yeah, it’s a lot, and nobody knows
everything. But take the effort to learn the tips and tricks and failure modes of
your tools.
Fill in -your- gaps. Read technical books cover to cover. For <$100 and a few
focused days you can download world class expertise on anything.
Focus on you and your employer’s needs. There are so many opportunities in
tech that you can pretty much pick out your turf and play entirely within it AND
be completely ignorant of all the other stuff AND still do great!
Don’t get me wrong: I’m a big fan of playing the meta-game. It is possible to
make strategic blunders but it’s also impossible to avoid them altogether. Stop
trying. It’s much better to focus on the “good enough” and be directionally but
not literally correct (Chapter 16). The goal is to be accurate, not precise. Try
your best to be right, but don’t worry when you’re wrong.
There’s also the why and the who. Who made the paradigms we live in now?
Who’s maintaining it today? Why is the API the way it is? Why did it change
from past versions? (If you’re feeling adventurous: how does the tool work
under the hood?) Let your intellectual curiosity carry you and fill in your lack of
experience with research that nobody else bothers to do.
To give you an example knowledge graph traversal with React: Many workshops
portray “Advanced React” as using some lesser known hooks or deploying
production metaframeworks like Next.js. But this omits so much:
Swap React for whatever technology you are trying to learn. Knowing how to
know your tools is timeless. Be able to explain them from first principles
(Chapter 17)!
Compared to other academic pursuits, there could not be an easier subject matter
to research, this stuff is literally all online and version controlled with git, and all
the people involved are still alive and easily contactable.
And when you’ve filled something in, when you’ve found something cool in
your research, write it up. Preferably in public!
Chapter 12
Specialize in the New
You already know the value of a niche - your market value increases the more
specialized you are in anything. So what should you specialize in? There are
many schools of thought, including ones where you could be a generalist that
doesn’t specialize at all.
I find one rule to be the simplest and most effective of all: Specialize in the
New.
Isn’t FOMO bad? Well yes, that’s an important distinction — don’t specialize in
everything new. Specializing means you have to say no to a lot of things. Just
pick something new that fascinates you, and hopefully many other people as
well. Since you’re learning in public, you’ll know when you hit on a real
nerve. Budget in the idea that you’ll fail a few times before you find Your
Thing.
Then the other big objection: There are plenty of jobs in (fill in the blank older
technology) too! This is usually followed by some big numbers and anecdata.
“My brother’s cousin’s roommate’s friend took this COBOL job and now she’s
earning six figures on the beach in Tahiti!” And it’s true - you can probably find
a job doing PHP or Angular for the rest of your life.
If that works for you, good. I will never say there is only one path to success.
Here’s why I don’t do it. It is far easier to rise up the ranks quickly in a new
space than in an old, crowded space.
Note: I discuss a short list of people who made their careers betting
early on tech in Betting on Technologies (Chapter 24).
You know how people rant and rail against companies who hire based on years
of experience? That could go away tomorrow and you’d still have
clients/employers silently comparing your length of experience to your
competition’s. It’s human nature.
But you know where it’s impossible for someone to have five years’ experience
doing X? When X is less than five years old.
As a developer (and not a startup) you don’t even have to make the bank shot of
finding the overlooked adjacencies next to an area of heavy investment. You can
just focus on the area directly and let the market tell you where gaps exist.
What’s broadly true is that heavy investment often leads to the cost of that thing
decreasing, as the usual plan is larger scale with lower unit cost.
Plant your flag on fertile ground, and say, “this is what I do”. It will carry
you far.
You may be familiar with the “Lindy Effect” - the idea that the future life
expectancy of a thing is proportional to its current age. This is commonly
expressed as something negative. If someone tells you their project will be late
by ten days, you can expect it to take another ten days from that, and so on. It
isn’t meant to be taken literally - since nothing lasts forever - but it does describe
the tendency of deviations to correlate rather than remain independent.
However, the idea also applies positively. Taleb notes in his book Antifragile
that if something has remained relevant for 50 years, it can be expected to
remain relevant for another 50 more.
We can also apply this concept to the way that we specialize in the new:
Building a network and picking technologies both compound in the same way.
The reason is because they are basically the same thing - technologies are built
by people. Therefore: Play long term games with long term people.
Chapter 13
Open Source Your Knowledge
Open Source Code wasn’t always the norm.
The Unix operating system was created in the 1970s and freely licensed to
academic and business institutions for a decade, before Bell Labs decided to
charge for it as a proprietary product. Frustrated with this, Linus Torvalds
created and released Linux in 1991. Today, 97% of web servers run Linux.
Similarly, most software you use today is mostly open source. The expectation
is that the open source alternative to a closed source codebase will eventually
win:
The Tech Industry is fundamentally more open. This is wonderful. Now we not
only share most of our secrets, we can get up on stage and tell our peers about it,
and get rewarded for it! Every company understands the value of blogging, and
we often even give away our code.
Open Source Knowledge wasn’t always the norm. We used to have door-to-
door Encyclopedia salesmen, who sold us giant sets of books that contained
Everything There Was To Know on Earth. Then computers happened, and I
remember being awed that all the knowledge on Earth could fit into a single
Microsoft Encarta CD-ROM.
Of course we know what happened next - Wikipedia came along and obsoleted
all commercial encyclopedias with sheer breadth, then depth - on a shoestring,
nonprofit budget. It was released in 2001. By 2005, the prestigious journal
Nature found it comparably accurate with Encyclopædia Britannica. By 2018,
Google, Facebook and YouTube began to combat fake news by linking to
Wikipedia articles.
Wikipedia isn’t without its problems. But it’s ability to leverage collaboration
and crowdsourced knowledge has produced great value for society - and for
authors and curators of individual articles. We should let a thousand
Wikipedias bloom.
On the first day of my first job as a developer, my tech lead casually mentioned
that we’d be using React with TypeScript, and it wasn’t up for debate. I had
never used TypeScript before. So a forced introduction to TypeScript began. I
read through the TypeScript docs, and they ranged wildly from very basic
(assuming no ES6 knowledge) to very advanced (assuming extreme facility with
generic types), with no mention at all of accommodations needed for React. The
React docs had even less to offer.
So I started my own cheatsheet of tips and tricks, purely for React developers
who needed to add TypeScript to their repertoire, aka me.
It turned out there were a lot of people like me - the repo stands at 12k stars as of
time of writing. I definitely got lucky there - but I’ve extended this approach to
cover everything else from React Suspense to Design tricks to Node.js CLI’s and
it works for me just the same. The “README in a Git Repo” thing isn’t the
only way to do Open Source Knowledge, but it is a damn good one.
Of course, it is a short step to helping beginners too. Because you were recently
a beginner yourself, you can explain things at an accessible level, and arrange
topics in logical introductory order (whereas an expert might be too far away
from the basics to relate).
The unexpected benefit comes when your Open Source Knowledge starts being
useful to people who know more than you. Experts are always busy with a
million things, and get more opportunities and requests for help than they can
handle. You’re effectively building a resource they can point people to. Now
they are incentivized to help you be the best resource, for example, by fixing
mistakes and holes in your Open Source Knowledge. In this way I’ve been
taught TypeScript by experts from AirBnb, Artsy, Paypal, and the TypeScript
core team, for free.
13.5 Tips
Some tips for doing it well:
Optimize for Copy and Paste - the most immediate value you can provide
to yourself and others is to offer copy-and-pasteable examples. Make the
examples clearly self-contained, well annotated, and made for Copy and
Paste.
Help others help their friends - when people look good by linking to your
work, you look good. So be timeless, don’t add junk like ads and random
jokes.
Add an Open License - just like you should license your code, make
explicit that people are welcome to read, contribute, and fork your
accumulated knowledge, and what attributions you require.
Look out for under-served community needs. Just like with any venture,
it is not a requirement that you be the first or only attempt to do something.
But it can help you get initial traction. The intersections of two domains are
usually under-served. This helps your effort be Tractable (don’t bite off
more than you can chew) and Resonant (do people say “Hell yeah! I wish
I’d seen this when I started!”)
Structure is as important as Content. Your role is as much organizing
information as it is providing information. Everything down to the relative
length of sections, the structure of headings, and even what not to include,
is worth paying attention to.
Ask for Specific Help. If you have known gaps in your knowledge, ask for
help there rather than ask for general help. It may or may not come, but at
least you stand a higher chance. The world punishes the vague wish and
rewards the Specific Ask.
Internal OSK. Not all information should be public. But you can still do
extremely well open sourcing knowledge internally in a company.
Chapter 14
Spark Joy
Your work should spark joy. Therefore, you should get very good at adding
sparks of joy in your work.
This may seem like a really weird principle to have in a book about coding
careers. But it can add so much value and impact to your work, disproportionate
to the amount of effort spent, that it had to be included.
While we are used to this idea from the perspective of the consumer, the
principle cuts equally the other way as well. We live in an Age of Abundance,
which is also an Age of Noise. We creators, producers, and developers should
all think about how to make our work “spark joy” - lest it be “Marie Kondo”-ed
away like everything else.
“I’ve learned that people will forget what you said, people will forget
what you did, but people will never forget how you made them
feel.” - Maya Angelou
Your eye went straight to the red tomato. We notice when things stand out. This
is known as the Von Restorff Isolation effect - when multiple similar objects are
present, the one that differs from the rest is most likely to be remembered. And
what we remember is what we value.
In the same way, you should want your work to stand out in the memory of
everyone from your colleagues to your potential customers. Because you’ve
given them something remarkable to hinge on, they can then become your
biggest advocates.
Sparking Joy isn’t just about standing out, though: so long as your work evokes
good vibes with people, they’ll associate you with positive emotions.
In the same way that Broken Windows can encourage further crime, having
examples of excellence in your work causes the reverse effect, which has been
called the Aesthetic Domino Effect. Putting sparks of joy in your work shows
people you care and inspires other people to do the same.
14.3 Examples
We’ll start close to home, in code, and widen out in concentric circles of
opportunities you will come across. This isn’t an exhaustive list; it is just meant
to give some inspiration for how you can Spark Joy with the things you do day-
to-day.
Code is read more than it is written. If your code isn’t a joy to read, then it will
be difficult to use and dreadful to refactor. Avoid Hasty Abstractions as far as
possible. We constantly need reminders to avoid Code Complexity:
Everyone knows naming things are hard - there are many opinions here - if
something is too complicated to give a good name to it, you’re probably giving it
too much responsibility. Heed your code readability as a code smell.
Code comments are a developer communication cheat code. They don’t have
any performance impact (usually!), and can help avoid others wasting time.
Instead of explaining what the code is doing, which is often evident from just
reading the code itself and liable to go out of date when code is changed, you
can try to note why some choices were made, or why the “obvious” approach
wasn’t chosen, or give an ASCII art diagram of how the code works. When you
anticipate what I’m going to ask as I read your code, believe me, that Sparks Joy.
According to Sarah Drasner (elaborated in talk form here), comments can serve
these other good purposes as well:
I think the best written, most elegant code in the world cannot
compare even remotely to well done, natural language documentation
when it comes to communicating the intention and context of what
was built. How this thing works, why we built this thing. The code
can explain what it does and at a technical level how it does it, but it
doesn’t explain the business reasons and impact, or even some of
the other systems that might depend on it… A lot of people
underestimate the value to the doc writer of having to sit down and
write those docs… You might discover things about what you just
built and realize: “Oh wait, I missed something!” - Jared Short
Great error design sparks joy. Developers often write services and modules to
be used by other developers, even from within the same app. Most of these
interactions will be governed by some sort of contract, explicitly specified by
design documents or an OpenAPI spec or something similar. However, what is
usually underspecified is what to do when things go wrong:
You might expect these things to be covered in code standards documents. But
Code Standards usually address the minimum required standards (for good
reason, to avoid being onerous). To Spark Joy, we look for opportunities to go
above and beyond. One way to be a developer that others enjoy working with is
to write code others enjoy reading and using.
Well crafted PRs and issues spark joy. Even when you are writing out of
frustration in dealing with a problem, the ability to keep your cool, provide
context and concise information, and help them help you is a boon.
StackOverflow has a good guide on How to ask a good question, but you can
also go above and beyond in easy ways:
GitHub makes it very easy to attach images and gifs to issues, so we should
use that wherever appropriate to convey information as that is very high-
bandwidth.
Use an app like Annotate or Zappy to take and annotate screenshots.
For gifs, the open source LICEcap app lets you control everything down to
the framerate and recorded screen area. This helps you isolate bugs in
motion.
Sometimes you need longer form commentary than just screenshots or gifs.
Record quick video demos or bug reports with narration and post it up to
YouTube as an unlisted video, and include the link to your report. A five
minute effort from you can help resolve a lot of back and forth with the
maintainer/potential user of the project.
A lot of GitHub collaboration is asynchronous and faceless. It’s common for
people to say they will do something - create a repro, try out a beta, work on a
fix - and then never return. Simply doing what you say you are going to do
sparks joy.
The most high impact way a developer can spark joy is in writing good docs. It
is the first thing every new user and team-mate reads, and shows that you care
about the project.
You don’t have to create a bells-and-whistles docs site for every little project.
For most things, a really good README is more than enough - but you can do a
lot to “sweat the README”.
Get straight to the point. Place Installation, Examples, and API docs up front
and use a Table of Contents generator to make it easy to navigate. Keep them up
to date, and write example code with the understanding that developers will copy
and paste while skimming over most of the explanations. Even where copy and
paste is not possible, for example when developer keys are concerned, you can
show the expected form of the key for people to visually verify they have the
right one, e.g. API_TOKEN= # e.g. MY_API_TOKEN_1234
CI Badges are associated with quality. It’s tempting to regard docs badges as
performative “pieces of flair”, but an academic study of this phenomenon has
actually found that badges with underlying analyses, e.g. displaying build status,
issue resolution times, and code coverage are predictive of project quality.
Shields.io makes it easy to set up a selection of great badges. Correlation isn’t
causation: this probably has more to do with the kind of maintainer that adds
badges than implying that badges cause project quality. But you could be the
kind of maintainer that shows they care!
Side note: Not too many badges! 4-6 badges seems like the sweet spot
- any more and the “Christmas Tree” effect starts showing you are
“trying too hard”.
Repo Metadata should also be given proper attention. GitHub allows you to
place a description of the project at the top, as well as to place a link. Be sure to
put your best oneliner pitch in there, and to link to a live project of the demo!
That is literally the first place developers look.
READMEs are typically written in Markdown, which imposes some strict order
on your content, but you can often break that monotony by using some HTML
alignment with <div align="center">, or adding a logo or banner (either
ask for contributions or use a generator like Hipster Logo Generator, Hatchful,
or Excalidraw).
Pay attention to the structure and relative weight of your documentation.
Nobody enjoys reading big blocks of text - break it up into bullet points or tables
where possible. With GitHub-flavored Markdown, you can even hide lengthy
explanations of edge cases in HTML <details> and <summary> tags
interspersed with Markdown, which helps make your docs useful for both the
skimmer and the dev who wants to dig deeper.
Automate formatting for your docs. You can run prettier as a git hook (with
husky and pretty-quick for a fast experience), and use doctoc to keep your
Table of Contents up to date (also available as a GitHub action).
There’s no end to things you can add for Great Documentation - so it is best to
match your documentation to the project maturity. Two nice features that are
always appreciated: Searchability, and a “Tradeoffs” or “When NOT to use this”
section.
Anecdote time: Great docs aren’t only important for open source marketing
and adoption. One of my best dev memories was hearing a new employee
coming across an internal repo for the first time, and finding an extensively well
explained README with diagrams to show how everything worked and even a
short explanation of project file structure. The engineer responsible for that
hadn’t even touched the repo in over a year, but the new person was able to pick
it up right away. You BET the new person was overjoyed to find such great
docs, and sang its praises all over the company’s internal chat. As for the
original engineer? She was promoted to Principal Backend Engineer not long
after.
14.3.4 Sparking Joy in Demos and Products
Demos are GREAT opportunities to spark joy, because of the relative freedom of
a non-production, non-core code app. On-brand humor can really help to sell the
intent of your project while also helping with marketing - just check out the
landing page of and social media reactions to Muzzle.
Even when you are demonstrating how to interact with an API, you can use joke
APIs like this one for “clean” jokes or this one for developer jokes or this one for
devops jokes. If you need to be more serious, check Public API Lists for
interesting APIs you can demo with.
The best demos localize for their audience. People notice when the talk they
are watching could not possibly work for any audience except for them. When
Divya Tagtachian gives a talk in Boston, she talks about local seafood joints.
The same demo switches to Deep Dish Pizza in Chicago. When she speaks in
Amsterdam, she makes funny Dutch puns and discusses GDPR. In Nigeria, a
demo using milk tea gets swapped for Jollof Rice. In your marketing pages, you
could use avatars and illustrations that reflect the colorful variety of your
intended audience. Audiences notice when you go the extra mile for them, and
this sparks joy.
Sweat the accessibility. It’s not only a good habit to do it even in non-
production demos, it truly sparks joy for keyboard and screenreader users used
to a sea of inaccessible apps. Accessibility isn’t just for those with disabilities –
it is becoming a key product differentiator among productivity and developer
tools (even for heavily visual apps like Slides.com) and apps for outdoor or
industrial use. Marcy Sutton, Lindsey Kopacz and Jen Luker offer a wealth of
talks, resources and workshops you can check out.
Storytelling can make for a compelling demo. Your visitors can get invested in
characters, whether made up or referencing pop culture. One of the most
compelling DevOps demos I have ever seen was delivered through telling the
story of a coworker named Pavel. Years later I still remember Pavel’s name and
what he went through.
Don’t forget your empty states! Empty states are common to see with demos,
especially when users create a trial account and see nothing in their dashboard
because they don’t have any data yet. Most programmers leave empty states
empty. But that blank space is free real estate to prompt the user to do the next
action! For apps like Superhuman, the empty state is not only a goal, it is a
competitive advantage. Check emptystat.es for more inspiration in real apps.
Our discussion of demos is starting to veer into the dreaded Full App Design
territory. Beautifully designed demos definitely spark joy - but does that mean
we should hire designers? Become designers?
Your capacity to inspire joy is only limited by your creativity. But people
always notice when you do. Going the extra mile to delight people invokes the
principle of reciprocity, which is one of the most powerful forms of influence.
“There are no traffic jams along the extra mile.” - Roger Staubach, the
Hall-of-Fame football player
If you didn’t know about the power of sparking joy in others, now you know.
Chapter 15
The Platinum Rule
You’ve heard of the Golden Rule: Treat others as you want to be treated.
This means I prefer shipping an imperfect thing and iterating rather than lining
up my ducks in a row. This means I don’t engage in compliment sandwiches.
This means I make fun of myself and anything I strongly identify with, which
can sometimes include people I work with. This means I often am too harsh on
something I care about.
Some of you are reading and nodding and don’t see what’s wrong. That’s what’s
wrong.
It doesn’t really even matter what the relative quantities of More Particular vs
Less Particular people are - if these people are to work together, then they must
coexist under a different social contract.
I propose the Platinum Rule to be that contract: Treat others as THEY want to
be treated.
On one hand this seems like basic human decency: Of course you should be
considerate of others’ feelings. Use their pronouns. Respect their agency and
freedom.
On the other, it can seem FAR too accommodative - what if people abuse the
system and want to be treated unreasonably well? Double standards exist
everywhere when it comes to self interest. Well, a line must be drawn
somewhere.
It’s imperfect, but probably the right balance of where you and I should operate
is somewhere in between the Golden Rule (extreme self-centered empathy) and
the Platinum Rule (extreme other-centered accommodation).
Here’s my proposal for a Silver Rule: Treat yourself as you treat others. A
nice inversion of the Golden Rule.
In Gretchen Rubin’s Four Tendencies Framework, she splits people by how they
respond to inner and outer expectations, which seems very apropos to this topic.
Questioners are most in need of the Platinum Rule. But Obligers, the majority
of the population, probably need the Silver Rule most. For Obligers, self care
must not get sidelined by self sacrifice. This is something we address in
Chapter 40.
Chapter 16
Good Enough is Better than Best
In general, you move faster and feel a lot less stress once you realize: You don’t
need “the best”, you just need “good enough”.
The more reversible the decision, the faster you should move.
The problem with being a beginner is you don’t even know that these are bad
questions.
I think we all could do a better job of framing engineering and life as satisficing
rather than maximizing operations. You can achieve more success and happiness
when you look for “good enough” and then move on, instead of constantly
looking for “best” (unless that is your entire value proposition, e.g. you are a
professional tech reviewer).
Happiness: You don’t always know that you’ve got the best. You make
your decisions under imperfect information — what reviews say, what
friends tell you, what the marketing says — and then you buy something.
Seeking the best only to find you have ended up with the second best is a
recipe for disappointment. You end up comparing long feature checklists
looking for the most amount of green. Most of which you don’t need. Even
picking something, anything, gives you anxiety because you fear missing
out.
Cooperation: Looking for the best transforms your world into a zero-sum
finite game rather than a positive-sum infinite game. It’s cancerous to your
worldview.
Efficiency: It is also ridiculously inefficient. The corollary of the Pareto
principle is that the last 20% of something is the most expensive - and that’s
what you have to sweat if you must seek “the best” all the time. It’s fine to
seek the best - just know that you’re going to incur a disproportionately
high cost.
Agency: People game “best-seekers” all the time, by defining for you what
“best” is. Who wants to be Mayor on Foursquare? Who can compete to get
the most subscribers on YouTube? Which wait-service staff will be
Employee of the Month? Games to give fake status to people who live in
the system, by people who profit off the system. If you seek “good
enough”, you reclaim your own agency.
“Good Enough” is, well, good enough. Learn to define that for yourself, and to
be happy when you get it, and you will be more reliably happy, cooperative,
productive, and independent than you ever were.
The seductive lure of precision can come in several forms - decimal places, high
frequency updates, one-axis comparisons of complex things, the majority
consensus, the highly credentialed expert.
Be very wary. It’s not that precise people are always wrong. It’s literally that
being more precise has little to do with whether you are more accurate. It is
always easier to be more precise than it is to be more accurate. One
produces more confidence. The other produces more results. Choose wisely.
The easier that data can be obtained, the less valuable it generally is – not
because of the relative surplus, but because nobody guards worthless facts. This
is good news for humans: In a world of Big-Data-driven everything, there will
forever be a place for judgment, insight, and fundamental, First Principles
Thinking (Chapter 17). However, humans also have a built-in aversion to
ambiguity and uncertainty, known as the Ellsberg paradox, so we end up
clinging on to whatever data we do get, no matter what it is worth.
Finally, in addition to asking the handicappers to predict the winner of each race,
he asked each one also to state how confident he was in his prediction. Now, as
it turns out, there were an average of ten horses in each race, so we would expect
by blind chance — random guessing — each handicapper would be right 10
percent of the time, and that their confidence with a blind guess to be 10 percent.
So in round one, with just five pieces of information, the handicappers were 17
percent accurate, which is pretty good, 70 percent better than the 10 percent
chance they started with when given zero pieces of information. And
interestingly, their confidence was 19 percent — almost exactly as confident as
they should have been. They were 17 percent accurate and 19 percent confident
in their predictions.
In round two, they were given ten pieces of information. In round three, 20
pieces of information. And in the fourth and final round, 40 pieces of
information. That’s a whole lot more than the five pieces of information they
started with. Surprisingly, their accuracy had flatlined at 17 percent; they
were no more accurate with the additional 35 pieces of information.
Unfortunately, their confidence nearly doubled — to 34 percent! So the
additional information made them no more accurate but a whole lot more
confident. Which would have led them to increase the size of their bets and
lose money as a result.
Push yourself to think beyond labels. Questions like “is it production ready?” or
“does it scale?” or “is it blazing fast?” have very little meaning absent your own
context. For a hilarious take on this, check out this parody video discussing the
technical merits of Node.js between two developers. It’s funny because it is
true. So many beginner developers, and too many senior developers, think and
talk with labels and never go past that. Learn to break down how things work
and derive your own answers based on first principles.
When you are told that something cannot be done, First Principles will help you
ask “Why Not?” Conversely, if you are being tasked to do something
impossible, First Principles will help you quickly demonstrate nonviability by
breaking down the problem to a set of base facts.
Jeff Dean was known to circulate a short list of Latency Numbers Every
Programmer Should Know at Google, reminding developers of the total
futility of trying to do transatlantic roundtrips faster than 150ms because it
is limited by the speed of light.
John Carmack, working on gesture interfaces, points out that the speed of
thought is only 110m/s, placing 9ms of latency in your arm. This is hugely
sobering for his field of human-computer interfaces.
You can keep your own list of base facts for performing Napkin Math in
your own domain.
Having a good grounding in inviolable truths helps you dispel myths. If you
break apart a bundle, whether it is a system or product or library or belief, and its
constraints aren’t demanded by the sum of its parts and Amdahl’s law, there is
probably opportunity.
17.1 Logic
I first encountered this via a philosophy lecturer I had in junior college, Lionel
Barnard (who was actually supposed to teach Economics, but preferred to turn
our class into a little PPE program for our intellectual gratification). In particular
I have always favored the format of Syllogism, which takes a form like this:
You can’t get very far if you only rely on facts, though, because there are many
more unknowns and indeterminate or stochastic processes than there are facts.
So you can supplant your syllogisms with Axioms - assumptions that you take to
be true. You don’t HAVE to prove them true, but you can show by deduction
that given an acknowledged set of assumptions, you can arrive at a logically
sound conclusion. This is FANTASTIC, because it lets you enumerate your
beliefs. It also allows you to change your mind instantly if your assumptions are
proven wrong (especially handy because you can’t prove a negative).
It turns out that logical deduction has limits, and in fact takes a lot more effort
(in corralling facts - sometimes what you believe to be true isn’t true, as in the
reproducability crisis in the social sciences - and validating the integrity of the
logical chain of arguments), and by far the more prevalent method we operate on
is Induction. We study this in Epistemology.
17.2 Epistemology
There are many approaches to the study of Certainty so I will blithely ignore
most of them and contrast two: Induction vs Deduction.
“1500 years ago, everybody ‘knew’ that the earth was the center of the
universe. 500 years ago, everybody ‘knew’ that the earth was flat.
And 15 minutes ago, you ‘knew’ that humans were alone on this
planet. Imagine what you’ll ‘know’ tomorrow.” - Men in Black
Addressing your Epistemology head-on is very important for decision-making -
because if you don’t know how you know what you know, then how do you have
any faith in the decisions you make, based on that knowledge?
17.3 Applications
My talk on Getting Closure on Hooks was cited as a “First Principles” talk, as is
the followup on Concurrent React. I think all talks and blogposts in the From
Scratch genre, like this on React Router or this on Redux or this on the
hardware-software interface is great First Principles fodder. There’s even an
entire repo on GitHub for Build Your Own X projects!
But of course, First Principles can be applied far beyond code. The Drake
Equation is a well known first principles decomposition of the number of alien
civilizations in our galaxy. You can explain everything from Music to
Computing (to Coding Careers!) with First Principles.
When you are trying to change a system and it feels too hard, a reliable trick is to
find out where you are in Donella’s list and work your way downwards.
In the software domain, Will Larson is a leading voice on how to apply systems
thinking to engineering management.
17.5 Further Reading
Napkin Math
Boring Technology
Wait But Why on Elon Musk
Neil Kakkar on First Principles Thinking
Donella Meadows on Leverage Points
Li Haoyi on First Principles
Chapter 18
Write, A Lot
“What many people underestimate is that being a good writer, whether
that is through emails or through documents, allows you to be more
impactful. I see many engineers ignore that skill. You might be proud
about your code. You should also be equally proud of the craft of
writing… Writing is a highly underestimated skill for engineers.” -
Urs Hölzle, Google’s first VP of Engineering
If you are serious about making an impact in your coding career, you should get
good at writing words as well as code. Developers write in a ton of scenarios
both at work and for their own careers, and there are a host of attributes that
make writing down your knowledge particularly rewarding for a knowledge
worker like you.
Some developers write more words than code for their jobs, and have more
impact than someone who only codes. This reality only increases as you go
beyond your coding career, whether you are managing people as an engineering
manager, or raising funds as a founder. Your writing style can differ drastically,
as is clear when you study internal memos from leaders like Steve Jobs, Bill
Gates, and Mark Zuckerberg. But they all agree on the criticality of writing to
scaling themselves. If you have the ability, encourage a culture of written
communication to scale the benefits of writing across your entire organization.
“The database is like the universal source of truth, it is where all the
data lives about your users and customers… Over time, as you grow,
the database can’t respond to all the requests, so you add a cache. This
is how most web applications scale. Writing is the cache.
Documentation is the cache. Code is the cache. The people in the
company - me - I’m the database.” - Sahil Lavingia
You can also do it for the sheer joy of sharing what you’ve learned. That can be
enough. In the words of one of the most prolific developer-writers I know:
Ultimately, I really like sharing stuff that I’ve learned. It’s some
combination of “being informative”, “passing it on”, “helping”,
“teaching”, “not repeating myself”, and “showing off / bragging”. I
write because I have stuff to say, because I know that I’m helping
people, and because I really can’t not write. - Mark Erikson
18.1.1 Documentation
John Resig attributes the success of jQuery to Documentation: “On the very
first day it was released, I had documentation written. I sat down and went
through every method and documented it and how it worked and provided
little examples…(in 2006) jQuery was the only JavaScript library with
documentation!”
Taylor Otwell makes eight figures running Laravel as an (almost) solo
developer, and is even more blunt: “Whoever writes the best documentation
wins!”
GitLab’s handbook begins: “A handbook-first approach to documentation is
sneakily vital to a well-run business. While it feels skippable — inefficient,
even — the outsized benefits of intentionally writing down and organizing
process, culture, and solutions are staggering. Conversely, avoiding
structured documentation is the best way to instill a low-level sense of
chaos and confusion that hampers growth across the board.”
Most developers don’t write in public - a lot of their writing just sits on company
servers. Smart developers write so that they Don’t Go Home with Nothing.
They understand that the vast majority of developer careers outlast their tenure at
their current firm, and the easiest way to establish expertise and build a
reputation in the industry is to write under their own names.
A good way to write for your own career is to publish under top industry blogs
and forums - anyone that pays you to write will have rigorous editing standards,
and you can practice your technical writing while making money and gaining an
audience:
Twilio Voices pays $500 per technical post, and usage of Twilio isn’t
required!
Digital Ocean and Linode pay $300 to write about Python, JS, or Linux
WonderProxy pays $500 for content on testing
ClubHouse pays $500 for content for senior devs/eng managers
Smashing Magazine, CSS Tricks, A List Apart, and LogRocket pay $250
for front-end posts
FloydHub pay $150 for Data Science/AI/ML
Stack Overflow pay $500 for general programming content
You can find more on WhoPaysTechnicalWriters.com. Some other platforms
may pay for writing on a case by case basis - almost all the video course sites
like Treehouse, Lynda, Pluralsight, and Egghead have some form of published
writing component.
Two caveats to note when writing for other platforms - you lose your copyright
(they paid for it after all, but this is usually fine because getting your name out
there is more important in the early days) and you have to go through the editing
process (this is a good thing! You want this!).
Not everything has to be for money - it is often easiest to get started just by
writing great answers on established platforms. Jon Skeet rose to fame by
answering prolifically on StackOverflow until he was the top contributor of all
time.
Personal Technical Blogs are a permissionless form of writing that you own.
Mattt Thompson created NSHipster, “a journal of the overlooked bits in
Objective-C, Swift, and Cocoa, updated weekly”, and made a reputation as an
expert in iOS and Swift. Jeff Atwood and Joel Spolsky only met through their
blogs, going on to create StackOverflow.
You’ve also seen from the other principles in this book that you can Open
Source your Knowledge and create Friendcatchers while you Learn in Public
- if you own the domain, you don’t need anyone’s permission to publish and you
can build a brand on distribution that you own.
Even when you code the next great Open Source project, you will still have to
market it. Here’s Dan Abramov on creating a successful Open Source project:
“It also means writing blog posts, making tutorials, sending pull requests to
popular open source project examples to use your tool, talking to the users on
social media platforms to learn what they want, preparing promotional materials
(like tweets), reaching out to influencers, etc. Open source is a lot of work, and
having a project is not enough.”
Writing forces you to create rather than consume, and gives you scale,
structure, and power when you do it.
18.2.1 Scale
Writing is searchable, and writing lives forever. Search and storage are things
that human brains are particularly bad at - we should offload that to computers as
much as possible. It just so happens that the most indexable and durable format
for storing this information is in writing. Do you remember what you worked on
five years ago on May 10th? No, but your journal does.
“When you write, you become a resource for your future self. It’ll
save you time (pulling up your own blog post is a lot quicker than a
fresh Google search), you’ll get all the credit (instead of some Stack
Overflow post), and it’ll make all that writing feel even more
worthwhile.” - Alex MacArthur
A quick note on Search: Writing controls your narrative. For people who
don’t know you, your online presence is solely what they find on Google. Most
people’s “Personal SEO” is terrible. They probably don’t have negative stories
published online, but also there’s usually a lot of random junk from their digital
footprint. Writing fills that empty space. If I googled you and found excellent
writing, I have a much better opinion of you before I ever meet you. (And
everyone googles you before an interview! It’s not “fair” but it is fact.)
“If you’re not writing stuff on the Web, then when people search for
you they’re going to find stuff that you don’t control.” - Joel Spolsky
18.2.2 Structure
The other thing brains are bad at is giving structure to a fuzzy cloud of loosely
related ideas. Writing organizes your thoughts. Steven Sinofsky, who led the
development of Office 95 and Windows 8, is more to the point: Writing is
Thinking. When you write, you are forced to a definite sequential order - even
unordered lists have implicit order. As we write, we give weight to key ideas
and emphasize word choice and phrasing. Links are the best addition of the web
to writing - You can hyperlink to original sources, so readers can follow up if
they wish, but still keep on topic with what you are saying.
“Writing is a linear process that forces a tangle of loose connections in
your brain through a narrow aperture exposing them to much greater
scrutiny.” - Andrew Bosworth
Writing makes others perceive you as smarter. An organized mind will seem
instantly smarter than a disorganized one every time. Because our brains lack
structure, we crave structure. My best talks start off with writing an outline,
because a written outline is the minimum viable talk. Just by having gone
through the exercise of organizing your thoughts, writing even helps you sound
smarter when speaking unprepared, whether to a large crowd or to a single
coworker. You know those moments when a speaker says something profound
and everyone rushes to write it down? That phrase was probably written down
somewhere first before it was ever uttered. The other way to frame this: writing
makes how smart you actually are shine through.
“I almost never say anything in public that I haven’t written down
before.” - Neil DeGrasse Tyson on how he communicates so well
18.2.3 Power
Writing lets you explore ideas cheaply: It’s easy to pivot an essay halfway,
reorganize by cutting and pasting, and test out different words and structures
before committing. This is because writing is cheap - you can sketch out an
entire architecture or business plan in just a few paragraphs, without
implementing it! But the cheapness of writing extends beyond experimentation -
you can also map out hypotheticals and consider edge cases without actually
accounting for them right away.
Writing is abstract. You can convey feelings, systems, concepts, and stories
that don’t yet exist. Writing is the ultimate friend of the creator because it isn’t
limited by inconvenient things like reality. Yet, writing is also constrained -
you aren’t allowed to pick colors, worry about audio, futz with screen resolution
or take a million other little design decisions that perfectionists mess with
instead of creating. So you eliminate the paradox of choice and just get going
with transferring your ideas and learning to the printed page and digital
document.
Writing buffers your inputs until you are ready. Ideas, information, and
learning happen spontaneously in a continuous fashion. They don’t respect your
personal schedule. However your time for creating is limited. You need to
serendipity and focus to coexist. Writing things down as they come to you
helps you “save your mental state” and defer creating until the time is right and
you have enough for something truly great. Writing turns push to pull.
Note: This is related to Mise en Place Writing (Chapter 36).
“Anyone can publish an essay on the Web, and it gets judged, as any
writing should, by what it says, not who wrote it. Who are you to write
about x? You are whatever you wrote… The Web may well make this
the golden age of the essay.”
The Internet isn’t a strict meritocracy by any stretch, but it is probably more so
than any comparable real world institution.
Notice that I did not make this section about how to be a “Great” writer. That is
because I am not one. But the point is also that you don’t have to be a “Great”
writer to do well in your coding career. You just have to be Good Enough
(Chapter 16).
People who don’t write regularly are understandably cautious when asked to
start being a public writer. You can get started with three simple steps:
Have a place to write: For some this is an old-school paper notebook, for
others, Emacs Org mode might work. I write in OneNote or Notion because
searchability and cross platform capability is important to me.
Find time to write: Eliminate distractions. You waste a ton of time in
distractions. Use writing to fill those holes of boredom in your routine. Use
airplane mode when you write. You probably spend a lot of time
reading/watching/listening to developer content - take some of that and
write down what you learned - otherwise, 99% of it will be gone from your
memory and you might as well not have consumed that content anyway.
You can also sacrifice a vice, like TV or social media time, to find more
time to write.
When in doubt, don’t publish: I will always encourage you to publish
your work, but if you’re not sure if you should, then keep it private. It’s
more important to establish the habit of writing - you can publish what you
wrote later when you find your style.
Many people don’t publish their writing because of impostor syndrome. I’m
certainly not going to be the first or last to tell you that you don’t have to be an
expert to write about something. If you must, put a big disclaimer saying what
research you’ve done into the topic, and let people correct you if you are wrong.
This is how experts become experts.
Another objection is that you still don’t have time to write. Don’t forget that
you can write with the explicit intent of saving yourself time. When you
summarize things you have read, you not only solidify it in your memory, you
save time for your future self when you run across it again or need to quote it.
And when answering questions - rather than explaining the same thing over and
over - you write your explanation once, publish it, and you’re done. From then
on you can just point people to it. As Scott Hanselman notes: Do they deserve
the gift of your keystrokes?
Some people feel like they lack ideas for what to write. Easy! I have four
categories for you to get started writing:
It can be tempting to write about news (e.g. “This Week in X”), but that has a
very short half-life. Where possible, prefer evergreen content – topics that will
still be relevant in 5-10 years – in order to benefit from Lindy Compounding
(discussed in Chapter 12).
Write down what’s obvious to you. Derek Sivers is fond of saying that What’s
Obvious to you is Amazing to Others:
First you can start with What topics: “What is Kubernetes?” “What is
Agile?” (Julia Evans’ free zines are great examples of these, but yours can
be just text of course)
Then you progress to How: “How do I do X in Y?” (Josh Branchaud has
gathered a huge audience posting just tiny bitesized TIL’s for years)
Then get introspective with Why: Why Do We Write super(props)?
for underexamined commonplace things
Then get more historical and introspective with When and Who topics.
Careful not to disclose confidential information!
Pay particular attention to questions that you ask. When you figure out your
answer, don’t just carry on with your day - WRITE IT DOWN!. As Chris
Coyier says, “Write the article you wish you found when you googled
something”. You have no idea how often you’ll be referring to your own work
when the need comes up again, or when others have the same issue.
You should eventually try to publish your writing, not least because having other
people read your writing, correct your mistakes, and become fans of your work
is half the benefit of writing at all! Andrej Karpathy, the Stanford superstar
responsible for Tesla Autopilot, notes that he goes “the extra mile knowing
others may scrutinize [his] published work… [so he works] harder to make
things correct and consistent”.
“By writing on a blogpost I was held to higher account than I ever
would be internally.” - Troy Hunt
You may be the sort of person that craves feedback for your work if you put it
out there (most of us are). Make peace with the fact that everybody wanders
around in the wilderness a long while before finding an audience. David Perell
calls this the Four Months of Quiet, where you might put out a blogpost a week
for 15 straight weeks and only get noticed on the 16th. For me it was about a
year. For Troy Hunt, it took years of blogging about everything under the sun
before finding his niche as the Security Guy. Think about the community you
serve as well. Focus on a single platform rather than scatter your shots – every
platform has quirks and nuances that make certain types of content perform
better on it than anywhere else. Bootstrap your readership on that platform and
then transfer it to a domain you control.
Bottom line: be patient, hone your writing. You’ll find your groove eventually.
Endure long enough to get noticed – you will be noticed, because people who’ve
done it notice others who are doing it. Game recognizes game.
What you write is strongly influenced by what you read. Read and do
interesting things. Dive down rabbit holes. Go back in time. If you just read
the same stuff everyone else does, don’t be puzzled why nobody reads what you
write.
Write down what “everyone” knows but doesn’t write down. Address the two
questions everyone wants to know: “So What?” and “Now What?” Explain
complex things simply. It’s a guarantee that there will be people that will be
eternally grateful. Every tribe needs a scribe. Not everything can be written
down – Polanyi’s paradox teaches us that there are many things we cannot – but
plenty of knowledge isn’t written down simply because nobody bothered to.
This book consolidates tacit knowledge learned from years of personal and
collective experience, but anyone could have written it if they were determined
enough.
If you want to do well in SEO, you can try doing TDD: Title Driven
Development. Use keyword research like KeySearch to find keywords you can
rank for. Then pick a standard title format that you know works because you’ve
read dozens of these before (these ideas are from Monica Lent’s free blogging
course):
Alternatively, if you want to offer more context, a popular template for writing
has 4 steps:
This format is popular for everything from self-help to recipe blogs because it
works.
That said, sometimes readers just want the deep dive – write the most
comprehensive, ultimate resource possible on your topic! This is known as the
Skyscraper technique in the content marketing world. Corbett Barr calls this
Write Epic Shit – the Internet disproportionately rewards high effort, high
quality content. This can be about anything from A Complete Guide to CSS
Grid to Falsehoods Programmers Believe About Names. However, this can be
exhausting if you try to do it all the time, so don’t feel like you have to hold
everything to you do to an impossibly high standard. See also Flavio’s SEO
learnings from blogging every day.
Don’t be afraid to remix your writing. It’s almost certain that nobody will read
everything you write. The last part of David Perell’s Five Pillars of Writing is
repackaging existing work. If the ideas connect, link back to them, or copy them
over, or throw them out and rewrite it better. You will seem enormously
productive, and your work will seem of incredibly high quality, to people who
don’t know you are remixing prior work. For example: 10 chapters in this
book were previously blog posts, which helped get this book done faster, though
all have been extensively reworked.
If you want feedback fast, there is a way to almost guarantee it - Pick Up What
They Put Down (Chapter 19). In the words of Dale Carnegie: “To be
interesting, be interested (in others)”. Build relationships one by one instead of
spraying your writing to an uncaring Internet and praying it works.
You can become a very good, well regarded writer by earning a “Do-It-Yourself
PhD”:
Look for a Nexus of Interest, the most interesting topic to you that is also
interesting to others
Write a million words to deliberately improve from where you are, to
becoming the world’s foremost expert on that topic
The first part is straightforward. Most life advice converges on some form of
Ikigai, the idea that you should do the intersection of what you love, what you
are good at, what the world needs, and what you can be paid for:
However this is unattainable if you don’t yet know any of these. Writing is the
way to get there. So we can make two simplifying assumptions:
Instead of the hackneyed advice of “do what you love”, we assume that you
will learn to love what you do well. This is the more realistic truth and it
better explains why people unironically love, and are great at, all sorts of
things from tax code optimization to designing high availability systems for
multibillion dollar corporations.
Whatever the world needs, you can be paid for it. As Naval Ravikant
has often noted: “The internet has massively broadened the possible space
of careers. Most people haven’t figured this out yet.” Global reach has
freed every niche from geographical constraints, and global payment
systems have enabled everyone to create viable businesses serving every
niche.
With that, we collapse the four parts of the Ikigai concept into just two: Find
something that is most interesting to you, that is also interesting to others. That
is the raw essence of Ikigai, and that is what I call your Nexus of Interest.
The second part is less obvious – writing a milion words as a means to both find,
and grow into, the predominant expert in your Nexus of Interest.
It’s not about the precise number, it’s about the order of magnitude of effort that
will turn you into a world class authority. You’ve already written a million
words once, probably twice in your life. Sum up everything you ever wrote from
your first word to your last high school exam (or whatever is equivalent in your
life path). That was about a million words to get you from illiterate to highly
literate. Then, if you went to college, especially a liberal arts one, you wrote
another million-ish words to get your degree, across your essays, senior thesis,
class projects, extracurricular activities, and so on.
You achieved so much just by writing what people assigned you to write. Now,
as an adult, imagine what happens when you write a million words to find,
research, and share what you assign to yourself. You don’t need any admissions
committee to give you permission. You don’t need a supervising professor to
sponsor your work (though mentors can help!). You don’t need a pre-existing
field with departments and grants and endowments. You just need to find your
Nexus of Interest and write and publish more work than anyone else on earth
towards it.
Take any pace you want. I like the symmetry of 1000 words a day for 1000
days. Absent weekends and days off, there are 250 days in a year, so that
works out to four 250 word pages of notes, ideas, blogposts, documentation, and
code comments for four years.
Jeff Atwood’s How To Achieve Ultimate Blog Success In One Easy Step
has one step: “Pick a schedule you can live with, and stick to it… If you
can demonstrate a willingness to write, and a desire to keep continually
improving your writing, you will eventually be successful.”
Tim Ferriss, the bestselling author, uses this rule: Write two crappy pages
per day. He keeps the expectations low enough that he is not so
intimidated that he never gets started.
Julia Cameron starts her day with three pages of longhand, stream of
consciousness writing and calls it her Morning Pages - Brian Koppelman
does this to override negativity and jumpstart his own creativity to write
great shows enjoyed by billions.
It happens that 2 pages at 500 words each adds up to 1000 words a
day. That’s exactly what Nathan Barry committed to in 2012 before he
published his first book, built a following, and eventually created a 9-figure
email marketing business. He committed to writing 1000 words a day and
even made an app to track it. His realization: “Slow, consistent progress is
the only way to make big things happen”.
You’re probably thinking it can’t be that simple. There are a million other things
that go into making great writing, and we’re not addressing any of that in this
simple goal. Yes, that’s a future chapter of this book, but I’m banking on you to
figure that out as you go along. But you don’t get there if you don’t, at a
minimum, write more.
The truth is: It almost doesn’t matter how well you write. Some of the best
regarded developer-writers, like Steve Yegge, Patrick McKenzie, and Dan Luu
don’t obey any traditional patterns of Good Writing. Run-on sentences, long
paragraphs of unstructured rants, obscure jargony references, none of it matters.
What matters is that they know what they like to talk about and what captures
their readers’ interests.
500 words of notes on everything you read and learn and watch and listen
to
250 words journaling your state of mind and your goals (journaling is a
great way to time travel)
250 words of actual writing meant for others to read - documentation,
blogposts, etc.
That doesn’t look so bad, does it? Of course, tweak it however you like. The
way you count words is really up to you. When Nathan Barry committed to
1000 words a day, significant acts of creation - like recording a YouTube video
or podcast - counted towards his quota. For me, tweets and code do not count.
Brain dumping a list of ideas, like I did before I wrote this essay, counts.
Writing summaries of articles and private journal entries count. You might hold
yourself to different standards. Your life, your rules.
If the 1000 a day pace is too much given your existing commitments, take it
slower for longer. 800 words a day for five years. 666 words a day for six
years. 400 for ten. Adjust to taste! It’s a marathon, not a sprint.
All that, from a simple commitment of writing a million words, on the most
interesting things to you that are also interesting to others. It’s simple, not easy.
You may encounter many personal obstacles to completing this. But if you can
overcome them, I really don’t see how you cannot succeed.
It’s the same with your writing, your personal brand, your career. It’s your
baby. You’ll figure out how to parent it once you realize it’s yours and you have
no choice but to do it every day.
It can help to find a community of people going through the same thing as you
are. A bunch of writing commitment platforms exist: 750 Words, Diary Email,
WriteNext, Commit, Reddit’s No Zero Days, and Writing Prompts, or this book’s
own community. You can even write in a Git repo and use GitHub’s streak
tracker as a commitment device. Whatever floats your boat!
This chapter isn’t writing advice. This is advice to write. I have writing advice,
but you can only get there once you write like you breathe.
“I write because I’m scared of writing, but I’m more scared of not
writing.” – Gloria E. Anzaldúa
Chapter 19
Pick Up What They Put Down
Let’s say you’re sold on the idea of Learning In Public (Chapter 9). You want
to start right away but are feeling intimidated at all the advice out there:
“Just start a blog for the past you!” but you’ve done that before - and no
one read it - and you lost interest.
“Ask people what they want to read!” but you don’t have people to ask,
and people always say yes to free content anyway. Which you write and
they then don’t read. So you lose interest.
“Don’t worry it takes a while to get an audience!” but all the people
telling you that are unrelatable because they’re already successful in your
eyes, so you lose interest.
In the past two years I’ve talked to a couple hundred people at various stages of
their #LearnInPublic journey, and of course I went thru it myself. It’s still too
hard to start, no matter how many well-intentioned voices tell you what they do
and how they did it.
I think, like any new habit or diet, the best plan for you is the plan you can
stick to.
After doing a lot of thinking, I have a hack for you. It is six words long:
What do you mean by “put down”? Any new library, demo, video, podcast,
book, blogpost, or course that they put out. It is important that it be new. By
virtue of it being new, it is simultaneously at the top of their minds, and also the
most likely to lack genuine feedback.
How do I pick “it” up? Here is a nonexhaustive smattering of ideas for you:
If it’s a new library, go try it out. Report bugs, ask questions about ANY
confusing documentation, make a demo using the library, then blog about
it!
If it’s a new demo, go read the source code! Then write a walkthrough of
the source code explaining everything in your own words.
If it’s a new video/talk/podcast/book/blogpost, summarize it in your own
words.
If it’s a new course, go through it, highlight the top three things you
learned.
Sketch notes for literally anything are always LOVED.
Tan Li Hau literally became a Svelte maintainer by picking up TODO’s in
the Svelte codebase
Come up with your own ideas, I’m not the boss of you!
The BIG requirement about any of the above is that you MUST genuinely
love/be excited about the thing you’re picking up. If you don’t love it, move
on quietly. You don’t want to build a brand of shitting on things people put out.
You must also close the loop - when you have produced anything (e.g. a
blogpost) based on their work, tag the creator in social media. Twitter is
inherently designed for this, but you can also reply in a comment or email it to
them with a nice note.
If you try your very best to understand the topic, AND you still get something
wrong, you will be corrected. If you keep your ego small, you will handle it. In
fact, being wrong in public will be your biggest source of personal growth.
Activity on the Internet has an insane Zipf’s law distribution. This is sometimes
called the “one percent rule” - 90% of people passively view content, 9%
comment on content, 1% create. I would endorse this but for the fact that it’s not
extreme enough:
Basically, the correct number of passive consumption is closer to 99%, and less
than 1% even comment on newly created content. I’m not exaggerating in the
least.
What’s the strategy? Say it with me: PICK UP WHAT THEY PUT DOWN.
There is a dire lack of feedback everywhere. Yes, there are industry superstars
with inboxes too hot to respond to. You will get ignored. But even they go out
of their way to respond to some feedback. And we already established there
aren’t too much of those.
On Twitter in particular, people can be shy promoting their own work. But if
someone else on the Internet says nice things about their work, well, shit, they
can RT that all day long.
Read Nir Eyal’s Hooked model for more explanation, but basically we are
setting up:
I virtually guarantee you get feedback on at least one. If you don’t aim too high,
you will go three for three.
Do this 12 times.
You will end the year having learned a good deal and having made many new
friends along the way. Including me… if you (ahem) tag me.
Chapter 20
Part III: Strategy
Strategy applies anytime you make major irreversible decisions, in the face
of uncertainty. Let’s discuss the major Strategic decisions that you will
encounter in your Coding Career:
Career Strategy:
Business Strategy:
I’ll use the language of James P. Carse’s Finite and Infinite Games:
Strategy in Games offer you infinite runs of a Finite Game, where you
have almost perfect information and the rules don’t change.
Strategy in Life gives you one run of an Infinite Game, where
misinformation outnumbers information, and the rules are constantly in
flux.
For those who work inside Google, it’s well worth it to look at
Jeff (Dean, head of Google Brain) & Sanjay (Ghemawat,
cocreator of MapReduce) ‘s commit history and code review
dashboard. They aren’t actually all that much more productive in
terms of code written than a decent SWE3 who knows his
codebase. The reason they have a reputation as rockstars is that
they can apply this productivity to things that really matter;
they’re able to pick out the really important parts of the problem
and then focus their efforts there, so that the end result ends up
being much more impactful than what the SWE3 wrote.
Engineering Leaders can make disastrous decisions. This sounds
obvious in the abstract, but in the workplace it is common to accept the
HIPPO (Highest Paid Person’s Opinion) with no critical thought. This has
direct implications for your career - you clearly want to work on projects
that will be successful. Imagine working under Vic Gundotra on Google
Plus. Or on Digg’s v4 rewrite following a Google algorithm update. Or the
thousands of other less dramatic failures that get swept under the rug in
tech. You need to understand the larger context your coding lives in; to
push back when appropriate (tactful pushback is a GREAT career skill); and
to ask for reassignment when you are being pushed into unsalvageable
failure.
Agency. You own your career when you start being aware of what’s around
you and taking control of what you work on. Agency = Resourcefulness +
Initiative. A decent programmer used to be able to work at IBM for 30
years, with the expectation that IBM would take care their career if you just
stick with them long enough. Those days are long gone. Jobs today are
bifurcated - you either tell a machine what to do (you live above the API) or
a machine tells you what to do (you live below the API). You can choose to
take control, or be controlled. Act, or be acted upon. A good manager will
be your ally in your personal journey, while a bad manager will only see
you as a tool to accomplish their goals. But even with a good manager you
bear ultimate responsibility for your career. Never them.
This was first formulated by Henry Mintzberg as Plan, Pattern, Position, and
Perspective - because business types love alliteration - with a 5th P for “Ploy”
added for decoy/fakeout plays. I have redefined these elements so as to be more
applicable for Tech Strategy and your personal career strategy.
It helps to know what is Good and Bad Strategy. Fortunately, there’s a book for
just that.
Good Strategy:
Bad Strategy:
Everything I have described may feel a bit out of reach. You aren’t a general or
a founder. You aren’t even a senior engineering leader yet. I get it.
But strategy applies anytime you make major irreversible decisions, in the
face of uncertainty. This makes intuitive sense. If some decision was
reversible, you’d just try it and “see what works.” And if you had no
uncertainty, your decision would be obvious. As with all decision making, “no
strategy” is also a strategy - it is you trusting your fate to the strategic choices of
someone else. If you hope to grow professionally, nondecision will be
increasingly less valid.
This section will help you think through major strategic aspects of a coding
career: how to bet on technologies, whether you should be a specialist or
generalist, technology business models, and everything in between.
You should also try to develop a mental framework for understanding reality.
Yes, that felt as absurd to type as it was to read. Tech is immensely complex and
noisy, yet there are clear supercycles and winners that you need to stay on top
of. You need a way to filter and organize information about information
technology. We will touch on Systems Thinking, Ecosystem Awareness, and
Megatrends.
Because you should understand the economics of what you work on, I will also
introduce the basics of Tech Strategy. Advertising vs SaaS vs Marketplace
business models. Horizontal vs Vertical. And other ABC’s of the Business of
Software.
Teaching Strategy is an ambitious task. I’m not an expert. I don’t know your
specific situation, and the experiences of me and my friends may not be
representative. My hope is to teach you to think about Strategy, rather than do
the thinking for you.
As a software person, your skills are transferable, so you are less locked in than
people in other professions. Finally, on a long enough time horizon, most
decisions become reversible. If you feel stressed out, take a longer view. This,
too, shall pass.
A final thought: Peter Drucker is famous for saying that “Culture eats Strategy
for breakfast”. Whatever fancy strategy you or your leadership adopt, remember
that people are always at the heart of your work, and great people can overcome
bad strategy when united by a strong culture.
Chapter 22
Learning Gears
I can think of four gears of Learning In Public.
22.1 Explorer
Your Explorer gear is your high speed, low power gear. You’re just trying to
cover as much ground as possible, in many directions.
The main problem to solve is that you don’t know what you don’t know.
The creative exhaust you make are mainly notes to self, possibly in terms
only you understand, possibly noting problems only you have. This is
mostly in gists and blogposts and tweets and (good) StackOverflow
questions, because text is cheap to produce, although Twitch streams are
also on the rise. You are often laying out literally your entire state of
knowledge for a metaphorical rubber duck, looking for holes and
documenting for the future.
Your public output is episodic - there is no unifying theme - you are just a
field correspondent reporting from whatever foreign land you find yourself
in. This is still useful, because you can’t connect the dots until much later
in life.
The public commitment level is low, usually doable in one day sprints, so
this is a great way to get started Learning In Public and also finding what
resonates so you can switch gears. It is easy to fall off the wagon though,
because no one’s really expecting anything from you, because you haven’t
committed that much.
22.2 Settler
Your Settler gear is a high speed, high power gear. You’ve found good, fertile
ground, and there is an established playbook you can follow.
The main problem to solve is one of pure learning. You know what you
don’t know, and your sole job is to learn what everyone else already
knows.
The creative exhaust you make are still notes to self, just like with the
Explorer gear. Your task is to move up Bloom’s Taxonomy (discussed in
Chapter 9, Learn in Public) as quickly as you can, and to explore the
knowledge graph of your technology (discussed in Chapter 11, Know Your
Tools).
Your public output is less essential - a lot of what you are learning will
already be stated very well elsewhere. However now you can have a
unifying theme, because you are focusing on something! A great thing you
can do here is to keep a cheatsheet and list of links to what you have found
helpful in your journey (a great form of Open Source Knowledge –
Chapter 13).
The public commitment can be a bit higher, for example by reporting your
progress on social media and doing daily streaks like 100 Days of Code.
This can be helpful in providing motivation and external reinforcement for
your progress – note that people can be very helpful and forgiving
especially when you note you are just learning in public rather than being
an expert.
22.3 Connector
Most people should aim for your Connector gear to be their default. This is a
powerful, yet nimble gear. You connect people and ideas.
The main problem to solve is that you know things others don’t know.
Hence you should share that and they need to hear you. That takes a little
extra effort.
The creative exhaust you make is explicitly meant for others. This
means some effort is required that isn’t just about your learning, but more
about making things easy to digest. Here are the talks, tutorials, cartoons,
cheatsheets, books, etc - Higher effort, higher usefulness, longer lasting.
You usually arent sharing everything you know, though, so it can feel like
you’re learning less. However, this is the best way to master fundamentals
because you are forced to cover your bases and be able to answer questions
you haven’t thought to ask.
You don’t have a grand overarching theme to your work, that one thing you
are known for, but usually you are juggling multiple themes, and also
learning and teaching about their intersections.
The public commitment is moderate - usually for a few weeks or months -
and often involves active exercise of soft skills that you may feel ill
equipped for. Check your ego at the door and learn that too. You are
“putting yourself out there”. But also remember Learning In Public is an
art, not a science: always rely on and refine your taste rather than
objectively trying to please everyone. Find your people, lean on strengths
you always thought were irrelevant for coding. You are presenting yourself
as an expert here, so make sure you cover your bases responsibly so as not
to mislead beginners.
Examples:
22.4 Miner
Reserve the Miner gear for when you’ve struck gold. Something that resonates
with people, that you are also abnormally fascinated by. When you strike gold,
you’ll know. Stop and plant your flag – this is where you should definitely
choose to become a Specialist over a Generalist (Chapter 23). Then dig in for
years – this is a low speed, high power gear.
The main problem to solve is that something important is too hard, or the
world knows too little about something this important. Therefore you dive
deep into something nobody else does.
The creative exhaust you make is very specialized - you do research and
build community and infrastructure. Miners are also Builders – they
build whatever is necessary to achieve that ultimate end goal. What you do
is meant to last. Before you, the thing was very hard, or impossible. After
you, the thing becomes much easier. The world will thank you.
You now have one theme that not just unifies your work, but that you
become synonymous with. Every person in the world who has the problem
you solve, will eventually find you, because that is how the Internet works.
(Coincidentally, you no longer need to “put yourself out there”, people will
come to you.) This might feel boring since you’re just about one thing all
the time, but what seems like one topic to you today (e.g. Machine
Learning) will eventually subdivide into different disciplines when you go
deep enough (e.g. Supervised Learning, Unsupervised Learning,
Reinforcement Learning).
The public commitment is very high - on the order of years and careers.
You’re digging a mine and spending energy far more than any other sane
person is doing - it helps if the area you’ve chosen has a good chance of
widening and deepening at the same time you’re mining. So have some
form of macro thesis for why this field in general will be increasingly
important. (More in Chapter 24, Betting on Technologies and Chapter 28,
Strategic Awareness)
Examples:
When you know where you want to settle and focus, become a Settler. Learn
how to learn, and learn what everyone else already knows about the topic.
When you have a good sense of the terrain and see other Explorers you can help,
start being a Connector. Link people and ideas, use your full creative talents.
Go back and cover gaps in your knowledge.
If you find yourself tripping over gold, start Mining. Dig into what people don’t
know, talk about what people don’t know they don’t know, build infrastructure
and communities to make it all easier. If it turns out a dud, switch gears, no
shame in moving on.
It is hard to discuss this topic intelligently when people cannot even agree on
definitions. Someone who looks like a generalist in certain circles, looks like a
specialist to everyone else standing outside that circle. Specialization is in the
eye of the beholder.
Consider Michael Phelps. In the 2008 Olympics he won 8 gold medals. Eight.
(The guy is so ridiculous that he set a record for setting records.) To most
mortals, he looks like a swimming specialist - you wouldn’t put him in a
basketball lineup, for example. To swimmers, he looks like an untouchable
generalist - setting solo and relay world records in freestyle, butterfly, and
medley categories at multiple distances in the span of seven days.
You don’t have to be at a scrappy startup to do this. Generalists can get things
done inside BigCos by being able to work better with counterparts, and/or
sidestepping the formal process and doing it themselves when politics and
prioritization get in the way.
With some specialised Platform as a Service services like Firebase and Amplify,
frontend devs could also get in on the game:
Of course, this is a tired meme now, and more enlightened takes - like hiring
“full stack teams” - have emerged.
However there are clear benefits to being generally capable. If you are on a
small startup team, you will generalize and handle things that you’ve never
trained for - which makes you a GREAT generalist hire for future teams. Even
in a large company, being able to speak the language of your counterparts can
help you get what you need more effectively. And nobody said that being a
“generalist” has to mean exactly equal competence on all dimensions.
This combination of breadth and depth is, of course, appealing, but convenient in
its avoidance of acknowledging any real tradeoffs. The straw man argument
here is that by this definition, virtually everyone who is considered a specialist
can be considered T shaped, because what person doesn’t try to develop other
basic skills in order to function?
Of course, if tradeoffs don’t exist, why not go further? Scott Adams says we
should become very good at two or more things. Be a “Pi Shaped” person!
Thanks Scott!
And while we’re making things up, why stop there? You should be a Comb
Shaped person instead!!
I’m throwing shade not because people like this don’t exist. They do. It’s just
not helpful general advice, because these discussions conveniently leave out
having to give up anything of consequence in order to get these advantages, or
act like what shape you are is more choice than chance. <sarcasm> The
downsides are always small, the upside is always huge. Great. Nice Medium
article. Life changing. </sarcasm>
Probably the best take I’ve seen is Jeff Scott’s reply to me:
Malcolm Gladwell’s Outliers popularized the “10,000 Hour Rule”, arguing for
extreme specialization. Then David Epstein’s Range made the case for the total
opposite.
The world will never stop coming up with ways to tell you that you are not good
enough, that you are missing out, that you should do the opposite of what you’re
doing. It is difficult to read (and write!) advice that fundamentally accepts that
there are multiple paths to success. The real debate is less an outward facing one
of What The World Wants, and more an inward facing one of What Do I
Want.
Only you can answer that. I’m confident that once you figure it out, you’ll find a
way to be successful at it, whether as a generalist, specialist, or comb. Shape
your world to fit you, rather than twist yourself into what you think the world
wants.
Most people have a wide range of interests anyway; in other words, the
natural tendency is to be a generalist and to learn Just in Case. So you need
to lean against the bias in order to achieve the right mix.
You will seldom be forced to specialize, but you will be forced to
generalize. Since specialization thrives with leverage, you will mostly
choose to be in those positions where you increase your specialization.
However, when you are thrust into situations of needing to be self-
sufficient, e.g. in a small startup, you will be forced to generalize anyway.
Learning how to be an Expert is a skill in itself. When you start a lot of
things you just get good at being a starter. This is a fairly mundane process
of doing the things everybody knows you should do to get started - reading
docs, going through tutorials, making toy projects. When you become an
expert in something, you also learn how to be an expert. You know what
it’s like to push past the first Dunning Kruger peak, feel the depths of the
ignorant intermediate, and to see things through to become advanced in a
domain. This makes all subsequent expertise gain easier.
Specialization is Fractal. Because you lack domain knowledge, what
looks like specialization to you now may not look like it the more you learn
about the domain and the deeper you go. Experts thrive on narrowness.
When PhD students write their theses, they don’t address all of politics, the
stock market, or the human body, they study narrow things like the political
landscape of a particular year, the valuation vs momentum debate, or how
sleep affects productivity. Mastery needs a boundary.
To paraphrase Tim Ferris, probably all of the developer heroes you look up to
are walking flaws who’ve maximized one or two strengths. Here’s Dan
Abramov’s list of Things He Doesn’t Know - that he knows he doesn’t know.
“You are not superior just because you see the world in an odious
light.” - François-René de Chateaubriand
First we should discuss the gloomy specter of the pessimists. A great way to
limit downside risk is to simply never take any risks. You hear this a lot from
jaded developers, who are often right about certain technologies being overrated,
but are also very keen on making sure everyone knows how much they don’t
care.
This is, of course, not a great personal brand, but more importantly, I always
think about the adage that “a broken clock is right twice a day”. Yes, tech
trends are cyclical, and often what’s old is new again, but it is objectively untrue
that technology never progresses.
The cynical dev thinks technology never changes. The optimistic dev
persists in trying to change technology. Therefore all progress
depends on the optimistic dev.
These are fine, but they are all imperfect proxies for things we actually care
about - how useful the technology is for our needs. As a rule, the easier to
obtain the data is, the less value it has. We care about popularity to the extent
that it de-risks your choices - bugs are more likely to be caught, documentation
is likely to be complete, and third party libraries are available to fill any gaps.
For the really big technologies, jobs are likely to be available. But as we grow in
our dev capabilities and preferences, what other people like is increasingly less
relevant to us.
Note: see Good Enough is better than Best (Chapter 16) for a deeper
discussion!
24.3 How To Be Early
As a technologist, you will frequently find yourself on either side of Geoffrey
Moore’s “chasm”, either as an Early Adopter or as part of the Early or Late
Majority (see Chapter 28, Strategic Awareness for an in-depth explanation).
The career upside, and risk, of betting on tech early is well understood, but it is
worth discussing how early to be and where in the stack to take risks.
As you build things and grow comfortable with your stack, you should be
mindful of where your productivity isn’t as great as it could be. Some of the best
developers you’ve heard of made their names because they have a “low bullshit
tolerance” - leading them to create the tools, libraries, and languages that they
then become famous for. It turns out that a lot of developers share the same
frustrations as you do - but don’t do anything about it, because they can’t
imagine a better way, or don’t mind working around the technology’s limitations.
I call this “Exposure Therapy”. It’s like a neat inverse to Second System
Syndrome. You’re not evaluating things in order to switch - you’re opening your
mind to what’s possible out there, so that you don’t get too comfortable with the
status quo. Conferences and YouTube channels are very good ways of exposing
yourself to alternative ecosystems, because you can try to understand ideas and
observe effectiveness at a high level without getting lost in the details.
Keep a list of the problems you constantly run into again and again. Here’s a list
for UI Engineering. Solutions come and go, problems always remain.
When you know what you’re looking for, it’s easier to sift through the noise
and evaluate new solutions. Having built a sense of what’s missing in your
world, it’s much easier to go through the constant stream of new projects and
launches, and pattern match against how the new technology could fit in your
workflow.
24.3.3 Evaluation
Be careful not to only judge the project based on how it is today. If you’re early,
there will almost always be problems with it. It may have lousy docs, be full of
bugs or have missing functionality. This will make it look inferior to alternatives
that exist today. That’s not what you’re looking for. You’re looking for the core
idea, the thing it does differently, and, assuming everything else is fixable (it is),
how game changing that would be to your world.
Ben Horowitz, of Andreesen Horowitz, is fond of explaining it this way - New
technology is usually inferior to existing alternatives in every way but one.
He applies it most to crypto, but we could easily argue this for NoSQL or React
or any other major new wave in tech. In Thomas Kuhn’s The Structure of
Scientific Revolutions, he shows how almost every significant scientific
breakthrough is first a break with tradition, old ways of thinking, and old
paradigms. This is why we sometimes call them paradigm shifts.
You should also be aware that the technically superior project often does not
“win”. Often this is because the superior qualities require too much change,
whereas the “less superior” project compromises technical merit for
compatibility. Economics rewards evolution over revolution. This happens
again and again in tech history, from VHS vs Betamax, to React + Redux +
TypeScript vs Elm. Of course, in personal projects, you shouldn’t need to care
who “wins” (as we discussed in Chapter 16), but that changes when you are
literally trying to bet on a winner for career or investment purposes.
Even after careful risk management, selection, and evaluation, there are still
many people who try to keep up on every new thing. Unless this is literally your
sole job, don’t do this. It is a fast track to burnout. Try to have an investment
thesis for how the technology fits into a longer lasting Megatrend
(Chapter 29)that makes your investment worth it.
Dave Rupert of the Shop Talk Show had a great analogy for this:
“When you surf, if you paddle for every wave, you just get
destroyed… You hurt and out of breath and it’s dangerous, to be
honest, because you could literally drown. You see the good surfers.
They just effortlessly paddle out. They figured out how to do that.
They sit out there until a big wave comes. They know how to find a
big wave. Then they say, ‘Yeah, I’ll ride that big wave because that
big wave is worth my time.’ They don’t waste energy. All energy is
put towards good surfing.”
24.3.5 People
The other factor to weigh heavily is the people behind the project. If the
project maintainers have a track record of running high quality projects, that
should be an immediate upgrade in terms of your interest level. Of course,
famous maintainers will already have this halo effect surrounding all their work.
But you should be paying attention to the lesser known ones as well, who aren’t
as much in the limelight but who steadfastly put out quality open source and
tooling that you rely on.
When it comes to People involved early in a new project, you have an ace in
your hand. You. When you choose to become actively involved as a
maintainer/contributor, instead of just as a passive user, you gain the power to
affect the direction and potential upside of the technology. Being Early is the
best time you can tie your career to a technology and grow as it grows. You
basically buy a career call option on the tech, which is even better than owning
equity. If it works out, your career benefits from your involvement and
contributions. Jessie Frazelle’s career rose with Docker, Charity Majors with
MongoDB, Ryan Florence with React, Kelsey Hightower with Kubernetes.
None were project originators, all just decided to join while still early and reaped
the rewards of the contributions.
“The best way to predict the future is to to create it.” - Dennis Gabor
Resiliency
Velocity
Interoperability
Simplicity
Security
Maintainability
Performance
Compatibility
Availability
Sometimes you get lucky, and the community leaders actually write down their
values on a document. The published Goals and priorities for C++ list just six
goals and four non-goals. Even then, proclaimed values are only half the story -
actions tell the other 99%.
25.1 A Disclaimer
If you see people acting one way while vehemently denying its very existence,
you may have hit on some fundamental, inconvenient, truth. That is how I
warily, carefully, approach this loaded topic. It is extremely loaded because it
concerns the relative worth of employees, which is not at all polite conversation.
My only goal here is to offer you first exposure to the received wisdom on this
topic for those who haven’t even heard of this, and then to leave you to come to
your own conclusions. I don’t even know how to feel about it myself, apart from
the fact that I very definitely have mixed feelings on the topic.
25.2 Definitions
Alright, I’ve covered my ass. Here goes:
Now, as a developer in a dev team: Which are you in? Which do you want to
be in?
The problem is that these concepts don’t exist in formal accounting. They are a
matter of perception, and therefore sometimes the subject of intense politics and
spin:
When I was in investment banking, we not only directly acknowledged the profit
center/cost center divide, we formalized it in department group names:
“Sales and Trading” and Corporate Finance directly dealt with clients,
closed deals, and booked revenues, hence they were the Front Office.
Risk and Compliance reviewed deals for regulatory, market, and
counterparty exposure limits, therefore they were the Middle Office.
Accounting, Logistics, and Operations did the dirty jobs of confirming and
clearing trades with their counterparts at other institutions, the final step of
any trade or deal, hence they were the Back Office.
The bewildering array of departments in the bank was originally hard to
remember, until a trader pulled me over and explained, “Look, it’s simple. You
make more money the closer you are to The Money.” (In a bank, “The Money”
meant either the clients, who had the money, or having executive decision on
deals, where the bank made money.)
It was true. Front Office people could make millions as a cut of the revenue they
brought in. Sharp suits, flashy smiles, corner offices, busy busy. Middle Office
people mostly consisted of retired Front Office people or model quants (people
who measure risk rather than take it). Back Office was generally the lowest paid
and had the worst literal office space and budget. Dim lighting, TPS reports.
Promotions went one way (from Back to Middle to Front) but never the other.
Can you spot the profit center and the cost centers? Look, I pass no judgment on
whether this is the right way to run a business and treat employees. I merely
observe that this is a thing that happens.
It isn’t about power - if you screwed up something, the social structure inverted.
Middle Office’s sole job is to rein in Front Office people when they overstep,
and Back Office can make Front Office’s lives a living hell pretty much on
command, as there is always something they screwed up.
If you are interested in doing research and doing cutting edge work, get an
Investment Center job, free from the shackles of financial accountability.
You’ve probably heard of the amazing advancements that came out of Xerox
PARC and today Microsoft Research and Google X are probably its spiritual
successor. However it is true that there are much fewer corporate research labs
today than before.
When the company isn’t doing well, the company is loath to let go of top Profit
Center people, because they have to do the math around the loss in revenue vs
the money saved. Cost Center people are net money burners though, so it is
easier to let some go and ask those who remain to do more. This isn’t always
true; when the economy is tanking or the competitive landscape has shifted,
there might be not enough market opportunity to keep around Profit Center
people. If your company has salespeople, talk to them about how they break
down sales pipelines for more information.
Profit Centers and Cost Centers can’t live without each other. They are partners
more than competitors. Profit Centers don’t deserve 100% credit for all the
profit they make, because Cost Centers make it possible for them to get that
revenue. Cost Centers aren’t to blame for 100% of the money they spend,
because they to a large part spend it on behalf of Profit Centers. And yet
companies sometimes forget.
If you personally have been through some of this - I’m sorry for bringing it up -
but also we should consider where the developer sits in all of this.
On one hand, developer efficiency is a point of pride. The company does want
you to get more done with less. Developers don’t have direct revenue
attribution, and dev teams sure do spend a lot of money. When you design
scalable systems, you are “doing more with less” - hopefully the cost to maintain
the system grows sub-linearly relative to the number of users of the system, for
example. Arguably you are a high-performing cost center.
On the other, developers are highly paid, highly in demand, have great offices,
and when a new market opportunity opens up, more developers are needed to
write the code to go after that opportunity. When you create a feature used by
millions, like Snapchat Stories or Facebook’s Newsfeed, that then drives billions
of market value to the company, you are most definitely a profit center.
You can make a good case for either side, even for the exact same job! Consider
the Billing Engineer - their job is to make sure bills go out, and payments get
processed, with discounts, dunning, and upgrades applied appropriately. Seems
like a reliability/stability/efficiency issue. But if they make even a 1%
improvement in recovery rates, that’s real money. You literally cannot get closer
to The Money than the Billing Engineer.
I think what you are depends on how you are perceived by management. If you
sit on a product team that is going gangbusters, you are now a profit center,
because you helped make that. If you work on a project that doesn’t make
revenue yet, you work on an investment center. If your company/team/manager
fails to translate your work into business results, you are a very expensive cost
center. Regardless of what you are, it is possible to do well in any of these
roles by beating expectations. Just understand how beating your quarterly goals
might not translate to long term reward from the company if you’re simply in the
wrong strategic place at the wrong time.
The entire Strategy section of this book is dedicated to helping you select
projects and companies where you will be a profit center, and if you aren’t in
one, to understand how to potentially turn or pitch your work into something that
is a profit center. But regardless of where you sit, do always acknowledge the
contributions of the people who helped you along the way.
Chapter 26
Career Ladders
“What will it take to get to the next level?”
This is a very open ended question, but it can be nice to set some guidelines
around your company’s expectations. As an individual contributor, career
ladders tell us what the company ostensibly values (and, by omission, what it
doesn’t value). Because they are formally endorsed systems, you should plan
your strategic choices around your company’s ladder. However, you should try
to value doing the right thing and being a good teammate, over mercenary
optimization to check boxes on an assessment rubric.
Companies generally start introducing formal ladders once engineering gets past
40-50 people. Given a standard ratio of 1 manager to 6-8 engineers, that means
between 5-8 engineering teams - just about the breaking point where a VP of
Engineering stops being able to equitably manage the career progressions of
everyone on a case by case basis. If you see an opportunity to ask for formal
laddering, go for it. Your leadership in the matter will give you a voice in setting
up the system you work in.
Many engineers feel the need to go into engineering management to reach the
next level. However, the demands of managing people instead of code are
wildly different (as discussed in (Chapter 7)). This can burn out the employee
and cost the company a great engineer, in a perverse form of Peter Principle.
Companies combat this by establishing an equivalent technical leadership track
alongside the natural managerial tracks that form, in the hopes of creating viable
career paths for excellent engineers who don’t want to manage people. This
“Technical Leadership” or “Individual Contributor” track is what we will focus
on for this chapter.
Some companies want to be flatter organizations, and actually stop at the Senior
Software Engineer title - roles and responsibilities then start taking more
precedence than title. Others, like Netflix, only start at Senior Software
Engineer. Is it clear that there’s no industrywide pattern? Sorry.
The rest of this chapter is focused on giving you a general intuition for career
strategy throughout your coding career. This is difficult not least because every
company and every situation is different - however we do have a lot of hard data
collected from public engineering ladders (see below). We can combine that
with intuition and anecdata from shared experiences to arrive at some probably
good ideas.
26.3 What Companies Want
There is some consensus on what to call each experience level. If we had to
condense each:
This loosely maps to the five-stage Dreyfus model of Directed Skill Acquisition:
Technical Competence
Execution
Communication
Influence
Technical Competence
Execution
Able to plan & execute large, complex projects with interdependencies
across teams and systems, spanning months to years.
Looked to as a model for balancing product and engineering concerns.
Trusted with any critical project or initiative.
Owns capacity and growth of technical systems across multiple domains,
defining key metrics.
Creates a compelling technical vision with company-level impact,
anticipating future needs.
Communication
Influence
Fog Creek: from 2009, but obviously Joel’s thinking has been very
influential. Focus is on growing ownership, ability to write production code
independently, shipping experience, and at senior levels,
design/planning/architecture. Teamwork, self study, mentorship, and
impact are all key, as well as the Joel Test.
Rent the Runway (spreadsheet): from 2015. Takes a fun D&D inspired
Dex/Str/Wis/Cha stats based evaluation, corresponding to technical skill,
productivity, impact, and communication/leadership. Management track is
also included, with more focus on architecture, hiring, organizational skills,
and leadership/salesmanship.
Artsy: inspired by Rent the Runway
CapGemini UK: also inspired by Rent the Runway
Basecamp: Pretty minimal, just like the rest of the company’s ethos.
Thumbtack (spreadsheet): from 2019. Breaks down technical skills into
code quality/testing, debugging, and scoping/project design, and
nontechnical factors to collaboration, citizenship, leadership, and
impact. Leadership is interestingly broken down into Autonomy,
Judgement, Initiative, and Consensus Building.
CircleCI (spreadsheet): one of the most well known ladders, detailed but
not overwhelming. Notably, one of the values assessed is Security.
Envoy: pretty simple ladder list, by a hot company.
Financial Times (webapp). Even has an API! Only four areas across
Technical, Leadership, Delivery, and Communication are assessed. Feels
manageable.
Patreon: focuses on five dimensions of Technical, Execution,
Communication, Influence, and Maturity
Meetup: splits roles into Makers and Managers.
More ladders (non engineering) are available at Progression.fyi, which can help
give further grounding for companywide leveling. See also the Holloway guide
to Job Titles and Levels.
Chapter 27
Intro to Tech Strategy
This is a very high level overview of tech strategy. That is, the business of
software rather than the art and science of creating software itself.
It goes without saying that your coding does not have independent value. It must
be applied usefully on some economic problem to have sustainable real world
impact.
Even if you don’t care about that, and never intend to be a founder, your
understanding of the business you’re in allows you to offer suggestions and
prioritize work in alignment with economic opportunity. It may not feel like
much, but as the person closest to the code, you have a tremendous amount of
autonomy to the final experience delivered:
As you advance in autonomy, you will get to pick the projects you work on, and
even pitch new initiatives that you eventually own (this is a GREAT career
move).
If you read the story of how Google Maps’ Satellite view was almost named
“Bird Mode” due to a CEO decision, but was ignored by the product team, you
will understand how your broad-ranging powers even go as far as naming
products, which is in no developer’s job description. When the chips are down,
Developers are designers and product managers of last resort.
As you increase in seniority, you will also have to grow in your business
judgment. In fact, taking a glance over any Engineering Career Ladder
(Chapter 26) will tell you how important your business impact is to your career
advancement.
Finally - the technologies that you work with are also strongly influenced by
their economic incentives. “Free and Open Source” does not mean “Free of any
commercial considerations.” Nor does it mean “Open Direction decided by
Direct Democracy.” The platforms you run on , whether it is the browsers,
public clouds, databases, payment/fulfilment platforms, or even language
distributions, all have massive investments. Well above 10 figures in some
cases!
This is now widely understood in the software industry, and you should at least
be aware of it even if you disagree with it. (Though it does make the software
engineer the center of the new world, so you will probably like it a little bit!)
There are two other analogies typically offered to describe this divide:
None but the most disciplined of businesses are 100% horizontal or vertical.
There is usually a healthy debate within the company as to which direction to
pursue, as both are valid ways to grow. But pursuing both can signal a lack of
vision and inability to accept tradeoffs and will lead to problems in resourcing,
product development and sales/marketing.
You’ll also hear this idea applied to other aspects of business - Horizontal vs
Vertical Integration, Horizontal vs Vertical Acquisition, and Horizontal vs
Vertical Strategy. They are all variants of business expansion along one of these
lines.
The most common ones you should be aware of are Agencies, Advertising,
Subscriptions, and Marketplaces. Most other companies that employ software
engineers have aspects of these embedded within them. I cannot do justice to
them in the space I have here, but I will at least introduce them and try to give
you enough to learn more.
27.4.1 Agencies
The Agency model is the most common one for small teams. I don’t have
numbers for this, but my guess is it is responsible for most tech jobs as well.
With an agency model, you have one or more clients and you are paid for
your time.
If you are a dev team within a bigger, non-tech company, you are basically
an in-house agency with one client.
If you are a consultant or freelancer, you are a one-person agency.
There are a thousand small ways to tweak dev setups and payment terms,
but broadly, as the amount of dev-hours grows, so does the amount of
money flowing into the agency.
Ideally, you should be trying to get the most done per hour, but cynically, bad
incentive systems can lead to just booking more hours. The common thread is
that your income isn’t fully pinned to the success of your client’s business,
which is sometimes a feature and often a bug of the Principal-Agent Problem.
Despite the flaws, agencies are still so popular because of the sheer amount of
work that needs to be done, and the specialized talent needed for certain types of
high skill work.
27.4.2 Advertising
The Advertising (or Media) model is next most common. Here you make
money by increasing the traffic to your site or usage of your product and then
selling advertiser spots.
Sometimes the advertising is display ads (paying for Cost Per Milles - aka
ears and eyeballs - just to be present and build brand awareness).
But most advertisers these days prefer performance based marketing -
paying for directly measurable user actions e.g. Cost per Click.
Most social networks and news/opinion sites run this way, though there is an
absolutely massive assortment of marketing technology to help ad buyers find
the best ad inventory. Because end users pay nothing and advertisers pay for
access, the derisive view is that “Users are the Product.” However this may not
always be a negative - the Wirecutter and the Points Guy are both well-regarded
high quality content sites that make their money from affiliate marketing, which
is a variant of performance based marketing (pay-on-purchase rather than pay-
per-click).
Social Media and Digital Media differ in one important way - digital media
companies have to hire journalists and editors to create the content that draws
people, whereas social media companies get User-Generated Content for free.
Social media is a unique intersection of tech and society, where we trade our
information and attention for news and social status. On paper you might be an
ads business, but as far as humans are concerned, you offer Status as a Service.
People literally compete to give you their best content for free. This sounds
like a wildly attractive proposition, and at first it was. You can see Reid
Hoffman’s Series B pitch deck for LinkedIn to appreciate just how compelling it
is. But in recent years the hidden “cost” of running a social media company has
emerged in the need for content moderation. You might start out a technologist
and end up spending all your time debating the fine points of 47 U.S.C. § 230
and having complex debates about deplatforming and misinformation.
With digital media companies, including podcasts, the trend has been toward
realizing that ads aren’t the only way to make money - you can charge your
audience directly! That leads us to subscriptions.
27.4.3 Subscription
Since users pay directly for the software/content/membership, and can walk
away at any time, the incentive alignment is clear - use subscription revenue to
make a better offering, which helps drive more subscriptions, which helps
finance a better offering, and so on. Since digital content can be replicated
infinitely, the gross margin and therefore cash flow of these kinds of business is
high. To grow, the business has to expand its marketing funnel, increase
conversion rates, keep a lid on cost of content (e.g. revenue sharing with content
creators), and decrease churn.
Most subscription businesses are a buffet - pay your subscription and it’s all-
you-can-eat. This has an inherent flaw - some people just eat a whole lot more
than most. This is expensive to support and the lighter users subsidize those who
“abuse” the platform (by bringing down average usage). Therefore all
subscription business eventually start charging per-seat, and then find their way
toward some form of metered billing (using some form of value metrics). Doing
this too eagerly can have the perverse effect of punishing your most engaged
users.
Fun fact: Marc Benioff is widely credited with inventing SaaS, and
ironically introduced it with the famous “No Software” campaign in
1999.
27.4.4 Marketplaces
Marketplaces are the hardest software businesses to build, and therefore there are
fewer of them than other kinds of business. However, once established, they
exhibit gobsmacking double-sided network effects, which makes them very
valuable (Bill Gurley describes marketplaces as creating “money out of
nowhere”). Developers both use and work for marketplaces every day without
realizing it - ranging from Airbnb and Uber to Cameo and Udemy (see this list
for more).
Marketplaces match buyer and seller, just like their offline counterparts. The
marketplace gives both sides an assurance of:
liquidity (buyers will be able to find what they want, sellers will be able to
sell what they have, and both can do it faster than anywhere else)
and quality (buyers are good customers whose checks don’t bounce, and
sellers must not sell fake or defective products, or they get kicked off the
platform).
In exchange, it takes a fee from either the buyer or seller or both. Because the
fee typically is a percentage of the money that changes hands, this is called a
take rate and marketplaces want to grow the Gross Merchandise Volume it is
based on. Take rates range wildly based on platform power - Gumroad charges
3.5% while Apple and Google’s app stores take 30%.
This model sounds simple, but there are a lot of ways to make additional
revenue. For example, suppliers often pay certification or listing fees, or they
could instead be paid to join. It also turns out that a marketplace’s own site is
prime ad space and that customers will pay for better service. So as your
marketplace grows up the Hierarchy of Marketplaces, you can build both an
entire advertising business AND an entire subscription business INSIDE a
marketplace business, which is what Amazon has done.
In a way, this is the business model to end all business models, because you
essentially now run your own economy.
Most platforms eventually add marketplaces, sometimes called App Stores. Fun
fact: Steve Jobs gave Marc Benioff the idea for Salesforce AppExchange, the
first “App Store” in 2005.
These benefits aren’t free - marketplaces are hard to build for a few reasons:
If goods are sold, you must handle the issue of fakes, lemons, and
returns. This might not seem fun, but Zappos made great return policy
a competitive advantage.
If services are sold, you must handle the billion things that can go
wrong when humans work for humans, and you’re not around to verify
what actually happened. Airbnb had to roll out a Million Dollar
Liability Insurance Program to reassure hosts, whereas Uber uses its
rating system to keep drivers in line.
The art of maintaining marketplace quality is an entire discipline of its
own. Underlying the entire discussion is the fundamental problem of
how to create trust between strangers. The best place to learn more
is Lenny Rachitsky’s research.
One way to get past many of these issues is to be your own supplier - so that you
only grow the demand side of the market. This is sometimes called “single
player mode”. If your “marketplace” has value without any network effects,
then it has a reasonably good chance of attracting enough people to get network
effects (Often referred to as “come for the tool, stay for the network”). You
could view all ecommerce businesses as “one-sided marketplaces”, although the
trendy term for this is Direct to Consumer or “D2C”.
27.4.5 Gaming
In reviewing this section, Julian Garamendy pointed out one other business
model that wasn’t quite accounted for: Gaming. Given that gaming is a huge
megatrend (we discuss megatrends in more detail in Chapter 29), I feel I must
discuss this somewhat. Some games, like World of Warcraft, are subscription
businesses. Others, console and PC games like Zelda and Red Dead
Redemption, are one-off purchases, akin to D2C ecommerce with entirely virtual
goods.
He’s right. The Bill Gates Line defines Platforms as serving an ecosystem that
exists because of them, but is also much bigger than them. And because
Platforms are such tremendous economic centers of gravity, we need to
differentiate them from your average, run-of-the-mill marketplaces (which, I
hope I have established, are powerful economic engines already).
The three most important platforms of all time are Windows, iOS and Android.
Per Ben Thompson, it’s no coincidence that all are operating systems:
Windows was the OS for the Desktop Age: Developers made apps to run
on Windows and manufacturers made hardware to run Windows, which
made Windows more attractive for both sides. Quoting Ben:
The end result was one of the most perfect business models ever:
commoditized hardware vendors competed to make Windows
computers faster and cheaper, while software developers
simultaneously made those same Windows computers more
capable and harder to leave.
iOS and Android are the OS for the Mobile Age: Developers make apps
for iOS and Android, and users are trained to find everything via the
Google and Apple Play Stores, which makes iOS and Android more
attractive for both sides.
Platforms exist on a higher level than business models - for Windows it was
licensing, while for Google it is ads. Yet the two-sided nature of a Platform
makes it seem like a Marketplace, and Bill Gates’ definition seems comparable
to GMV.
But Platforms don’t play the transaction volume game - their M.O. is to look at
the most critical use cases and to build them out as subsequent products.
Windows built out Office (Word, Excel, Outlook, etc), and then Windows
Server. Google built GSuite (Docs, Sheets, Gmail, etc), and acquired YouTube.
I mentioned that the usage of the term “Platform” is quite overloaded. Hugh
Durkin identifies three traits:
Search around and you’ll find more definitions. Everyone tries to put their own
spin on it, which mainly serves to show that it’s an important thing to be.
Not all Platforms are economic powerhouses. If the market is not a natural
monopoly, then there may be a lot of competitors, and a race to the bottom in
terms of pricing. This happens in many industries from publishing to
semiconductors. In fact there is often a phenomenon where platforms become
the least value-adding part of the supply chain, with relative power flowing to
creators and distributors. Stan Shih, founder of Acer, famously called this the
Smiling Curve, and the concept has been extended to everything from self-
driving cars to Taylor Swift (aka the music industry).
Note: If this seems strangely focused on the theories of one person, it’s
because Ben has shaped the entire zeitgeist of tech with this theory, to
the point of being quoted at Apple keynotes - so I feel compelled to
introduce it to you.
If you aggregate users, you call the shots. This means great user experience is
paramount, and explains the tremendous amount of investment in web and
mobile clients over the past ten years. (One answer to why React developers are
in such demand.)
Levels of Aggregators:
1. Supply Acquisition - they have a great user relationship, but buy their
supply, e.g. Netflix and Spotify. Content cost is a concern.
2. Supply Transaction Costs - they don’t buy their supply, but pay some
marginal costs to bring suppliers onboard, e.g. Uber and Airbnb.
3. Zero Supply Costs - they don’t buy their supply, and incur no supplier
acquisition cost, e.g. Amazon.
4. Super-Aggregators - they have at least three sides - users, suppliers,
advertisers, and have zero marginal costs on all of them. E.g. Facebook
(with Instagram), Snapchat and Google.
It can help to situate these two models by contrasting them. I’ll point you to
Ben’s writeup on his site:
Platforms (e.g. Windows) are critical for their suppliers (e.g. Windows apps) to
function, Aggregators (e.g. Google) aren’t critical for their suppliers (e.g.
websites) to function.
Platforms help people do things (aka Bicycles for the mind), Aggregators do
things for people.
To find more information, you can read Ben Thompson’s body of work - be
aware, his definitions changed between 2015 to 2019. Also, the commonly
accepted usage of the word “Platforms” also encompasses Aggregators.
One final point is relevant for us - Both Platforms and Aggregators make it so
much easier for suppliers to reach customers that it enables new types of
businesses to be created atop them. Apple, Microsoft, YouTube, Amazon,
Teachable and others have all minted millionaires, and developers can make a
great living working on them or for them.
I haven’t any room left but want to share a few more interesting dynamics you
can investigate on your own:
As discussed in Intro to Strategy (Chapter 21), The basic starting block for
Strategy is having a mental model of present reality. This is not only important
for making future plans (getting from here to there), but also for sifting through
the deluge of information coming at us from every angle.
This chapter is dedicated to giving you some basic ideas for where to start.
The idea is that people are happier, and more effective, when their Circle of
Influence covers a large percentage of their Circle of Concern. The converse, a
person whose Concern far exceeds their Influence, is one who spends their time
impotently raging and fretting. With the Circle of Concern, information is
pushed to you, and you are unknowingly manipulated by news cycles and
marketing calendars. When operating in the Circle of Influence, you have the
power to pull the information you need, and you gain back personal agency.
The real trick to these Circles, of course, is that they exist entirely within your
mind. You have the power to both contract your Circle of Concern (aka Focus)
and expand your Circle of Influence (aka Competence, Power, Network). The
rest of this book deals with your Circle of Influence, so here we shall concern
ourselves with helping you focus.
Have a primary domain that you concern yourself with - projects, news, and
discussions in this always take priority over everything else.
Don’t spend too much time on Hacker News, or on email news recap
newsletters.
Trim your unrelated follow list on Twitter (it is never personal, you can
refollow in future).
Learn Just in Time instead of Just in Case.
Prefer grooming relationships with people who know things you don’t
know, and resist the urge to learn everything yourself.
Get comfortable lampshading ignorance (Chapter 34). Having better
things to do than know everything is always a valid defense.
“Stop caring so much” is very persuasive, of course - but in tech, things move
fast, and sometimes you do have to keep tabs on things you don’t yet use. So we
need something more nuanced than a binary Concern/Ignore model.
28.2 Levels of Concern
For Enterprises, Thoughtworks has split out Circles of Concern into four levels,
called a Technology Radar:
Each level can warrant a different level of engagement. For Assess, it can be
sufficient to just listen to one regular “overview” podcast, like This Week in
Machine Learning. Trial technologies are worth looking through docs and
demos and trying on new projects. Adopt technologies don’t have to be things
you actively use in production, but as a professional in your field, you should be
familiar with and have opinions about (eg by going through talks, source code,
or following GitHub issues, Twitter threads, or email newsletters).
Know What You Want, and Know What People Want. You don’t have to be
interested in everything - knowing what you want can help you only look out for
projects that will be helpful to you, and knowing what people want can help you
pick projects that will be well received.
Your information inflow should be managed to help you create action. Not
quantity of consumption. People brag about how many books they read in a
year, or obsessively keep up with headlines (because of Fear of Missing
Information). Or you could clip and organize and summarize everything and
have gorgeous notes everyone fawns over. Great — if your goal is pretty notes.
Optimize for action, not consumption.
In 1957, Joe M. Bohlen, George M. Beal and Everett M. Rogers first proposed a
bell curve-like distribution of technology adoption, now known as the Rogers
curve:
It’s much easier and faster to become an expert in a subject still young
and evolving, and people are actively looking for new voices to listen
to.
However, of course there’s always a fear that the technology fails, and you will
have wasted a bunch of your time tearing your hair out over tech that nobody
really cared about. This is not quite true for a few reasons:
It turns out that not all the transitions between stages are equal. Geoffrey Moore
nailed this dynamic in his seminal book: Crossing the Chasm.
The “Chasm” thus named refers to the extraordinarily difficult jump between
Early Adopter and Early Majority. Early Adopters can be very forgiving and
imaginative, while Early Majority need a lot of the documentation and usecases
paved for them before they will jump aboard.
Marketing to and building for these two audiences are very different
propositions, hence the argument of the book is that the company or
technologist’s strategy must change drastically between every stage, especially
across the Chasm.
If you are keeping tabs on technologies, it can be very rewarding to watch for
technologies that are just teetering on the brink of Crossing the Chasm, and to
jump on just before, or help it cross.
You can look through Gartner’s writings over time for many, many, examples of
Hype cycle applied to different industries - I will not list them here.
A technology will go through multiple hype cycles over time. By some counts
there have been at least eight AI Winters. Yet the builders keep building, and if
you zoom out, these cycles smooth out over time. And that is what we will now
do.
Not to get all Calculus 101 on you, but if you took an integral to the Rogers
curve, you end up with an S curve going from 0% of the population to 100% of
the population.
And the spread of information technology also means technology spreads faster
over time.
If you lived through the Coronavirus Pandemic of 2020, you saw Zoom zoom
through this turning point - a video conferencing tool mostly used by techies,
suddenly became a household name for both students and retirees, with
unsponsored shoutouts by major television shows like SNL. Accordingly, new
problems arose - Zoom-bombing, more scrutiny on security practices, and the
need to manage massive thousand person events.
The Deployment phase can look very different from the previous - you go from
building the tech, to building on and around the tech. To give you an example
closer to home, I applied this to explain the rise of React metaframeworks:
If you are looking to build tech, understand where your tech is in the adoption
cycle through these mental models, and build what is needed.
In order to deliver apps, you chain tech components together (in a “value chain”)
to build them. Some of these, like electricity, are commoditized - cheap, and
highly available. Others, like cloud services, are productized - cheaper than
building yourself, and not core to your value prosposition. Still others, like a
proprietary compression algorithm, is “secret sauce” and must be coded by you.
One of the most salient driving forces in technology has been Moore’s law -
computer chip performance (loosely defined) doubling every 18 months for
50 years. Yet the person to make the most wealth from this trend has been
Bill Gates, who wrote the software that runs on this hardware - even if it got
worse at a commensurate rate. In fact a popular variant of Wirth’s Law is
christened Gates’ law: “The speed of software halves every 18 months.”
This is akin to the legendary founding story of Levi’s Jeans - during a gold
rush, sell shovels.
In much the same way, Larry Page and Sergey Brin made the most wealth
from the world going online, not the ISPs that helped make it happen.
Joel Spolsky (and later Gwern Branwen) wrote about this strategy as
“Commoditize Your Complement”. This assumes a great deal of agency on your
part, which you may not have since you aren’t Google or IBM. But you see the
influence of this law in every huge and aspiring-to-be-huge tech platform - it
puts itself at the center of its world, and commoditizes all the adjacent
technologies that it works with (often you hear this as “framework agnostic” or
“language agnostic” or “You can use ${THING EVERYONE USES} or
${DISTANT SECOND FEW PEOPLE USE} or ${THIRD THING NOBODY
USES} with us!”). Fill in the blanks with your favorite platform - If I named
names, I’d piss someone off!
The overall lesson is this: Look out for things which are rapidly becoming
cheaper/easier because adjacent things will become a lot more valuable as a
result. As a supplier and creator of technology, you want to be next to the hype.
At first glance these can feel like mumbo jumbo, overly complex charts, but it
actually makes an intuitive model for mapping out an entire ecosystem in
context of all its moving parts. Simon Wardley reframes tech maturity into four
stages: Genesis, Custom, Productized, and Commoditized, and then vertically
arranges tech components by visibility to the end user.
I didn’t get it at first - it took watching a few talks (1, 2, 3 and more) for it to
actually sink in - but hopefully by introducing Wardley Maps in context of
Technology Adoption Curves and Commoditizing Complements, I have made
the connections for you to understand the value of mapping an ecosystem.
You can maintain a mental map or actually go through the exercise of drawing
out the ecosystem you work in - but the implications are clear - you should
want to help technology commoditize, and then you should want to work
right next to that technology.
The field of systems thinking traces its origins to Donella Meadows, who
worked with the Club of Rome to lead the influential 1972 Limits to Growth
report, laying out scenarios for global growth for the next 100 years. The basic
understanding of systems was spelled out in a seminal essay, the Twelve
Leverage Points (subsequently a book).
Tip: See First Principles Thinking (Chapter 17) for more on Systems
Thinking.
While Technology Adoption Curves and Wardley Maps deal with fixed
paradigms and vague models, the Systems Thinking movement offers some
insight both for quantifying the “leverage points” in a system (read: bottlenecks
where you will be most effective) and for quickly traversing up paradigms to
higher perspectives, spawning more insightful questions.
Will Larson, CTO at Calm, has some good writing applying systems thinking to
engineering management, and of course as an engineer, designing and running
systems is a core architectural skill, as much as you also work within a larger
system. Teaching you to apply this is beyond the scope of this book; I just hope
to introduce it to you here and invite you to explore further.
A few final tips for keeping tabs on your ecosystem, staying focused while
keeping up to date:
Keep a reference counter for technologies: Every time you hear about a
technology and think “I should check it out!” - keep a mental or literal
tally. Only actually check it out once your counter hits five - enough that it
isn’t a flash in the pan, but also not too late that you’re ignoring something
that could be amazing.
Debounce your Information: Whenever you run into something new, ask:
Do I need to know now? Does this information have an expiry date? A
nice trick to force yourself to do this is to put everything on time delay - for
example, all new blogposts and articles must be stored in a Read Later app
like Instapaper, and new YouTube talks relegated to the Watch Later list. If,
in a week, you look at it and are no longer as interested, delete without
guilt. You have just gained back hours of your life by denying the
dopamine hit of checking out new things. (Note: Exception for this is when
you are trying to Pick Up What They Put Down.)
Understand the value of Information: As a knowledge worker, you need
to establish a very strong sense as a curator of knowledge. Here’s a
preference order to get you started: - Value private information over
publicly known things - Value timeless information over novel information
- Value subtle nuances over sensational headlines - Value digesting high
quality pieces over consuming sheer quantity
Make it easy to try things out: Having no place to try things out is a
barrier to trying things out. You need to lower activation energy for trying
things out. Fortunately most documentation comes with good demos, but
also you can build expertise with some quick-start services to trying things
out - CodePen, Glitch, CodeSandbox, Netlify, Render.com for web
developers. On my laptop, I always have a “testbeds” folder for throwaway
stuff, and I can jump to it easily with rupa/z - just knowing that everything
in the folder is disposable gives me great peace of mind. Having a
Breakable Toy also lets you swap out technologies in production, freeing
you from endless tutorial hell of trivial Hello World examples.
Pay attention to Narrative Violations. The term is somewhat debated, but
basically when smart people do something quite uncharacteristic, or trends
make a sudden reversal, it is a sign you might not understand it fully, and
there may be a deeper underlying reason to be discovered. I liken it to Neo
noticing the duplicate cat, indicating a Glitch in the Matrix. Pay. Attention.
Most people are too content to only see things that confirm their prior
worldview. Actively seek out things that don’t fit, because that is where
you have more to learn.
Keep Tabs on Megatrends: Some trends are clearly massive, slow-
moving, yet inevitable. You can position for the future by living in the
future. In fact, this is what we will discuss in the very next chapter!
Chapter 29
Megatrends
It can sometimes feel like we have reached a “steady state” in tech. This is
known as the End of History illusion: the temptation to conclude that what you
have today is the best possible outcome. This is often due to lack of imagination
and sense of place in history, but also some deserved cynicism from seeing
major failures and overhyped disappointments.
The first thing to realize is that the tech “everybody” uses isn’t that old. The first
web site was published in 1990. Git was released in 2005. Both iPhone and
Android were launched in 2007. Both the modern serverless and container
paradigms began in 2014. It is highly likely that someone is working on
something right now, that will change the world not just in your lifetime, but in
less than a decade from today.
You don’t have to be super early to benefit from Megatrends. Sometimes you
can just surf the wave of something much, much bigger than yourself. If it is just
“obvious” (perhaps a loaded term) that something is a Big Deal, but on its way
to be absolutely huge, you can gain a significant advantage by simply “living in
the future”, as Paul Graham puts it, and building what’s missing. Developers
and consumers, as a population, are much slower moving than you can be. Even
“obvious” evolutions don’t happen overnight.
The first and easiest feature to notice is that Megatrends are measured on the
order of magnitude of population percentages. Smaller projects may use
absolute numbers of downloads or signups or active users, their monthly or
annual percentage growth, or some other vanity metric. Most startups’
projections of Total Addressable Market are complete pie in the sky - but it starts
being real when complete strangers also start talking about adoption in terms of
percentage TAM capture.
I’ve mentioned the term “vanity metric”. That’s a slightly derogatory term - all
metrics are imperfect, and the better framing is more that there is a hierarchy of
metrics that matter. It’s easier to get signups than it is to get active users, and
easier to get active users than paying users. But one thing more valuable than
money is time. If your technology measures engagement in hours per day rather
than monthly active usage (i.e. someone who uses it five minutes a month
counts), then you have established a habit that is sticking, and is therefore more
likely to be worth investing in. A popular way users self-describe this effect is
that they are “living in” the tool.
Megatrends are often tied to generational shifts. A newer generation will often
opt to choose a slightly different way of doing the same thing that has existed
before, and for some reason the later iteration will be the breakout technology
instead. This will seem very puzzling to the older generation, who gripe and
grumble that they were on to the hot new thing “before it was cool”. Newer
generations do this partially to distance themselves from the past, but often also
because platform shifts or new technologies enable things that just couldn’t be
done before. For example:
This is why there is always oversize interest in future potential platform shifts
like cryptocurrency, virtual reality, quantum supremacy and deep learning.
The absence of any prior baggage also allows for skeuomorphisms (intentionally
crafting the new thing to look like the analog of the old thing, to help intuition
when transferring platforms) to eventually be abandoned in favor of “native”
assumptions (throwing away all semblance of the old thing and leveraging the
full capabilities of the new platform).
Megatrends don’t just spread across time, but space as well. As William Gibson
observed, “the future is here, it’s just not evenly distributed yet.” Because so
many startups start and prove themselves out in the US, and yet take many years
before going abroad, the Samwer Brothers have made a career starting clones of
successful American startups in Europe and Asia. Chinese students in America
have returned home as Hai Gui, setting up the “YouTube of China”, the “Google
of China”, the “Amazon of China”, the “Expedia of China”, the “Uber of
China”, and so on. The Indian Institutes of Technology have an even closer
bond with American institutions. The founders of two generations of
semiconductor titans, Morris Chang of TSMC and Jensen Huang of Nvidia,
graduated from MIT and Stanford, had successful careers in the US, and
returned home to Taiwan to start their empires. Even within a country there can
be an advantage in import the future - Governments, VC firms and investment
banks are known for organizing inspiration trips from Silicon Valley to New
York and back, and from every other city to tech hubs.
As far as Developer Megatrends go, one pretty reliable metric is seeing large
companies announce that they have adopted a certain technology. When you
see Airbnb announce that they have adopted TypeScript or Shopify moving to
React Native, these are the end results of months, often years, of careful
evaluation, and the investment of the equivalent of millions of dollars in
developer hours. Even the announcements have to be carefully vetted by
marketing and legal teams, considering the credibility impact of potentially
reversing a very public decision. As much as your needs may not be the same as
BigCos, endorsements from them do carry more weight as it means that the
technology has been vetted for scale, they will contribute open source support,
and the technology has formally become a job differentiator both on the
recruiting and the prospective employee sides.
29.2 Examples
An example here might help. TypeScript is an example of a very clear developer
Megatrend in the JavaScript ecosystem. You might personally dislike
TypeScript, but if you make tools for developers, this audience is increasingly
difficult to ignore. Piecing together survey results, usage of TypeScript rose
from 21% to 34% to 47% to 62% of all JavaScript developers from 2016-2019.
Want to bet if it keeps rising in 2020 and beyond?
I don’t know the developer ecosystem you work with as well as you do, so it is
hard for me to give more examples that might connect. We can draw up similar
numbers for Docker or Kubernetes or GitHub or StackOverflow.
Gaming is capturing a LOT more revenue and time than movies, music,
TV, and literally any other form of entertainment. The definitive essay on
this is Matthew Ball’s 7 Reasons Why Video Gaming Will Take Over - I’ll
just refer you to it rather than rehash his points.
Software isn’t everything; there are a good deal more interesting “hard”
technology trends like the renewed Space Race, Quantum Computing, Carbon
Capture, and Plant Based Meat. But, as a rule, bytes are easier to manipulate
than atoms, and the majority of developers are better served staying in the
software domain, especially in their early career.
Any time you can think of something that is possible this year and
wasn’t possible last year, you should pay attention. You may have the
seed of a great startup idea. This is especially true if next year will be
too late. When you can say “I am sure this is going to happen, I’m
just not sure if we’ll be the ones to do it”, that’s a good sign. - Sam
Altman on Idea Generation
One final observation. Even trend watchers often underestimate the sheer scale
and magnitude of Megatrends. It is very common to feel like you already missed
the boat, because you are more attuned to developments than the general
population:
When Tim Sweeney started Epic Games in 1991, he “had a sinking feeling
it was too late” to start a game dev company. Today, Unreal Engine and
Fortnite are undisputed kings of the game dev world.
When Marc Andreesen moved to Silicon Valley in 1994, he felt like he’d
already missed the tech boom, but ended up founding Netscape.
When Kevin Systrom and Mike Krieger started out, their original app was
one of a throng of trendy social, location sensitive, mobile apps including
GoWalla, Foursquare and Groupon, with Yelp an already established player,
when they eventually landed on Instagram.
When Chad Hurley and Steve Chen made their own video sharing site, they
faced a crowd of existing media sharing apps including Dailymotion,
Vimeo, Flickr, Webshots, Ofoto, Shutterfly, Snapfish, Ebaumsworld, etc,
but of course YouTube eventually won out.
The lesson is clear: it is normal to feel “late” to a Megatrend. Just looking out
for Megatrends at all puts you ahead of the vast majority of the population who
do not reflect on their place in history. Further, while first movers have an
advantage, it is always more important to be the last mover in a MegaTrend -
those are the ones that end up counting.
Chapter 30
Part IV: Tactics
Finally, let’s discuss the common Tactical skills that will help you in your
Coding Career:
Aside: If you’re new to this topic, it means that this is probably going
to be the highest value chapter in the book. Which is sobering to
realize as an author!
Haseeb Qureshi negotiated a $250k offer from Airbnb coming out of his
bootcamp. Here are his Ten Rules:
You should negotiate your job offer even if it already seems pretty
good. The best way to begin the salary negotiation is by sending a counter
offer email. Eventually, the negotiation will move to the phone. But it’s
best to negotiate over email as long as you can because it’s easier to manage
the process and avoid mistakes.
The first thing you should do when you get a job offer is ask for some time
to think it over.
Do not disclose your salary history or salary requirements. This can be
uncomfortable, but it’s your first opportunity to negotiate a much higher
salary.
Typically, your counter offer will be 10–20% more than their offer, and
you’ll focus on your base salary at first.
Josh provides a “detailed counter offer email template” to help!
But no, of course I don’t think that everything should be public. I don’t even
think everyone should Learn In Public, as I have taken great pains to explain in
every talk and podcast I do.
The expanded form of this is Following the Graph - not only following people,
but following the people they follow (the best way to get in their heads). Tracing
back work histories and tracing forward new workstreams. Most things are
made by only a small set of prime movers and they are usually (by definition)
not hard to find.
Read Good Books Cover To Cover: Authors spend a lot of time nailing down
details in books because of how permanent it is. They also spend a lot of time
organizing the structure and relative weight of the content with some educational
goal in mind. If you come across a highly recommended book (or just one that
starts off well), do it the justice of going cover-to-cover. You may get bad
chapters or sections, but you won’t know til you plow through it. Particularly
pay attention to endings, since people often don’t make it to the end but many
authors put The Good Stuff at the end (ahem!). Usually this is the
“unimportant details” that they didn’t want to clutter the introduction with. This
is especially relevant if you are Intermediate at whatever you’re doing. Think
about it: Beginners need tutorials as they give the shortest path to success,
Experts just need to tinker and keep up to date, but Intermediates need context
and clear explanation of details.
Read Source Code: People often treat the open source movement as “code that I
can use for free”, forgetting the premise that it’s also “code that you can freely
fork for your needs”. But we are so spoiled that we even forget that it is “code
that you can read to learn from masters”. As Ryan Florence has noted: “I get
asked all the time ‘how do I level up?’ Read code. Read lots of code.” It’s
simple, but not easy. One of Paul Irish’s early hits was 10 Things I Learned from
the jQuery Source (followed by 11 more things) - granted, this was a public talk,
but it could easily be private learning. I curate the list of open source React
Project Ideas on /r/reactjs for this reason.
Subscribe to Repos and Issues: Just like there is a metalanguage behind the
language, behind the code, there is metacode - discussions and attempts on
Github Repos and Issues by collaborators, all in the open. If Reading Source
Code is reading code-frozen-in-time, then subscribing to repos and issues is
reading code-in-motion. Since a developer’s job is to put code-in-motion,
learning how to do this by watching others is a great idea.
I do believe that Systems are more important than Goals. This whole thing
you’re reading is a proto-System. But Systems can be focused by Goals.
Sometimes you can stuff a system into a goal - Ultralearning seems to have
caught some fire recently as a form of super intense, immersive learning. Joe
Previte summarizes it as such: “Set a goal to experiment say with a new
technology for 31 days. Check it out. See what you think. Write down what you
learn.” Note that I’m not saying you have to have a goal at all times.
Sometimes undirected learning is fun and leads to serendipity.
There’s no point learning anything if you can’t recall it - or rather, the more
you can recall, the more you actually learned.
There is a natural limit on how much you can recall at any time.
So to learn more than your brain can hold, you must take notes.
I have a bias toward digital notes because search is a superpower. But search is
no substitute for organization, which at its simplest is a tagging system, but at
its best is a “minimum spanning taxonomy” of the subject matter.
For the same amount of content stored, an organized mind will always
outperform a disorganized one.
Spaced Repetition: Another tactic is just trying to increase how much you can
recall. Michael Nielsen is famous for making bombastic claims about the
capacity of Long Term Memory, but the basic principle is sound: use spaced
repetition learning. Anki is the leader here. I’ll be honest, I don’t do this much.
In a way, having a daily habit of pursuing the same topic, and making sure to
take searchable notes leads you toward spaced repetition anyway. But of course,
I could always do a better job of this because I often have to recall things on the
spot in interviews and workshops.
Pick Up What They Put Down: I have called this “the Ultimate Hack for
Learning in Public” (Chapter 19), but of course you can also do it in
private. Follow up on anything and everything your unknowing mentor
says is good, or is yet to be done, or straight up just replicate their work.
Which leads to…
The Ben Franklin Method: I’ve read this before, but was recently
reminded by Mike White. The “Ben Franklin” method is shorthand for a
Dissect and Reconstruct process for training yourself to notice differences
in quality between your output and your input. This is why you think your
work sucks - your tastes have zoomed far ahead of your abilities. Ira Glass
calls this The Gap. The Ben Franklin method is a feedback loop for closing
The Gap.
32.3 Go Meta
Active over Reactive: Active Learning is Pull-based - You try to do something,
find gaps, and then go seek out what you need to get it done. Most learning
starts out Reactive - you see something new, you learn it. Push-based. The
problem is that the content industry has swung waaaay too far towards drowning
you under a deluge of content. Additionally, Reactive Learning doesn’t serve
your goals - it serves someone else’s. Part of learning is learning what to learn,
and Serendipity is a wonderful thing, but Just-In-Case learning is not
productive long-term. The right mix of learning will include more Just-in-Time
Active Learning than is natural or feels comfortable.
I confess I don’t do this well at all and would welcome ideas for how to make
Active Learning more of a habit.
As a bonus, once you can do this well, you also become more persuasive to
people who disagree with you. Because you took the time to understand them.
This is sometimes called Steel-manning (more from Andrew Chen), as opposed
to Straw-man arguments.
This may just be a nice-to-have for a backend developer, but if you do any
frontend work at all, it is surely an advantage to show that you can add some
design flair, without direction from a card-carrying Designer.
33.2 Frameworks
The easiest way to get an instant design lift is to use a premade design
framework. There are a lot of these, so you should curate a short list of
frameworks you like - your “toolkit” of sparking joy.
You should use different frameworks based on your usecase. I split them into
“heavy”, “drop-in”, and CSS resets. Here are a short list of them for you to
check out:
Resets (the lightest of all, just resetting default user agent styles to
something just not-ugly): Nanoreset, Destyle, Andy Bell, Normalize.css
If you’re doing a Demo, the Fun frameworks can be really easy wins. The
popularity of handwriting styles have led to XKCD-inspired charting and
Graphics. Who doesn’t smile when looking at a demo like this!
Many vendors like Creative Tim and Tailwind UI offer free and premium custom
styled components that you can explore as well.
33.3 Layout
If you need more control than the frameworks give you, you will need to learn
some basics of design.
The most immediate impact you can have here is to add more spacing -
developers as a rule tend to like information crammed together, so we need to
space things out a little more than we are comfortable for general audience
reading. Also consider standardizing the vertical “rhythm” in your site. For
example, you can restrict yourself to a small set of css variables that are 0.5x,
0.75x, 1x, 2x, and 3x a given base size (say 1em or 16px). Because margin
collapsing can be hard to manage, use single-direction margin declarations to
simplify your rulesets.
Next, you should be familiar with the simple CSS incantations that make
common layout paradigms - CSSLayout and Every Layout are the definitive
resources you can use. In particular, the Holy Grail layout is so named because
it is so common for apps and sites.
When you have laid out all your images and elements, consider the number of
“lines” that are created in your design. You should try to make elements across
your page line up as much as possible. This is a lot easier to do if you set box-
sizing: border-box to make your layout include padding and border.
33.4 Typography
The standard advice is to use either the System Font Stack - built-in device fonts
that are faster because no download is needed - or a maximum of two custom
fonts - one for headers and one for body text. Canva’s Font Combinations app
and Google Fonts can suggest pairings for you.
Font selection is a rabbit hole and a discipline unto itself - just remember that the
high level goal is to pick based on the personality you are trying to convey:
Elegant/Classic: serif like Freight Text
Playful: rounded sans serif like Proxima Soft or a Handwritten font
Plain/Safe: neutral sans serif like Freight Sans
Don’t forget that you can also make your fonts responsive, using the font-
size: calc(1rem + 2px + ((100vw - 550px) / 250)) trick.
You can blend that color with a grey for secondary content, and lighter grey for
tertiary content.
Don’t use system defaults for colors, they tend to be too harsh. An example Blue
palette:
Black: #1d1d1d
Purple: #b066ff
Blue: #203447
Light Blue: #1f4662
Blue2: #1C2F40
Yellow: #ffc600
Pink: #EB4471
White: #d7d7d7
There are dozens of free color picking tools like Adobe Color, Coolors and
FlatUI that you can use to settle on yours.
Two special notes for Sparking Joy with colors:
Take care to ensure that your color contrasts meet accessibility guidelines -
as a rule, dark text on light background passes more easily than vice versa
Using CSS Variables for every color helps you implement Dark Mode
easily, which many users enjoy. Plan ahead - instead of using variables like
–black or –blue in your code, you should use something “semantic”
like –text-color or –link-color so that it makes more sense
swapping out colors for Dark mode.
33.6 Backgrounds
Interesting backgrounds can give a lot of texture and inspirational feel to your
work. Use them judiciously - it doesn’t help to have a distracting background
when the user should be looking in the foreground!
Gradients only require a few lines of CSS, so have great performance. You can
generate good background gradients with free tools like WebGradients, UI
Gradients, and Gradient Animator.
If you want to get a little more interesting, you can use more CSS, tesselating
icons or subtle textures.
Marketing pages should grab attention. You can use something like Bootstrap’s
Jumbotron or a Hero Generator, together with free stock photos from Unsplash
or Pexels to add instant visual interest.
For doing your own graphics, Canva and Snappa are the market leading free
tools for non-designers to do basic graphic design.
If you don’t have the time, you can grab animations off the shelf for everything
from loading spinners (CSSFX and SpinKit) to buttons (Animista and
Animate.css). In general, you want to animate state changes, so that you guide
your user’s eyes smoothly to the next state.
If you need more firepower in video form, video makers like Animoto, Biteable
and Powtoon are there to help.
Josh W. Comeau’s useSound helps you makes apps you can hear
React-Rewards help you add microinteractions that reward success
Canvas based interactive visualization in 2D with Processing or D3, or in
3D with Three.js (with great React demos in react-three-fiber)
Konami Codes are popular easter eggs - GenieJS is a more general
keybinding library
Clippy.js to add a little virtual assistant for your site
The Nostalgia category in general is a very ripe field for sparking joy. Clones of
old Windows and iPods regularly rank well on Reddit.
7 Practical Tips for Cheating at Design by Adam Wathan & Steve Schoger
(who also wrote Refactoring UI in book form)
7 Rules for Creating Gorgeous UI by Erik Kennedy (who also teaches
Learn UI Design)
Design for Developers Frontend Masters Workshop by Sarah Drasner (with
repo here)
Degreeless Design by Tregg Frank
Nothing will beat practice by following the popular design inspiration sites like
Dribbble, CollectUI and Codrops to hone your skill.
Good luck, and don’t forget to check out the spark-joy repo for even more
resources!
Chapter 34
Lampshading
“The person who asks is a fool for five minutes, but the person who
does not ask remains a fool forever.” - Unknown
We are often told that Knowledge is Power. This is mostly true - except for at
least two points in your career.
Have you thought about how Ignorance can be Power too? I can think of at
least two stages in a career when you can wield lack of knowledge as a form of
power (in the neutral, ability to influence others to do what you need sense, not
in the petty dominating over others sense).
And we’ll talk about how you can wield ignorance throughout the rest of your
career too - with Lampshading!
In my career so far I’ve often noticed that it is senior management, not middle or
junior people, that are most likely to say “Whoa, whoa, whoa. I don’t
understand what’s going on here. Can you explain like I’m five?” Done right, it
can expose weak reasoning and bust bullshit, particularly when framed with the
(mostly correct) belief that “If you can’t explain it simply, you don’t understand
it well enough.”.
Note I’m not absolving incompetent management of the need to know domain
knowledge necessary to be an effective leader. I’m simply observing that at
senior levels you are not expected to know everything, and that’s an interesting
violation of “Knowledge is Power” you have probably experienced.
Of course, there are cases where this doesn’t apply. Junior talent are the most
expendable, and some companies don’t have a healthy attitude to mentorship and
hiring. But in general, I find the tech industry a lot better for mentoring than,
say, finance. Tech companies generally place explicit responsibility on
seniors/team leads to mentor juniors, especially as part of their career
progression goals.
You might imagine, having restarted my career 2-4 times depending how you
count it, that I have a good deal of personal experience with being a total
newbie.
34.3 Storytime!
Here I can tell you about my first day on my new dev job, fresh out of bootcamp.
My team all joined on the same day - three new hires (me and two more
experienced devs). My new boss, a confident senior dev who had had a long
tenure with the firm, was walking us through our tech stack. All of a sudden he
paused, and said, “oh by the way, we’re going to use TypeScript. You all know
TypeScript, right?”. Coworker 1 nodded, Coworker 2 nodded. There was that
unspoken sense of duh, we’re all professionals here, of course we use
TypeScript.
I don’t do well with peer pressure. In Gretchen Rubin’s Four Tendencies model,
I’m an Obliger - I like to please people and put my own concerns aside. Of
course my bootcamp hadn’t taught TypeScript, we’d only had three months to
learn fullstack JS! And of course I wanted to say yes!
I had a probably visible moment of panic, before going with “no I don’t know
TypeScript.” My boss simply nodded, saying, “you can learn on the job”, and
moved on.
I think in my first few months I probably had a dozen little tests like that. Did I
know how to do professional code reviews? (No) Did I know how to do BEM
naming? (No, and I proudly still don’t) Did I know what Clean Code was? (eh..
nope).
Every time I confessed ignorance, they gave me what I needed to learn, and I
caught up. If I made a mistake, they taught me what I did wrong. What were
they gonna do, fire me? They knew what they were doing when they hired me
out of bootcamp.
34.4 Lampshading
So we see that confessing ignorance works at both the senior and junior stages of
careers. But it also works in isolated situations as well, for example when you
caveat what you don’t know while learning in public.
Given my casual interest in creative writing, I often compare this technique with
Lampshading. To quote from TV Tropes:
Lampshade Hanging (or, more informally, Lampshading) is the
writers’ trick of dealing with any element of the story that threatens
the audience’s Willing Suspension of Disbelief, whether a very
implausible plot development, or a particularly blatant use of a trope,
by calling attention to it and simply moving on.
Applied to real life: You call out your own weakness, so that others can’t.
In fact, by most functional team dynamics, others are then obliged to help you
fix your weakness. This is soft power.
Many Americans (of a certain age) immediately sympathize with this by linking
it to the final battle in 8 Mile. In it, Eminem kicks off by naming every single
weakness of his that his opponent Papa Doc was going to, literally stealing all
the words from Papa Doc’s mouth and turning himself into a sympathetic
character. Weakness is strength here purely because of lampshading.
A “Safe Harbor” is a legal idea that explicitly okays some behavior that may be
in a grey zone due to unclear rules. So I use it as an analogy for how we act
when someone says “I have a Stupid Question”.
When we invoke the “Stupid Question Safe Harbor”, we are acknowledging the
question is potentially stupid, AND that we all know that there’s not really such
a thing as a stupid question, but we’ll just get it out of the way to ask something
really basic - because getting mutual understanding is more important than
saving face.
The trick here is you actually are saving face - now you’ve invoked the SQSH,
people understand you’re roleplaying, you’re explicitly invoking a well
understood mode of conversation, and you’re not ACTUALLY that stupid.
Right? Right?? nervous laughter
When you are in a group scenario, the SQSH has positive externalities. There
may be multiple people wondering the same thing, but only one person has to
“take the hit” of asking the “stupid question”, and yet all benefit. I like
performing this role of Stupid Questions as a Service.
Kyle Simpson famously was told “You Don’t Know JS” in an interview,
and turned that into his primary claim to fame, controversial title and all.
I eventually took my own TypeScript learnings, explicitly lampshaded that I
was learning, and put them online and that became the React TypeScript
Cheatsheets
I frequently lampshade my mistakes during my talks. Clicker not working?
Call attention to it. Joke didn’t land? Call myself out. Self aware, self
deprecating humor is always appreciated by the audience, and fills dead air.
But you can also use it to set up a Pledge, in advance of a Turn and the final
Prestige, which is exactly how I set up my own livecoding talks.
This woman lampshading masterfully to ward off all trolls on Twitter
Who else lampshades very well? Let me know.
Chapter 35
Conference CFPs
When conferences want speakers, they have two options: invite well known
speakers or open up a selection process for all other speakers. If you’re a new
speaker, you’ll mostly get your speaking opportunities through the latter process,
which is called a Call for Papers (CFP).
Don’t let the name fool you – you don’t have to write a paper to get accepted!
The term is a holdover from academic conferences where you would submit
papers you’d worked on. But there are other commonalities – you send in one or
more proposed talks, with a title and abstract, and a review committee looks
through all the submissions to curate the lineup. This is usually done 3-6 months
in advance, so you have time to work on your talk if and when it is accepted.
Speaking can open many doors for you. From building your professional
network, to getting in front of employers, to promoting a great idea or library
that you want everyone to know. Everyone should try speaking - to teach what
they learn and improve their communication skills.
“The biggest boost for my career the past five years wasn’t working at
Facebook or being a manager, it was developing public speaking
skills.” - Charity Majors
I don’t say this to flex, merely to establish what I’ve done and also what I’ve not
yet done (e.g. been an emcee or been invited to more “prestigious”
conferences). I know I’m solidly on the B or C list. I’m get a few conference
invites, which give me more freedom from the CFP process, but most of the time
I still have to go through it. If you’re a beginner, I hope that makes my advice
more relatable to you.
My YouTube Watch List is 400+ videos long. When I have lunch or am bored, I
pull up a video and watch a talk. Most conferences directly copy and paste titles
and talk abstracts into the videos. Start paying attention to those, since you’re
about to start writing them. Watching talks also trains the YouTube algorithm to
start recommending them rather than entertainment, which is a nice nudge when
I procrastinate.
https://reactjs.org/community/conferences.html
https://events.vuejs.org/conferences/
https://jsconf.com/
https://conferences.css-tricks.com/
https://twitter.com/moztechcfps
https://twitter.com/cfp_land
https://twitter.com/callingallpaper
https://confs.tech/
If you’re new to conferences, “the game” can be rather opaque, so here are some
basic, general facts (each conf will have exceptions!):
You should especially seek out conferences that put out high quality videos of
every talk. This has two purposes. Part of your first talk’s job is to be a calling
card for your next talk. One great talk can kickstart a great speaking career all
on its own. Secondly, you can tell the exact nature and tone of previous talks
that have been accepted for that specific conference, and therefore it is much
easier to do research when pitching your own talk, and then preparing to speak
for it.
First, you have to find a topic. This is, at its simplest, finding the intersection
between the things you’re very interested in and the things that everyone else is
interested in. The simple reason for this disparity in interest is that you’re gonna
be spending a bunch more time on this topic than the audience is, but you still
need an audience to show up (and, more to the point, for CFP reviewers to rate
you highly).
If you aren’t a great writer, that’s fine, you can also create demos. Diana Smith
has made a career of CSS art and I’ve never read a blog post of hers. You can
bet she’ll be accepted to speak anywhere (I’m pretty sure she has spoken, I just
can’t find it right now). Your YouTube watch history and GitHub timeline are
also great indicators of your revealed interests.
The reality is that the ultimate customers of conferences are the bosses of the
people attending conferences. They want to see some “I can use this at work”
return on investment on sending their employees. Most bosses find sending
people to technically-heavy conferences easier to justify, hence there is more
demand for technical talks. Less cynically, the timeframes for measuring and
getting return on investment (2-3yrs, the stereotypical tenure of an in-demand
tech worker) dictate what you invest in.
The War Story: This is a great first talk genre for someone with some
work experience. You simply tell a story of something you went through at
work, including setbacks, lessons learned, and ESPECIALLY any
quantitative benefits gained. You don’t have to be the world expert in
anything except your specific situation. It usually helps if you work
somewhere notable like AirBnb but a lesser known name is fine if you
advertise the interesting elements of the story like Millie Macdonald did.
Library/Framework/Product Launch: Conference organizers like to be at
the start of something big. To do this genre of talk well, you have to tackle
an important problem, and sell the idea that you have developed a good
solution for it. You don’t have to have made it yet, but of course it helps.
Examples: Dan Abramov, Ryan Dahl
How to X: How to do Error Handling in GraphQL. How to do Input
Masking in Vue. How to make Static Sites Dynamic. How to Be a Web
A/V Artist. 14 Ways to Bounce a Ball. You get the gist!
Introduction to X: This is easy Meetup fodder, but is more difficult to get
traction at conferences, usually because conference organizers don’t want to
be perceived as having talks which could just as easily have been on the
docs or README instead. So a good Introduction to X talk will also have
to be creatively framed and titled. One of these I’ve seen recently is Louisa
Barret’s Intro to Color Theory, except it wasn’t named that. It was titled
The Teenage Mutant Ninja Turtle Guide to Color Theory. You can even
add a single word like A Whirlwind Introduction To TypeScript. See how
this works?
What’s New in X: Straight survey of what’s new. This is also often framed
as “State of X”. You often have to be rather established to do this kind of
talk, like Mark Erikson or Ben Ilegbodu, or Sarah Drasner or Evan You.
But even if you’re not super established, you can also bring data like Sacha
Greif or just straight up explain things entertainingly like Tara Manicsic.
Fundamentals: This is a GREAT genre for beginners (not that it is
exclusive to beginners). CS Fundamentals like Algorithms, Data
Structures, State Machines, and Coroutines are always loved because they
reinterpret boring things that everyone “should” know, in a more familiar
and up-to-date context. But I name this genre more broadly because you
can also think of other fundamentals to teach, like the JS Event Loop,
Visual Design or Game Programming Techniques.
Live Coding: This is an intimidating genre to many, because a mistake can
derail a talk without a satisfying conclusion. However, the “live wire act”
fascinates audiences, for the same reason we enjoy watching acrobats do
death-defying stunts. We know they are well-rehearsed but there is still a
risk of catastrophe. Being able to watch working code form over time gives
extreme confidence in the tool or concept being demonstrated. Two less
appreciated benefits are the familiarity of IDE as presentation tool and the
natural guard against rushing (first time speakers, like me, make the
mistake of talking too fast to hide nervousness and risk losing audiences).
My best talk is a livecode talk and I think interest in this genre is on the
rise. SmashingConf is now organizing 100% livecode conferences, and
React Live is also 100% live code.
Heresy Talks: Definitely not for the faint of heart. To do a Heresy talk, you
have to go to a conference where >80% of people love Technology X and
tell them why Technology X isn’t good enough (yet) or question the tropes
that fans use to oversell it. See Corey Quinn’s Heresy in the Church of
Docker ad DockerCon or Robert Zhu’s The Case Against GraphQL at
GraphQL Asia. The pro is that attention is guaranteed with all your
slandering. The con is that you better be confident in your claims or be
prepared to be torn apart.
Intersection Talks: This is definitely downstream of picking your topic,
but usually people with interests in X and interests in Y are underserved
with talks about X + Y. There are an infinite number of topic intersections,
too many to name, but just talk about the obvious tips and tricks and notes
that come to mind when you consider intersections.
The Perf Talk: This is a great genre for speed demons. Pick a common use
case, start off with an inefficient, high number, and whittle it down with
trick after trick after trick. Here are examples with Jake and Surma
reducing an app’s TTI from 6 seconds to 1 and Sasha Aickin reducing
React SSR from 1025ms to 5ms.
But no pressure: you can still tweak your title after getting accepted.
To the extent that your genre dictates your title, just go with that. (I’ve put all
genre title examples above in the Genre section)
If you can come up with a memorable name that encapsulates your core pitch,
like Never Write Another HoC, do that. If your talk is good, its title will be
quoted back to you with surprising frequency, so make it something you can live
with.
Examples:
Getting creative and eye-catching is helpful. Remember that CFP reviewers will
mostly be scanning through hundreds of CFPs, usually in a Google sheet or
table. Short titles stand out. Special buzzwords stand out. Again, scan through
old published conference schedules to get an idea of what works.
If none of the above fit, don’t push it. Just take the most boring, practical title
you can do that touches on the main technologies you’ll be demonstrating.
Sometimes plain and simple is best!
Most conferences only ask for abstracts, but some will leave room for more
context on why you are the best person to present this topic (it’s usually optional,
but USE IT!!!).
The first paragraph of your abstract is most important, since it is what will be
printed and used in the YouTube description. Most abstracts are just one
paragraph. The first sentence draws the attention. The last sentence seals the
deal. As with all writing, Gary Provost’s timeless advice on writing applies:
This sentence has five words. Here are five more words. Five-word
sentences are fine. But several together become monotonous. Listen
to what is happening. The writing is getting boring. The sound of it
drones. It’s like a stuck record. The ear demands some variety. Now
listen. I vary the sentence length, and I create music. Music. The
writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short
sentences. And I use sentences of medium length. And sometimes,
when I am certain the reader is rested, I will engage him with a
sentence of considerable length, a sentence that burns with energy and
builds with all the impetus of a crescendo, the roll of the drums, the
crash of the cymbals–sounds that say listen to this, it is important.
Do that, for your talk. Use less words if you can. Most of my abstracts are
under 100 words.
Abstracts are great places to stick attention-grabbing data points. Did you know
TypeScript is at 65% adoption of JavaScript users? Or that 51% of developers
use VSCode? Or that “we recently refactored 100K lines of JavaScript to
TypeScript”? Or that I slashed my webpack build times by 20% with this one
weird trick? We are suckers for numbers.
Most abstract submissions allow markdown for emphasis and simple styling.
Use it. Sparingly.
Just like your talk title, you’ll rarely be held exactly to it. Nobody is watching
your talk holding you to your abstract at knifepoint. You reserve the right to
change things, hopefully not too drastically or too last minute. You won’t use
this right often, but it’s there if you need it.
Run your abstract by a few developer friends, with no context. If they don’t get
it, that’s a problem. You likely have a better idea of what your talk is than
you’ve actually written down. Rip it up, try again. Be more obvious, less
abstract. Appeal to what people will get out of your talk rather than the
specifics of how to get there (which is the reason why people should come to
your talk!).
You can see this 12 Minute Video of How I Write CFPs explaining my process
below
Write a short bio, you’ll be asked for it over and over again. Don’t write down
your life story, just a simple statement of what you do, what you identify as and
what you’re generally interested in. As your speaking career grows you’ll want
to have a short, medium, and long bio on your site for organizers to just copy
paste without asking.
As you start getting acceptances and recorded talks, keep a list of your best
talks. You’ll be asked for those in future CFPs. If you make them easily
discoverable and shareable, people will start inviting you without a CFP.
You can find every single title and abstract for accepted, pending and
rejected (dead) talks on my site)
My first CFP (accepted for React Rally)
My first JSConf CFP (accepted for JSConf Hawaii)
React Rally Bad Example Proposal
David Khourshid’s React Rally CFP
Devon Lindsey’s React Rally CFP
Motherlode of CFP Examples from Will Larson also check Tweet Thread
If you purchased the Community Package for this book, feel free to drop your
CFP for peer review in the community chat!
As always, I am not the only source of advice on this stage. Here are other
advice pieces I have come across:
Author’s Note: This was purely advice on how to get your CFPs
accepted. In a future edition of this book I will add a chapter on
Speaking Advice – I cut that out for now due to Covid-19.
Chapter 36
Mise en Place Writing
If you want to write, you probably want to write high quality articles, in high
quantity.
I know of only one way of doing this: Mise en Place Writing. Instead of
making writing a habit, you should make pre-writing a habit. By decoupling
writing from pre-writing, you can write more, faster, and better.
The idea is that cooking is faster, easier and more enjoyable if you have all the
stuff you’ll need to do prepared beforehand. It’s basically all the fun parts of
cooking separated from the boring parts. If you’ve ever had the chance to do a
cooking class in a foreign country (A great way to appreciate local cuisine in
personal travel or team retreats), notice that it’s fun because all the prep is done
for you.
Of course, for chefs, typically you’re also the one doing the prep so you’re not
really saving any work. But it can be nice to break work up into more palatable
(pun intended?) chunks of “prep” vs “cook” instead of “Prep & Cook”. In fact,
if you prep early, you also get a chance to spot missing ingredients that you’ll
need, and be able to run out and get them, rather than discovering that you don’t
have them while cooking (!).
The key insight of Mise en Place Writing is that we should decouple writing
from pre-writing.
Writing is an intensive, focused process. It takes me anywhere from 1-5 hours to
pump out an average article - in that time I am doing nothing else.
That’s a lot of continuous time dedicated to just one thing - rare in today’s
attention economy. If I were to add to that ideation and research and
organization and so on, it’d take even longer, and I’d do a poorer job of it.
Ironically, this is the stuff that actually has high leverage on what readers will
take away from what I write. So I should spend more time on that.
36.3 Components of Pre-Writing
Pre-writing is low intensity and often serendipitous, dependent on thoughts
flowing into you rather than you putting thoughts out. Here is a nonexclusive
list of things that can be realistically counted as pre-writing:
Ideation (Deciding the menu): Literally, what are possible things you could
be writing about? Raw Idea Velocity is the focus here - remember you’re
not signing up to actually deliver the thing - but if you had a flash of
inspiration or insight sometime somewhere, write it down. It’s not
uncommon for me to watch a good talk and come out of it with two ideas of
things to write about.
If you feel like you lack ideas for things to write about, your bar is too
high. Even if it’s been definitively explained elsewhere, you can still
get value learning in public by explaining in your own words to others
who think like you.
If you have too MANY ideas - I can sometimes relate - run it by a
mental filter of What People Want. You’ll want to take note of what
people are interested in. Or, y’know, just ask them what they want.
As you can see, there’s a lot that you can do to improve your writing before you
write. We should have a separate workflow for pre-writing than we do for
writing.
36.4 The Pre-Writing Workflow
The idea of grooming a backlog is key to productive writing. For the past few
months I have been accumulating a backlog of ideas that could be interesting
topics to write about. As of right now it stands at around 50-70 topics.
First, make sure you have a cross platform note-taking tool - I evaluated
Evernote, Notion, Roam Research, and SimpleNote, but currently am using
OneNote because it is free forever with the backing of Microsoft, and has good
offline support. I might move to Joplin in future, or write my own. It’s not
really about the tool - at my scale, it’s trivial to switch tools - but the feature set
needs to support the workflow.
And the workflow is this - anytime you have any content idea anywhere -
reading something, watching a talk, listening to a podcast, having a conversation
with a friend, thinking to yourself in a shower - you need to note it down in a
searchable place. If it attaches to some other relevant piece of thought, you
collect these together in a growing list of ideas, quotes, soundbites, links, talking
points and so on.
It has to be easy and fast. I don’t know about you but I can forget ideas in
minutes. If I don’t write it down it might be gone forever. I’ve been known to
jump out of the shower dripping wet just to go write something down.
Human Brains are great at abstract thinking and creative inspiration. Computers
are great at storage and search. Use them as your second brain.
Each note you make is a little kitchen, and you’re assembling the pieces in place
for a future you to come in and just get to cooking.
36.6 Writing
The process of writing is the same whether I write once a day or I am trying to
create a monster skyscraper or even a book. I still separate pre-writing from
writing.
Each time I sit down to write, I go through my growing list and think about what
is the most interesting thing I could write about that day. The nice thing about
having a groomed backlog is that all the related links and notes and thoughts
from myself over time is collected in a list ready for me to flesh out into a full
piece. It’s just less intimidating that way. But there’s also a little dopamine hit
from this concentrated dosage of inspiration from all my past selves who have
sent this message into the future.
The key insight of Mise en Place Writing is that we should decouple writing
from pre-writing. With that, our writing improves, as well as our enjoyment of
writing.
36.7 Improvisation is OK
With all that work done pre-writing, I might be giving you the impression that I
am strictly separating everything all the time and I don’t deviate from the plan
once I enter Writing Mode. Not true. Writing Mode is another opportunity to re-
experience the pre-writing and the writing job all at the same time, just with the
benefit of some extra prep that I’ve done before hand.
Improvisation is OK.
36.8 Editing
A lot of people put heavy emphasis on editing. I agree that it can add a lot of
value. But I don’t do a lot of it. For one thing, I don’t have a ton of time. For
another, I find it often doesn’t add as much value as hoped. You can run things
by Hemingway or Grammarly but they are no substitutes for human judgment.
Finding a good editor is harder than just grabbing a coworker, but that’s what a
lot of people do and accordingly they don’t get the same value as a good editor
would.
I wish I had more insights here but I just don’t have a ton of experience with
editing. I will say that I edit my posts a lot after publication - they are all
intended to be living documents in a Digital Garden - so if something doesn’t
read quite right or someone chimes in with a crucial thing I overlooked, I will go
change it. But usually, it’s more important to err on the side of getting it out
there rather than be bogged down in heavy editing, especially when it can be
edited post-publication.
Chapter 37
Side Projects
Side Projects aren’t necessary to succeed in this industry, but they offer a huge
advantage for your learning and career development. I make a strong
recommendation that, if at all possible, you have one or two side projects you
are constantly shipping.
Prototyping new things. You don’t just have to work on apps. You can try
building your own X from scratch, or creating a “Lite” version of something you
already use. People often learn so much from building a “Lite version” of their
main app or tool that they end up applying it to their actual work, like Dominic
Gannaway did with Inferno.js (now he is on the React core team), or Zack
Argyle building a Pinterest PWA and convincing the CEO to switch the real
Pinterest site over to a PWA (now he manages the React Native team). Google
used to be famous for its 20% rule, which spawned amazing side projects like
Gmail, Chromecast, and AdSense (worth billions of dollars).
Practice Shipping. Shipping is a whole other discipline than coding. When you
ship code at work, you are doing the shipping equivalent of bumper bowling.
The system is set up to not let you fail as much as possible. You have coworkers
and bosses around you to help you decide what to do, when to do it, how to
market it, what your budget is, what not to do. When you ship, your coworkers
are obliged to pay attention. None of this true in real life. When you work on
side projects you practice all the other noncode aspects of coding that make your
code matter: decision making, prioritizing, marketing, documenting. If you
dream of founding a startup someday, you should practice these skills before you
start relying on them for a living. If you are a Junior Engineer looking to grow
to Senior, understand that one of the few things everybody identifies as a key
quality of a Senior Engineer is the ability to independently execute. Act for the
job you want.
Resume Builder. Side Projects should never be a required part of any job
application, but it usually helps to show that you can work independently and
that you are passionate and curious about technology. Your current job might
work on some legacy technologies for good reason, but if you want to switch
jobs to work on a newer tech stack and have no experience in that stack, it can be
a resume saver to have a Side Project that demonstrates you have built
something nontrivial with the stack you want to work with. Of course, some
people take this too far and do Resume Driven Development. In practice, I find
that this is more often a criticism by bitter Reddit trolls than actual dev behavior.
If you are pursuing a career in Infosec, getting bug bounties on BugCrowd and
HackerOne are excellent resume items.
Improve your productivity. Your Side Project can be a dev tool that makes you
more efficient at work. This can often be the best kind of side project to do,
because the Side Projects you learn the most from are the Side Projects you
use, plus it saves you valuable time at work. Think expansively of the entire
range of tasks you do - from things you do 50 times a day to things you only do
once a month. Randall Munroe of xkcd has a great chart that does the math on
how much time you should invest in automating tasks:
User Empathy. Your Side Project can often put you in the shoes of your
company’s end user. As an employee, you can usually try it for free. Since you
build the product, you might think you understand it intimately - until you
actually try to use it as a user. Suddenly all the bug reports become real.
Suddenly the bad design decisions matter. Suddenly documentation and good
copy are critical, rather than a chore.
Making Money. If your Side Project makes money, you suddenly gain options.
You don’t have to go all Pieter Levels-level Indie Hacker, but a little passive
income on the side never hurts. But if it ends up going unexpectedly well, as
happened for devs like Taylor, Mike, and Anne, you now have uncapped upside.
Mikael Cho ended up pivoting his entire business to his side project, Unsplash.
When you work, you are renting out your time. When you do a Side Project,
you own equity. Rich people own equity. Be like rich people. Your project also
serves as a good BATNA (see the Negotiation chapter, Chapter 31, for more) -
when negotiating your next role.
Productive Fun. Don’t forget you can work on things simply because it is fun.
You don’t need a better reason than that. However there is a difference between
passive fun (leaning back, watching Netflix, reading) and productive fun
(making, experimenting, failing). Most people are extremely imbalanced in their
Consume:Create ratio - correct it with a fun Side Project!
Work on your own open source library. This is a common one for
developers because the risk is low. But the reward is often low too. It is
usually unpaid work and a maintenance burden. But it can help you be
more productive at work or get some conference/networking opportunities,
while giving back to your community. Don’t forget that you can clone
existing open source apps as well! (Chapter 10)
Open Source your Knowledge. See Chapter 13!
Contribute to your local meetup/community/nonprofit. Your valuable
skills can be put to great use helping out on projects that other people need
and cannot make. Many developers got their start in web dev making a site
for their band. Everyone needs a site!
Build your Portfolio or Blog. A portfolio or blog is a project too - spend a
bit of time every year making sure your online profile is updated to reflect
your latest skills and interests. See Marketing Yourself (Chapter 39) for
more. Other forms of content are also interesting: running a podcast,
newsletter, livestream, or YouTube channel - but know that they are higher
effort and bigger commitments.
Teaching. If you want to make your first money in the content creation
game, there can be no better place to start than a platform like Egghead,
Frontend Masters, Pluralsight, or LinkedIn Learning. They will give you
the resources you need to record your first lessons, market them for you to
their existing audience, and take care of payments. All you need to do is
create compelling content.
Writing a Book. If you’re feeling particularly adventurous and your
blogging/other content has seen some good results, you can also go for
writing and selling your first book. You’re looking at the result of one such
Side Project!
Closed Source Side Hustle. You can also create and operate an app for
money. This is basically a full-on Side Hustle, and involves the highest
level of responsibility and support because you have recurring customers.
To get ideas you can check out Ideaswatch, or you can simply look for
problems to solve at work. Dylan Feltus saw a need for a feature request
tracker at his company, so he built NextPlease.io, and his own CEO is a
now proud customer.
Pick constraints. Scott Young decided he would go through MIT’s four year
computer science curriculum (all of it, no cut corners) in 1 year. This is how he
frames the MIT Challenge that made him famous:
Consistency and Momentum are King. A project that you leave for too long
gathers dust and dies. It’s easy to look at that project you haven’t touched in a
week and say you’ll get back to it next week. Then a month. Then a year.
Making a regular commitment that you don’t break helps you see forward
momentum on this project, and helps others see it too so that they know that they
can keep cheering you on. When your friends check in on you you’ll have
something positive to report, instead of the awkward “yeah I haven’t got any
updates”.
Have an end date. Projects that drag on forever cause guilt due to their
incomplete state. Having no end in sight can be strangely demotivating, even if
you are doing it for fun. Being able to get closure and move on frees you of
responsibility so that you can tackle the next thing. Define “Good Enough” up
front, and don’t let your scope expand when you get there.
One great “forcing function” for you to ship your project and get closure is to
commit to giving a live demo or talk at a meetup or some other event in the
near future. Not everyone responds well to this kind of pressure! But it works
for chronic procrastinators like me.
When I think about the best project choices I have made, I tend to
think about winning even if I fail. What that means is I’m choosing
my projects based on the skills and relationships I develop that can
transcend or persist after that project. - Tim Ferris
Jennifer Dewalt shipped 180 sites in 180 days while learning to code, and
now is technical cofounder of a YCombinator-backed startup.
Jessica Hische practiced design by shipping one drop cap a day every day
since Sept 2009.
Niklas Göke built a massive audience writing one book summary a day
from 2016.
Casey Neistat put up a daily vlog for 550 days and became “one of the
Internet’s most famous celebrities”.
Kate Bingaman practiced illustration by drawing something she purchased
everyday from 2006 to 2014.
Michelle Poler decided to get over fear by spending 100 days facing her
fears. This kick-started her motivational speaking career. Jia Jiang did the
same with rejection.
Megan Gebhart couldn’t decide what she wanted to do, so she decided to
have a cup of coffee with a different person every week for a year.
Both Pieter Levels and the Shooting Unicorns duo decided to do 12 projects
in 12 months, and both didn’t complete it because they found something so
successful that it became their full time gig.
This book was shipped by writing 2-4000 words every day from April 10th
to June 1st 2020.
Of course, entire companies have emerged out of side projects, from Slack
(offshoot of a failed MMORPG) to Apple (a side project of an Atari employee).
Chapter 38
Developer’s Guide to Twitter
Twitter is at once optional, yet incredibly important in the developer community.
An academic survey concluded that developers use Twitter for Awareness of
new projects and practices, serendipitous and social Learning, and building
professional Relationships.
We know that great projects and communities are organized on Twitter. But at
the same time great developers also do well without any Twitter presence
whatsoever. An enlightened empiricist might therefore conclude that Twitter has
zero bearing on developer success!
The truth is, whether you would benefit from Twitter depends on the community
you’re in and your natural affinity to the format. The #1 feature of any social
network is the people already on it. Look at the leading figures in the
language or framework or other developer community you care about. Where
are they most active? That’s probably where you should be. For whatever
reason, Twitter is currently the watering hole for everyone from frontend web
development to machine learning to infosec. If you’re reading this in the future,
it may have changed, but I doubt it.
Projects you use may also have a Twitter account - some merely post project
updates, but others may also retweet interesting work done by community
members that you should check out. Follow people who work on that project,
and follow your peers who are also doing cool things with it. Here is where you
will start to find your community - people who can inspire, encourage , and
challenge you.
The other thing you can do from the get-go is to set up your profile. Get as good
a Twitter handle as you can - preferably your name, without underscores, no
misspellings, no numbers. Of course it might already be taken, so you may need
to get creative, or pick some other handle representing what you want to be
known for (e.g. there are a lot of Joe’s in tech, so Joe Previte goes by JavaScript
Joe, and his site is http://jsjoe.io/, so his handle is just @jsjoeio). This is
mainly important because it is the primary way people will call on you. Don’t
worry, you can change it later if you need to.
The other basic element of the profile is selecting a good avatar picture and
name. If in doubt, just use your real name, and a good picture of you smiling (or
a picture of you with a great story to it that you can tell when asked). This is
your “face” online - people will see it before they see anything else you post, and
eventually subconsciously associate your profile whether or not they want to
read what you have to say. When people talk about you in real life, they’re
likely to use your Twitter name and handle. This transfers across social
networks, and people like seeing the same names and faces pop up across
GitHub, Twitter, YouTube, and Slack. In a world of default anonymity,
consistent identity is king.
In your bio, you should indicate what you do and what you’re about. This is
Twitter’s equivalent of a business card. Offering your job title and company, and
what you do there, can be a good shorthand, but be sure to double check whether
there are any company social media restrictions you need to abide by (for
example, publicly traded companies often have regulator-imposed restrictions).
You can also choose to get a little more creative and inject some personality
instead - this isn’t LinkedIn after all!
Because there are no rules, you should make your own. It is easy to sign up
with the intention of staying informed on technologies you care about, but then
getting sidetracked into an infinite feed of memes, clickbait, and outrage. The
timeline is a slot machine and you need only scroll down to get the next hit of
dopamine. You can legitimately find yourself in the grasp of social media
addiction, and Twitter is only too happy to feed it. At a minimum, shut off all
email and phone notifications (which are on by default). If addiction is starting
to severely impact yourself or someone you know, seek help. For example, if
you find you cannot sit and code for two hours without compulsively checking
Twitter when you need to focus.
While you can connect with luminaries in your field and find future coworkers,
remember that “Dev Twitter” is dwarfed by the rest of the 330 million Twitter
users, engaged in every form of human interest from politics to finance to dog
ratings to academic research to K-pop. Developers you follow also have a range
of interests, and unclear policies about what they will or won’t do on the
platform. Different people use Twitter in drastically different ways - some only
tweet about a single topic, others broadcast every waking thought. You will have
to decide what you want out of Twitter in broadly three dimensions:
Since this is personal social media, you have the right to do whatever you feel
like doing, and it is difficult to give general advice in book form. But I can offer
some high level principles along with some reasoning as to why they are a good
idea, and you can then decide how much you agree with it.
Your impact also impedes what you can say. Like it or not, with great audience
comes great responsibility, and your audience will be the first to remind you of it
when you step out of line - placing high stakes where previously there were
none, and effectively losing control of your own public voice. To be rich and
famous is good, but to be comfortable and anonymous (or rather, known-just-
enough-to-be-credible) is better.
Experienced users can also tell when you buy followers, and it looks dreadful.
The 10,000-100,000 follower range seems like a sweet spot - enough to open
doors for you, but not so much that it starts controlling you instead.
A better goal for Twitter is to get off Twitter. By this, I mean that you want
your Twitter activity and friendships to translate into off-platform activity and
friendships. It is at its best when the people and projects that we find on it leads
to impact - collaborating on open source, working together on a company,
teaching the next generation, organizing for social change, or even real life
friendships.
I don’t know who first said this, but it rings true of each platform:
Real human connection is the goal - what Seth Godin might call Finding your
Tribe. You don’t need everybody to know you. You’re just there to find people
who share your interests. Kevin Kwok compared this to “Tapping a tuning fork
and seeing who resonates.”
I experienced this in a real way one weekend when I decided I wanted to start
the first SvelteJS meetup in New York with no organizing experience and no
resources. Within one week I got a venue, speakers, and 50 people showing up to
kick it off, all entirely via Twitter friends. Since then, it translated into a global
conference attended by thousands of developers across five continents. In other
parts of my life and career, Twitter has translated into countless speaking, open
source, work, and friendship opportunities. My experience is not special. You
can have this too with a few years of consistent engagement with fellow
developers.
Unfollowing someone noisy is a good first step, muting and blocking them is
more aggressive. All of these are reversible decisions. I’ve ended up following
people I’ve blocked because I made a mistaken snap judgement. Other people
act as “signal boosters” - retweeting and quote tweeting important/quality stuff
from others. You can stay on top of interesting but noisy people, by leaning on
others who do the filtering work for you.
I mute the nitpickers, block the outraged, like the kind, follow the
insightful. - Naval Ravikant
Keep in mind that you’re dropping into the deep end. As awesome as it is to be
a fly on the wall listening to experts debating, you’re going to be missing context
and required knowledge to keep up - for now. You’re also going to see people
performing at their best - sharing their wins and “overnight” success. Keep in
mind that their struggles and sacrifices are real but hidden. It’s normal to feel
overwhelmed when you compare everyone’s best to your worst. Twitter has
been described as an “imposter syndrome slot machine” - take inspiration and
insight, but keep everything in perspective.
Twitter gives you an algorithmic feed by default (giving you “Top Tweets”
determined by their black box algorithm). You can switch this to a chronological
feed on some apps, but it is anecdotally poorly supported. While you can’t do
much about your Home Feed (representing everybody you follow), you can stay
on top of select groups of people by using Twitter Lists. You can also stay on
top of high priority accounts by turning on notifications for them (you can do
this while still not letting Twitter interrupt you with push notifications). For a
more advanced workflow, look into using Twitter Lists and Tweetdeck. I
personally refrain from them because I fear those would lead me to spend even
more time on Twitter.
Probably at the top of the heap in terms of concerns is the balance of personal vs
professional. How much of your “whole self” do you share in public, or how
much do you “stay in your lane”? It isn’t a binary decision - people want to
interact with human beings, not bots - but there is some balance that will be
more right for you than others. Everyone has a filter - you will need to decide
what yours is.
The other dimension to think about is your positivity. A huge swathe of social
media is driven by constant outrage - while justified to various degrees, the
majority of it may not be in your immediate Circle of Influence. Engaging in
outrage and criticism might feel good in the short run, but may negatively impact
your mental health in the long run. You also have the same impact on anyone
who follows you. I’m not saying to never criticise or to never be outraged. I’m
just recommending that you pick your battles. It’s not the same as pretending
that “Everything is Awesome!” either. If something is truly terrible, by all
means, call it out. But remember that human beings always deserve human
decency. Criticise actions, not people.
If in doubt - stay 90% positive. Take special effort to point out truly awesome
things (e.g. work that other people have done), and elaborate why they are
great. People appreciate when you are a Beacon of Awesome.
You might feel that you haven’t done anything interesting yet. That’s fine. One
good way to get started is with retweeting content you like from others. As you
become more able to add value yourself you can start alternating between
retweets and your own original content.
There are a great number of other ways you can be helpful on the Internet:
Take some pointers from Daniel Vassallo, author of Everyone Can Build a
Twitter Audience:
A high-quality tweet:
Professional tweets have a few genres, and you could adopt Bianca Ciotti’s
taxonomy of posts and think about how different kinds of accounts have
different mixes of posts. For example, Brand Accounts like Wendy’s are mostly
Delightful, whereas Product Accounts like GitHub are mostly Transactional.
When you read something great off Twitter (e.g. via Hacker News or shared
internally at work or in an email newsletter), check to see if the author has
shared it on their Twitter. You can track it down easily by pasting the URL into
Twitter’s search, or use a chrome extension like this to automate that. Give that
author positive feedback, retweet it to your followers (ideally with an elaboration
of what you liked). If the post is not on Twitter, great! That’s something you
should post as a standalone tweet.
It is quite reasonable to get your first two to four thousand followers without any
notable achievement of your own, just by being an active community
participant. The reason I know this is because that’s what I did for a year while
learning to code. Having a good (read: helpful, informative, or funny) early
reply on someone else’s popular post gives you a lot of exposure.
It may seem silly, but humor is helpful too. Everyone needs to let loose every
now and then, and we all appreciate the occasional joke, meme, or cat picture.
Twitter definitely has a “back of the class” vibe to it. Not taking ourselves too
seriously and making lighthearted jokes is part of the fun. Some people in fact
find a lot of traction running meme accounts. This is great if you want to be a
comedian, but doesn’t always help you in your professional pursuits.
By far the most rewarding thing is creating something you’re proud of and
sharing it on Twitter. Your followers may not respond to every one, but do
enough good work and it will eventually be noticed. Just be sure not to hinge
your self worth on the vagaries of Twitter’s recommendation algorithms.
The main idea is that you don’t always want to be a taker in your various
relationships with people you meet on Twitter. You should give as much, or
more, than you get. Ironically, being a chronic giver will help you get much
more out of Twitter too.
One way to consistently add value as part of your Twitter engagement is to stop
thinking of every interaction as a transaction or a professional interaction. Sure,
on some level you could argue for it, but it probably doesn’t help. Nice people
don’t keep score. It’s better to think of Twitter as the ultimate tool for
Learning in Public.
Tweet out anything insightful that you learn. We’ve discussed summarizing
podcasts and talks, but you can go a LOT further. Share interesting quotes with
attribution to the source. Screenshot pages of books you read with key sentences
highlighted. Record videos of amazing demos. Learn in Public.
Note that this works for you even with zero followers. Because you are using
Twitter as a note-taking app, you now have a free, immutable, publicly
searchable record of everything you’ve learned.
You might chafe at the format - 280 characters isn’t a lot to work with. But
constraints are sometimes blessings in disguise. In this case, you are forced to
summarize everything, and break up your summaries to multiple tweets if you
need to. This makes every tweet an interactable and linkable chunk of
knowledge - fast to read, and trimmed of excess fat. Because it’s so short,
there’s no point spending too much time on it either.
It turns out this is great for Future You - and the people who follow you. All
content must be condensed to this tiny format - bigger than a headline and
smaller than a paragraph. It means that everyone (loosely) has an even playing
field, and you aren’t allowed to ramble on without getting straight to the point.
For those familiar with the Faustian bargain of Google AMP - Twitter is “AMP
for thoughts”. From the consumption side, Twitter is RSS reborn.
What’s great about tying a social network to your note taking is that your
followers have an equal chance of benefiting from your notes, as they do
contributing to them. Instead of a comment section all the way down at the
bottom of a blogpost or YouTube video, they can chime in at the appropriate
spot. I have learned a tremendous amount from people pointing out related
resources and readings. This informal, spontaneous, collaborative learning is a
form of Open Source Knowledge and can be very powerful for building your
knowledge, reputation, and network all at the same time.
A final tip: Tweet Threading works across time - power users call this a
Zettelkasten or Memex. You can explore that concept on your own.
Chances are you won’t be involved in anything as serious as that New York
Times story I just linked. It’s far more likely that you will attract the occasional
loud critic, or be quietly removed from opportunities that you might otherwise
have received.
In these situations it is important that your good intentions are clear and that you
demonstrate that you can receive and act upon feedback well. Instead of
instantly defending yourself, listen to the substance of the criticism, and address
them or apologize accordingly. We all screw up sometimes, and knowing how to
admit you are wrong is a better strategy than trying to never be wrong. As Tim
Ferriss notes, some version of “I hear you” will diffuse 80% of haters. Just make
sure you mean it.
Nitpicking
Insults
Straw-manning
Goalpost-moving
Deflection
When you do, stop replying. There is no point continuing the conversation.
Also, recognizing these traits will help you avoid arguing in bad faith yourself.
Don’t share secrets. You will gain access to more and more privileged
information as you grow in your career and network. This is beneficial to
you, but nobody’s going to tell you anything if you just blab it out to show
how cool you are. Of course, telling company secrets is a fireable offence.
Don’t police others’ Twitter behavior. They have a right to use Twitter
differently from you. If you find yourself getting upset over a like or
retweet or follow or unfollow, you may be getting too caught up in Twitter
drama. We tend to judge ourselves based on our intentions, but judge others
based on their action. Because Twitter is a cold medium, we even judge
inaction, despite clearly knowing that there are more important things in
life than Twitter.
Imagine explaining why you’re upset to a friend who doesn’t use Twitter. If
all you get is bemused sympathy, you may be starting to lose a grip on
things that actually matter. Let it go. Respect people’s right to disagree. Of
course, genuinely reprehensible behavior with deserved real world
consequence does happen on Twitter too. It’s a fine line to draw and
nobody does it well. Just remember that there is a line, and Twitter has no
built-in mechanism to tell you when you’ve crossed it. Meta-outrage will
happily consume your life and mental health if you let it.
Yes, it is ironic giving advice that you shouldn’t tell others how to
use Twitter, in a chapter meant to tell others how to use Twitter.
Unfortunately, this rule is recursive – people who police others’
Twitter behavior don’t appreciate being told not to police others’
Twitter behavior. Therefore, I don’t. Feel free to ignore
everything here – it’s your life, your rules.
Don’t use excessive hashtags. Self-styled “SEO experts” might tell you to
throw on a bunch of hashtags to “increase discoverability” or something.
No serious Twitter user actually does that. We can Smell Corporate a mile
away. Keep hashtags to a max of three in your bio, and up to two in your
tweets. Ironic usage is, of course, allowed. But be funny or Poe’s law will
strike.
As you proceed, you will figure out your own rules for what you don’t do on
Twitter. I personally use “dinner table rules” - I avoid discussing politics,
religion, climate change, medical conditions, and other non-finance-or-dev-or-
career-related topics (I make some exceptions for cat pictures and good music).
I also refrain from unconstructive industry debates:
For others, those topics are a key part of their identity and they have as much
right to discuss them as you do to ignore, unfollow, or mute.
Just remember that you have the right to free speech, but that right doesn’t shield
you from criticism or consequences.
Support other people. Avoid toxicity. Strive for “Yes, and…”, instead of “Well,
actually…”. Your experience of Twitter will be best when you try to win hearts
instead of change minds.
And be patient - you are building a network that will be with you an entire
career, and maybe lifetime. Your Twitter relationships will probably outlast
any job. Invest accordingly.
Chapter 39
Marketing Yourself (without Being
a Celebrity)
You have done something significant that you are proud of or enjoyed
Just before some major professional move or project launch (jobhunting or
getting a promotion or even when trying to pitch an idea)
For the rest of this essay I will primarily talk in terms of marketing yourself, but
the tactics here also work for marketing your ideas and your projects.
39.2 Introduction
Marketing is important for your career. This isn’t earth-shattering news:
according to a recent survey, 91% of you already agree.
But people tend to doubt their ability to market themselves well. They see “tech
celebrities,” and then they look at themselves, and they say: “I’m not like that;
when I put out a blogpost I don’t get a billion likes,” or “I don’t want to be like
them — that seems hard.”
The mistake here is equating marketing with celebrity. It’s like saying your
favorite restaurant shouldn’t bother trying because McDonald’s exists. They’re
two different (but related) things!
You are a product. You work really hard on making yourself a great product.
You owe it to yourself to spend some time on your marketing even if you don’t
want to be a “celebrity”. Like it or not, people want to put you in a box. Help
them put you in an expensive, high-sentimental-value, glittering, easy to reach
box. Preferably at eye level, near checkout, next to other nice looking boxes.
It’s not that hard to be better than 95% of devs at marketing. The simple fact is
that most devs don’t do the basic things that people tell them to do. I think this
has two causes:
It’s not code. Code is black and white. Marketing is shades of gray.
A lot of advice is very generic. “Blog more”. Devs often need more help
transpiling this to actionable instructions.
Let me try.
And you certainly want to benefit in the other direction: you want to be that
thing that others find out about from someone somewhere. You want to register
hooks in people’s minds. You want to drive people to check you out. And you
want people to prioritize working with you.
One constraint you have (one that other marketers wish they had) is that you
don’t have to market to the whole world. You can target the specific
audiences you want to work for, and no more than that. As long as you are well-
known in those circles, you don’t need a public presence at all. Your conversion
rate will be higher, and your stress probably lower (as will be your luck surface
area).
Think of yourself as a plain, unmarked can of soda. You’ve got awesome fizz
inside. Branding would slap a distinctive logo and colors on the can. Marketing
would then be responsible for getting you, the freshly minted can of Coca Cola,
at the top of people’s minds.
Branding is the stuff that uniquely identifies you. Marketing gets your
awesome in front of people.
Of course, it helps marketing to have strong branding. This is why they are
correlated. In fact, the strongest branding creates its own market. You don’t
want a laptop, you want a Macbook. You don’t want an electric vehicle, you
want a Tesla. You don’t want sneakers, you want Air Jordans. You can probably
come up with more examples.
It’s really easy to sell to a market in which you are the only seller. Shooting fish
in a barrel you made. Nobody can compete with you at being you.
Your personal brand is how people talk about you when you’re not in the room.
So naturally, one way to start picking a brand is to listen to what people have
naturally chosen for you.
Caution: you may not like what you hear! That’s OK! That’s what we’re trying
to fix.
If you can get a friend to tell it to you straight, good. If you can get some people
on a podcast talking about you without you there, good.
Or, like me, you can accidentally eavesdrop on a conversation. I swear I did this
unintentionally!
The first time I found out I had established an incredibly strong personal brand
was when I was at a house party with 20 friends and friends of friends. While in
a small group, I overheard someone behind me talking about me. They
introduced me as “that guy that preaches Learn in Public”. Then, at a later hour,
I heard another person introduce me without me there. Then, again, when
joining a new group, a third person introduced me the exact same way.
There are other aspects of my personal brand that don’t get as much attention,
but I bring them up front and center when relevant. I changed careers at 30. I
used to be in finance. I served as a combat engineer in the Army. I am from
Singapore. I speak Mandarin. I’ve written production Haskell code. I sing a
capella. I am a humongous Terry Pratchett fan (GNU Terry Pratchett). I love
Svelte and React and TypeScript. I am passionate about Frontend/CLI tooling
and developer experience. I listen to way too many podcasts. The list goes on.
But I have this list down cold. I know exactly which parts of me spark interest
and conversation without going too off track. Therefore I can sustain interest
and conversation longer, and in exchange, people know when to call on me. You
should keep a list too — know your strengths and unfair advantages.
What I do NOT consider my personal brand is the stuff that doesn’t differentiate
me at all. For example, when asked about my hobbies, I deflect extremely
quickly. I identify as a “Basic Bro”: I have my PS4, and Nintendo Switch, I like
Marvel movies and watch the same Netflix shows you watch. Just like the
million other Basic Bros like me.
I’m serious about that second part - You don’t want trolling or outrage or cruel
sarcasm to be your brand, nor do you want to bum people out all the time.
Instead, entertain, educate, inspire, motivate.
“I’m a former public school teacher and I think the way we teach people to
code can be greatly improved.”
“I was an actual architect and we’re doing software architecture all wrong.”
“I did my graduate thesis on static analysis and I see a new generation of
tools that make developers faster and less frustrated.”
I really want to give you more hints on this, but I’m afraid if I gave more
examples I might limit your imagination. Don’t even take this formula as a
given. It’s just one template – Another template is “X for Y”: “<what you
do> for <who you do it for>”. “I create gorgeous, accessible frontends
for DTC ecommerce brands” is a highly marketable oneliner pitch. “I create
backends that scale to millions of peak concurrent users for live streaming
apps.” And so on. This is a more business oriented template that puts the target
audience/customer squarely in focus.
The point is, being able to pitch yourself (and why people should care) in a
short, consistent way is a powerful weapon in your marketing arsenal. You can
choose to think about this rather than improvise.
Once you know what you’re about and have nailed down your brand, it’s time to
plaster it all over. You know how Nike pays athletes millions of dollars just to
wear stuff with their logo on it? That’s what you’re going to do with everything
you touch. Top brand consultants ask: “What are the best ways to connect your
values and unique value proposition to your site?” You should do that with your
portfolio, blog, Twitter, resume, and work output.
Manifest your brand. You don’t have to stay digital. In fact, in a digital-first
world, going physical sticks out. If your product gives people peace of mind,
you might fill your office with aromatic candles and hand them out as gifts (this
is not hypothetical; this has been done). Shirley Wu is a data visualization
consultant; she printed out her data visualizations as her business cards and
hands them out at conferences. You BET they return 1000x their marketing
expense in memorability and virality.
Be remarkable. Seth Godin (you’re going to hear his name a lot in marketing,
think about why) calls this having a Purple Cow. Design Pickle, a design
agency, picked a unique name, and literally dress up in pickle suits and hand
out pickles at conferences, which gets them notoriety and business. To manifest
their brand, they lean hard into it, and see great success while having a lot of
fun, because their brand is authentic and consistent all the way through from
their name down to their swag.
39.4.6 Consistency
Here’s an idea of how much humans love consistency. We often want people
who are famous for doing a thing, to come on to OUR stage, and do the thing.
Then they do the thing, and we cheer! Simple as that. There’s so much chaos in
the world and having some cultural touchstones that never change is comfort and
nostalgia and joy bundled up into one. Here’s Seth McFarlane being prodded to
do the voice of Kermit the Frog and Stewie from Family Guy - something he’s
done a billion times on a billion talk shows - but he does it anyway and we love
it anyway. We LOVE when people Do the Thing!
Photo. Take a good photo and use the same photo everywhere. A
professional photographer is worth it, but even better can be something with
a good story, or an impressive venue. If possible, try to show your real
face, and try to smile. This already puts you ahead of 50% of users who
don’t understand the value of this.
Photos are seen before usernames. Examples here and here.
Companies spend millions on their logos. So why shouldn’t you spend
some time on yours? We are irrationally focused on faces, and we really
like it when people smile at us. Thankfully, because it’s just a photo, it
costs us nothing to smile at everybody all the time. It’s a really easy way to
associate your face with positive emotions. And when we see you pop up
on multiple different platforms with the same smiling face, we light up!
The emotion completely transfers, and the branding is nonverbal but
immediate.
Real Name. Show your real, professional name if possible, unless your
username is your working name. This works especially well in anonymous
platforms like Reddit and Hacker News, because you are taking an
additional step of de-anonymizing yourself. People respect this.
Username. Your username should be your name if possible (so people can
guess it), or failing which, something you intimately identify with. You
should probably have the same one on most platforms, so that people can
find you/tag you easily. Some, like myself, will simply use their usernames
as their working names for ever. This can be a branding opportunity as
well, similar to the way musicians adopt mononyms and fighter pilots adopt
callsigns.
Words. You should consistently associate yourself with a small set of
words. Where a bio is allowed, you should have those words prominently
displayed. For example, it doesn’t take a lot to show up whenever SVG
Animation or React and TypeScript are mentioned. You can set Google
Alerts or Tweetdeck filters for this, and before long you’ll just get
associated with those terms. When you have your own words, like a
catchphrase or motto, and it catches on, that is yet another level of personal
branding.
You will have made it when people start making fun of you. I’m not 100%
serious, but I’m at least a little bit serious: Can people make memes of you, and
others instantly get it? If so, you’ve got a personal brand.
All this personal branding will be 10x more effective when you have a Domain.
The first just makes sense - instead of putting all your work on a platform
somebody else owns, like Twitter, YouTube, LinkedIn, or another industry blog,
have it primarily discoverable on your own site/blog. This builds your site as a
destination and lets you fully control your presentation and narrative — even
off-site, on Google.
Having a distinctive site design is yet another point of personal branding that,
because you are a dev, costs basically nothing. People come to my site and they
remember my scrollbars.
Just understand that your domain and your website are the center of
your identity, so ideally you’d have a good domain that will last a
literal lifetime. - Daniel Miessler
But the second meaning deserves more introspection: I am asking you to plant
your flag. Put up your personal bat signal.
I used to have a very crude, kinda sexist name for this idea: “Be the Guy.” This
is because I noticed how many people were doing this:
The Points Guy is the Internet’s pre-eminent authority on travel perks (now
a 9-figure business)
The RideShare Guy blogged about Ride Sharing for 4 years, and became
the guy Wall Street called upon when Uber and Lyft IPO’d
Science communicators have definitely caught on to this. Neil deGrasse
Tyson always introduces himself as your Personal Astrophysicist. But he’s
completely owned by Bill Nye, the Science Guy!
If you skim over “the guy” as a gender-neutral shorthand, the actual important
thing about having “a guy” is that you look better just by “knowing a guy”.
Listen to Barney Stinson brag in “How I Met Your Mother”:
You know how I got a guy for everything?… My suit guy, my shoe
guy, my ticket guy, my club guy, and if I don’t have a guy for
something I have a guy guy to get me a guy!
Just by “having a guy” for something, you suddenly feel no desire to overlap
with that person’s domain. You can now focus on something else. And, to the
extent you do that, you are now utterly dependent on “having a guy”. You’re
also extremely invested in your “guy” (aka go-to person – the gender is not
important) being as successful and prominent as possible, so that you look better
by association.
It should strike you now that being someone’s go-to person is very valuable, and
that this also scales pretty much infinitely (you can be as many people’s go-to
person as you want, so long as they rarely actually call on you).
You get there by planting a flag on your domain, and saying, “this is what I do”
(a framing I stole from an excellent Patrick McKenzie keynote). People want
expertise. People want to defer to authority. People don’t actually need it all the
time, they just want the option just in case. People love hoarding options. You
can satiate that latent insecurity indefinitely. Most people also define “expertise”
simply as “someone who has spent more time on a thing than I have” (The bar is
depressingly low, to be honest. People should have higher standards, but they
just don’t. This is a systematic weakness you can – responsibly – exploit.)
You don’t need to get too creative with this one. You want to connect yourself to
something important:
Maybe something people deal with daily but don’t really think about too
much (especially if they know they are leaving something on the table, like
airline points — it’s easy to make money by helping people unlock free
money).
Maybe something people only deal with once in a blue moon, but when
they do it REALLY hurts (so you gain unfair expertise by specializing in
having repeated exposure to rare events across multiple customers).
There are a bunch of these, so to narrow them down even more, look out for
something you disproportionately love. Look for your own revealed
preferences: Search a topic in Slack or Twitter and see how often you talk about
it. Look up your own YouTube watch history. An ideal domain for you is
something that seems like work to others but is fun to you.
With everything you love, there are things to hate. Find something within what
you love, that you are ABSURDLY unsatisfied with. That love-hate tension can
fuel you for years.
For any important enough problem, there are plenty of experts. Do you feel like
you haven’t narrowed enough? Shrink your world. Be an internal expert at your
company for your domain. This also helps you focus on things that bring value
to a company, and therefore your career. It’s also a very natural onramp to being
an external expert when you leave.
Think about the last time you purchased soap. You probably buy one of two
brands of soap. But there are 100 on the shelves. They just weren’t in your
consideration set, so they never had a chance.
By the way, we also have huge Availability Bias when it comes to recall. We
conflate “top of mind” with “being the best”.
It’s your job to be the best at what you do (and to define what that means), but
don’t stop there. It’s also entirely within your control to be considered the best,
which is what claiming your domain is all about.
The flip side of planting your flag is that you shouldn’t plant it anywhere else.
People like to see commitment. It implies, and usually does mean, that you have
no choice but to be a domain expert. You signal commitment by giving up
optionality. This is 100% OK - what you lose in degrees of freedom you gain
10x in marketing ability.
The secret is — and don’t tell anyone — that if you pick a domain and it doesn’t
work out, you can still pivot if you need to. Nobody’s going to hold it against
you, as long as you don’t pivot too often.
If you really aspire toward more general prominence, you will find a much easier
time of it if you first prove yourself in a single domain.
39.5.5 Blogging
I will always encourage you to blog — but don’t fool yourself that merely
pushing a new post every month will do anything for you by itself. That’s just
motivational shit people say to get you started. There’s a lot of generic,
scattershot advice about how you should blog more. These are usually people
trying to sell you a course on blogging. (Except Steve Yegge!)
The fact is blogs gain extra power when they are focused on a domain. CSS
Tricks is a well-known blog in the frontend dev space, and, as you might guess,
for a long time it’s domain was entirely CSS tricks. (It’s expanded since then).
Like everything else you follow, it’s all about signal vs noise.
Blogs help you get more juice out of that domain name you own, by constantly
updating it with fresh content. You can also use it to feed that other valuable
online business asset: your email list! Overall, it is just a good general principle
to own your own distribution.
Twitter is a form of microblogging. It lets you export data easily and your
content shows up on Google without an auth wall. All good things. But you’re
still subject to an algorithmic feed. Social media followings are definitely not
distribution that you own — but it can be worth it to make the Faustian bargain
of growing faster on a platform (like Twitter) first, then pivoting that to your
blog/mailing list once you have some reach. Growing a blog/mailing list from
zero with no other presence is hard.
Have at your fingertips all the relevant statistics, data, quotes, and anecdotes for
when you solved major product pain points, or contributed a major revenue
generating/cost saving feature. Julia Evans calls this a Brag Document. You
should be able to recite your big wins on demand, and frame it in terms of
What’s In It For Them, because you will probably have to. Managers and
employers are well intentioned, and want to evaluate you fairly and objectively,
but often the topic of your contributions comes up completely without warning
and out of context, and you want to put yourself on the best footing every time.
You might notice some differences between the general form of personal
branding we discussed previously, and this “applied” form of personal branding.
They are different because you have different goals. With general personal
branding, you are trying to be memorable and relatable. People want to get to
know you and people like the somewhat familiar (But not too familiar!
Familiarity breeds contempt.) With applied personal branding, you are
straightforwardly trying to sell yourself and help others sell you. Here you want
to focus on unique achievements and traits, including highlighting notable
successes.
Be just a little shameless. Nobody’s going to like fighting for you if you don’t
show any interest in fighting for yourself.
Unfortunately, “Market Your Business Value” is not at all helpful advice for
people who have yet to make attributable business impact through their work:
Code Newbies and Junior Devs. Sometimes, even as a Senior Dev, you are still
trying to market yourself to fellow Devs. These two situations call for a different
kind of marketing that is under examined: Marketing your Coding Skills.
There are explicit requirements (those bullet points that companies list on job
descriptions) and implicit requirements (subconscious biases and unnamed
requirements). You can make it very complicated if you want to, but I think at
the core developers generally care about one thing: that you Do Cool Shit.
Some have an expansive definition of coding skills - even if you’ve done
something totally unrelated, they’ll easily assume you can pick up what you
need later. Others need something closer to home - that you’ve Done Cool Shit
in a related tech stack.
If you’re marketing yourself for employment, then the risk averse will also want
to know that you have also Covered Your Bases — That, along with the upside
potential of hiring you because you’ve Done Cool Shit, the downside risk of
your being a bad hire is minimized. Do you know Git? Can you solve
FizzBuzz? Is your code readable and well documented? If you have shepherded
a nontrivial project from start to finish, and have people you can ask for
references. If instead you’re just marketing your projects and ideas, then
downside matters less — it’s easy to walk away.
The definition of Cool really depends on your taste, but people’s interests are
broadly predictable in aggregate. If you look at tech sections of popular
aggregator sites like Reddit and sort by, say, most upvoted posts in the past year,
you can see patterns in what is popular. In fact, I’ve done exactly that for
/r/reactjs!
Even if your project is less visual, and more abstract, you still need to explain to
the average programmer why your project is Cool - it solves a common/difficult
problem, or it uses a new technology, or it has desirable performance metrics.
The best Cool Shit will be stuff you have been paid money for and put in
production, and that people can go check out live. If you don’t have that yet, you
can always Clone Well Known Apps (automatically Cool) - or win a Hackathon
(check out Major League Hacking) - or Build Your Own X from Scratch, another
popular developer genre.
They display your work easily and spells out the quick takeaways per piece
- you control your narrative!
They help you diversify your appeal - if one project doesn’t spark interest,
the next one might!
They look skimpy without quantity - meaning you feel forced to Go Wide
instead of Go Deep. Quantity over Quality.
They overly bias toward flashy demos (which doesn’t really help if you’re
not focusing on Frontend Dev/Design)
You can and should buy designs if design isn’t a skill you’re trying to
market - it gives your projects an instant facelift which is generally
worth multiples of the <$100 that a premium design typically costs.
Some people plan their projects based on how they will look on a portfolio - the
dreaded “Portfolio Driven Development.” That lacks heart, and it will show
when you talk about your projects at interviews and talks. Instead, pursue the
projects that seem most interesting to you, and then figure out how to present
them later. Your interest and enthusiasm when talking about them will go further
than padding the portfolio.
In actual practice, there is a wide variety of devs and dev careers for which
portfolios make no sense at all. Your humble author is one of them. You can
market your coding skills in any number of more relevant ways, from doing
major contributions to Open Source, to being Highly Available surrounding a
Domain, to blogging. The most general, default marketing skill is definitely
blogging. You can write about any kind of technical topic in your blog.
At the end of the day, what you really want to accomplish is to demonstrate
Proof of Work. Just like in a blockchain transaction, anyone checking you out
should be able to instantly and trivially verify that you have worked on some
very non-trivial things. When it comes to marketing in public, this is a business
card, resume, and interview all rolled into one.
Pick a Channel. The best marketing channels are the ones you’re already on.
Whatever the reason you enjoy it, you have a natural affinity for it. For me, it
was Reddit, and then Twitter. Dev communities like Dev.to are great too, as are
the ones you build on your own (aka your mailing list). Just be aware that some
platforms are less rewarding than others. For example, Facebook charges you to
reach your own subscribers, LinkedIn is full of spam, and Reddit and Hacker
News don’t show an avatar so you don’t get to imprint your personal brand. I
think Instagram and YouTube are huge areas of opportunity for developers. Just
pick one or two, and go all in. A lot of people use social media tools like Buffer
to crosspost, but I think this is misguided, because you end up underinvesting in
every platform and everyone can tell you aren’t there to engage.
Don’t Lie. Most things are taken at face value online, and this is wonderful for
getting your message out there. But if you misrepresent what you were
responsible for, or straight up fabricate something, you will eventually get found
out. We like to think that things live forever online, but I think it’s actually
easier to erase something from Google than it is to undo the reputation damage
caused by a lie. People will hold it against you for years, and you will not have a
chance to defend yourself or atone for your sins. Stephen Covey calls this the
Speed of Trust. Once you lose trust, everything you say gets run against a
suspicion check, and you have to put up more proof points to be taken seriously.
This also applies to promises of future commitment too — if you simply do what
you say you were going to do, you will stand out.
Don’t Share Secrets. You will gain more privileged information over time as
you grow in your career. This is advantageous to you, and you should do
everything you can to show you are a trustworthy guardian of that information.
People might flatter you to get that information, or offer an information swap.
But the only way to encourage more information flow to you is to show that you
can keep a secret. If it helps, I’ve started by flatly saying “That’s not my info to
discuss” and people usually get the hint.
Market Like Nobody’s Watching. Because probably nobody is, when you’re
just starting out. It’s OK: this is your time to experiment, screw up, find your
voice. Because marketing yourself doesn’t ordinarily fall within normal comfort
zones, you should try to do a little more than you’re comfortable with. An
aggressive form of this advice? If you’re not getting complaints about how
you’re showing up everywhere, you’re not doing it enough. This advice makes
sense to some people, and is way too upfront and annoying for others. We each
have to find our own balance — it’s your name on the line after all.
Market for the Job You Want. This is a variant of “Careful what you wish
for… you just might get it.” You’ll probably end up getting what you market
yourself for… so make sure it’s something you want!
If you are obnoxious online, people can mute you and carry on with their lives.
If you are obnoxious at work, it can backfire pretty directly on you. In particular
- always share credit where it’s due and never take credit for something that
wasn’t yours. Of course this applies in public too, but enough people do it at
work that I feel the need to remind you.
Basics aside, you would probably agree that it’s important to ensure you get
visibility for the work that you have done. Here are some ideas:
For more ideas on becoming indispensable at work, check out Seth Godin’s
Linchpin. You can find a decent summary here.
Being a Celebrity.
Better to be rich and unknown than poor and famous. If you can build
a successful tech career without being a celebrity, then absolutely do
that — unless you just crave the attention.
I haven’t mentioned followers once in this entire essay. You can buy
followers and everyone can tell. It looks sad.
Building real relationships with peers and mentors you respect is way
more fulfilling than raw numerical mass appeal.
39.10 Recap
That was a LOT of high level marketing concepts. Do take a while to digest
them. The last section is going to be a grab bag of tactical ideas for marketing
yourself - after you get the important details in place.
To recap:
Assemble your Personal Brand, your Domain, and your Coding Skills/Business
Value, then Market Yourself in Public + at Work.
As Troy Hunt often notes in his career advice, good personal marketing is your
Plan B. If you only start doing it when you need it, it will be too late. Take the
time to work on it while the stakes are low, and you’ll be much better at it when
the stakes are high.
I’m pretty good at making demos, but I’m not very good at
original ideas, so what I try to do is find smart people with really
good ideas who are struggling to explain those ideas and why
those ideas matter, and I popularize them because those ideas
deserve that. And I think people respond to that. And you
remember who you learn from.
Market the same thing three different ways. A great exercise to hone
your marketing skills is to interpret the same thing three different ways.
During a prior job I was forced to queue up tweets for the same blogpost
multiple times, but because of Twitter rules I wasn’t allowed to repeat
myself. I used to dread it, but then reframed it when I realized that this was
a great exercise in figuring out how to market the same thing to different
audiences. You can do this with your own personal brand, too. You’re a
multidimensional person — if there is some part of you that connects better
with your audience in context, use that! I recommend Leil Lowndes’ How
to Talk To Anyone for great tips on this.
Crosspost on Industry Blogs. A nice way to get attention for your work is
to do great work on someone else’s platform. Industry blogs (and
newsletters) are pretty much always looking for quality content. For
Frontend Dev, the ones with rigorous editing are CSS Tricks, Smashing
Magazine, and A List Apart. For Backend, you can try Twilio, Digital
Ocean, or Linode’s blogs.
Elevator Pitch. In the old days, you prepared pitch literally for when you
ran into the decisionmaker on a 30-second elevator ride. A typical template
goes something like “if you’re a <role> who <point of view>, I/my
thing <what it does> in <some eyepopping metric>”. In this
day of both TikTok and podcasts, attention spans are both shorter and
longer than that. You need to tailor your elevator pitch accordingly. Be
able to sell yourself/your idea/your project in:
1 hour
15 minutes
5 minutes
30 seconds
280 characters (a tweet)
(stretch goal) 2 words
Summarize the top three books in your field for your blog. This idea is
often attributed to Tim Ferriss, but I’m sure multiple people have come up
with it. The idea is that you don’t have to be original to have a great blog:
it’s easy to bootstrap your web presence — and your own expertise — by
covering existing ground. If you do it very well you can rise to prominence
for that reason alone: Shane Parrish and Mike Dariano built Farnam Street
and The Waiter’s Pad purely off summaries. Then practice marketing your
summaries by syndicating them on Twitter. Make talks out of them at work
and on YouTube.
Further Reading:
Human beings are works in progress that mistakenly think they are
finished. - Dan Gilbert
In other words, I have installed 35 new applications into your memory that you
can boot up and run on demand. I really hope you use them well.
Tactics are like utilities. You pull them up for a quick reference when you need
them, drop them again when you are done.
Strategies are like big apps. You will almost constantly run them and all your
data is in them, so you take your time to choose. Slack or Discord? Notion or
OneNote? Figma or Sketch? Visual Studio or IntelliJ?
Principles are like daemons (or services, which is Windows’ much less
interesting word for the same thing). You should always have them on. They
protect you from malware, they prompt you to take action, they help you handle
the thousands of inbound decisions and choices that you make every day.
If you find any bugs in these apps, send a bug report to me!
But what about your underlying operating system itself? Who is taking care of
that? That’s where your underlying Habits come in. If your Principles,
Strategies and Tactics operate at the conscious level, then your Habits work on
your subconscious.
40.2 Coding Career Habits
I’m not a great programmer; I’m just a good programmer with great
habits. - Kent Beck
Because your habits are automatic, and regular, they have tremendous
compounding power, both good and bad. The authorities on this are James
Clear’s Atomic Habits, Charles Duhigg’s The Power of Habit, and Stephen
Covey’s 7 Habits of Highly Effective People - they offer more detail than I can
do justice to here, so I recommend you read them.
The first category of habit to get control of are the habits that directly operate
your “hardware”: Your physical and mental health. Family, faith, hobbies,
fitness, sleep. If these habits aren’t maintained well, they can cause a hard-to-
diagnose system failure in yourself.
Sleep is important, not least because we spend a third of each day doing it. You
should know Why We Sleep.
Take care of yourself. This job can destroy your hands, back,
shoulders. Walk, talk, stand, squat, whatever. Your hands and back
and brain are your money. Treat them right now and they’ll last you
30-50 years.
Repetitive Strain Injury can end your coding career unexpectedly. It doesn’t feel
serious at first, but accumulated damage over years can be too late to reverse
when it starts getting serious. Check my compilation of RSI resources for more.
The second kind of Habit handles all your interactions with everything directly
connected to you that isn’t actually you. There are many such angles to consider,
but I will pick out Storage, Networking, and Virtualization as examples.
Modern CPU’s have a series of caches, from L1 to RAM. The further away you
go, the slower the speed of recall. This is loosely analogous to the human
Forgetting Curve. But for true, persistent, durable storage, we need to store our
information on hard disks. For humans, the most efficient form of this is
writing. Therefore the habit of writing a lot helps you increase the bandwidth of
everything you communicate to your future self and the outside world. This
seems costly in terms of times, but remember that the speed of most algorithms
are drastically improved with just a little bit of memoization and judiciously
stored data structures. Even context switching becomes a lot cheaper!
Your current brain is good, but see what happens when you build a “Second
Brain” that does everything your first is bad at!
Computers got a lot more interesting once they started talking to other
computers. In fact, there’s a rule for just how much more interesting: Metcalfe’s
Law says the value of your network grows quadratically! This is why you are
well served spending time building your network, including outside of your
current company. Whatever you choose, whether open sourcing your
knowledge, speaking at conferences, or marketing yourself, will help.
Finally, many apps are better easier run inside virtualized containers, where a
constrained environment helps provide better reliability and scalability. In the
same way, you can make your environment conducive to your productivity.
Use an applied understanding of psychology to turn yourself Indistractable,
offering some process isolation from the diversions of our modern Attention
Economy. Don’t overcomplicate your work rituals – start with simple tricks like
the Pomodoro Technique and work your way up. Learn the impacts of your
work environment on your own productivity and satisfaction. Remote workers
universally report much better productivity when they have a clear separation
between where they work and where they sleep. Don’t run “work apps” in your
“home container” and don’t intermix personal affairs with work!
The third category of Habit concerns your scheduler (also known as a process
manager). Does it drop tasks? Does it prioritize low priority tasks over high
priority ones? Is it bad at task switching or terminating clearly stalled apps? If
so, it may be buggy. Get control of your schedule. Create a single source of
truth (per category), put everything in it, and make time for things that matter.
To tell if things matter, defer execution as much as possible: Say “No” more to
your impulses and other people’s requests. Just like you would want any API
to behave, rejecting tasks is better than accepting and never doing them.
Knowing how to say No well Sparks Joy.
Remember our biases in the Eisenhower Matrix - we often neglect the Not
Urgent yet Important things for the Urgent yet Not Important ones:
Almost every endeavor of lasting, long term value is Not Urgent, yet Important.
If time is more valuable than money, then the skill of making time is more
valuable than the skill of making money. Learn to make time.
Strategy matters. Make time for the big strategic decisions in your life. Time
is uneven – Some years will pass like days, but some days will feel like years.
You can’t control when your big career breaks will happen, but you can
periodically step back to reassess the big picture, everything from Business
Strategy to industry Megatrends to how you are progressing on Career
Ladders. Luck will favor the prepared mind.
When you do work also matters. Your focus and energy do not stay constant at
all times of the day. The science of chronotypes has found widespread
acceptance and it is worth figuring out which you are. This will help you batch
focused work to times when your mental acuity is high, and leave administrative
chores to afternoon lulls. The best discussion of this I’ve come across is Dan
Pink’s When: The Scientific Secrets of Perfect Timing.
The idea of optimal batching doesn’t just apply to diurnal rhythms, it also
applies to the work week. For example, Sarah Drasner dedicates the start of her
week to meetings, and blocks out large chunks toward the end of the week for
uninterrupted coding. Paul Graham’s term for this is Maker’s Schedule,
Manager’s Schedule – if you have to do both, try to alternate between modes
rather than constantly intermix them. The road to burnout is paved with context
switching.
The last kind of Habit is one I cannot articulate for you. You’ll have to find it
within yourself. It has many names:
Purpose
Vision
Mission
Calling
Intrinsic motivation
But I like the word Drive. Lose it, and you will eventually burn out. Keep your
drive alive. In Dan Pink’s book on the topic, he notes:
As children, we are driven by our inner desires to learn, to discover
and to help others. But as we grow, we are programmed by our
society to need extrinsic motivations: if we take out the trash, study
hard, and work tirelessly, we will be rewarded with friendly praise,
high grades, and good paychecks. Slowly, we lose more and more of
our intrinsic motivation. Extrinsic promises destroy intrinsic
motivation.
If you were an operating system, this is your equivalent of pid 0. The “system
process” that makes your whole system run. It’s the process that runs all the
other processes. Except instead of calling it a process, we might call it a
principle. When you lack direction, when you have nothing else to do, when you
have too much to do, or when everything is going horribly wrong, this is the one
principle you fall back onto. We covered some in this book, but there are many
more that could work for you. Pick one, internalize it, make it your guiding
light, pass it on to others.
It took me >30 years to find mine, but you can have it too: Lifelong learning in
public.
“The worst thing you can ever do is think that you know enough.
Never stop learning. Ever.” - Arnold Schwarzenegger
40.2.5 Recap
I am not the first to make the analogy of humans to computers – it makes sense
that the same algorithms we use to maximize performance of our machines, are
probably also great Algorithms to Live By. But for our context, we just focused
on four categories of habits:
Nobody is perfect at any of this – so don’t expect this of yourself. But every
little bit you can do to improve your baseline habits helps. You can backslide on
any given day, week, month, or year. It’s fine – just get back on the horse.
Every action you take is a vote for the type of person you wish to
become. No single instance will transform your beliefs, but as the
votes build up, so does the evidence of your identity. This is why
habits are crucial. They cast repeated votes for being a type of person.
- James Clear
Everything that makes you you, is your operating system. Take care of it. It’s
all you’ve got.
Acknowledgements
This book owes a lot to friends and reviewers for its existence. Thanks to:
All errors that remain are my own. I’m sorry if I forgot anyone here - there were
literally dozens of people who helped me in ways big and small, and hundreds of
people who bought pre-launch that encouraged me along the way.
And thank you for reading! If you have any feedback, tweet at me or the book
and join the book’s community forum!