James Maa


Technical Recruiting Guide for New Grads & Junior Engineers

Note: The views and opinions expressed in this article are those of the author and do not
necessarily reflect the official policy or position of Scratch.

Other note: There are a few referral links for Hired and Triplebyte. Feel free to just go to the site if you don’t like going through referrals, but we both get free money if you end up getting a job on the platform 🙂

Your career is a big deal, no matter how you think about it. You spend about 35% of your waking hours (not including the commuting time and all the logistical stuff surrounding work) working. You’ll spend more time with your company, your boss, and your co-workers than you do with your best friend, spouse, or family. Your career is also your livelihood. Whereas some people can work leisurely hours with six-figure salaries, some people struggle with mid five-figure ones working overtime week after week.

With something as important as your career, it’s worth investing time into maximizing your opportunities. One of the highest leverage things you can do is to figure out how you can put yourself in a place where you’re happy and can grow.

I’m a relatively inexperienced engineer, so I can only speak about the experiences I’ve had so far. But my lack of experienced hasn’t stopped me from systematizing various verticals of my life nor doing pretty well in my career so far. So I will lay out how I approached my last job hunt.

Although I believe my advice applies broadly to most new grads and junior engineers, I understand that there are advice and observations that may not apply to you. Just to lay out my cards upfront and give you chance for bias correction, here was my background before my job hunt.

  • UC Berkeley 2016 Graduate with 3.6 GPA
  • Experience interning at Lexity, Yahoo, and Pinterest
  • Worked at Reddit for 2 years on ad-related technologies
  • Live in Berkeley

Here’s my LinkedIn.

Preparatory Work

Time Commitment and Scheduling

One of the most important prerequisites to get right is figuring out the logistics of your interviewing schedule. Interviews take time, and doing enough interviews to have a healthy amount of options of table takes considerable time. Finding my 2nd internship in my career took approximately 120 hours spanning 9 weeks. My recent job move took approximately 110 hours spanning 7 weeks. It’s a big time commitment to do recruiting right, and it’s going to be worth every hour of your time to get yourself an awesome job. At least 50 hours+ of work should be the bare minimum of due diligence I think new grads and junior devs should put in.

Most interviews these days are:
1 recruiter screen (1 hr)
0-1 take home assignment (3 – 6 Hrs)
1-2 technical phone screens (1 – 2 Hrs)
1 full day onsite (8 Hrs)
= 13 – 17 hrs/company

Not only that, there are some preliminary exercises and research that you are going to want to do:

  1. Values reflection (2 – 5 hrs)
  2. Company research and lead generation (5 – 10 Hrs)
  3. Interview practice (15 hrs +)

So you have to figure out how you’re going to dig up 50-120 hours of time in your current schedule. For many of you, you’ll be in school, which offers some flexibility with phone screens and onsites. But some of you have full time jobs, in which it is much harder to schedule and coordinate recruiting calls.

Some questions you might want to address when thinking about where to find time to interview:


  1. How much can my academics suffer in order to find a good job?
  2. Am I taking on too much school work this semester such that I cannot put into time into recruiting? Should I drop some classes?
  3. Am I doing too many extra curriculars that will distract me from spending time recruiting?
  4. How am I going to take days off for onsites?


  1. Should I quit my job to recruit full time?
    1. Upsides
      1. You don’t have to worry about scheduling
      2. You can concentrate full-time on recruiting. Trust me, you’re going to get busy
      3. You’ll have more clarity when deciding
      4. You don’t have to keep things undercover from your existing boss


      1. You don’t get paid
      2. You have to maintain your current work responsibilities while recruiting
      3. You are considering staying at your current company as an option

      Should I tell my current manager that I’m recruiting? This was one of the most emotionally draining decisions I’ve had to make. In a small-sized poll amongst my friends, 70% of my friends say you should wait until you have an offer to tell your manager, the other 30% thinks I should tell my manager out of respect for your manager.
      How will I be able to take time off for onsites? Ideally you’ll be able to do at least 3 – 5 onsites for your next role to have a healthy number of options on the table.

      However you decide to make the time to do your recruiting, it’s important to get that set aside as early as possible. Now that you have time set aside you’ll understand approximately when you’ll have a job lined up. With due diligence, you can reasonably expect something to happen within 8 weeks.

      Scheduling is a bit of an art. There are two general considerations when it comes to scheduling — how much do you like the company and how long each company interview process takes.

      With preference ranking, you want to backload companies you’re most interested in towards the later stages of your interviewing season. You’ll naturally get better as you start interviewing, which means you’ll be closer to peak performance right when you’re talking to companies that really interest you.

      If you want to know how long the interviewing circuit takes at each company, Glassdoor has interview reviews that will give you good sense of how long the whole process takes. You want to line up all your onsites as closely together as possible, since it lines up your offers around the same time and is slightly easier logistically to handle. The coordination also helps you move fast and avoid exploding offers. My interview experience so far has been that even though Google and Facebook are great places to work (and therefore should be backloaded for some people), their interview process can sometimes take multiple weeks. Some companies didn’t even get back to me when I accepted my most recent offer.

      Work Values

      Beggars can’t be choosers, but thankfully it’s an engineer’s market. If you don’t think you’re in a position to choose, make sure you exhaust all the resources listed in the “Recruiting Skills” section to make yourself a top-tiered candidate. You want to market yourself as best as you can.

      I somewhat regret not going through this Work Values exercise when choosing my first full time job. I never realized how important certain qualities were until I spent some time reflecting on it (and some experience living out my preferences).

      For a sample model and writeup of ranked values here’s the one I wrote for my previous job search. I highly suggest reading the example doc, as some of the values on there were only discovered when I talked to other peers about what they look for. I didn’t realize I had some criteria until I had polled other friends.

      Another consideration you probably want to nail down in your doc is exactly what you want to learn. “Learning a lot” is not a meaningful objective as your learning goals will be entirely shaped by business needs, which often ends up in some weird, esoteric crannies. Do you want to do front-end, backend, machine learning, devops, product management, or something else entirely? If you leave those to chance, you might end up going down a career path that you’re not happy with. If you’re unsure, it’s also worth noting and trying to find jobs that resolve those questions as quickly as you can (e.g. working at startup to try many things, joining a rotational program, etc).

      There are a few write-ups that evaluate opportunities based mostly on business success. I personally like this one.


      Lead Generation
      Lead generation is knowing what great companies exist out there. I think the classic list to scrape is Wealthfront’s Career Launching Companies List. I think their evaluation criteria overlaps a lot with some of the values you seek in a company. It’s worth looking through all the companies, understanding what value their deliver, and what their engineering culture is like.

      If you’re still in school, asking your respected peers is also a great way to find interesting companies to join. Seeing where all the 10% of graduates join is a good proxy for know which companies are sought after.

      Angelist also has search criteria for you to find companies that match your interests. They’re much more focused on smaller companies and startups though.

      I’ve also scraped top VC firms to see what companies they’re funding. Andreessen Horowitz, Sequoia, and Kleiner Perkins Caufield Byers (KPCB) are great places to start scouting companies.

      If you’re looking for smaller companies (think <50 people), here’s my favorite technique for finding small startups to join: Go to LinkedIn, sign up for a $70/month premium membership (you’re only going to have it for a month or so), and then go to this custom search query I created. Although crude, it’s a search query that scouts out where all the smart people in the industry are working, filtering out all the trendy, big players. “Smart people” here being defined by people: 1. who attended a top tier CS school and 2. who worked a trendy company before. I found some strong candidates for startups to join by scouring the search results.

      Just because I know you’re lazy and probably not going to do it, and because it’s pretty easy for me to do publicize it, here’s my lead generation spreadsheet. YOUR SITUATION IS NOT THE SAME AS MINE. DO YOUR OWN RESEARCH.

      After you’ve generate more leads than you can handle in your schedule, you’ll need to start paring down the list. I found Glassdoor reviews to be a great site for getting a peek at company culture. If there are any red flags that stick out there, you can feel comfortable removing them from your lead generation spreadsheet.

      I found most of the signal that comes from preliminary research here to be very noisy. For example, it’s very hard to evaluate engineering culture by reading a company’s website, or understand how viable their business model is without someone internal showing you the numbers. Most of the information you’ll extract will actually be from the interview, but getting a sense of the company here is important to weed out any companies that have some immediate red flags.

      Finding the right channels to getting in touch with companies is a high leverage activity to maximize your chances of getting hired. Some of these channels also double as a lead generation tool too, so I would recommend jumping into some of these early.

      Here are the company sources from the most to least likely to land you a job.

      1. Referral
      2. TripleByte
      3. Hiring Platforms/Talent Portals
      4. Head hunters/Recruiters
      5. LinkedIn
      6. Cold email
      7. Applying online

      Referrals are probably your best bet to getting an interview at a company. A cold referral from someone whom you’ve met once at a party is still better than most of the other channels on the list.

      You can dig up referrals in surprisingly places. Searching on your LinkedIn and finding nearby connections is a great start. Otherwise even consider getting referred to places that you’re not super interested in. Sometimes your friends can see a valuable opportunity that you’re missing.

      Triplebyte deserves its own mention because of how pleasant and comprehensive I found the interview to be. Triplebyte is a hiring platform that acts as a gatekeeper to a bunch of other great companies. Triplebyte will give a comprehensive interview to you and (if you pass the interview) will be your promoter and introduce you to other companies. You skip all phone interviews onwards and go straight to the onsite. They have scheduled calls with me that asked me about what I look for in a company and matched me with companies they thought would fit my preferences.

      Triplebyte is a lot harder of an interview than most company phone screens (I think the statistic is that only 15% of applicants pass), so I would suggest acquiring some practice before going on Triplebyte. However, the company matching process can take some time so I wouldn’t delay scheduling your interview too late into your interview schedule. Scheduling your Triplebyte interview approximately 2.5 – 3 weeks before your expected onsites is most ideal.

      Hiring Platforms/Talent Portal
      Hiring platforms like Hired or AngelList’s A-List are a great way to increase your presence in the job market. Think of these platforms as scalable ways to get your resume out there. I would do the due diligence of comprehensively filling out each profile to maximize reach.

      A hidden gem is that most VC’s have talent portals too. Greylock has a talent network for both students and full time engineers. I know A16Z has one too, but requires some networking to get in touch with their recruiters. Literally search “[VC firm] talent” and try to join all the hiring platforms you can, either by applying online, reaching out to a recruiter there on LinkedIn, or attending their workshops/events.

      Headhunters and recruiters who act as a middleman can be great ways to get in touch with companies. Although I will say that 50 – 70% of these recruiters are a waste of your time, I’ve worked with a select few who have been phenomenal at matching me with companies I liked.

      Next time you receive a pesky email, I would suggest responding to the recruiter. My rule of thumb when dealing with recruiters is that if I ever felt like they aren’t listening to what I’m looking for, but instead pushing their clients on me, I would immediately drop them.

      LinkedIn is most likely going to be your largest source of incoming interview requests. There are going to be good requests and bad requests, but the most important thing for you to do right now is to go to LinkedIn’s career interests setting page, and check that you are indeed looking for a job. This switch will signal a miniature beacon to all the recruiters that you are indeed available, and since freshly available talent generally doesn’t stay in the market too long, there will be a lot of emails.

      Cold Email
      If there’s a company you’re particularly interested in and they’re not in any of the channels above, it’s worth writing an email to a hiring manager to signal your interest. It helps to tailor your email such that it doesn’t sound like a shotgun email.

      Online Application
      The very last resort. You should only use this option if you’ve exhausted all other options, don’t have a particularly strong interest, or don’t have enough time to write a cold email. Beware, response rates could be anywhere from 5 – 20%.

      Feel free to employ more than one channel for large companies. Sometimes you’ll slip through the cracks in one channel but get picked up in another. I’ve applied to companies online and never heard back from them until I reached out to them through a different channel.

      Recruiting Skills Read More


Ultimate Productivity Hacking Guide (Part II): Time Management

“It is not enough to be busy… The question is: What are we busy about?” – Henry David Thoreau

Time management is process of aligning your time with your priorities. The strategies discussed in this guide are to address the following questions: How do you spend your time? Does the time you spend every align with your goals? The people who benefit the most from this section are people who have diverse set of goals and workloads and consistently need to allocate their time. Conversely, people whose goals are singular (e.g. I’m going to focus on taking care of my child) and have a strong conception of direction will benefit the least from this section.

Planning Your Time

Daily Planning

Every day you should set aside 15 minutes at the start of your day to plan your day. Take out a post-it. First, figure out what obligations you have for the day. Do you have classes to attend? Friends to meet? Appointments to go to? It’s worth writing the ones that aren’t part of your regular schedule down. Then, figure out what you’re going to do for the day and assign an upper bound estimate on the amount of time you think it’ll take. You can comb through through your gathering points in the “Priority Management” section to figure out what you need to and want to do. Examples could be “Read chapter 5 of Intro to Probability (1.5 hrs)” or “Respond to recruiter emails (30 mins)”. Add up all the hours of your tasks and double check to make sure it doesn’t fill up more than 70% of your daytime outside of strict obligations. Now stick this post-it somewhere visible like your laptop, your planner, or your desk.

Weekly Planning

At the beginning of every week you should give yourself an overview of what larger tasks or goals you have. If you have a diverse workload or a diverse set of goals you generally should write these goals in a spreadsheet. If you have math homework due every week, you should make a note on how many hours you expect it to take. I also take tasks off my project management software and throw them onto this spreadsheet. I found it useful to write down what I expect to complete by the end of the week and make sure I’m not overloading myself.

Example of my master calendar

Once you take note of your weekly goals, you need to start blocking out time on your calendar to work on these tasks. I generally have a recurring weekly schedule, and just modify events as necessary at the end of the week. Here’s the calendar I have:

Example Google Calendar

It’s quite a lot to take in, and I’m not asking you to plan every hour of your life. I’m going to break down different milestones you’ll reach as you begin to start blocking out times for goals and obligations. Take your time to reach each milestone. It took me two whole years to go from the easy milestone to overkill mode.

Easy: Put only obligations on your calendar. These are appointments you have, friends you promised not to flake out on, classes you need to attend. This prevents double booking your time with your obligations.

Medium: Put on time blocks to work on goals with hard deadlines. These are homeworks you need to turn in, work projects you need to complete, tasks you just have to do.

Hard: Put on time block to work on goals in general.

Overkill: Not for the faint of heart — put on everything else: sleep, shower, mealtimes, transportation. This will give you insight into how you want to spend your time across all verticals of life.

Let’s talk through the calendar methodology. Putting time on your calendar is a great way to visualize how you’re going to spend your time. It’s also a great litmus test to check whether or not you’re being overly demanding on yourself or trying to do too much in a week. Because you’re laying it all out on a calendar, you’re not double counting any time period and overcommitting your time.

Here’s what the different colors mean:

  1. Sleep (Blue)
  2. FoShoTrans (Red/Pink): FoodShowerTransportation. This is the time you spend to get ready in morning, to get from place to place, to shower, and to eat. This can also be named “Essentials”.
  3. Break (Yellow): The time you spend resting or taking a break
  4. Exercise (Turquoise): Time spent exercising or healthy living
  5. Social (Orange): Time spent with friends or engaging in a social activity
  6. Work (Purple): Time spent working
  7. OutsideEd (Brown): Education I pursue outside of my usual obligations
  8. Blogging/Journaling (Grey): When I journal, blog, or self reflect.
  9. Read (Blue)
  10. Miscellaneous (Green): Miscellaneous tasks and obligations.

Even something like rest or break time should be planned in. Break should let you rest and give you energy. If an activity like playing videos games doesn’t make you feel better after having done it, it doesn’t count as a restorative break (more on this later).

Every morning you’re going to go through all the tasks on your to-do list and make sure they have corresponding events on your calendar. If a task takes <5 mins long, it’s better to do it right now and not have to bounce mental reminders in your head.

If your task takes from 5 – 15 minutes, then group them together under an event called “Personal Errands”. These tend to more shallow and mindless, and I would put the event at some time which you are not at your peak energy level, like in the evenings.

Everything else goes on your calendar as individual blocks/events. If they aren’t on your calendar, you’re not being intentional about how you’re going to spend your time. If you don’t have space on your calendar, then you’re asking too much of yourself, and should review the “Priority Management” section of the guide.

Why it Works

A calendaring system reduces the cognitive load with planning. If I didn’t have my calendaring and task tracking software, I would have to keep all the information in my head. “What should I be doing right now?” “Should I study or work on interviewing?” “Do I have the time to go to Jay’s party or would that ruin my morning run the next day.” Those are the dialogues that happen in my head ALL THE TIME  if I don’t set aside 30 minutes each week to just lay out all my time visually. Those thoughts are extremely draining, and when you have to overcome the issue of “what should I do?” before starting to work, you’re going be more likely to make poor decisions (I’m looking at you, Facebook, Instagram, Reddit).

Putting everything on a calendar (as opposed to say, a planner) also forces you to specifically allocate time towards your goals, values, and obligations so you don’t double count your hours spent. Time is your most finite resource, so it makes sense to set aside time to figure out how you’re going to spend it wisely, rather than haphazardly deciding on the whim.

When you follow the system, you end up consolidating a lot of gathering points and merge it into one place. Instead of checking 20 places to figure out what you need to do, you just check 1. A calendaring system can be used to consolidate gathering points, like gleaning emails to throw to-do’s on your calendar or to copy homework due dates from your classroom website.

“What if you go off track?”

Going off track of your schedule is not a crime. It’s more important to notice that you’ve gone off track than to judge that you’ve gone off track. Judging your behavior at this point only brings about negative emotions, but the noticing helps collect useful information to help us understand how we can do better next time.

I think of my calendar less as a behavior enforcer, and more as a ledger of intentions. Without it, I simply wouldn’t know what to do with my life, and I’ll probably meander aimlessly with a constant fear of forgetting something important.

I actually change my schedule frequently, maybe 3 – 5 times a day, to account for any possible changes. Sometimes it’s a disruption, or a task that took too long. Other times it’s a riveting conversation with a friend that went over an allotted time. I don’t see deviations of my schedule as transgressions. As I like to say, it’s easier to change plans than to make them, so plan first and change if needed. Planning my day forces me to be more mindful about how I spend my time, which doesn’t leave a lot of room for mindless activities.

Planning Tips

Potpourri of tips I’ve had working with a schedule for 7 years:

  • Avoid doing any mentally straining work for more than 1 – 2 hour chunks at a time and more than 5 – 6 hours a day. Despite my best efforts, I can probably focus for at most 3 hours before needing some kind of break.
  • Do the hardest things first: Willpower tends to decline as your day progresses. Some tasks become extremely difficult as you reach the akrasia zone of 2 – 4 hours before their bedtime. Because of that, I try to schedule the most cognitively or energy demanding things in the morning and menial tasks before bed.
  • Try to fit your habits in the morning: Especially post-graduation, most of your social time will occur in the evening. It’s hard to uphold a workout routine if you’re friends with people who make plans on the day of. One way to avoid this pitfall of making hard choices between your habits and your friends is to move your habitual stuff to the morning, where people have less of a chance to interfere or interrupt your schedule.
  • Find ways to double up your time: You can save some time by doing two things at once. For example, reading a book during your commute saves you from spending all your time commuting. Eating a meal with friends can fulfill your social and dietary needs. Just be careful not to mix two cognitively demanding tasks, and not to give up break time in order to squeeze in more activities.
  • Set plans are about 1.25-2x the cost of normal times: Any set plans that cannot be moved (like any appointments, obligations, or engagements) should be treated as costing about 1.5 to 2 times the amount of the time they take. For example, if I wake up earlier than expected for a 9am coffee with a friend, I’m wouldn’t be able to adjust my schedule nor squeeze in something other activity before my engagement. Concrete plans cannot be moved and I find that the flexibility of the schedule I lose is approximately 50 – 100% of the time of the obligation. This means that I generally treat concrete plans as costing more and try to do more things that are flexible, like running by myself over joining an intramural sports league.
  • Identify high variability factors that can throw off your schedule: My biggest hidden variable is sleep. My sleep duration varies quite highly, and I have to adjust my schedule accordingly. I try to avoid concrete plans in the morning to avoid my sleep from clashing with my other plans.
  • Read More


    Ultimate Productivity Hacking Guide V2 (Part I): Intro & Priority Management

    Note: I can’t believe it’s been 5 years since I first wrote my productivity hacking guide. I was a freshman at Berkeley when I published that article. Now I work full-time and still juggling various aspects of my life. A lot of productivity methodology has changed, and yet a lot has stayed the same. I’m rewriting this guide from scratch, and organizing the information in a more referential manner. That way, people can reference material that’s relevant to them and ignore everything else. I’m also releasing this guide in 5 parts, as not to overwhelm people too quickly. Read More


    Thoughts on Downtime

    Lately I’ve been needing more downtime. Downtime for me are activities that are low stimulation activities. Downtime include stretching, spacing out, closing my eyes (whether or not falling asleep), going on walks, and doing household chores. Downtime (for me) does not include playing video games, watching television, or browsing Reddit. As little as 15 minutes of downtime correlates strongly with an increase in my subjective well being.

    The concept of downtime is a relatively new concept to me. I originally had a strong attitude against downtime. I didn’t believe in deep rest, and felt like doing hard work was sustainable. After going through 2 burnouts in my life (once in college and another during work), I’m willing to soften my claim now.

    One discovery that overturned my opinion on downtime was realizing that burnout is a well defined and studied phenomenon. When you’re burnt out, a series of physiological effects occur that make you less effective of a person. You’re less likely to respond positively to stimuli, you’re more stressed, and burnout affects sleep. Being burnt out is a bad place to be, and recovery can take months. Months of unproductive work is not worth squeezing out the extra 10% of efficiency in your day-to-day job.

    I also used to think that downtime was superfluous because of the high variance of what people consider downtime. The reasoning goes that if different people have different notions of downtime, then if I could convince myself that a productive activity is actually downtime, I would be able to derive the upsides of downtime and the productive output of the activity.

    Despite trying to adopt that attitude to the things I wanted to like, I’ve had very limited success with incorporating my work into my downtime. High variance of notions of downtime implying flexibility of each individual’s notion of downtime is a non-sequitur.

    Being more experienced with downtime now, here are some subjective descriptions of what MY downtime feels like:

  • Freeform day-dreaming. Ability for mind to wander about ideas.
  • Light sleep. Similar to the description of the onset of sleep, it feels like my sympathetic nervous system is calming down and negative thoughts no longer has negative physiological responses.
  • Deafening of consciousness or focus.
  • Hard focus for long periods of time produces a sense of “congestion”. I’m able to accurately assess this by a simple working memory task. Usually by the time my brain is very congested, holding 3 things in working memory becomes a serious chore. Downtime feels like a drainage of that congestion.
  • Decompressing the memories and information in my prefrontal cortex/hippocampus.
  • Read More


    Keyboard Customizations

    Something that you spend a lot of time doing benefits from even the smallest marginal efficiency. Sleep is a good example. Investing in good quality sleep pays multiple folds when you spend more a third of your time sleeping. Similarly, when your full time job involves sitting in front of a computer and typing, then you’re likely to experience death by a thousand cuts when you perform the same manual tasks over and over again. I’ve developed some useful keyboard customizations that I’m briefly going to introduce. I use laptops from the macOS ecosystem, so I apologize for those PC and Linux fans who are unable to follow along.

    The biggest epiphany I’ve realize comes from when I accidentally press the option key. As few may know, pressing the option key and any alphanumeric key results in a special character. Do you know which keys produce which characters? Neither do I, and nor do I ever use that feature. Whenever I have to search up a special character, I just end up copying the unicode symbol from the search engine instead of learning to do it myself. Understanding that I pretty much don’t care about any option + X combination, I can freely override any of those combinations.

    Searching for software for remapping keyboard layouts, I came across Karabiner for OSX. I really enjoyed the reliability of the software, and it has served me well so far. So I got to tinkering what customizations worked for me.

    For me the biggest pet peeve was having to use the arrow keys. Whenever I’m typing something and want to navigate my focus to a different part of the text, I have to shift my right hand to the bottom right by 4 inches in order to reach the arrow keys. After moving to the location I want, I have to shift my right hand back to its original typing position to resume typing. It becomes really annoying after performing this maneuver hundreds of times a day.

    So the first change I made was remapping option + IJKL to the arrow keys. Now whenever I need to move my cursor around I don’t have to move my right hand 4 inches to the bottom right to adjust my cursor. That’s 11 yards fewer than your hands have to travel each day!

    There are some great side effects from remapping this. For example, now that option + L = right, ctrl + option + L now equals ctrl + right, and that shortcut moves you one space to the right. So now you can easily switch macOS spaces left, right, up, and down. You can also do cmd + option + L = cmd + right, which lets you go back or forwards on a web page. What a joy to not have to move your right hand 4 in to the bottom right.

    I found my next optimization while spending some time working in Sublime Text, a code editor. I tend to split window into multiple panes so I can cross reference files from one another. However, I found it annoying when I want to switch my typing cursor from one pane to another. Usually this involved moving my mouse to select the pane I want, or the sublime shortcuts ctrl + 12345. The shortcuts are a mess, since when you move your left pinky to the bottom left to hit the ctrl key, it becomes quite a reach for your other fingers to reach the numbers to select the panes, so I thought of optimizing that. I decided to remap option + m, option + comma, option + period, and option + slash to ctrl + 1234. This way if I can hold down left option with my left hand, and slightly curl my right hand to select which pane I want.

    It was also annoying when using split view (putting two applications side-by-side) and having to switch between them. You could do cmd + tab to switch between applications, but that doesn’t work when you want to switch between windows of the same applications, like if I’m working between two repositories of sublime text of seeing two windows of my Chrome web browser.

    Mac has a native shortcut to move to the next active window, but it’s at an inconvenient place at ctrl + F4. I remapped that shortcut to option + H so that I can navigate across my entire computer while holding down the option key. I can switch spaces, switch focus within a space, switch panel views all on my keyboard.

    It says option+D here because I use Dvorak and the H key maps to D

    One particularly tricky thing to write was the option + cmd + left shortcut. On Chrome, this lets you switch to the tabs to the left and right of your current tab, which I found pretty useful instead of having to memorize the tab indices to select the tab you want. However this shortcut is undoable with the option + IJKL setup since an extra option key is needed to hit this shortcut. I had to separately remap other keys to make this setup work, specifically I remapped cmd + option + U and cmd + option + O to the tab switching shortcut.

    Something that particularly bothered me when I received my 2017 Macbook Pro was the touch bar. There’s just no tactile response with the escape key. The escape key is way more useful if it were just more accessible. For example, if you’re trying to scroll through the web page with your arrow keys, but find that the focus is placed on one of the text boxes, you can move your mouse to click outside the text input, or you could press escape. The problem is when you use your option-based arrow keys, holding down option, then pressing escape, then going back to option, is hard. So I remapped option + semicolon to escape, and now I can hold down left-option, then escape my focus, scroll around a view, and then switch panes!

    Similarly, on the top right hand corner we have the delete key. Reaching for that delete key is annoying that I remapped my caps lock key to delete. I also added a mod such that holding shift while pressing delete will do forward deletes.

    I added some other minor stuff too, like personally swapping semicolon with colon. I have my Karabiner rules posted here, which you can copy.

    If you want to go really hardcore with improving your keyboard ergonomics, consider learning Dvorak. My favorite dvorak learning resource is here.

    Have any interesting keyboard shortcuts? I would love to hear about them. Let me know either in the comments or through my email :)


    Works on Commodity Hardware

    There are design patterns, algorithms, or techniques that are highly dependent on the agents that execute those patterns. The recent boom in neural nets in artificial intelligence was only enabled by the rise of fast GPU’s that run the back propagation algorithms. Sophisticated breakthroughs in sports have been enabled by more performant athletes who can execute complex strategies. Without some requirements on the executors, none of these things would work.

    There is a design pattern that is highly agnostic to the executors, yet produce meaningful or effective results. This is particularly interesting to me because by working well DESPITE the dependencies, it gives more robustness to the design pattern itself.

    I first discovered this pattern when reading the DynamoDB paper, which is a computer science paper that boasts incredible database performance by organizing machines in a particular topology and having them talk to each other in a special way. One of DynamoDB’s biggest selling point was that you didn’t have to buy specialized hardware to achieve a highly available and consistent data store. As the original paper phrases it, “Dynamo is run on standard commodity hardware components that have far less I/O throughput than high-end enterprise servers.” This was a big deal when companies had to purchase specialized hardware in order to achieve the durability and availability they wanted. Not with DynamoDB. The design pattern of how the different machines operate work just as well as the specialized hardware not running the database software. Ever since reading the original paper, every time I recognize a similar pattern, I say “this works on commodity hardware.”


    One of McDonald’s breakthrough innovation in the rise of business franchises is their ability to produce consistent quality burgers and service through untrained labor. When you want to open a normal restaurant, you often have to hire specialized workforce like a trained chef or an accountant. Not McDonald’s. With their trademarked business practices that they share with anyone looking to start a branch of McDonald’s, they can train untrained labor to produce very, very consistent meals and restaurant experience.

    It was a revelation to me that McDonald’s is in the business of selling business blueprints. McDonald’s convinces entrepreneurs that starting a McDonald’s is the most profitable business they can start. With minimal skill and labor, McDonald’s Corporation provides all the support, guidance, and materials you need to successfully run your own branch of McDonald’s. You don’t need any special personnel, just someone who graduated from their local community college and some gumption to take on leading the business.


    I’ve been asked a few times if I ever want to be a manager. I reply that I’m a good peacetime manager, but when shit hits the fan, I don’t know if I’ll be able to step up. I also note that I really like working with competent people and can get things going if everyone likes each other.

    That’s a difficult ask, considering that most managers don’t hire their engineers, they’re more likely to inherit them. Managers also have very little say on who gets along with whom or who is a good engineer. A good manager build products and manages the team without the need to have a highly specialized or educated team. They tend to produce those players instead of acquiring them. Good managers enable mediocre engineers to produce stellar results. Good management styles works on commodity engineers.


    If you ever coached young athletes like I did, you’ll understand how to work with the athletic limitations of your team. In soccer, for example, asking your 12 year old players to make shots outside the penalty box is a no-go when they can’t even kick a ball that far. Developing a strategy becomes highly dependent on the executors of that strategy, and when you don’t have those executors, you have to develop strategies that work on commodity players. Some of the best coaches I’ve seen in the community soccer league are ingenious coaches who develop strategies that you won’t see in the World Cup, but works tremendously on 12-year-olds who only show up to practice twice a week. Dumb stuff like “kick the ball above the goalie because he hasn’t hit his growth spurt yet” sounds really dumb and slightly mean, but I’ve heard similar statements on the playing field before.

    Also literally watch any sports movie. Coaching’s all about playing to each players’ strength.


    There was a case study surrounding an intervention to reduce child mortality in rural Africa. Being born prematurely is one of the biggest sources of premature deaths. One way to save these babies is to keep them in an incubator. Western hospitals would sometimes donate these incubators to African hospitals that end up being neglected because it required a skilled technician to fix any issues.

    The world of philanthropy recognizes executor limitations and celebrates the frugality of things to work on commodity hardware. Take this water generator for example:


    Or this $1 microscope. Often these philanthropic projects boast the effectiveness of certain techniques without caring about the materials of the labor required to produce the results.


    Hopefully your tour of some design patterns will help you recognize robust systems that are agnostic to the executors of the pattern. This is an interesting quality to discuss when making design or implementation choices, as it can make or break you in certain cases.


    Lessons From Improv

    2017 was a rough social year for me. I was having a hard time connecting with new people I met and making new friends. I attended a lot of social gatherings over the weekends with the mindset of talking and interacting with people in more fun and meaningful ways, but I always fell flat of what I set out to accomplish.

    Social skills are hard to come by because if you’re bad at socializing, you’ll be conditioned to not like socializing. Not enjoying socializing in turn makes you worse at socializing, and you have a vicious cycle. I felt trapped in this vicious cycle since my self-conscious attitude towards my social skills would pop out in a middle of a conversation while I socially implode mid sentence.

    I didn’t feel like I made much progress in 2017, but I was eager to improve. Lamenting my problem to some friends, they recommended that I should try improv. I emotionally flinched at the idea, and came up with an excuse not to sign up for a class. When given more time to think about my social issues, I realized that I needed systematic ways to overcome my fears, and improv was a good systematic way to set a regular schedule to go outside my comfort zone

    So I signed up for an improv class. That decision was one of the best decisions I’ve made in 2018. I wanted to highlight some of the takeaways I had from the class that carried through to my day-to-day interactions.

    Not all Questions are Created Equal

    Although in many conversational skill books recommend asking questions as a way to show interest in other people, in improv starting a scene with a question is generally a no-no because it puts the burden of setting up a scene on your partner. “What are you doing?” doesn’t contribute as much to the scene as “I see you’re rebuilding your computer again.” A good initiator plants an improv seed and invites the other players to build on the scene.

    Not all questions are created equal. From my work I am trained to ask specific questions to get specific answers, but when I carry that conversational style to weekend parties, I find that asking those questions strongly backfires. I have had people tell me that talking to me felt like being in an interview. Asking specific questions only gives your partner a small set of responses to choose from, sometimes only one. For example, if I ask, “what do you do for a living?” There is only one answer my conversation partner can say. These answers are usually so automatic and devoid of individual expression that I missed an opportunity to connect with this person.

    The only free outs in these questions are when they say the an answer you like. For example, if you do finance, and they do finance too, then you guys can continue your conversations there. If they don’t work in finance, then you’re out of luck and have to talk about something else. That’s why sometimes these questions are called “qualifier questions.” Your connection with this person depends on the answer he/she gives, and people don’t like having the burden of having to impress or interest you.

    Being a person of varied interest helps only to the extent of expanding your preferred answer set, but even a “me too” itself is not sufficient to move the rapport-needle forward. It’s a false assumption that rapport-building has to come from common interest.

    A good conversation avoids canned messages and invites your partner to express themselves. An open ended question is an easy way that’s taught to elicit that kind of behavior, but it doesn’t have to be a question that invites the other person to join in on a conversation. It could be a compliment, an observation, or a commentary. The important thing is to invite people to be able to freely express themselves without giving them the entire burden of expressing themselves.

    The Most Important Part of Improv is the Relationship

    Relationship is a conflated word here. I will use “relationship” as to describe how people feel/relate to one other. “Relationship” is also often used to describe formal interactions, independent of how the individuals in that relationship feel. I call that type of relationship “roles”.

    There was an activity we did in class that involved two people going onstage and assigned roles (e.g. brothers in law). Then they had to start a conversation and they could talk about anything. One pair of students were assigned the student/teacher role, and that scene was very difficult to play. The problem a student/teacher dynamic was that people were too eager to play the role and forget about the relationship. The scene quickly dove into the teacher giving the student advice and the student passively listening. People playing on their roles made the scene less about the people and more about the role.

    I found similar problems play out when I feel assigned a particular role. For example, in the few mentorship programs I was a part of, I often found myself too mentally grooved into my role as a mentor to develop a relationship with my mentee. I would avoid showing weaknesses to my mentee, gave advice that wasn’t asked for, or adhere to a strictly professional manner. Not seeing the human on the other side of the table resulted in a lack of rapport and chemistry. Less chemistry correlates with less trust to seek out my help when they ran into issues.

    Similarly, even though I’m out of college, I catch myself often giving advice to college students that I meet, even if they don’t ask for it.

    In improv scenes, it’s wise to quickly establish the relationship as a way of how people relate to each other. Do you and your scene partner hate each other, love each other, envy each other? When people can’t figure out your relationship, they can’t have expectations about how you should behave. Similarly, it’s important to establish a relationship when meeting someone new for the first time. Without some way for you to emotionally relate to one another, the natural response is for people to not care.

    Act Like You’ve Known Each Other for at Least 6 Months

    It’s a lot of drudgery of asking people for names, occupations, et cetera. Improv scene start with the assumption that people have at least known each other for 6 months.

    I find that interacting with people as if you’ve known them for a while really helps build rapport quickly. When I proceed too cautiously, I tend to ask more questions and try to figure people out. However, when I act like I’ve known people for longer, I find myself avoiding the prerequisite small talk and jump straight into something interesting. Most people respond reciprocally when you treat them like a friend you already know.

    Yes And, If Then

    The biggest tenets of improv are arguably defined by two phrases “Yes, And” and “If, Then”. “Yes And” references the collaborative effort between improv members to build a scene. It’s a positivity mantra that sets the who scene open to all possibilities, because every agrees that they’re going to build something together and that they value everyone’s contributions to the scene. When you adopt a “Yes, And” attitude, you’ll find yourself more agreeable, less judgmental, and more likely to carry on a relationship with people.

    “If, Then” is what gives the story consistency and depth. Improv scenes that are as random as a dice roll are as fun as a dice roll, so “if, then” attitudes help members find their common ground of scene direction that they want to take. An improv scene that is a bunch of If’s and no Then’s is just a bunch of unrelated one liners. By connecting the statements together through “if-then’s” you begin building a beautiful story.

    Why You Should Consider Taking Improv

    I think one of my favorite moments in my improv class was when I was really struggling to get through a scene in class. I sat in my chair dreading for my turn to go on stage to perform *that*. It wasn’t me. I’ve never done that, and I’ve never acted that way before.

    At some point it was my turn. I got up, word-vomited on stage, and sat back down. I still felt afraid at some point, but at the same time I just *knew* that I was in no harm. Fears play out in my head in the form of mental scenarios, like falling off a cliff, being made fun of by people, or getting hit by a car. But this fear that I feel now is different. I didn’t think anyone was going to judge me or look down on me after my performance. I was not in any physical harm. When I took away all the different scenarios that fear manifests in my head, all I had left was the fear itself. This raw fear had no “worst-case scenario” attached to it. I just observed it just like a biologist would observe a physiological response from a wild animal. When I realized I was able to disassociate myself from my fears, I felt much more at ease.

    The positivity that is nurtured in the improv classroom is amazing. Positivity and safe space has been so thoroughly enforced and demonstrated, even in the most trying of times is remarkable and admirable. After that incident I felt more comfortable around my fears. No, I haven’t full overcome my stage fright, but I feel much more comfortable tackling those fears in a safe environment.

    I would recommend improv to anyone who feels like they need to work on their social skills. I’ve only been highlighting the benefits of improv with respect to my social life, but even if I were to ignore all the social upsides of taking the class, I have to admit that improv is pretty darn fun.


    The Death of Semantics

    Words decay as soon as they are invented. That’s because words and language are a distributed protocol to tie semantics (meanings) to representation (words). With so many people trying to communicate with each other, the distribution of these protocol are subject to chinese whispers and decay. This essay traces how words might change for the worse.

    Stage 1: Neologism

    The birth of words begins when there is a semantic (meaning) without a representation (word), so people invent a new word to “point” at the semantics. “Google” was a favorite modern word officially added into the English dictionary in 2006. It was a new verb that was used to describe the searching of information on the internet because no previous word existed to describe what the word “google” described. Words are saved because no one ever has to say “Why don’t you search it on the internet?” ever again. We say “Why don’t you google it?”. All is good.

    Stage 2: Semantic Diffusion

    Often times the popularization of a word weakens the definition because the word is no longer used by the original people and often used with a weaker semantic. This is called semantic diffusion, coined by Martin Fowler.

    “Allergy” was originally used to describe a medical condition pertaining to the hypersensitivity of the immune system to foreign substances, but when popularized, it transformed into a weakened definition to include the condition in which includes the hypersensitivity of foreign substance not pertaining to the immune system. For example people would often say people who have G6PD are allergic to fava beans, when in reality the mechanic related to the sensitivity to fava beans is not resulting from an autoimmune disorder, but rather an enzyme deficiency.

    Weakened definitions are bad because words lose their original precision of semantics, and the margin of imprecision can lead to errors and confusion. Doctors who hear the phrase “X is allergic to Y” can no longer safely assume the underlying cause is an autoimmune disorder.

    Stage 3: Overloading

    When a word’s definition weakens to the point that it covers too much, the semantics of the word begins to split while the representation of the word stays the same. The result of the process is an overloaded word. An overloaded word is dangerous to use because when used in discussion, different people might assume different definitions.

    “Fascism” used to describe a collection of beliefs supporting a dictator in power forcibly suppressing opposition, regimenting commerce and industry, and promoting nationalism and racism. When the terminology became popular in modern politics, the term has weakened its definition to cover a set of unpopular right-wing beliefs.

    Since the original semantics of “fascism” has receded in everyday conversations and the new weakened definition has grown in popularity to describe a new right winged political party, the word has been “hijacked” to encompass this new meaning without fully deprecating the original use case. Now, “fascist” is being used to describe right-wing extremists, who only hold a subset of the beliefs from the original definition. It’s a great public relations move to overload an already emotionally-charged word, but I believe adds more confusion than clarity around the public debate surrounding right-wing extremists, and the manipulation of terminology can also be used against our own beliefs, as described in the noncentral fallacy.

    “If a tree falls in a forest, and no one is around to hear it, does it make a sound?” The paradox and argument embodied in this koan can be summarized by pointing at the overloaded word “sound.” If you substitute the definition of the word for the word, then you have your answer.

    “If a tree falls in a forest, and there’s no one around to hear it, does it produce a sensation produced by stimulation of the organs of hearing by vibrations transmitted through the air or other medium?” No.

    “If a tree falls in a forest, and there’s no one around to hear it, does it produce mechanical vibrations transmitted through an elastic medium, traveling in air at a speed of approximately 1087 feet (331 meters) per second at sea level?” Yes.

    A key understanding is that overloaded words are semantically diffused words that have begun to contain non-overlapping definitions. A diffused word can contain overlapping definitions that are weakened based on the use of the word. “Evolution” is arguably an example of a semantically diffused word that hasn’t

    Even in self-reflection, overloaded words are grimy nooks that can hold contradictory thoughts. In some instances, I would think I “love” someone when what I was really just physically attracted to them. Some people would say they “love” someone but their significant other wouldn’t move in with them, so it’s not love. I would argue the word “love” is one of the most problematic overloaded word because everyone has their own definition of the word but we all think “love” is supposed to be one universal concept. This expectation vs reality gap is a large portion of relationship issues and debates about what “love” is or isn’t.

    There’s a running but true joke in philosophy that half of philosophy is arguing about definitions. Overloaded words is the root cause for these debates because it’s the philosopher’s jobs to try to sharpen the precision of words. Often, in order to carry out conversations NOT about definitions, philosophers have to avoid overloaded words to reach the same level of precision, which, in turn, results in really long philosophy essays.

    Stage 4: Death

    “Literally” literally has no meaning. The death of semantics occurs when definitions exist that contradict another, giving the original word no meaning. A word could mean definition A or definition B, but not never both. I literally don’t know what “literally” means when someone says “literally.” One of the definition of literally is that it is not literally true.

    “Biweekly” is another example that causes confusion, since it can both mean “twice a week” and “once every two weeks.” Saying “let’s meet biweekly” is no longer informative, and people have to substitute the definition for the word, often saying “let’s meet twice a week” or “let’s meet once every two weeks.”


    Be careful of what words you use, because if you aren’t using words correctly, you can contribute to semantic diffusion, overloaded words, and even the death of semantics.


    My Favorite Book on Friendships is a Book About Polyamory

    I recently read a book called “More Than Two: A Practical Guide to Ethical Polyamory” by Franklin Veaux and Eve Ricket. I didn’t know about polyamory before, and always lumped “poly” people with the rest of the sexually deviant groups of society. Because polyamory is a relatively new concept for most of the monogamous world, the authors spend a great deal of time outlining a guide for navigating in the world of polyamory. The upside of being so detailed in helping neophytes navigate complex relationships involving more than two people is that I learned a lot about relationships in general. “More Than Two” is probably my favorite book for navigating my friendships.

    Friendships involve multiple people, and our relationships with our friends can interact in similar ways as polyamorous people. For example, jealousy is discussed at length in the book, but jealousy is equally frequent amongst close friends. So are long distance friends, or friends who grow apart. Friendships, like poly relationships, can have many shapes. They can be a V shape in which one person knows two friends who aren’t friends with each other. What kinds of problems can occur in these structures? What kinds of problems can occur in an hierarchical friendship? Polyamory people spend a lot of time and energy figuring this out.

    Poly people also don’t have any cultural norms or scripts to support their claims. We all know what a monogamous committed relationship looks like. We know about fairness, trust, commitment, and consent in the 1 to 1 relationship. But what does a V-shaped romantic relationship look like, and what does “fairness,” “trust”, and “commitment” look like in those relationships? Poly people reason about these issues from first principles that are laid out upfront, instead of hidden behind hidden assumptions. .

    Before I dive in on why I find polyamory material practical for my own relationships, I should mention that the authors really want to make this clear: Polyamory is not the same thing as casual sex with multiple partners. Proponents of polyamory are adamant that though polyamory, like swingers, does sometimes involve multiple partners, polyamory is completely different in many other aspects. The book focuses less on the lifestyle of polyamory people and more on how the individuals in these poly relationship interact.

    How to Win Friends (But Not Keep Them)

    The most iconic book “How to Win Friends and Influence People” by Dale Carnegie sparked a flood of self-help books that followed afterwards, all focused on how to make friends. Those resources are fantastic and give good prescriptions for making friends.

    The subject of making friends is also easier to study in an academic study, as it’s easier to find subjects who don’t know each other interact with other subjects in a short, self-contained study. Studying any relationship longer than a year is just a logistical night, hidden with confounding variables everywhere. No psychology professor will ever stake their tenure on making such an experiment or study happen.

    Because of all these factors, I rarely come across compelling material for how to keep friends. No one seems to know how to interact with close friends, or everyone assumes they know how to do it properly (accumulation of experience doesn’t always equate expertise). Most books on friendship involve learning to interact with acquaintances, and many of them are filled with trite aphorisms reminiscent of the original “How to Win Friends” book. Be kind. Be generous. Compliment people. Reach out to folks.

    No one seems to know how to deal with interpersonal issues that involve more than one person. There are some informative resources for conflict management, two of which come to mind are “Nonviolent Communication” and “Crucial Conversations.” They both prescribe amazing advice with communication between two people. But unlike those books, our day-to-day relationships are less compartmentalized and more entwined. I know how to talk about my feelings and make compromises with a friend, but what if the compromise involves or affects another close friend of mine?

    Putting it concretely in an example, Alex has two close friends Bob and Claire. Bob was Alex’s childhood friend. Claire is Alex’s college dormmate. Unfortunately, Bob and Claire don’t like each other, and Alex desperate wishes they could just get along. Alex has been busy lately with his job, and Claire confronts him that she wishes they spent more time together. Should Alex spend more time with Claire if that time spent is at the expense of Bob? Where’s Bob’s share of voice in this? Friendships can be complicated, and when they involve more than 1 person it can get really hairy really fast.

    It’s also difficult to find material in romantic relationship books that transfer well to our own day-to-day friends. Relationship materials only involve one person, who is implicitly the most important person in the world. Unfortunately, I can’t rank my close friends from best to worse. They each have a special place in my heart, so I can’t draw good advice from the books that assume there’s only one person that takes priority in your life.

    Polyamory material fills this niche on the subject matter in which they discuss situations no books on the market currently talk about. They talk about relationships problems that 1. Are high emotional stakes and 2. Involve more than one person. The authors have done an amazing job walking through real examples that are transferable to my personal life.

    Love: The Most Overloaded Word in Human History

    It was only recently that I realized that “love” is the most overloaded word in human history. It’s use to describe so many different type of interactions and so many different types of relationships. Yet many people talk about relationships as if there’s one universally agreed upon definition. It makes answering questions like “are they in a relationship?” give very little information about the nature of two people’s interactions. Does a relationship mean being exclusive? Does it mean “with the eventual intention of getting married” or just “we enjoy each other’s company”? Does a relationship mean sharing a bed, money, or a child together?

    Most books on relationships rely on a core, implicit assumption of what an ideal relationship is supposed to be like, and those assumptions contain the author’s value judgments. For example, one recurring assumption that reveals itself often is Gary Chapman’s conception of a biblical relationship in his book “The 5 Love Languages.” His implicit assumptions bleeds into his prescriptions of the various relationship problems he encounters. One jarring piece of advice I’ve found in the book was around a mismatch of sexual appetite. The advice nudges a female patient to be submissive to her partner for a couple of weeks in order to smooth out a disagreement between a husband and a wife.


    Set Strategy

    Set is not a board game that leaves much room for luck. When an experience Set player plays with you, you’re almost certainly going to be destroyed.

    Back in college, I had a friend who was really into this game. She would always invite me to play with her in our free time and I would get crushed every time. One day, I got sick of getting beaten, so I decided to intensely train and study Set for a week. After a week, I played a rematch with her, and won.

    This guide presents some strategies for the game that I discovered. After guiding you through these incremental strategies, I will evaluate how much of an improvement each strategy makes the game.

    Sometimes I see guides like these like spoilers of sorts, since I really enjoyed the experience of learning to be better at set myself. So, if you would like, you should try to learn Set by yourself for a couple of weeks, and then come back here.

    **Spoiler Alert**

    The Rules

    Set is a real time pattern-finding card game. Each Set card has 4 identifying attributes — color, number, shape, and shade. Each attribute has 3 variants.

    Color Red Blue Green
    Number 1 2 3
    Shape Diamonds Oval Squiggly
    Shade Solid White Shaded


    Counting all unique cards yields 3^4 = 81 cards. The game involves laying out 12 random cards, and finding a set of 3 cards such that for each attribute, all the cards either have the same attribute (e.g. all blue) or all different attributes (e.g. blue, red, and green). An example of not a set is {blue, blue, green}.

    When a set is found, the first player to call “set” and correctly retrieves the 3 cards will win a point. The empty slots are filled with new cards, and the game continues until the 81 card deck runs out and there are no more sets on the field.

    Strategy #1: Pick 3 Cards

    When I was first taught Set, it took time to even figure out if any given 3 cards formed a set. So my very first game of Set, I just picked arbitrary cards out of the layout and see if they form a Set.

    This is the probably the only logical first strategy for anyone starting to play set. This is the part of their development to familiarize themselves with the rules and constraints of the game such that they can recognize sets quicker when they see it.

    However, this is a poor long term strategy for finding sets. To understand why this is a poor strategy, we have to probability theory.

    The first important thing to note is that given any two cards, there is **exactly** one cards that completes the set. For each of the attributes between the first two cards, they either have to be the same, or different, so the third card must have the attribute that has the same relationship as the first two cards. If the first two cards are both green, then the third card is the set must also be green. If the first card is red, and the second card is green, then the third card must be blue. You can apply this logic to all of the attributes and the conclusion you wind up with is that there is **exactly** one card that fits all the relationships since.

    With that understanding, we now know that any random 3 cards will have a 1/79 probability (1/(81 – the last two cards you pick)) of forming a set. The first two cards can be arbitrary, but what you pick as the 3rd card has to fit the above requirements, and out of the cards that are left, there is a 1/79 chance that you will find a set.

    That doesn’t sound so great. If you can evaluate a set of 3 cards to determine if they are a set on average of 2 seconds, then in a 5 minutes, you’re going to find an average of 2 sets. That’s not amazing considering most set games end in 5 minutes. Not only that, on a layout of 12 cards, you’re going to evaluating 12 C 3 = 220 sets of 3 cards to determine whether they a set.

    This is an important milestone to accomplish because this strategy phase you are building your capacity to quickly evaluate the validity of sets. Newbies can take up to 3-5 seconds to reliably validate sets, but with some practice this could go down to half a second.

    Let’s see if we can do better.

    Strategy #2: Pick 2 Cards, Look for the 3rd

    Armed with the knowledge that any 2 cards has exactly 1 card that completes the set, you can quickly scan whether that 3rd card is in the pile. Instead of evaluating 220 sets of 3 cards whether they form a set, you just pair off cards one-by-one to see if you can find the 3rd set. The numbers are more in your favor this time at 12 C 2 = 66 pairs of cards. You just saved yourself 220 – 66 = 154 checks! Not only that, the chances that the 3rd card is in your current 12-card layout is 10/79. Assuming it takes you 2 seconds to figure out what the 3rd card is given 2 cards, and 1 second to scan the layout looking for the 3rd card, then in 5 minutes you’ll find on average 12.65 sets! That’s almost 6 times as many sets!

    Pursuing this strategy requires a different skill from the previous one, namely the speed at which you can produce the image of the 3rd card in a set given the first two. I can do it in about 0.5 seconds, but for newbies it might take up to 3 – 5 seconds. You might experience a small dip in performance from pursuing this strategy before you improve on your time again.

    Could we do better?

    Strategy #3: Look at the last 3 cards

    When someone finds a set, new cards are used to fill in the cards that were in the set.

    As you play more games of Set, you’ll begin to notice that most new sets involve at least 1 of the new cards that is introduced. The reasoning approximately goes like this:

    If there exists a set that consists solely of cards from the 9 cards remaining, there is higher chance someone (myself) included, would have found it. The fact that we spent 10 seconds looking at the card layout and not finding a set in that group of 9 nine cards indicates that a set probably doesn’t exist in those 9 cards. Therefore if a set were to exist, it would most likely include at least one card of the three that are being introduced.

    Usually the probability that a set exists decreases as time goes by. This is usually intuited by experience, but we can dig a bit deeper about what signals that the causality exists (i.e. more time = lower % set exists). I like to think about it as “mental cycles.” Just like computers perform computer cycles, there is an approximation of measure for human that perform “mental cycles.”

    At this stage of development you begin to think about where mental cycles are “spent.” You’re looking for patterns that no one else has found yet (that’s the objective of the game!). As cards are introduced to fill the spaces of the last set, it’s important to note that the mental cycles spent on the previous 9 cards are disproportionately high compared to the new cards, so you’re going to want to pay special attention to the new cards in the field.

    Assuming there are no sets in the remaining 9 cards, to find the next set in a layout, you only pair off one card from the new with one card from the old to look for the 3rd card. With this strategy, you only need to look up at most (3 * 9) + 1 [for the set being the 3 cards introduced] = 27 sets to find a compatible set. This is a good improvement from the previous strategy of 66 pairs. Your set throughput is going to go from 2.53 set/minute to 6.18 sets/minute! This is also way better than strategy #1 at 0.4 set /minute. You’re now better by a whole order of magnitude.

    Strategy #4: Property Filtering

    What you might find interesting to note is that with little practice, you can filter out cards by property, and only focus on cards with a particular property. For example, it should be very easy to find all blue cards, or all oval shaped cards. If you layer two properties, you can find subsets of subsets of properties, like if you wanted to find blue ovals, you can narrow by blue, then by ovals. With this, we can on average be faster than strategy 2 and strategy 3.

    Instead of the 2-step process of:

    1. Figuring out the 3rd card in 2 card setup and then
    2. Scanning the field for the card

    You can break the two processes down into individual properties, like so:

    1. Pick an arbitrary property
    2. Figure out what property the 3rd card needs to have
    3. Scan the field for cards containing the 3rd property
    4. If there is exactly 1 card, figure out if it’s the set
    5. If there are no cards, then the 3rd card doesn’t exist
    6. If there are multiple cards, return to Step 1

    Although this strategy has more steps, the time savings you get comes from the amount of time you save by scanning the field for a single property at a time instead of figuring out the 3rd card and then scanning the card on the field. Given 2 cards, the odds of the 3rd card being in the playing field is 10/79. That means on average you need to lookup 7.9 sets before coming across a successful one. The time you save comes from the 7.9 dead ends before finding a successful 3rd card. If you’re scanning for a particular property, the chances you’ll have at no cards that fits the first arbitrary property is (2 / 3) ^ 10 = 1.73%.  The chances you’ll have exactly one card that fits the property is about (10 C 1) (1 / 3) (2 / 3) ^ 9 = 8.67%. Adding those cases up equates to around 10%, indicating a 10% chance that you’ll be done with these two cards by now. It’s more likely you’ll have multiple cards passing the first property, at around 89.6%. The expected number of cards to have the given property is approximately (1 / 3) * 10 = 3.33 cards. Now repeating the process again with another property, the probability that you’ll have no cards matching your second probability is (2 / 3) ^ 3.33 = 25%. The probability of exactly one card matching is (3.33 C 1) * (1 / 3) (2 / 3) ^ 2.33 = 43%. The overall chances you’ll failure or success by the second round is (0.1) + (0.9) * (0.25 + 0.43) = 71%. So generally you can very quickly scan two properties on a field to test for membership of the 3rd card, instead of figuring out the 3rd card a priori, and then scanning it. The time you save from the 7.9 dead ends by only evaluating on average 2 properties (instead of 4), should be about half.


    I decided to write some simulation software to test out my theories. Here’s the code. I assigned a `mental_cycles` value for particular cognitive tasks, like finding a card on the field or calculating the 3rd card that completes the set. With those values hard-coded in, I ran simulations which each agent plays 1000 trials. Here are the results:

    NaiveAgent avg mental cycles per game 1851.74625

    Pick2RandomAgent avg mental cycles per game 1166.0175

    Pick2CardsLastAgent avg mental cycles per game 1146.651

    PropertyFilteringAgent avg mental cycles per game 1039.2773999999338

    PropertyFilteringLastCardsAgent avg mental cycles per game 1001.812499999939

    The results were not as extreme as I would hope, but ordinally they rank they are about the same. Some strategies are only dominate over other within a small margin of mental cycle costs, so it hints that either my mental cycle costs are off or that individual variability in specific cognitive tasks could translate into which strategy works best for them.

    Another point worth mentioning was that I had hoped that by looking only at sets involving the last 3 cards you would achieve a large improvement, but that seems not to be the case by the margin I was looking for. One possible explanation is the criteria I set for the game not to admit new cards unless all the existing sets have been found. Counterintuitively, it actually makes picking random cards more likely to involve one of the 3 cards introduced. For some quick math, the probability that the 2 random cards drawn by Pick2RandomAgent involves one of the new cards is 1 – (0.75) ^ 2 = 44%. About half the time it’ll involve the new cards. This probably is higher when it’s 9 cards on the board, at 56%. Doing a quick simulation, the average number of cards on the board before a set appears seems to be 8.2262, which will increase the probability of picking a random last 3 card on the field.

    Some other things are difficult to write agents for, as we’ll discuss in the heuristics section below.


    Now we look at heuristics for better set plays by relying on probability theory.