Landing My First Freelance Development Projects


I recently took the plunge and left my job to freelance full-time as a web developer. It's been an amazing transition and I honestly regret not doing it sooner.

There are so many reasons why more developers should consider freelancing full-time. You have the freedom to control your own schedule. I take advantage of this by carving out a few hours in the middle of the day to read or take my dog for a long walk. If demand is high enough, you can pick and choose the projects you take on. You can also often earn more freelancing than you can working for a single company. I'm on track to earn more than twice what I made at my previous full-time job.

All that said, getting to the point where you can make the jump takes time. I freelanced on the side for five years before I built up enough work to start doing it full-time. It doesn't have to take that long, but it will take a while to build up a steady stream of incoming projects.

I started freelancing for two reasons: I needed the income and I needed the experience. I started right after I graduated from a coding bootcamp. Between the time I graduated and the time I got my first paycheck, I needed some way to cover my rent. Also, being a recent bootcamp grad, I needed some "professional" experience I could show employers. Freelancing ended up being a great solution for both of these.

In the five years since I first started, I've always done freelance work on the side. As a junior developer, it was a fantastic way to build up more experience. I really mastered JavaScript and Sass working on the freelance websites I built for people in the evenings and weekends. As I became more senior as a developer, it was always a really great way to earn some extra side income. My wife and I were able to afford the down payment on our apartment mostly from money I'd made freelancing.

If freelancing as a developer is something you're interested in, the first thing to figure out is how to get your first paying client. 

Starting Your Search

Before you start, you need to realize that the economy is enormous, unfathomably so, and the market for people who can code is huge. If you're flexible with the kinds of projects you take on and the technologies you use, there's more demand out there than you can meet.

My freelance projects have ranged from things like:

  • HTML/CSS emails
  • Simple scripts that pull data from a website and store it in a database
  • WordPress sites with multiple page templates
  • Production applications with user authentication and complex relational data

The challenge is finding the demand for your skillset.

When thinking about where to start finding freelance projects, many developers draw a blank. Others jump to networking, whether that's literally hitting the streets, or messaging people on Twitter, Craigslist, and LinkedIn. Still other developers immediately sign up for sites like Fiverr and Upwork.

I tried both of these approaches when I first started. I messaged people on LinkedIn and responded to ads on Craigslist; I also handed out business cards at meetups and other events. Networking can be a good approach, but it never actually turned into a paying project for me. The challenge with networking is that you have to connect with a lot of people in order to ever get any work.

So what about Fiverr and Upwork? I tried these and was able to get a project or two through these sites. A friend connected me with someone who worked full-time through Fiverr. Over coffee, this person validated the challenge with these sites: the projects tend to be small and low-paying, so you have to complete a lot of them in order to make a sufficient living. This developer lived in Costa Rica, so he needed to earn less to be comfortable. I lived in Washington, D.C where rent is, shall we say, significantly higher.

A Better Way.

When Willie Sutton, an infamous bank robber, was asked why he robbed banks, his response was, "Because that's where the money is." If you're looking for work as a freelance developer, you have to take a step back and think, where are the projects?

When someone needs a new website, they research their options and then hire a designer to figure out what the site should look like. Then the designer and the client go out and find a developer who can build and launch the site.

The best thing you can do to start getting freelance work isn't to network extensively or sign up for Fiverr, it's to try and find designers who need a developer.

Partnering with designers has one key advantage over networking and Fiverr: it's where the need for developers is. If you go out and try to find work for yourself, the audience of people you have to network with is huge. Once you finish building a website for a client, they probably won't need another for a couple of years, so every time you finish a project you have to go and find a new client. If you instead focus on finding designers, you only need to find and partner with two or three who can send you a relatively steady stream of work.

So now the challenge is to find a couple of designers who you can partner with.

Finding and Connecting with Designers

So how do you find and connect with designers? Well, the same way you'd find and connect with anyone: using and expanding your network.

The first designer I worked with was the edgy older brother of a close friend. The second had completed the same coding bootcamp, but a previous cohort. The third was a friend-of-a-friend's wife and the fourth was the husband of one of my wife's coworkers.

You should definitely start by tapping your network, as it's likely to quickly lead to some freelance work. But if you don't know of many designers, there are still other options. In a pre-COVID world, I would suggest attending meetups, where you would find large rooms filled with designers, many of them full-time freelancers. Post-COVID, you can still try meetups, but connecting with individuals won't be as easy.

What you can do instead is reach out to people for "coffee" or a quick chat. I have found that people are far more willing to hop on a 30 minute phone call now (audio, not video).

You will likely still have to connect with a few designers before you find someone willing to pass their work on to you. Once you have partnered with a designer though, they're yours to lose. So how do you keep them?

Keeping the Designer as a Client

You want to keep two things in mind. First, the designer will always feel exposed or like there's some risk in delegating the build to you. Second, you are taking on the entire technical side of the project, not just implementing the designs.

You have to understand the designer's side of freelance work. The client paying both of you is actually the designer's client, so their reputation is more at risk than yours. The designer is delegating the actual construction of their designs to you for their client. This is really important for you to remember. You have a skillset the designer probably doesn't have and you are doing something for them and their client. I've built sites for clients and never actually met the client, only the designer who was passing the project off to me. Regardless of whether you meet the client or not, if you deliver sub-par work the designer will look bad in front of their client. 

I've had friends and former coworkers try to start taking on freelance projects thinking they would only be responsible for implementing the designs. That's 80% of what you'll need to do, but that last 20% is what's going to make or break your relationship with the designer. The designer hired you because they can't build the website themselves. That means they also probably can't set up hosting or administer the site themselves. In the designer's mind, that's part of building the site, which you are expected to handle.

You're not likely going to get out of hosting and administering the site. So the best solution is to have easy, standard options that you can use. It's not sexy by any means, but I've set up hosting for clients on Bluehost. I know, it's not AWS but it's easy and cheap and I actually had to do very, very little to get the site live. Meanwhile, the designer, who you remember is really my client in this project, didn't have to do anything and was able to give their client an easy and affordable hosting option.


I fell into this insight by accident. My friend and his older brother needed a website built for their startup and my friend knew I had just graduated from a coding bootcamp. The older brother said that he often had a hard time finishing projects for his clients because he couldn't code and he didn't know many reliable people who could. So if there's a formula for success in getting started as a freelance developer it's this: find people who have work (i.e. designers) and be reliable.

With time, you can work up to doing this full-time, like I have, or you can just do it on the side, like I did for the last 5 years. The decision is up to you. I made the switch when I had enough current and incoming work that I felt comfortable giving it a shot. Whatever your end goal is, the best thing you can do right now is get started.

If you enjoyed this post, you should follow me on Twitter or sign up for my newsletter.

Command and Feedback


What's the first thing you think of when you think of leadership and management in the military? Is it a commander yelling into their subordinate's face? Or a General giving exact and explicit orders on what to do and how to do it?

If someone were to tell you they model their management style on what they learned in the military, would you want to work for them?

The typical style of military leadership is command and control -- telling your people what to do and how to do it. It's a leadership style that is unfortunately prevalent outside of the military and it's totally ineffective.

According to Jim Mattis in his book Call Sign Chaos, it's also not how the Marines think about management:

In the Corps, I was taught to use the concept of "command and feedback." You don't control your subordinate commanders' every move; you clearly state your intent and unleash their initiative. Then, when the inevitable obstacles or challenges arise, with good feedback loops and relevant data displays, you hear about it and move to deal with the obstacle. Based on feedback, you fix the problem.

Having never worked for him, I can't speak directly to Mattis' management style. But he spends a lot of time in his book on this idea of Command and Feedback and his insights on leadership are fascinating.

I think a lot of new managers approach leading their first team with something akin to this style oof Command and Control and that they often do so unconsciously. Hopefully they never indulge in yelling at their team. But it is common for new managers to think of management as setting a goal and "managing" each and every step the team takes to accomplish that goal.

That approach is as ineffective as it is demoralizing for a team. So how can we move from Command and Control to Command and Feedback?

Command and Feedback

Reading about this style of leadership made a lot of things click for me as a manager. I was one of those new managers who felt like they had to give really precise and specific directions in order for their team to produce quality work. Not only did I have to set the direction, but I had to very clearly articulate how to achieve it. If we didn't reach that goal, I would reflect back on how I had communicated my instructions, trying to understand where my directions had been unclear. With hindsight, I can see how ineffective that approach was and, honestly, how naïve I was to think that style of leadership could have ever worked.

Mattis dedicates a lot of ink to this idea in Call Sign Chaos: rather than giving explicit orders and micromanaging your team over the finish line, give them the objective and set them loose. Don't direct, coach!

The first part of Command and Feedback is to clearly state what it is you want the team to accomplish. What is the goal you're trying to achieve? Why is it important that the team achieves this goal? Why is it important to the organization, but also why is it important to you, their manager?

You have to state this in clear terms but you have to do so without prescribing any course of action. Instead, your goal as a manager is to provide time for reflection and positive feedback. Reinforce what's working well and get the team to think critically about their progress.

Trying to control and direct my team's every move quickly lead me to burn out. Are you surprised? I managed a team of 8 people. Never mind that Command and Control is ineffective, no one can keep track of every detail of every ongoing project.

I wish I could say I started a self-directed process of experimenting with giving my team more autonomy, etc. But really I just couldn't manage and control everything (obviously), so I delegated some of the stuff I couldn't juggle. This feels so obvious now, but I was surprised and immediately impressed by how quickly these projects were completed and how good the work was.

By the time I read Mattis' take on Command and Feedback, I'd arrived at a very similar place in my own management style: give people the goal, describe what it is you're trying to accomplish and why and then let your team loose on the challenge. You will often be blown away at the creativity and initiative of people when you give them a clear goal and the autonomy to accomplish it on their own terms.

Reflecting Back to Wise Management

The style of management that I try to achieve is what I call Wise Management, which I've written about previously.

The gist is: how can we be both supportive and demanding as managers? How can we lead teams that are connected on a personal level while being exceptionally high performing? We generally think of having a fun team as being at odds with having a hard-working and driven team. There is an unmistakably tension between the two, but it is possible to have both as a manager, which is what I call Wise Management.

If you think of these two modes of leadership on a scale, you end up with models of leadership that look like this:

Many new managers are more inclined towards one over the other: being supportive or being demanding. Either they're really good at connecting with their team members or they're really good at holding their team accountable to achieving goals. Wise management is about doing both.

Bringing this back to Mattis -- that idea we have of traditional management in the military is very much an authoritarian form of management: you are controlling your team and directing their actions. Mattis' idea of Command and Feedback is a fantastic tool for Wise Management.

Explicitly stating a goal for your team (ie the "Command" portion of both Command and Feedback and Command and Control) puts you high on that demanding axis of management. The Command and Feedback approach becomes a Wise style of management because you're giving your team members autonomy and providing them with useful feedback. Both of which are tools for being more supportive.


Reading Call Sign Chaos, you get the impression that Mattis was bullish about Command and Feedback. While assigned to a senior role in NATO, he worked with a commander of a NATO member country who embodied Command and Control. This is how Mattis responded to that commander after observing their management style:

"Your staff resents you," I said. "You're disappointed in their input. Okay. But your criticism makes that input worse, not better. You're going about it the wrong way. You cannot allow your passion for excellence destroy your compassion for them as human beings." This was a point I had always driven home to my subordinates. "Change your leadership style." I continued. "Coach and encourage, don't berate, least of all in public."

If someone were to tell you that this is what they model their management style on, would you want to work for them? I certainly would. I would love to work for someone who would push and challenge me while making me feel supported and like they were invested in my personal growth. Perhaps most importantly, this is the kind of management style I would like to achieve and be known for.

This article describes one of the many lessons I took from Call Sign Chaos. I have very little connection to the military and the Marines, but I picked up this book on a whim and it ended up being one of the best leadership books I've ever read. In addition to this idea of Command and Feedback, I learned a few other things from Mattis' book and I've been recording them in a series of articles, which you can find here:

  • You can read about Mattis' unique approach to building exceptionally high performing teams in my article Brilliant at the Basics.
  • Mattis thinks you are inevitably going to be incompetent if you're not reading a lot more, which you can read about in my article Leadership Literacy.

Getting to Philosophy with Roam Research


After a lot of careful thought, I've figured out the thing that makes me most excited about Roam Research - and it has to do with Wikipedia's "Getting to Philosophy."

If you click the first link of any page on Wikipedia and repeat that step for each subsequent page, you will eventually get to Philosophy. This phenomenon is called Getting to Philosophy, and there's a Wikipedia page on it, naturally.

Roam describes itself as a note-taking tool for networked thought. Each page of notes represents a thought or collection of thoughts and you can very easily connect each note to any related note through simple linking. It's a great writing tool. But it's also a great thinking tool.

For all the talk of Roam having a steep learning curve, the core of what you need is actually very simple. Roam gives you a place to write and a couple of ways to link pages of notes. Create a new page and fill it with content. When you're ready, link it to related notes through hashtags or through inline links.

You go on adding notes and once you have a substantial number of interconnected pages in Roam, a web starts to form. Roam gives you an interactive view of this graph so you can see the landscape of your own thinking:

Overtime, you develop a database of notes that are all interconnected, sort of like your own personal Wikipedia of notes and thoughts.

The Promise of Roam

The comparison to Wikipedia is fair: you input notes and connect them together through links. Then, you can navigate through the pages of notes, hoping from one page to another. In my own database, I can navigate from a page on binary sort, to a page on Algorithms, to my notes from Algorithms to Live By, to using math to find your ideal romantic partner, to a note on Love. I can go from binary sort to Love in 4 steps.

This is in essence how Getting to Philosophy works in Wikipedia and the fact that you can make similar serendipitous connections in Roam (like binary sort and Love) begs the question: what is your own "Getting to Philosophy?" To what page will any path of links, starting from any note eventually lead? And, what is significant about that page?

My theory is that the note where my linking converges will have a profound impact on how I view myself and my work.

What it all Means

What does it mean that you can get to the Philosophy page from any of the millions of pages on Wikipedia?

Note that there are only some ~600 pages that directly link to Philosophy (compared to some 80,000 that link directly to the United States, for example). So it isn't that Philosophy is a really large node in the graph with lots of pages linking to it.

So what will the equivalent note in your database mean? I can see two ways of thinking about this.


"Ikagai" is a Japanese term to describe your reason for living. If you are depressed or anxious, the thinking goes, it is probably because you're not living in alignment with your Ikagai. It's the thing that will make you feel the most fulfilled and connected to a purpose larger than yourself.

Sounds pretty great, but how do you know what your Ikagai is?

It sits at the center of what you love, what the world needs, what you can get paid for, and what you're good at. The thing in your life that combines all of these is the best candidate for your Ikagai, so discovering that thing is a process of exploring and reflecting on these four questions. Is it cooking, teaching, basket-weaving, space travel?

If it is true that the central note in my database has meaning, it seems likely that discovering my Ikagai will be the byproduct of a good thinking and note-taking process in Roam. In fact, now that I've thought of it, trying to discover your Ikagai without something like Roam sounds haphazard and fraught with bias. I just answer the four questions with the first thing that comes to mind? How will I have any certainty that the thing I think of is really my Ikagai? No, I think the process has to involve more than that.

In a few years, I should be able to explore my database graph, with everything I thought important enough to externalize, and maybe start to see the emergence of some pattern. The process now is to live my life, externalize my thinking into Roam, and then reflect on the note that has the fewest degrees of separation to all other notes.

It's not fool-proof by any means, but it's significantly less haphazard than the alternative. My Ikagai is something related to that note and I can be confident in that because it's related to everything I've thought about. The longer I contribute my thinking to Roam, the more confident I can be.

12 Favorite Problems

What if it isn't one note, but a couple of notes that play this role? If that's the case then, the implications are only slightly different.

Richard Feynman had this idea of having 12 favorite problems constantly in your mind:

You have to keep a dozen of your favorite problems constantly present in your mind, although by and large they will lay in a dormant state. Every time you hear or read a new trick or a new result, test it against each of your twelve favorite problems to see whether it helps. Every once in a while there will be a hit, and people will say, "How did he do it? He must be a genius!"

So it's possible the notes that play a central role in my database will be the ones related to my favorite problems. The advantage I have over Feynman is, as a Roam user, I can discover these problems through regular Roam usage and reflection on the landscape of my database. I can not only discover non-obvious connections between problems and domains, I can discover problems I've given a lot of thought to without even realizing it.

For instance, I've given a lot of thought to what I'm calling Exceptional Pairs: Warren Buffet and Charlie Munger, Daniel Kahneman and Amos Tversky, Michael Jordan and Scottie Pippen, Steve Jobs and Steve Wozniak, etc. I didn't realize I had so many notes on these relationships until I stumbled across it in the graph view of my database. While the note on Exceptional Pairs is not the Philosophy equivalent in my database, it may be a favorite problem or closely related to one.

I've also collected a number of notes on "mafias" like the team that built PayPal (ie the PayPal mafia). I have notes on the team that turned Wells Fargo around in the 1980s, the Wise Men who built the Truman Doctrine and the Marshall Plan, and the Whiz Kids who took over the Ford Motor Company in 1946.

I am very fascinated in how relationship dynamics create an n+1 effect in both pairs and groups and I know this because I looked at my graph and saw a lot of notes to this effect. It is an odd feeling, discovering a problem you've spent so much time considering without ever having really done so consciously.


That is the promise of Roam: that I could discover and validate the main concern(s) of all my thinking and note-taking. That after a few years of using Roam as the operating system for my thinking, I could take a step back and see what note or handful of notes is at the center of it all. Perhaps it would change from year to year. Perhaps it will stay constant throughout my life. Regardless, this is what makes me most excited about Roam.

Avoid Incompetence by Reading A Lot


If you're not an avid reader, then Jim Mattis has some choice words for you:

If you haven't read hundreds of books, you are functionally illiterate, and you will be incompetent, because your personal experiences alone aren't broad enough to sustain you.

Four Star Marine general and former Secretary of Defense Mad Dog Mattis does not mince his words.

This is another of the many lessons I took from Call Sign Chaos, a book I picked up and read on a whim as a way of venturing outside my comfort zone. I had very little context on Mattis or the Marines and was blown away by the book -- it is one of the best leadership books I've ever read. The first lesson in leadership from Call Sign Chaos is this idea of being Brilliant at the Basics, which you can read here.

I was shocked at the emphasis Mattis put on reading. Weaved throughout the book is this assumption that when you're faced with a new challenge, the first step is always to pick up every book you can find on it. In describing every new stage of his career, Mattis starts by describing the books he read to prepare for that new role. Some chapters of Call Sign Chaos literally have pages that read like a literature review.

I never would have expected a Marine general to be such an avid reader or a determined advocate for reading widely. But I also didn't know that each level of the Marines is assigned an annual reading list and being promoted depends in part on your ability to discuss and apply the ideas in that list of books.

What ever your chosen career track, reading is an essential part of mastering your craft. Here we'll look at how Jim Mattis approached reading and how it can help you. And if you feel like you don't have time to read more don't worry, Mattis has thoughts on that too.

Leadership Literacy

Reading is an honor and a gift from a warrior or historian who - a decade or a thousand decades ago - set aside time to write. He distilled a lifetime of campaigning in order to have a "conversation" with you.

Whenever faced with a new challenge, Mattis' first step was to collect all the books he could find on the subject.

When he became Secretary of Defense, he read every book published by a former Secretary of Defense.

When assigned a leadership role in NATO to help the organization transform and modernize, he found every book he could on military transformation and change management. He also read widely on NATO's history and the military history of some of the other NATO leaders he'd be working with.

Before setting up Marine bases in Afghanistan, he read every book he could find on the country, its terrain and people, and previous military campaigns there. He went back to books published hundreds of years ago!

His thinking was that by reading history, he would develop a repertoire of ideas that he could pull from. The goal was always to learn what other people had tried, what worked, and what didn't:

If we needed "new ideas" to help us construct our plan, old books were full of them.

It apparently worked. In Call Sign Chaos, he says that, thanks to his reading, he was never caught "flat footed."

While I think we all see reading as important, Mattis saw it as necessary. Without reading, you're relying on just your own personal experience, which you often gain the hard way. By reading widely and deeply, you can learn from those who came before you. You can avoid their mistake and learn from their triumphs:

[T]here's no substitute for constant study to master one's craft. Living in history builds your own shock absorber, because you'll learn that there are lots of old solutions to new problems.

There's something to the scale at which Mattis read that's really interesting. Many people who would consider themselves avid readers would pick up one book on the problem in front of them. With a personal library of more than 7,000 books, Mattis would go through tens of books on a subject.

For his role as Nato's Supreme Allied Commander for Transformation, he created a list of 22 books to read and digest and help him command in that role. When I transitioned from being a software engineer to teaching, I read 3 books (A Mind for Numbers, Grit: The Power of Passion and Perseverance, and Mindset: The New Psychology of Success). I'd been walking around thinking I knew my shit and now I feel sophomoric.

Developing Literacy

By reflecting on Mattis' reading habit, I realized just how much could be gained by expanding what I thought it meant to read widely on a topic. For example, I've long been interested in starting a company, and have read a few books on doing so. But my reading has been narrowly focused on the act of starting a company (think books like Zero to One and the Art of the Start). I haven't, for instance, read any biographies of people who started successful companies.

An implicit point here that is worth making clear is that you have to get off the beaten path. Books that are currently on the New York Times best seller list or recommended by the Harvard Business Review are only going to get you so far.


Mattis famously sent a memo to a peer that included this line:

"Any commander who claims he is 'too busy to read' is going to fill body bags with his troops as he learns the hard way."

With stakes that high, Mattis' argument to read extensively becomes very convincing. You and I can still take this more or less at face value, even though we're probably not working under such extreme conditions.

What is appealing about Mattis' argument is the comfort he expresses, because of his bookishness. If reading extensively can give him confidence in a war zone, then surely it can give you and I confidence in our work.

Moreover, this is coming from someone who became a four star general. So what is perhaps even more appealing than the confidence Mattis gained from his extensive reading is the competence he developed. I want to become a much more competent manager and programmer, but I also want everyone in my industry to become more competent at these things.

So the next step for you is to think about your work, and the skills you need to improve, and go find the books to help you do that. Lots of books.

Brilliant at the Basics


This is the first part in a series of articles that dives into some of the leadership and management lessons from Call Sign Chaos, by Jim Mattis.

Last year, I went out on a limb and picked up Call Sign Chaos from the bookstore. It was a $20 gamble on a book that is way outside the normal collection of books I read. The gamble really paid off, as Call Sign Chaos was by far one of the most interesting books I read last year.

Mattis' biography is full of insights on leadership, management, and organizational transformation. These insights and principles are weaved into the story of Mattis' time in the Marines and as Secretary of Defense.

In this article, I explore one of the many interesting leadership tools that Mattis developed in his time in the Marines: brilliant at the basics. I also explore how you can apply this to your team by seeing how I'm thinking of applying this with my team.

I manage a team of instructors who teach people how to code. We already have new instructors practice delivering lessons and answering questions from students. But now I can see how we could dramatically improve our performance by adopting a more intense focus on the fundamentals.

Brilliant at the Basics

Mattis developed and tested this idea throughout his time in the Marines - from his first leadership position to his most senior. The idea is simple: figure out the essential set of skills your team needs to be successful and drill them until those skills second nature -- until your team is brilliant at them. The idea of practice and rehearsal may not sound new, but Mattis took this concept to an extreme

His units would drill their fundamentals in all different conditions and with all kinds of different constraints. It reminded me of coaching drills from sports, but taken to another level. Like a basketball coach drilling their team in the rain and snow, in addition to on the court.

Under Mattis, the Marines hired a movie set team to build a small village where units would simulate drills and exercises. They hired actors to be villagers and enemy combatants. They made the village look, feel, smell, and sound exactly like what Marines would experience in Afghanistan. Units would drill exercises and experience real scenarios that soldiers had encountered while out on patrol. His goal was literally to have his Marines “die” in the simulation multiple times before shipping out into a real combat zone.

How crazy is that? They built an entire replica village. They had Marines simulate exercises over and over again in a warehouse. It's crazy, but it's also absolutely brilliant.

How can you do something like this with your team?

Making Your Team Brilliant

Brilliant at the Basics is something that can be applied to any line of work.

If I managed a sales team, I would have fake “accounts” new hires had to win before they started talking to real prospective clients. If I managed lawyers, I would hire a bunch of people off Craigslist to act as a jury and have them drill their arguments before a big case. If I managed a team of DevOps engineers, I would create a production-like environment and simulate a DDoS attack to see how quickly the team could identify the attack and bring the site back up.

For my team of instructors, we already do what we call a Sample Teach, where an instructor delivers a lesson to a group of other instructors. But in thinking of brilliant at the basics, I see how we can take our simulated lectures a lot further and focus better on the individual skills required to deliver a lesson well.

Making your team brilliant at the basics starts by identifying all the skills, big and small, required to do exceptionally well in their role. Once you have the list, rank them and come up with creative ways to test and practice those skills in a realistic but high-feedback environment.

Skill Definition

The first step in making your team brilliant at the basics is identifying what the basics are. What is the fundamental set of skills everyone on the team needs to perform reflexively? These skills will probably fall into groups, or clusters, and some will be more important that others. Define that list of skills, rank them in order of importance, and identify a way to measure your team's progress.

One very important skill Mattis identified was spotting insurgents, who often hid in crowds of people. Mattis wanted his troops to be able to read cues and see insurgents before they initiated contact and to exercise drills without losing any civilians. This is where the actors came in. Units would practice their exercises and often fail the first few times in the simulation. But with practice and repetition, the Marines would develop almost a sixth sense.

Applying this to my own team of instructors, I can see that there are a lot of skills involved in being an effective teacher: preparing for and delivering lessons, giving students feedback, explaining complex technical concepts. Each of those skills could be further broken down into a list of even smaller skills.

Delivering a lesson involves skills like:

  • Annunciating clearly in front of an audience,
  • Projecting your voice to the back of the room (without losing your voice),
  • Speaking in clear sentences so the lesson is easy to follow,
  • Varying your tone to emphasize an important point

Now that I have that list, I can rank them in order of importance:

  1. Projecting your voice to the back of the room
  2. Speaking in clear sentences so the lesson is easy to follow
  3. Annunciating clearly in front of an audience
  4. Varying your tone to emphasize an important point

And once I have the list in order of importance, I can figure out ways to drill them with my team.

Can you think of a similar list for your own team? Note that coming up with this list could be a great exercise to do with your team.

Skill Practice

There were two models for Mattis's simulation:

  1. Chess masters who have such a repertoire of games and moves in their mind that they can glance at a board and know who will win
  2. Football players who reflexively know what to do when a play is called

The common thread is the pattern matching the brain is capable of after a lot of repeat exposure. The simulation Mattis created was intended to build up that pattern matching in his Marines and to make decisive response automatic for his Marines. He called it "the cognitive equivalent of muscle memory."

So with your list of skills identified and ranked, it's time to practice them. This part is really fun.

The most important skill my instructional team needs to nail is projecting their voice to the back of the room while they're teaching. If half your students can't hear what you're saying, then your expertise with the other skills just doesn't matter. Additionally, you need to project without having to think about it.

Most new instructors speak in their normal voice when they start teaching, meaning students in the back half of the classroom can't hear what they're saying. You can't just point this out to someone, you have to show them and make feel the consequences. Remember, in Mattis' Marines simulation, you often "died" when you didn't perform a skill well enough, meaning you probably "died" in your first few runs through a simulated exercise.

I can make the problem clear to my instructors by placing a camera in the back of the classroom and recording one of their lessons. When they watch back their lesson, they wont be able to hear anything they said.

Once an instructor sees how bad they are at projecting, a funny thing happens: they remember that they need to project their voice, do a good job at it for 30 seconds to a minute, then slowly sink back into their normal volume of speaking. After a few minutes, they realize they're not projecting anymore and they raise their voice again for another 30 seconds to a minute, before once again slowly falling back into their baseline.

Here again, a camera in the back of the room works wonders. The first few times a new instructor watches back one of their practice lessons, they either wont be able to hear anything, or only be able to hear pieces of the lesson here and there.

They need a way to practice projecting consistently. I've come up with two ways to practice this that are really effective.

First, I can sit in the back of the room and raise up a red piece of paper as soon as the instructor starts to slip back towards their normal volume. I had a teacher in high school who would use a bike horn anytime someone said 'um' or 'like' in a speech. It was pretty aggressive, but also very effective.

Second, I can have a conversation with my team where everyone sits in a different corner of a classroom. The distance forces everyone to project. That will help instructors establish their "teaching voice," a consistently loud way of speaking that doesn't sound like yelling.

Repeat these until projecting their voice to the back of the classroom is automatic.

We've identified the most important skills for my team to practice and figured out ways to drill them. Now it's a matter of drilling them consistently until the skills are second nature, until everyone on the team is brilliant at each skill.


Brilliant at the Basics is a concept that Mattis repeats throughout Call Sign Chaos. It's something he instituted in every mission and in every organization he worked on. It meant that, as a leader, he as could feel confident that his team would execute their roles well.

The way to get there involves identifying the skills your team needs to master, based on the circumstances they can expect to find them selves in (and that you expect them to excel in). Now that you have that list in hand, what are ways you can drill and practice those skills?

Mattis' confidence in his team wasn't the only big benefit to Brilliant at the Basics. It also helped his team exercise what he called "intelligent initiative," or taking the initiative to respond to novel situations in creative ways without having to stop and seek guidance. In that way, Brilliant at the Basics supported and even allowed some of Mattis' the other leadership principles like Command & Feedback and Decentralized Execution, both of which we'll explore in future articles in this series.

Tips for Reading More with the Rest of 2020

One of my New Years Resolutions in 2019 was to read more than 20 books; I finished the year having read 25. At the beginning of this year, I wanted to set a goal that would feel like an achievable challenge and have me reading even more. So I doubled my original goal and set out to read 40 books this year.

July 1st marks the start of the second half of 2020, so how am I doing in terms of this goal and what has helped me make progress?

Reading Update

I'm currently at 19 finished books for the year so far, meaning I'm a little shy of my goal. I'm not worried about that though because:

  1. In 2019, I read a lot more in the second half of the year than in the first. There's more downtime in the second half of the year because of all the holidays and traveling to see family.
  2. I'm only one book behind and the point is to do something fun, not to mercilessly pressure myself into achieving an arbitrary goal.

What has Worked

I've experimented with a few changes to how I read in order to achieve this higher reading goal of 40 books. Some of these changes have helped a lot. What follows is an explanation of five things I've tried that worked well. You should try them too and see if they work for you!

The five things are:

  1. Keep a book handy while working from home
  2. Start and stop more books
  3. Extend your timeline for some books
  4. Read more than one book at a time
  5. Find big chunks of time

1. Keep a book handy while working from home

In 2019, I started carrying my kindle around with me everywhere - to and from work, to the grocery store, to pick up coffee. You really would be amazed at how often you have a few extra minutes to read here and there throughout the day. For instance, I could typically read almost half a chapter of a book while I waited to order and pick up my lunch. And I'm not a particularly fast reader.

Now that most of us are working from home, though, most of these pockets of reading time disappeared. So how do you keep up the reading? Well I found that those pockets of time still existed, they were just less immediately noticeable.

Now instead of carrying my kindle with me, I have the kindle app open on my laptop all day. Now, if a meeting ends a few minutes early, that's time I can spend reading before the next meeting starts. In an 8ish hour work day, I can typically find 30 minutes of time like this, which is generally enough to finish a chapter of a book, depending on the book.

2. Start and stop more books

I've heard this advice a lot over the years: if you lose interest in a book, just stop reading it and start reading something else. It's great advice, but I've found it really hard to actually implement.

More likely, I'll slog through an uninteresting book (slowly) or procrastinate reading at all. That is of course why I should stop the book and start a different one. I've gotten to a point now where this isn't as difficult. I've finished 19 books, but I've stopped reading six!

I was able to get past the mental block of not finishing a book by telling myself that I'm going to finish it later. I may! But I probably won't.

The nice thing about reading books on a kindle is that there is no cost to owning a book, other than the price you pay for the book itself. Compare that with physical books: if you decide to stop a book, you have to find some place to put it in the meantime. With an ebook on my kindle, I can just remove it from the device.

An interesting side effect of this has been that I'm more selective with the books I finish, but less selective with the books I buy or sample. It literally costs nothing to download a sample to my kindle. If I get to the end of the sample and want to keep reading, it's an easy decision to purchase. If I'm 50/50 on buying it, I should just buy it and see what happens.

3. Extend your timeline for some books

Something that has prevented me from reading more in the past is getting hung up on a particular book. A book can be interesting while being challenging to read. It can be a book that I want to finish, but that I'm not often in the mood or the right mind-space to read.

For instance, I've been reading a book on Blockchain for about 2 months now. I'm almost half way through it after 2 months and this is very intentional. The book is interesting and I'm learning a lot from it. But it's also a completely new field with a lot of new concepts and topics. I'm not putting any pressure on myself to finish it, instead I read it when I'm in the mood to read something challenging.

I suspect I'll finish it in another 2 months.

4. Read more than one book at a time

I did this when I was younger and was talked out of it. Really though, within reason, it makes a lot of sense to read multiple books at a time. You can read different kinds of books and pick up and read the one that best fits your mood.

I'm currently reading For Whom The Bell Tolls, The Art of Doing Science and Engineering, and Blockchain Basics and I just finished Working by Robert Caro and Conversations with Friends by Sally Rooney.

You do have to keep a soft limit on this, or it'll get out of control. I've found that four books at once is generally the most I can do.

5. Find big chunks of time

One of the most enjoyable things I've stumbled on this year as a reading tactic is doing what I call a reading walk with my dog, Sadie.

I walk Sadie 3-4 times a day, which is pretty average for a dog owner. Sadie likes to walk really slowly and smell everything. She also likes going on really long walks. So a couple of mornings a week, I'll take Sadie on a 2+ hour walk and read the entire time.

Sadie walks slowly, so I'm not really walking and reading. She also stops and smells literally everything, so I'll spend most of our walks standing under a tree while she's smelling all the flowers. We'll also often stop at parks for 20-30 minutes at a time to rest in the shade, during which time I'll read and Sadie will be on the lookout for squirrels.

The time outside walking and reading has been such a fantastic addition to my lifestyle, not to mention that Sadie loves them. Whether you're a dog parent or not, I can't recommend reading walks enough. If you live somewhere where it gets really hot during the day, then go for a nice reading walk in the morning. Walk to a park, read for 20-30 minutes, walk somewhere else, read some more, and so on.

The other point I want to make here is that if you find big chunks of time, you'll finish books faster. I read Normal People by Sally Rooney in 2 days, or two ~4 hour reading walks with Sadie. One on a Saturday and one on a Sunday. Sadie woke me up at 6:30, like she always does. We went for a long reading walk where she smelled literally everything and I read and on both walks, I was home between 10:30 and 11.


If I were to come up with a philosophy of reading more it would be: find more time to read, then read what ever you're in the mood for in that moment; the number of books you finish will take care of itself.

So if reading more is something you're interested in, then try out some of these tips. Each tip is either about creating more time to read or making sure that what you're reading is something you're interested in.

I'm looking forward to reading another 20 books in the second half of the year.

Now I'm off to walk Sadie

Wise Management


When I first started managing a team, I honestly thought I had to choose between managing a high-performing team or managing a team I could go to happy hour with. A lot of managers worry about this. Being a supportive manager just seems at odds with being a manager whose team gets results.

Can you be demanding and supportive at the same time?

Well, in short, you can. In fact, it's imperative that you figure this out.

Hitting that perfect balance of being demanding, but supportive is elusive but it is not impossible. Hopefully you've encountered someone in your life who did it well, maybe a former coach or teacher - someone who was both tough and loving.

Wise Teaching

This tension between being supportive and demanding is something that is felt in other disciplines too. One that I've turned to for inspiration is teaching. Teachers have a great name for striking this balance well: wise teaching.

I learned about this concept in Grit: The Power of Passion and Perseverance by Angela Duckworth. Being demanding and being supportive fall on two spectrums, creating a quadrant of teaching styles:

Supportive Demanding Quadrant

Students with Permissive teachers will put more effort into their school work because their teacher cares for them. Students with Authoritarian teachers make measurably larger strides in their academic skills. Students with Wise teachers experience both: increased competence compared to their peers and increased engagement with their school work.

Sounds nice, doesn't it? A team that is happy and engaged and knocking out one home run project after another. We can apply some of the research on wise teaching to management to get a similar result.

Call it wise management.

Wise Management

Wise managing is when you are able to strike the same balance with the members of your team as wise teachers do with their students. It is based on deep respect and care for the individual, while firmly enforcing your expectations of their (high) performance. It's tricky to accomplish, certainly, but all wise managers do.

Raise Your Expectations

The first principle of wise management is simple: raise your expectations. If you feel some resistance to that, for example by wondering if your team could meet higher standards, then know this: you get what you expect from people.

My favorite study into wise teaching is one conducted by Robert Rosenthal that looks into teacher expectations of student achievement. Rosenthal split classes into two groups at random and told their teachers that one group had particularly high potential. At the end of the year, these students had outperformed their peers. The reason for their success? Rosenthal concluded that their teachers believed they were talented, treated them as such, and students rose to meet expectations.

How can you leverage the results of this study? Well, if you're holding back on raising the standards you hold your team to because you're worried they wont meet them, then stop. Instead, introduce them to the new standards and raise your expectations.

You can't stop at raising your expectations though. In our wise teaching parlance, that would make you an authoritarian manager. Avoid this by also becoming more supportive.

Give Supportive Feedback

Another great study on wise teaching looked at the effect supportive feedback had on student effort. David Yeager and Geoff Cohen asked a group of teachers to provide written feedback on student essays, including suggested improvements and words of encouragement. Then, they divided the essays into two groups. One group of essays included a note with each essay that said, "I'm giving you these comments so that you'll have feedback on your paper." The other group of essays included a note with each essay that said, "I'm giving you these comments because I have very high expectations and I know you can reach them."

Students were then given the option to revise their essays, incorporating the feedback from their teachers. 80% of the students who received the second note turned in a revised essay.

How can you provide similar feedback to your team?

Doing so will help them in two ways:

  1. It'll help them see where they're not meeting the expectations you've set
  2. It gives them a clear idea of what they need to change to reach those expectations

The best way I can think of for providing such feedback is in a one-on-one. Use that time to not only check in on how your team member is doing, but also to provide such feedback on the work they're doing.


I think most new managers see being supportive and being demanding as being at odds with each other. What gets mistaken as a contradiction is really just a tension between these two ideas. Being both supportive and demanding is certainly challenging. But it's something you can strive for continually through out the rest of your career as a manager.

Raising your expectations will make you a more demanding manager; providing supportive feedback will make you a more supportive manager.

And of course doing both well will make you a wise manager.

The Real Reason Everyone Should Learn to Code


“Everyone in this country should learn to program a computer, because it teaches you to think.” — Steve Jobs

The debate around whether everyone (including you) should learn to code typically focuses on one of two things:

  1. The way you learn to think about problems
  2. The way programming gives you leverage

While both are true, there’s a third reason why you should learn to program: you’ll need it to stay competitive in the job market. Workplace skills, like programming, normalize over time. While programming is a specialized skill now, it will become a common skill that most knowledge workers are expected to have.

Problem Solving and Leverage

People like Steve Jobs are fascinated by the way programming forces you to think about problems. You have to think logically. You have to break the problem into smaller pieces and build up a solution. Unclear thinking will make finding a solution nearly impossible. Disciplined thinking gives you a set of powerful tools for solving problems in domains far removed from building software.

While I’ve been a professional programmer since early 2015, I was formerly not all that handy around the house. In the last year though I’ve fixed plumbing issues in my apartment, completely redone our master closet, and fixed issues with our car. I’m not talking about changing the oil: I was able to figure out how to replace the electric side mirror after it was side-swiped. What is amazing about these experiences is that I followed the same process I would use at work to debug and understand a new piece of software.

But many would argue that this way of thinking is only half the story. The other reason you should learn to code is it gives you the ability to create leverage. If you see a problem that you and many other people experience, you can build a solution to it. Programming is really about building things that create value. The side benefit of building something of value is that you can charge people for it, which is how startups get founded.

While both of these are valid reasons to learn how to program, there’s a third reason that is more relevant to the average knowledge worker: you’ll need to know how to code in order to stay competitive in the job market.

Skill Normalization Over Time

This happens a lot with workplace skills. Just think, there was once a time when people would list Microsoft Word and Excel as skills on their resume. They were tools that some applicants wouldn’t have experience with, so being able to list them on your resume and answer questions about them in an interview gave you an advantage in the application process.

That was some 5 to 7 years ago. Now, if you were to put Word or Excel on your resume, the reviewer would assume one of two things:

  • You don’t know them that well and are trying to cover that up (i.e. posturing)
  • You don’t have many skills and are listing everything you possibly can (i.e. padding)

In either case, it’s assumed when you apply for a job that you are proficient with Word, Excel, and the rest of the Office suite or their Google Docs equivalents.

These skills have normalized to the point of being common.

This happens often with workplace skills. Take a more extreme example: typing. It used to be a skill you had to take a class to learn. People would get hired to be typists. Typewriters were expensive and using one effectively was a specialized skill taught in specialized schools.

Can you imagine sifting through resumes now and seeing “Typing” listed as a skill?

So, why should you learn to code? Because it’s a skill that is normalizing. More jobs in more industries are looking for applicants trained in programming and data science. And it’s only a matter of time before this is a skill set that is assumed across the workforce.

Normalization of Programming as a Skill Set

We’re still in a time when programming is considered a specialized skill. There are many people who’s job is to be a programmer. That said, this is already starting to shift.

More companies in more industries are expecting college grads to be proficient in programming and working with databases and APIs. For instance, Python is becoming a common prerequisite for entry level jobs in finance, banking, and marketing.

Additionally, companies are expecting their current workforce to get up to speed. Capital One, JP Morgan, and Booze Allen Hamilton are just a handful of companies training their existing workforce in programming and data science.

This trend is happening as the amount of data we’re working with gets larger and more complex - problems that programming is adept at solving. Excel is easy to use but it can’t handle a really large amount of data. I’m not talking Big Data here, more like not-small data. A dataset that brings Excel to its knees would barely make a SQL database flinch.

A programming language like Python empowers you to not only work with data stored in a SQL database; it can dramatically improve the kind of analysis you can do on that data. For instance, performing the same analysis on different datasets (like one for each state) is a really trivial task with a programming language: define a function to perform the analysis and loop over your data.


Programming is a really powerful skill, which is why the demand for programmers has increased so much. But all the skills that we think of as programming and
data science are most effective when they’re applied in support of an existing domain of expertise:

"I would encourage you to think of [programming and data science] not as a new domain of knowledge to learn, but a new set of skills that you can apply within your current area of expertise." — Data Science Handbook, Jake VanderPlas

A marketing analyst can be a more-effective marketing analyst by picking up some SQL and Python; a geologist can be a more effective geologist by learning Numpy, Pandas, and Jupyter notebooks. So while learning to program will change how you think about problem solving and it will give you leverage, the real reason you should learn to code is a culmination of these two: it’ll help you in your job and more employers will expect you to know it already.

Understanding the Difference Between Flooring and Truncating in Python


Reducing a float (a number with a decimal) to an int (a whole number) is a pretty common task in programming. In Python, you can achieve this by flooring or truncating the number with the floor and trunc methods, respectively.

Both methods are part of the math module and perform a similar function. But there is a subtle difference between the two: floor will round down to the nearest whole number, while trunc rounds towards 0.

Intro to Flooring

The floor method will round a number down to the nearest whole number. This is useful in cases where you receive a non-whole number and, for what ever reason, don't want the fraction:

import math

math.floor(2.6) # 2
math.floor(3.2) # 3
math.floor(9.7) # 9

The key point here is that floor will always round down, as opposed to true rounding. In true rounding, we would expect the first and last examples in the snippet above to be 3 and 10, because the decimal is above 0.5.

Intro to Truncating

What about trunc, then? Truncating a number, removes the decimal in the direction of 0. We can see how trunc behaves by looking at a similar set of examples:

import math

math.trunc(2.6) # 2
math.trunc(3.2) # 3
math.trunc(9.7) # 9

From these examples, we can see that trunc, like floor, is not rounding. If it were, the first and last examples would again be 3 and 10, respectively, but we get 2 and 9.

However, we're getting the same result using trunc as we did using floor. So, how are they different? Well, the trunc method is removing the decimal towards 0. In these examples, that does not give us a different result. But there are cases where it will.

Seeing The Difference

From the examples so far, it would be impossible to tell that floor and trunc have different behavior so let's look at another example:

import math

math.floor(-2.6) # -3
math.trunc(-2.6) # -2

Flooring a number will always round it down, while truncating will always round it towards 0. So when we floor -2.6, we get -3; when we truncate -2.6, we get -2.

When we truncate a negative number, we effectively round that number up. That's what I mean by "rounding towards 0"!


The difference between the two is very subtle -- so much so that you can't really tell the difference from the first two examples. This is one of those small differences that you can always look up. And you may have to look it up when the subtle difference in behavior causes a bug!

Using Pipenv with Django


Managing dependencies in Python projects can be a a really painful experience.

Getting your virtual environments set up and installing dependencies under the correct version of Python are just two of the challenges that a newcomer to the ecosystem might face. As I've been working with Python more, I've definitely forgotten to activate my virtual environment or run into versioning issues, like trying to run Django 2.x but only having Django 1.x available in my environment.

Additionally, different development communities within the Python ecosystem tend to have their own way of managing environments and dependencies. So when I was learning data science, I used Anaconda for my environments and it would often conflict with virtualenv. I once updated the requirements.txt file for a Django project and included everything that comes with a fresh Anaconda environment (pandas, numpy, etc) and didn't realize for a couple of commits.

For someone coming from Ruby (bundler), PHP (composer), or JavaScript (npm), the process seems messy and unnecessarily complex. It also feels frustratingly error-prone.


Pipenv is the solution - it works like other bundlers and dependency managers (so like you'd expect it to work) and it works really well. Pipenv uses a Pipfile and Pipfile.lock so you can manage your dependencies (including development dependencies) and have deterministic builds. It still manages your dependencies in a virtual environment, but it makes creating and activating virtual environments easy and straightforward.

Getting Started

The first step is to install Pipenv, which you can do with homebrew:

brew install pipenv

Now that it's installed, you can use it to install modules and setup a virtual environment for a project. Let's create a Django project and manage our dependencies for it with pipenv.

Make a directory called hello_django/ somewhere on your computer:

mkdir hello_django
cd hello_django

Now install Django, like so:

pipenv install django

Notice that we started by installing a dependency and not by creating a new

What's really great about pipenv is that it will automatically set up a new environment for you! When we run the above command, pipenv will create a virtual environment called hello_django-twf5jxgT where hello_django is the name of our directory and twf5jxgT is a hash.

This virtual environment will be created inside a .virtualenvs/ directory at the root of your user directory.

Working with Pipenv

Now that we have Django installed and our virtual environment setup, we can create our Django project:

pipenv run django-admin startproject hello_django .

This is the command for creating a new Django project. We add . at the end of the command so that the project is created in our current directory (instead of a subdirectory).

Now if we want to start up our new app, we can do so with the following command:

pipenv run python runserver

The pipenv run part of the above two commands is required, unless we run pipenv shell to activate our virtual environment:

pipenv shell # activate virtual environment
python runserver

Working with Dependencies

We can install another package by using pipenv install:

pipenv install psycopg2-binary

When we run pipenv install, the Pipfile gets updated automatically, just like with npm, composer, et al:

name = "pypi"
url = ""
verify_ssl = true


django = "*"
+psycopg2-binary = "*"

python_version = "3.6"

Pipenv Scripts

One of the things that's great about npm and the package.json file it uses is the ability to create custom scripts for commonly performed tasks. This automation is a great way of speeding up your development workflow.

You can also do this with pipenv! All scripts go under a [scripts] heading. Each script needs a name and a string for a command to run:

start = "python runserver"

In this example, our script is start and our command is "python runserver", which is the command for starting our Django server.

To run the above pipenv script, we do the following:

pipenv run start

Where start is the name of the command we want to run.


This feels easier than using virtualenvs on a few fronts. I've just covered setting up an environment and installing dependencies. But the Pipfile that pipenv creates makes managing dependences (and other things, like Python versions) a lot easier than requirements.txt. For instance, to install a dependency just for your development environment, you run pipenv install --dev. Notice the same simplicity of working with Node dependencies?

For a next step, I highly recommend checking out the documentation. There are pages on a basic pipenv workflow to follow and how to migrate from a requirements.txt file. There are also some cool, advanced features like automatically loading a .env file and setting up shell completion for pipenv.