Maximizing My Free Time

Lately, I’ve been feeling pretty stressed about my free time. I’ve taken on so many commitments, both at work and in my personal life, that I don’t seem to have much time for myself. My weekday schedule follows the same pattern of: wake up, do “morning chores” (feed cats, take out their litter, empty the dishwasher, put in a load of laundry, make breakfast, water plants on patio/garden), work from 9-5, exercise, feed the cats, make dinner, watch TV for an hour, go to bed. My weekends are no better. On Saturday, I go grocery shopping at the farmer’s market, tend to our garden for several hours, clean the bathroom or wash our bed sheets depending on which week it is, do any other chores which came up during the week, cook dinner, watch TV, sleep. On Sunday, I: clean the espresso machine, sweep, mop, vacuum, squeeze in an hour of video games, and finish up with an outing that usually lasts the entire day.

By the end of Sunday, I’m exhausted from the long week and disappointed that I didn’t have a solid multi-hour block to sit back, unwind, and do something that I really want to do: like take a really long flight in Flight Simulator, play Minecraft or Valheim, tweak my homelab, or read a book. I usually wake up on Monday anxious about all the chores I need to get done with the goal of getting them done before Sunday so that I will have free time at the week’s end.

I don’t even have kids! I know it will get worse when I do.

Of course when I stumbled upon the “What is your time really worth to you?” quiz from clearerthinking.org on hackernews, I took it immediately. Turns out, my free time is worth a lot to me: on the order of hundreds of dollars an hour. I’m desperate to get just a few more minutes of free time out of my days.

I’m taking the results of my “test” to the extreme – for the past month, every time I have the thought “am I wasting my time?”, I try to find a way to spend money in order to give myself more free time. Here are some examples that I’ve found so far – some of which spend money and some don’t.

  • I registered for Global Entry (and by extension TSA Pre-Check) to save myself time at the airport. This cost $100 and so far, I’ve saved a few hours on our vacation to Banff National Park.
  • I hired cleaners to come bi-weekly to help clean areas which I spend a lot of time on: the stove, bathroom, cabinet doors, and vacuuming cat hair off the couch. This cost $75 per visit and have saved me a few hours so far.
  • In general, I’m trying to look things up on the Internet less. I find that I spend way too long searching for something “perfect” when in reality a single recommendation will do. For example, we recently went on a vacation to Banff National Park and actually used the Visitors Center that we seemed skip on all of our other vacations. We had spent a few hours trying to figure out plans for Canoeing – the visitors center gave us an answer in less than 5 minutes. Easy.
  • If I buy food and water when I’m hungry, even if it means paying a bit more or sacrificing quality, I noticed that I’m happier than if I waited for something better (while starving). Again, this helped us out in our recent Banff vacation.

I’ll continue looking for ways to give myself back some time. There are a few things that I’d like to try that I haven’t been able to yet: hiring a laundry service to pick up my laundry, hiring a personal assistant to help me manage my email inbox, hiring someone to help come up with my weekly meal plans.

I fully realize that several of these are only possible because I’m fortunate enough to have money to spend. The concept of spending money to get back time is still new to me, however, since I grew up in a relatively frugal household.

On Fredericksburg Removing the Slave Auction Block

After the killing of George Floyd, the city of Fredericksburg, Virginia removed the historical slave auction block from the sidewalk on the corner of William St. and Princess Anne St. outside of Hyperion Espresso.

The slave auction block on a street corner in Fredericksburg, VA
By Sarah Stierch – originally posted to Flickr as Slave Auction Block, Fredericksburg, VA, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=10596228

At first, I was surprised by the decision. When I visited Fredericksburg, I saw the auction block and it reminded me of atrocious events in American History and how we overcame them. The blocks placement in the middle of a highly-trafficked sidewalk strengthens the point: Hundreds (maybe even thousands) of slaves were stripped of their humanity and traded hands at this very spot. This was part of everyday life in pre Civil War Fredericksburg. Why would th ecity choose to remove such a good reminder of the past and the great progress we’ve since made?

White Fragility and Tears We Cannot Stop gave me insight: Have we made as much progress as I previously thought? When I first appreciated the auction block, was I viewing the events of history through my white-privilege-tinted glasses? What does the auction block mean for a black person in America today? I imagine their life – struggling everyday with systemic racism and discrimination. Every time they walk by this auction block, they are reminded that only 200 years ago black folk were auctioned off to whites in this very neighborhood. That’s the reason they are treated poorly today. That’s the reason 1 in 3 black folks are sent to jail in their lifetime. That’s the reason that innocent blacks are shot down by police.

Black Americans are forced to remember this every time they walk this street or sit down to drink a cup of coffee. Meanwhile, white folk look at the block and remind themselves of how great things are today.

I didn’t understand the burden that the auction block might impose on Black Americans. I now believe that the city’s choice to remove the block was a good one. The block did not represent great progress or achievement. Instead, it only reminded us of why there is such great racism in American today. Removing it from the streets gives black folk the opportunity to walk around this particular corner without being reminded of the immense historical baggage and systemic racism that black folk face every day in America.

That said, the auction block surely still belongs in a museum where people can see it and be reminded while they are in the right mindset and surrounded by historical context.

The Moment Between Flips

In today’s fast paced world, pancakes are a great way to slow down. Each pancake needs to cook for a minute on each side. During that minute, you have to stay close – you can’t go off and do something else. It’s a great time to think. The mind wanders about this and that as the bubbles rise to the surface of the pancake. It’s a peaceful moment with nothing to do except wait for the next flip.

I cherish these pancake moments. I love to image that I’m living in the country and I’ve just completed the morning chores – nothing to do but think. I think about how nice the weather is and how interesting it is to be alive.

Today, I thought about how much we consume. Why do I feel the urge to browse Amazon for new things? Why isn’t what I have sufficient? I am addicted to that small burst of happiness when the next Amazon package arrives. But like pancakes, there’s no need to rush – slow down and enjoy the current moment.

Collectibles: Use Them or Lose Them

When I was a child, I was spoiled rotten. My parents had a dual income that they apparently chose to spend on toys and collectibles for my brother and I. We had a huge room above our garage dedicated to only our toys. In retrospect, it was ridiculous – but of course we loved it.

As I grew, things changed. My parents got divorced and we had to move. All our toys and collectibles went into boxes and moved with us as both my mom and dad changed houses every year. Those boxes stayed with my parents until I graduated college. Then, I chose to take everything my parents were storing when I moved to Silicon Valley.

Turns out, having those boxes sit around is a huge burden. They are always at the back of my mind and any time I try to make a big decision, they get in the way. “Should I get a rug to bring the place together? No, I should go through the boxes first.”; “Should I get a bike to commute to work? No, I should go through the boxes”. The boxes give me some form of decision paralysis, so I am finally deciding to go through them.

The majority of the boxes are filled with old toys and stuffed animals. After reading Marie Kondo’s The Life Changing Magic of Tidying Up, I decided it would be best to donate these things to Goodwill. Now, I’m left with collectibles and gifts from relatives – a lot of them are still in their original packaging. These are harder to deal with: they’re probably worth some money, they have a nice handwritten note on the packaging, and they’re from someone who loves me.

But I’m not interested in these collectibles. I’m not going to display them, I don’t want them, and they’re taking up space – both physically and mentally. I almost feel cursed. Why did my parents choose to keep these collectibles wrapped up for twenty years? Why am I dealing with them now? Did they feel too guilty to get rid of them, but too scared to display them?[1]

I’ve decided to do something with them. For the collectibles that I actually enjoy (there are only one or two), I’m going to unwrap them and display them. They’re not giving me any happiness sitting in a box – they’re much better on display where I can see them everyday. Most importantly, I’m going to throw away the box.

For the collectibles that I don’t enjoy, I’m going to take a quick stab at selling them on eBay and Craigslist. If they don’t sell in a couple weeks, I’ll donate them. I’ll forget about them a few weeks after and I will be burden-free.

I’m going to start applying this philosophy to other collectible-like things: stickers, books, greeting cards. If they’re sitting in a box, use them or lose them.

References
1 My parents have always had a big garage: I wonder if putting the boxes in the garage had some sort of “out of sight, out of mind” effect and they were completely free of this burden.

Organizing a Small-Scale Programming Competition: Question Writing

As soon as I joined the committee, I got started working on the next competition and learned about the processes in place. We constantly worked to improve them. In this post, I will talk about old processes, why they existed, and how we attempted to improve them.

Writing Questions

Writing questions for the competition is the most important step in the competition design process. In our committee, question writing was done by a designated group of committee members. They would write a rough-draft of their question, a small sample, and potential background stories. After a few weeks, the committee gathered to review all questions and narrow them down to the 15 we would use for the competition. To do this, we gave each question a difficulty rating of easy, medium, or hard. We then eliminated questions until all that remained were the 15 we would use, where the majority of them were “medium” difficulty.

Writing Test Cases

Of course, we also needed to create a collection of test cases to test contestant’s programs against. The test cases consisted of both INPUT and OUTPUT. Creating these test cases by hand for each problem posed a problem: crafting inputs was easy, but doing the work to calculate the expected output by hand was challenging. Further, we wanted a fairly large number of inputs to catch any corner-cases that contestants may have missed.

Sample Cases, Input / Output, and Method Stub from the Fall 2014 competition

Another challenge was test case formatting. Test cases had to be fed to contestant’s programs, whose output then had to be verified. Some of our test cases were also pretty complex (e.g Given a 2D array which represents one map, a 2D array which represents locations of hazards, find a path to the square with coordinates (X,Y)). Contestants definitely shouldn’t have to write this parsing code and instead should only focus on solving the problem in a pre-defined function stub.

Thus, the following problems had to be solved:
1. Given hand-crafted input, auto-generate output that we would use for judging contestants.
2. Provide the contestants with programs that already contained input-parsing and output-formatting logic. Contestants would simply complete a function stub.

Behold: “Template Writers” and “Solution Writers”

We solved the problem by having committee members be “solution writers”, who would act just as the contestants. For each problem, a “template writer” would write a template program that parsed input/output. Solution writers would then use the template and implement the function stub. As long as there were 3-or-so solution writers for each problem, this went very well. After everyone was finished, input could be added into a single file and provided to the solution writer’s programs. If all their outputs agreed, this input/output combination would be considered a new “test case”.

Eventually, we settled on a standard input format (separate test cases were delineated with newlines, components of each test case were determined by the template writer) and a sort-of standard template pattern.

Below is a Java template and case input for a problem in Fall 2014:

import java.util.*;

public class Problem4 {

  //Parameter(s): char ch - the character to be searched for in the String
  //              String phrase - the String to be searched through
  //Return:       int - the number of character triples in the String
  public static int spyingOnTriplets(char ch, String phrase) {

    //YOUR CODE HERE

    return 0;
  }


  /////////////////////DO NOT MODIFY ANYTHING BELOW THIS LINE///////////////////
  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    ArrayList<String> input = new ArrayList<String>();
    while (in.hasNext()) {
      input.add(in.nextLine());
    }
    for (int i = 0; i < input.size(); i++) {
      char searchLetter = input.get(i).charAt(0);
      String searchString = input.get(i).substring(2);

      System.out.println(spyingOnTriplets(searchLetter, searchString));
    }

  }

}
d ddidddd
f ffffffluffffffy
f fluffyyyyy
z heyhowyoudoin
o ooooo
o oooo
b blblbl
b bbb
c c-c-c
' '''
- -----
p chicken

 

At the time, we continued writing inputs and templates by hand. However, we put a lot of effort into PCFramework, which was a collection of shell scripts that would allow all testing of test-cases to be handled automatically.

As an example, basic workflow looked like:

cd BPCFa15/Solutions/dev # Move into the solution writer directory
cp ../Templates/Problem1.java Brandon/ # Move the template into my own workdir
vim Brandon/Problem1.java # Fill in the function stub with my solution
./test.sh 1 Brandon # Test my solution against "sample input" and "corner input", which are hand crafted
./compare.sh 1 Brandon Dylan Marisa # Compare outputs of solutions and verify they are the same
cp Brandon/problem1.out tests/problem1.out # Move Brandon's output into the official tests folder

This allowed us to have “Sample inputs” (sanity inputs whose outputs were provided), “Corner inputs” (Difficult corner cases whose outputs were hand-crafted), and “Generated inputs” (inputs that we created by hand but whose outputs were generated by solutions).

Other Benefits of Solution Writers

On the surface, solution writers provided the competition with usable outputs. In addition, the process of crafting solutions by hand provided us with insight into other metrics, such as how difficult the problems really were and how easily they could be understood. More than once, we revoked a question from the question pool after we discovered that no solution writers could agree upon a solution.

On one occasion, we discovered that one of our problems actually boiled down to a difficult scheduling problem and none of our solution writers could optimally solve it. Obviously, this question was pulled.

A “golden solution” for the above problem:

import java.util.*;

public class Problem4 {

  //Parameter(s): char ch - the character to be searched for in the String
  //              String phrase - the String to be searched through
  //Return:       int - the number of character triples in the String
  public static int spyingOnTriplets(char ch, String phrase)
  {
    int count = 0;
    char[] characters = phrase.toCharArray();
    for (int i = 0; i < characters.length - 2; i++)
    {
      if (characters[i] == ch &&
          characters[i+1] == ch &&
          characters[i+2] == ch)
      count++;
    }
    return count;
  }


  /////////////////////DO NOT MODIFY ANYTHING BELOW THIS LINE///////////////////
  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    ArrayList<String> input = new ArrayList<String>();
    while (in.hasNext()) {
      input.add(in.nextLine());
    }
    for (int i = 0; i < input.size(); i++) {
      char searchLetter = input.get(i).charAt(0);
      String searchString = input.get(i).substring(2);

      System.out.println(spyingOnTriplets(searchLetter, searchString));
    }

  }

}

 

Supporting More than Java

The usefulness of these verification tools quickly became evident. Since verifying inputs/outputs was now trivial, we could start supporting languages other than Java in our competition (as long as someone wrote a template and we had enough solution writers). Due to contestant demand, the first additional language we supported was C++.

At this point, our competition moved to HackerRank to manage contestant solutions and inputs/outputs.