Hardscrabble šŸ«

By Max Jacobson

See also: the archives and an RSS feed

Hardscrabble #2

February 8, 2021

Note: this was originally posted on a Substack newsletter that I abandoned after two issues. Hereā€™s the second one, converted to a regular blog post.

Hey! Thanks to everyone who read Hardscrabble #1 in July. I have to acknowledge: I said it would be a weekly thing and then let it sit for like seven months without sending a second email. I think Iā€™ve learned some lessons about expectations-setting, because this introduction is about to end.

Today, as usual, I have a story from my life, an observation from work, a cultural recommendation, and some hyperlinks. Hope youā€™re taking care of yourself.

A story from my life

Will at a body building competition

In July last year, I called up a bodybuilder named Will, who I follow on Instagram, and chatted for about an hour. He was at his day job, where he does graphic design for a newspaper. A few days earlier, he had competed in his first event, The Missouri State Championships, and won the novice division. What was it like training and competing for that during a pandemic, I wondered.

I also had a bit of an ulterior motive. Will and I crossed paths on the internet almost ten years ago, and became Internet Friends. We shared a common interest: Apple gadgets, and the loose network of bloggers and podcasters who talked about them. Both of us had set up personal blogs modeled after Daring Fireball, which meant that they were mostly short posts linking to other blogs with our commentary tacked on. This was the thing to do at the time, for a particular kind of nerd, resulting in a shaggy, growing constellation of blogs which kept my Google Reader account full of takes each day.

Will and I gradually fell out of touch as we outgrew our shared interest, but we still followed each other on social media. Iā€™m sure you have friendships like this, where you donā€™t talk to each other, but you sporadically see each otherā€™s updates, when the algorithms happen to allow it. Peopleā€™s lives move in fast forward when you arenā€™t paying attention to them.

Will physically transformed in a pretty dramatic way. I wondered whether I had transformed, too, from his perspective. I spent those years focusing on establishing a career in tech. Like his thing, it required a lot of dedication. Is that the same?

Iā€™ll share a few excerpts from our conversation, lightly edited for clarity.


Will

Most of the people who follow me [on Instagram], up until recently, werenā€™t bodybuilding or fitness people, they were just like, normal people, so they get a peek into this weird, crazy lifestyle.

Hardscrabble

Yeah, thatā€™s sort of where my fascination came from. Thereā€™s this feeling of like, could I do that? If I actually dedicated, you know, five-plus years ā€”

Will

Literally, anybody can.I feel like with this sport, you can super nerd out in it. Thereā€™s science behind the training, science behind all the nutrition. You can really nerd out on every single detail. You just get lost in YouTube videos about proper training, proper diets, why you eat certain foods, what is effective. Like, bro science versus real science. Like, bro science is kind of what works and what people have done. Real science says this, but bro science says ā€œYeah, but if you do this, it works.ā€

Hardscrabble

Wait, what are you saying?

Will

You canā€™t always listen to the science, sometimes youā€™ve got to listen to your body. ā€œFor my body, we tried it the science way, and it didnā€™t really work. Iā€™m gonna try it the way this huge bodybuilder dude told me he did it.ā€


To be clear, I donā€™t personally want to become a bodybuilder. But I like believing that I could, if I wanted to, according to someone whoā€™s done it. Transformative change usually feels impossible, but it happens all the time. It just requires commitment:

Will

Itā€™s such a weird lifestyle. No joke. Youā€™ve got to be partially insane, obsessed to want to do this. Itā€™s fitness, but to such an extreme that, to a normal person, itā€™s hard to understand. My mom is like, ā€œWhy are you doing this?ā€ Because Iā€™m, like, suffering while theyā€™re all enjoying this great food. They came to visit when I was two weeks away from the competition. Theyā€™re having a birthday party, celebrating, pizzas, Iā€™m eating these boring chicken and rice and broccoli meals. And itā€™s like ā€œAh, itā€™ll be worth itā€¦ā€œ

And it takes time:

Will

I set out to do this two years ago. The goal was to compete in a competition, and then after after a year it was, I want to win one. I have no problem waiting. Thatā€™s the thing about bodybuilding, is it takes a long time. When I first started, I knew that in ten years I would probably be where I want to be. Thatā€™s how long this thing takes. And Iā€™m six years into it. Iā€™m like halfway from my original ten year idea. I have no problem, if I want to do this, but it might take two years. And then a year later, itā€™s ā€œin a year, I think Iā€™ll be readyā€. And even now, I probably couldā€™ve waited another year. But I was just itching to do it.

Hardscrabble

I think thatā€™s what a lot of people struggle with, with fitness, is the long term nature of it. This is something that I can speak to from experience, the fact that it takes time is partly what gives you that sense of accomplishment, but itā€™s also what can be very frustrating about it if you donā€™t have that perspective that you expect it to take that long.

Will

Yeah. I always thought, five years is going to pass. Iā€™m going to be forty eventually. So I can either do this, and then at forty Iā€™ll be really happy with where Iā€™m at or I can not do it and Iā€™ll be at the same exact place that Iā€™m at.


The big question, of course, is: why?

Will

At the end of the day, if you did everything perfect, it makes you feel superhuman. Itā€™s like, wow, I was able to mentally make my body do things it didnā€™t want to do, turn down things it wanted, only eat the foods I was supposed to eat, and do everything youā€™re supposed to do. And you do that for weeks on end, and it makes you feel like you have incredible control over yourself. It makes you feel powerful.


For Will, the milestone he was working toward was his first competition. Perhaps you already know what happens at a body building competition, but I didnā€™t. I asked if itā€™s like, who can lift the most?

Will

No, that would be a powerlifting competition. Thereā€™s nothing physical. Youā€™re judged on your muscular size, symmetry and proportion, and then ā€œconditioningā€ which is how lean you are. Your hamstrings and your glute muscles only start to show when youā€™re really, really, really lean. They judge everybody standing next to each other, and then you have a couple hour break, and we all come back, and then we did our little routine to music.

The routine is about a minute long. In it, Will cycles through almost twenty poses, flexing various muscles, wearing nothing but his glasses and some bikini bottoms (he graciously credits Kittyā€™s Bikinis in the caption). I think Iā€™d feel a bit exposed, but he looks very comfortable, like itā€™s the most natural thing in the world to be doing. Like dance, it has both movement and stillness. Will tells me his posing role model is Terrence Ruffin whose work is high art. I have to agree.

Hereā€™s how Will felt onstage:

Will

My heart was racing onstage. I look like a deer in headlights in some of my pictures because I was just so nervous. You want to be able to flex every muscle in your body, but have a completely relaxed face, smiling, looking great, and I just didnā€™t have that stage confidence for my first time. I was just, heart pounding, trying to listen to my coach whoā€™s yelling at me, telling me what to do.

Hardscrabble

And youā€™re wearing glasses.

Will

I hate contacts. And I feel like thatā€™s just part of my look. I wasnā€™t even sure if you were allowed to wear glasses onstage. I asked my coach, _are they going to make me take these off?

Will was competing in the novice division, which is anyone who has never competed before. He won. He also competed in the open, and came in second. Why not first?

Will

He just had more muscles, so he won. I just have another year or two and then Iā€™ll be able to compete with people. Progress is measured in years.

Itā€™s heartening to me that bodybuilders are also self-conscious about how they look. We talked a bit about Instagram:

Will

I had quite a few unfollow. Which I donā€™t mind. Iā€™m posting pics half naked, so if you donā€™t want to randomly see that on your feed, like people from high school, theyā€™re not into it.

Hardscrabble

One of the reasons I can imagine a guy from high school might unfollow is maybe a bit of homophobia, like ā€œUh oh, not for me! I canā€™t look at that!ā€

Will

Maybe? Maybe. I think itā€™s more like, they think Iā€™m way too into myself. If I post a crazy picture I try to have a funny caption, or poke fun at myself. But I think people can just be like, ā€œOh, heā€™s so into himself.ā€ When really, I post a picture, and Iā€™m like, ā€œEhh, I wish this was like this, or this is no good, this picture is terrible.ā€

He tells me about the process of taking a bodybuilding photo for Instagram, most of which are taken by his girlfriend.

Will

It takes hundreds of tries to get the right one. Iā€™m making a dumb face or, to get the portrait mode popping just right, all the things. Weā€™ll take like ten different things that are the same exact pose and itā€™s just, ā€œAll right, letā€™s try it again.ā€ And if you watch that, itā€™s like, ā€œWho are these losers?ā€


It was a good conversation. We covered a lot more, but honestly itā€™s kind of hard to transcribe and summarize interviews, and I feel like you get the gist. Iā€™ll leave you with this.

Finally, I asked Will about the tech blogs. Do you remember all those characters from that scene? Do you remember that one anonymous blogger who just razzed everybody? Who do you think that was?

Will

I still read Daring Fireball, and that is the only one. I donā€™t listen to any of the podcasts.

An observation from work

I wrote a few blog posts about coding in the last few weeks:

  1. A little trick that makes using ripgrep in visual studio code nicer
  2. sindresorhus/pure is such a good zsh prompt
  3. heredocs in ruby

A cultural recommendation

In December, I wrote a blog post all about Zoeyā€™s Extraordinary Playlist, the NBC musical dramedy that just started up its second season. I really, really love it, to a corny extent.

Some hyperlinks

  • Thanks Will for doing the interview. Make sure to follow his very entertaining instagram: @kujawawa.
  • My friend Alex Liu, a product manager at Verily Health, launched a newsletter called Refactored Health about ā€œdigital health strategyā€. Seeing his announcement also inspired me to try writing this, and I regret not mentioning that in the list last week. Iā€™m already learning a lot about our modern healthcare industry from his first few posts.
  • Tom Scocca argues against using brackets to clean up quotations when quoting somebody. Too late, Tom! But Iā€™ll keep it in mind next time.
  • Giri Nathanā€™s writing about tennis, such as this coverage of Denis Shapovalovā€™s match from this morning, which mostly focuses on a tantrum the Canadian threw between games, is so fun to read.

heredocs in ruby

February 3, 2021

Iā€™ve recently been writing a lot of heredocs in Ruby. We have to talk about it.

what is the deal with heredocs?

Itā€™s one of the ways to make a string. It looks like this:

def help
  <<TEXT
Help.
I need somebody
TEXT
end

help # => "Help.\nI need somebody\n"

The idea is that you have some all caps label on the first line (TEXT in that example), and then Ruby will look at the next line as the start of the string, and keep going until it sees that label again, and then the string is over.

Itā€™s pretty similar to just using quotation marks like usual:

def help
  "Help.
I need somebody
"
end

help # => "Help.\nI need somebody\n"

One nice thing about the heredoc syntax is that you can use quotation marks in the middle of the string, and you donā€™t need to worry that youā€™re accidentally going to close the string.

Thatā€™s a pretty standard one, but there are a bunch of variations on the theme.

For example, this one is more common in my experience:

def help
  <<-TEXT
Help.
I need somebody
  TEXT
end

help # => "Help.\nI need somebody\n"

It looks a little nicer to indent the closing TEXT at the same level as the starting one, but thatā€™s not allowed with standard heredocs. If you want to do that, you need to start the heredoc with <<- instead of <<.

It would look even nicer if you could indent the text of the string itself. Unfortunately, if you do that, it affects the actual value of the string:

def help
  <<-TEXT
    Help.
    I need somebody
  TEXT
end

help # => "    Help.\n    I need somebody\n"

No worries ā€“ they thought of that. You can use the ā€œsquiggly heredocā€ syntax, which lets you write it like that without actually affecting the value of the string:

def help
  <<~TEXT
    Help.
    I need somebody
  TEXT
end

help # => "Help.\nI need somebody\n"

Most of the time, you should use a squiggly heredoc.

There is one last variation, which Iā€™ve never seen in production code, but which Iā€™ll share for completenessā€™s sake. This is the single-quote heredoc:

def help
  <<~'TEXT'
    Help.
    I need #{somebody}
  TEXT
end

help # => "Help.\nI need \#{somebody}\n"

When you put single quotes around TEXT ā€“ our heredoc delimiter in these examples ā€“ Ruby will treat the string like a single-quoted string rather than a double-quoted string. You know how in Ruby, if you want to use interpolation, you need to use double quotes?

"#{1 + 1}" # => "2"
'#{1 + 1}' # => "\#{1 + 1}"

Well, someday youā€™ll want to create a heredoc which behaves like a single quoted string (I donā€™t know why, to be honest) and youā€™ll be glad that you can.

why have I been writing so many heredocs recently?

At work, we use Rubocop to format our code. One of its rules, Layout/LineLength, checks that your lines arenā€™t longer than 120 characters. I think itā€™s a pretty good rule, and Iā€™m gradually updating the existing code to follow it.

For the most part, itā€™s pretty straight-forward. Maybe you have a line that looks like:

foo(:a, :b, :c)

And you change it to

foo(
  :a,
  :b,
  :c,
)

Great, now itā€™s growing vertically instead of horizontally.

But what about lines that look like:

Rails.logger.info "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

What do you do with that?

Letā€™s throw a heredoc on it:

Rails.logger.info <<~MSG.chomp
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
MSG

Itā€™s still quite long, but the Rubocop rule has a loophole: heredocs are fine. You can disable this loophole via configuration, but I donā€™t want to, I like it. As a reader, I know that when Iā€™m looking at a heredoc, the whole thing is a string; even if part of itā€™s off screen, Iā€™m not missing much, itā€™s just more string.

If we wanted to disable the loophole, we might write that as:

Rails.logger.info <<~MSG.squish
  Lorem ipsum dolor sit amet,
  consectetur adipiscing elit,
  sed do eiusmod tempor incididunt
  ut labore et dolore magna aliqua.
  Ut enim ad minim veniam, quis
  nostrud exercitation ullamco
  laboris nisi ut aliquip ex ea
  commodo consequat. Duis aute
  irure dolor in reprehenderit in
  voluptate velit esse cillum dolore
  eu fugiat nulla pariatur. Excepteur
  sint occaecat cupidatat non proident,
  sunt in culpa qui officia deserunt
  mollit anim id est laborum.
MSG

That uses the String#squish method in Rails, which squishes a multi-line string onto one line. Is that better? Thatā€™s between you and your God. I can go either way.

One unexpected benefit of using heredocs

Imagine this code:

def my_great_query
  "select count(*) from users"
end

my_great_query # => "select count(*) from users"

When youā€™re editing that code in your text editor, your editor is using syntax highlighting to help you. Maybe itā€™s turning all of the keywords orange, or all of the method names blue. This can help your eyes to scan thru the code, and can help alert you to syntax errors. But that string on the second line is just a string, and it looks like all of the other string literals. Your editor does not know that it is a fragment of SQL, and that it can apply its SQL syntax highlighting to the contents of that string. How could it know that?

Well, imagine if you wrote it like this instead:

def my_great_query
  <<~SQL.chomp
    select count(*) from users
  SQL
end

my_great_query # => "select count(*) from users"

Now your editor has a context clue it can use, and perhaps it will elect to apply SQL highlighting to that string. VS Code, for one, does. I only use VS Code sometimes, but itā€™s things like this that give me a little pop of delight and make me want to make it more of a habit.

some of the quirks of using heredocs

One thing that really must be said before putting a bow on this blog post is that heredocs are kind of ā€¦ weird. Like, what if you want to call a method on a heredoc, like to reverse it? It kind of feels like you should put that .reverse all the way at the end, like you would for a normal string:

# this is invalid
def help
  <<-TEXT
    Help.
    I need somebody
  TEXT.reverse
end

help

Why is this invalid? Well, remember what I said at the beginning of this blog post

Ruby will look at the next line as the start of the string, and keep going until it sees that label again, and then the string is over

(Yes Iā€™m quoting this blog post in this blog post. Iā€™m pretty sure thatā€™s allowed.)

I could have been more clear there but I didnā€™t want to be so clear that it was confusing: the string ends when Ruby sees a line that has that label and nothing else. If it sees TEXT.reverse, that does not satisfy that rule.

So you need to write it like:

def help
  <<-TEXT.reverse
    Help.
    I need somebody
  TEXT
end

help # => "\nydobemos deen I    \n.pleH    "

One last quirk, via my colleague Ian. What if you want to start two heredocs on the same line? You probably shouldnā€™t, but it is possible:

def help
  [<<~TEXT, <<~SQL]
    Help.
    I need somebody.
  TEXT
    select * from lyrics
  SQL
end

help # => ["Help.\nI need somebody.\n", "select * from lyrics\n"]

Whoa.

sindresorhus/pure is such a good zsh prompt

February 2, 2021

Given how much time I spend in a terminal, typing things and hitting enter, I think itā€™s a good idea to keep the vibe in my shell nice. For the first like seven years of my coding career, I felt it was important that I design and maintain my own prompt. Thereā€™s evidence of this on my blog and in my dotfiles repo:

  • In December 2012, when I used this character Ļ” (???)
  • In June 2013, when I used a little Ruby script to make it print a random emoji each time
  • In June 2015, when I wrote a shell script to display some git information about the current repository
  • In June 2016, when I kept the random emoji, but rewrote the script in Rust
  • In December 2017, when I finally got rid of the emoji, because I was using Linux at work and couldnā€™t figure out how to display emoji in my terminal emulator
  • In January 2019, when I rewrote the git shell script in Rust, which I thought would make it faster, but actually made it slower, but by then I was too stubborn and just kept it

On some level, I felt like my shell prompt was an avenue for self expression. I took some pride in that. No offense if you donā€™t care about yours, itā€™s not a judgment thing. Iā€™m just trying to establish some stakes here.

I found myself annoyed by how long my prompt took to render, especially when working in large git repositories. I spent some time optimizing it. I disabled some of the functionality; for example, I updated the prompt to display my current git branch, but ripped out the ā€œdirty checkingā€ which changes the color of the branch when there are uncommitted changes. I missed that functionality and brought it back.

Eventually, just as an idea, I decided to see what was out there. I googled around a little bit, and found sindresorhus/pure, which bills itself as a ā€œPretty, minimal and fast ZSH promptā€. Thatā€™s basically what I want.

I installed it a few months ago, andā€¦ well, shit. Itā€™s very good.

Here are a few things that are great about it.

When your last command failed, the prompt turns red.

When your last command took a while, the prompt automatically displays how long it took. You donā€™t need to have the thought ā€œhm, that felt slow, was that slow? Should I re-run it with time?ā€

The prompt tells you when your branch is behind the remote, and you should might want to pull. That means it automatically fetches, so that it can know that. At first that seemed kind of crazy, that rendering my prompt would have side effects on my repository (ā€œHow dare you, prompt?ā€ was my gut reaction), but Iā€™ve come to really appreciate it. Itā€™s the best kind of automation, in that it becomes just one less thing I need to worry about. That requires building some trust, but it did.

It renders super fast because it does a lot of its work asynchronously, like checking the git status. It uses this script called mafredri/zsh-async to do that. The effect is pretty novel: the prompt renders right away, and then (sometimes) it changes a half second later. Itā€™s a lot like an asynchronous request in a website, which fetches data and displays it when itā€™s ready. I skimmed the readme of that repo and I have no idea how the hell it works, but I basically donā€™t care, Iā€™m happy to let it be some magic.

Thereā€™s only one thing that I miss from my days of customization. Before I used pure, my prompt looked like:

hardscrabble.github.io main*

All on one line. The first bit is the name of the folder. Then the name of the branch ā€“ printed in red, and with an asterisk, to indicate that there are uncommitted changes.

Imagine that you were at that prompt, and then you ran cd _posts. What should it display then? It would be pretty intuitive if it displayed this:

_posts main*

In my days of customization, though, my prompt would have displayed:

hardscrabble.github.io/_posts main*

The idea being that I wanted to know two pieces of information:

  1. what repo am I in?
  2. what path am I at, in that repo?

To achieve that, I needed to write some clumsy, but workable Rust.

By contrast, pure displays the absolute path to the working directory:

~/src/gh/hardscrabble/hardscrabble.github.io/_posts main*
āÆ

Which isā€¦fine.

In summary, be like me: get over yourself and use pure.

A little trick that makes using ripgrep in visual studio code nicer

January 24, 2021

Hello friends, happy new year. Iā€™m writing now to share a quick tech tip.

One of my most-used command line utilities is rg aka ripgrep, which I use to search thru a codebase and print out results. Using it looks like this:

$ rg 'class User\b' activemodel
activemodel/lib/active_model/secure_password.rb
42:      #   class User < ActiveRecord::Base
111:        #   class User < ActiveRecord::Base

activemodel/lib/active_model/serialization.rb
97:    #   class User

activemodel/lib/active_model/attribute_methods.rb
8:  #   class User < ActiveRecord::Base

activemodel/test/models/user.rb
3:class User

activemodel/test/cases/serialization_test.rb
7:  class User

(Thank you to rails/rails for being my model repo for this blog post).

This output is nice:

  • Very readable
  • When it prints in your terminal, it uses color to show you which part of the line matched your search
  • Itā€™s clear which matches go with which files, even when some files have multiple matches

We can contrast with the similar grep invocation:

$ grep --line-number --color=always --recursive 'class User\b' activemodel
activemodel/test/cases/serialization_test.rb:7:  class User
activemodel/test/models/user.rb:3:class User
activemodel/lib/active_model/serialization.rb:97:    #   class User
activemodel/lib/active_model/attribute_methods.rb:8:  #   class User < ActiveRecord::Base
activemodel/lib/active_model/secure_password.rb:42:      #   class User < ActiveRecord::Base
activemodel/lib/active_model/secure_password.rb:111:        #   class User < ActiveRecord::Base

A few UX things of note:

  1. you need to tell it to search recursively in the directory
  2. you need to opt in to color
  3. you need to opt in to line numbers
  4. the output is very compact which makes it well-suited for scripting but less pleasant for a human to scan through

Additionally: grep is not git-aware, so it will look at every file, even if it is listed in your .gitignore.

So, anyway, I tend to prefer using ripgrep.

My workflow is generally confined to a terminal, with vim and tmux being the key players. But not always. Sometimes I pop open Visual Studio Code, if Iā€™m doing something which will benefit from using the mouse a lot.

VS Code has a nice feature where you can run a terminal right inside the app, under your editor. Of course, VS Code has a nice code search feature built right in, but my muscle memory has me always opening a terminal and using ripgrep to search for something.

This is where things get interesting. VS Code also has a nice feature where you can āŒ˜-click in the terminal on a file path, and it will open that file path in a VS Code tab. That pairs really well with ripgrep: often Iā€™m searching the repo because I want to open up those files and make some tweaks. If that file path is formatted with the line number, like path/to/file.rb:45, then āŒ˜-clicking on it will open the file and jump to that line. If it looks like path/to/file.rb:45:17, it jumps to the line and column.

Thatā€™s very nice. But, sadly, does not work well with the default ripgrep output format, which has the line number on a separate line from the file path.

Now, ripgrep has a whole bunch of options for customizing its behavior and output. By using these options, I can make it print output in a format that works well with VS Codeā€™s āŒ˜-click feature:

$ rg --no-heading --column 'class User\b' activemodel
activemodel/lib/active_model/secure_password.rb:42:11:      #   class User < ActiveRecord::Base
activemodel/lib/active_model/secure_password.rb:111:13:        #   class User < ActiveRecord::Base
activemodel/lib/active_model/attribute_methods.rb:8:7:  #   class User < ActiveRecord::Base
activemodel/lib/active_model/serialization.rb:97:9:    #   class User
activemodel/test/models/user.rb:3:1:class User
activemodel/test/cases/serialization_test.rb:7:3:  class User

I decided that I would like rg to behave like this when I invoke it inside of a VS Code terminal, but otherwise print output in its normal way. I did not want to have to remember to use those flags. Iā€™ve learned that when a solution depends on me remembering to do something, itā€™s not going to be a successful solution.

I added this to my shell intialization:

if [[ "$TERM_PROGRAM" == 'vscode' ]]; then
  alias 'rg'='rg --smart-case --hidden --no-heading --column'
else
  alias 'rg'='rg --smart-case --hidden'
fi

Now I can use rg anywhere I want, and it behaves how I want. Nice.

Itā€™s still pretty compact and not that human-scannable. I think Iā€™d like it even better if the output looked like this:

activemodel/lib/active_model/secure_password.rb:42:11
#   class User < ActiveRecord::Base

activemodel/lib/active_model/secure_password.rb:111:13
#   class User < ActiveRecord::Base

activemodel/lib/active_model/attribute_methods.rb:8:7
#   class User < ActiveRecord::Base

activemodel/lib/active_model/serialization.rb:97:9
#   class User

activemodel/test/models/user.rb:3:1
class User

activemodel/test/cases/serialization_test.rb:7:3
class User

But I couldnā€™t figure out how to make it do that. Life is full of compromises.

Zoey's Extraordinary Playlist

December 19, 2020

I was indoors a lot this year, and I watched a lot of TV, and I think my favorite thing I watched was Zoeyā€™s Extraordinary Playlist, the NBC musical dramedy that aired from January to May this year. It has a kind of silly high concept that I imagine will immediately turn off a lot of people: Zoey, an introverted software engineer1 in San Francisco whoā€™s not particularly in touch with her own emotions or the ones of those around her, suddenly starts having visions of the people around her breaking out into elaborate song and dance numbers, and in the process she gains access to exactly the emotion theyā€™re experiencing in that moment.

Hm, okay. And itā€™s good? Yes, thank you for asking, let me tell you why.

When we meet Zoey (Jane Levy), sheā€™s bottled up. In the first episode, sheā€™s angling to transition from an individual contributor to a manager at her company. Her boss, Joan (Lauren Graham, very fun as an impatient, callous tech executive), asks her ā€œWhat makes you think you could be a good manager? Are you an effective communicator? Do you think you can get others to follow your lead? Are you comfortable being the bad guy?ā€

She answers with a joke: ā€œIā€™m not particularly comfortable with anything, thatā€™s why I became a coderā€. The joke doesnā€™t land with Joan.

Her father Mitch (Peter Gallagher) is slowly dying. He has some neurological thing that leaves him unable to move or speak. It came on quickly within the last year. Heā€™s still with them, but kind of not. Sheā€™s got this reservoir of feelings about it, a mix of grief about losing him, anxiety about whether sheā€™ll get it too, fear about the condition progressing, pressure to be present while she can even while continuing to live her own life, worrying about her mother (Mary Steenburgen), resenting herself and her brother for not being helpful enough, etc, etc etc. So she mostly buries it and just does her best, like a lot of us do.

She actually gets the powers while visiting the hospital for an MRI, to check if her brain shows signs of the same neurological condition. The MRI technician puts a playlist on shuffle for her called ā€œAwesome MRI Mixā€. The first song is ā€œItā€™s The End of the World As We Know It (And I feel Fine)ā€, which begins:

Thatā€™s great, it starts with an earthquake

Birds and snakes and aeroplanes

And Lenny Bruce is not afraid

Then thereā€™s an earthquake and, the show gently suggests, somehow the playlist and the MRI and the earthquake combine to modify her brain and grant her a music-related super power. Just go with it.

For Zoey, it does start with an earthquake, and it is the end of the world as she knows it, because now people sing to her. Thereā€™s no original songs. For the most part, itā€™s very mainstream pop and rock songs youā€™d hear on the radio. First itā€™s a lone middle-aged woman walking past her, singing ā€œall by myselfā€¦ donā€™t wanna be all by myselfā€.

ā€œThatā€™sā€¦ sad?ā€ Zoey says, confused by the plain expression of a feeling. The woman, who wasnā€™t actually singing, brushes her off and keeps walking.

Then, as Zoey keeps walking, the entire city of San Francisco breaks out in an ensemble performance of ā€œHelp!ā€ by The Beatles. A forlorn man with loosened tie stares her right in the eyes and says, ā€œHelpā€. As others join in ā€“ perfectly ordinary people in ordinary clothes with nice but unremarkable singing voices ā€“ Zoey runs from their outstretched hands like sheā€™s fleeing zombies. On the cable car, a young woman holding a baby carries on the tune, ā€œAnd now my life has changed in, oh, so many ways.ā€ A man picks up the next line, ā€œMy independence seems to vanish in the hazeā€ as his partner clings to his shoulder. Three strangers come together to tell her, ā€œEvery now and then I feel so insecureā€.

She has adult onset empathy, and itā€™s kind of a nightmare.

This show suggests, again and again, generously, that every single person you walk past has a rich interior life, a tender heart, whether they know how to express it or not.

I think itā€™s notable that the show suggests some scientific source of what is plainly a magical ability. It could have gone in a more religious direction, is what Iā€™m saying. Did God give her this power, so that she could learn to connect with othersā€™ emotions and learn to express her own? Well, that is what eventually happens, so sure, but the show really, to its credit, doesnā€™t care about investigating or explaining the origins of the power, itā€™s much more interested in staying grounded in the plane of human emotion and experience, and itā€™s struck on this device to examine those. So, it was the MRI machine with the earthquake and the playlist, what more do you need?

Later, Zoey will tell her neighbor Mo about whatā€™s happening: ā€œSome [are singing] to me, some to themselves, almost as if they were singing what they were thinking out loud, collectively, as a people. Does that make sense?ā€

Mo (in what is probably my favorite line of the first episode) replies, ā€œNo, but Iā€™m an open-minded person. Iā€™m willing to roll with this.ā€

Mo (Alex Newell) plays an important role in the series. On one level, heā€™s important because Zoey needs to confide in someone about whatā€™s going on so that we can have scenes where Zoey talks about what she thinks is happening and how she feels about it. But more importantly, Mo is someone farther along in the journey of self-knowledge and self-expression than Zoey. Heā€™s gender fluid, Black, dates men, sings beautifully (even outside of fantasy sequences), likes drugs, and has a hilariously extravagant home decor style. You would be forgiven for finding him much more interesting than Zoey and wondering why heā€™s not the main character. Heā€™s not just a symbol of the beauty of unbottled expression, as he does get a few turns in the spotlight that develop and round out who this character is, but heā€™s also that.

Zoey hasnā€™t just bottled up her own emotions, sheā€™s also basically oblivious about others. She takes them at face value. Sheā€™s so out of touch with her own interior life that she doesnā€™t understand that other people have an interior life, either. She has a crush on a guy at work, Simon (John Clarence Stewart), whoā€™s good looking and energetic, and sheā€™s shocked and confused when she overhears him singing a powerfully sad song. She later tells Mo, ā€œI almost felt embarrassed listening to it.ā€

I think that gets at it really well. The reason we live in an ironic, disconnected time is that we find emotion and sincerity embarrassing. Accepting that has done us great harm. When you boil it down to the simple moral ā€œemotions are good, actuallyā€, maybe it sounds like obvious stuff. Personally, I needed to be reminded.

Itā€™s embarrassing to look someone in the eyes and plaintively sing, ā€œI want you to want meā€. People donā€™t talk like that in real life, as they do in pop music, but why donā€™t we?

By gaining access to the pure, sincere, unfiltered emotional inner lives of others, Zoeyā€™s walls start to erode. She starts to feel their feelings, and her own start to come out in the pull of the tide.

Thereā€™s a scene in the first episode where Maggie, Zoeyā€™s mother, talks about the drug regimen that Mitch is on. She confesses that sheā€™s tried his drugs: ā€œ[Iā€™ve tried] some of them. I just ā€“ I wanted to feel what your dad was feeling. Thatā€™s all.ā€

That line stands out to me now, as I reflect on this theme of empathy. Medically, itā€™s probably irresponsible, but itā€™s emotionally valiant.

Peter Gallagherā€™s performance is magnetic. Heā€™s a great actor, and he spends the vast majority of his time on screen sitting stock still on a couch, with a blank expression. Heā€™s amazing. At all times, you feel the seriousness of his condition, but you also feel that thereā€™s someone in there. Itā€™s a serious feat.

Thereā€™s some obvious symbolism here: Zoey is walled off psychologically, and heā€™s walled off physically. She wants so badly for him to be able to express something, anything. She also needs, badly to learn how to express herself. Both seem impossible at the start of the show, but both eventually happen. This show has deep streaks of despair running through it, but itā€™s ultimately hopeful. It suggests that there are ways forward. Allow your heart to be nourished by Zoeyā€™s Extraordinary Playlist.

Itā€™s not all emotions and morals, itā€™s also teeming with the exuberance of pop. Itā€™s fun when people sing and dance. The cast is dotted with a few ringers from Broadway like Skylar Astin and Andrew Leeds, and others swing by in guest roles like Bernadette Peters and RenĆ©e Elise Goldsberry. The choreography (from Mandy Moore, who worked on La La Land) is fantastic, always entertaining and often moving.

Jane Levy anchors the whole thing with a lot of emotion and neurotic energy. Perhaps because the protoganist is a software engineer, she spends a lot of time trying to figure out how her new ability ā€œworksā€, and the show has a lot of fun probing its boundaries, stretching the premise out like taffy, and hanging a lantern on the conceptual silliness while always respecting the emotional performances that are made possible by the silly concept.

This was obviously a weird, hard year. This show aired from January through May, a period of time when the world was coming to terms with a new reality, while feeling disconnected. Watching Zoey come to terms with her own situation and learning to connect gave me a lot of comfort. The first season felt like a complete story to me, but Iā€™m nevertheless very excited to see where they go with it when it comes back in January.

But again, most of all, itā€™s fun when people sing and dance!!

  1. Side note: a weird number of shows that I watched this year were about tech companies, and the software engineers that work at them. Was this me missing working in an office?? I watched this, DEVS (Hulu ā€“ hypnotic), Halt and Catch Fire (AMC ā€“ series rewatch of an all-time fav), Mythic Quest: Ravenā€™s Banquet (Apple TV+ ā€“ very funny), and Start-Up (Netflix ā€“ very charming).Ā 

Hardscrabble #1

July 12, 2020

Note: this was originally posted on a Substack newsletter that I abandoned after two issues. Hereā€™s the first one, converted to a regular blog post.

Hey! Welcome to the first issue of the Hardscrabble newsletter. Iā€™m Max Jacobson, a software engineer and writer from New York, filing this correspondence from Cape Cod, where Iā€™m visiting with my parents for a few weeks. A small amount of context: ā€œHardscrabbleā€ is the name of my blog that Iā€™ve kept over the last seven years as Iā€™ve gotten my feet under me in tech. Before that, it was the name of a science fiction screenplay I wrote in college. Before that it was a road sign I drove past.

Each week, the newsletter will come in 3-4 segments: a story from my life, a workplace observation, a cultural recommendation, and some hyperlinks.

A story from my life

July 3, 2am. If youā€™d asked me, I would have told you I was trying to fall asleep, but if youā€™d observed me, youā€™dā€™ve seen that I was browsing TikTok. I had lowered the screen brightness to an emberā€™s glow, which I felt made it Good Enough Sleep Hygiene. I had a slight fever and chills and I was watching young people dancing to the same twenty second snippets of the same three songs.

(Iā€™m 31 and I havenā€™t fully come to terms with not being plugged into Whatā€™s Going On Culturally, so I downloaded the young people app. I only follow people I read NYT profiles about, which I assume is also how the youths use the application. So thatā€™s Charli Dā€™Amelio (charming), Melissa Ong (hysterical), and Sarah Cooper (brilliant) and Iā€™m now an expert on TikTok).

When you open the app, you land on the For You Page, which is a feed of algorithmically recommended posts. Thereā€™s no dates on them. They could be from whenever. Itā€™s meant to be uncanny. When I open it right now, the first post is from a software engineer making jokes about what itā€™s like working as a software engineer, and itā€™s funny, and I just tapped through and watched all of her videos. OK, so itā€™s uncanny.

That night, the second or third video I scrolled past was of a young woman named Claira Janover introducing herself ā€œfor the non-existent number of people who want to get to know meā€. In the video, among other things, she shares that her worst quality is that sheā€™s insecure.

I paused. Why is the algorithm showing me this?

I think itā€™s important to do the work of self-discovery, and the healthy version of that probably involves things like therapy, journaling, and meditation. Which, sure, I do those things. But, I canā€™t help but wonder: Can TikTokā€™s algorithm tell me something new about myself?

I tapped through to her profile. It turned out the post Iā€™d seen was from a few weeks earlier, but sheā€™d posted several times more recently. To my alarm, her most recent posts were all close up videos of her, tears streaking down her face, explaining that she was, in that moment, being harassed by an online, right wing mob, who had singled her out for a video she posted critiquing the phrase ā€œall lives matterā€. Itā€™s a funny video that makes a good point, but it was being willfully misunderstood as a threat of violence, and that was enough to make her name into a trending hashtag, get her doxxed, and get her job offer rescinded.

As I soaked up this context, I got madder, and curiouser, and farther away from slumber. I switched over from TikTok to Twitter and pulled up the hashtag, which, indeed, was chock full of jackasses and creeps harassing this well-meaning, righteous 22 year old. I saw some valiant youth rallying to her defense, lobbing counterarguments back at the sock puppet accounts, patiently explaining the satirical point Janoverā€™s video was making.

Before my interest could wane, I noticed that one of the accounts tweeting with the #ClairaJanover hashtag had a profile photo that looked familiar. It was a man with a mustache sitting at the wheel of a boat, clad in plaid, looking over his shoulder to the camera with a goony smile that seemed to say, ā€œOh hey, I didnā€™t see you there. Iā€™m just driving my boat.ā€ It looked familiar because it was a photo of me, from the one time my dad let me drive his boat, when I felt super cool and posed for several photos.

At first I thought it was a glitch, and Twitter was just showing my own profile photo in place of other peopleā€™s. I can imagine how that kind of bug would slip in. And, I thought, thatā€™s my current profile photo, so thatā€™s what it is. I flipped over to my profile to double check. Yeah, there I am, on the boat, behind the wheel, looking straight ahead, my tongue sticking out a little as I concentrate on driving the boat. Wait no, thatā€™s a totally different photo from that day!

I tapped thru to his profile. His name was ā€œArtie Jā€. His bio was ā€œAdventurer, cook, dad.ā€ His photo was my photo. (Do I look like an adventuresome dad? Iā€™ll have to sit with that at some pointā€¦) Every one of his recent tweets was a reply to someone talking about Janover. If they were defending her, he would argue with them. If they were critical of her, he would agree with them. He applauded Deloitteā€™s decision to rescind her job offer. He crowed, ā€œall lives matterā€. He spoke about her personal biography in a way that struck me as invasive, sharing details and photos of her family. He had my face.

Screenshot of the Artie tweet

I decided to report the account to Twitter. I reported that he was impersonating me. I had to provide a photo of my driverā€™s license, so I got out of bed to snap a photo. ā€œImpersonationā€ wasnā€™t exactly right, but it was close enough. It seemed like a clear-cut example of a troll account, possibly operated by a professional in an agency like the one described in Adrian Chenā€™s brilliant 2015 story about Russiaā€™s Internet Research Agency. I was aware of this phenomenon, and its potential to increase conflict and division online in ways that can spill out past the four corners of our screens, but I had always just ignored it: as a policy, I donā€™t argue with people online, I just post photos of trees and oddball thoughts that cross my mind; it doesnā€™t affect me.

Butā€¦ thatā€™sā€¦ myā€¦ face. I eagerly awaited Twitterā€™s reply. I slept for 11 hours two nights in a row. My fever went away. My sore throat went away. Phew. I kept pulling up Artieā€™s account, every few hours, expecting to see the account suspended, and instead watched him willfully antagonizing people. With my face.

Screenshot of another Artie tweet

What are the odds that I would organically stumble across a troll account with my own face? It felt like, if my face is on one troll account, itā€™s on two. I felt sick, but, like, because of the unsettling situation now.

Twitter got back to me saying the account didnā€™t violate any of their rules:

After a review, we didnā€™t find a clear violation that would make it necessary to remove the image you reported.

If you see content in a Tweet that might be considered sensitive, you can flag it for review directly from the Tweet. After a review, sensitive content will require people to click through a warning message before the media is displayed if itā€™s considered sensitive.

We appreciate you reporting this to us, and hope if you see potential violations in the future, youā€™ll let us know.

Can you take a minute to rate your experience and complete a short survey?

Sigh. I filled out the survey, saying I kind of felt like they hadnā€™t even understood the issue I had reported?

I tried to forget all about it. We watched Hamilton, which draws a contrast between one character who acts boldly, and one character who waits and waits and waits and never acts or commits to a point of view. Shamefully, I found myself relating to the latter character. I decided, during Wait For It, that I wouldnā€™t wait for Twitter to save me or for the episode to slip my mind. For the first time in a very, very long time, I decided to get in an argument on the internet.

I found a thread where Artie was arguing with Janover defenders, and I replied all:

ā€œArtieā€ if you insist on sliding into the mentions of well-meaning young people to spout ignorant, racist takes, please use your own face. Mine is taken.

And then I went back to watching the musical, and then I went to sleep.

Truthfully, I was a bit afraid. Afraid to speak bluntly. Afraid I was being a dork. Afraid trolls would descend on me next. Afraid to make something about me that really wasnā€™t about me.

But in the morning, everything was fine. Artie had sputtered a few protestations about how he wasnā€™t racist, or a troll, but he had changed his photo to a cartoon, and he had fessed up:

Your photo was a happy one, and I used it, but geez, if I had knownā€¦ Have a good day Max.

I felt more relieved than I expected to.

So, anyway, in conclusion: the TikTok algorithm, which provided me with a days-long emotional rollercoaster, is truly uncanny. And Gen Z, which seems to be a bunch of ultra-genuine try-hards, is going to save us all.

A workplace observation

When you merge a pull request on GitHub, you can choose from three options: ā€œMerge pull requestā€; ā€œRebase and mergeā€; and ā€œSquash and mergeā€. I donā€™t like any of these. The missing choice I would prefer: ā€œFast forward mergeā€, which would make it possible to do a git merge --ff-only via the web. With a fast forward merge, your new commits would merge from the feature branch into the main branch much like ā€œrebase and mergeā€, but theyā€™d have the exact same commit SHAs that they had before. And unlike ā€œMerge pull requestā€, there would be no need for a gross merge commit. There would be no need to run the tests again, because the commits would retain their commit statuses. If the commits were GPG-signed, they would retain their signatures. Doesnā€™t that sound nice?

A cultural recommendation

Last yearā€™s comedy special John Mulaney & The Sack Lunch Bunch (on Netflix) was so funny and I laughed so much that it made me realize that most comedies I watch arenā€™t actually that funny. This week, following the happy news that theyā€™re making two more Sack Lunch Bunch specials, I rewatched a handful of the musical numbers, such as the pitch perfect Grandmaā€™s Boyfriend Paul:

  • My friend Vaidehi Joshi is launching a newsletter imminently, which I canā€™t wait to read. Vaidehiā€™s one of the most thoughtful software engineers and prolific writers I know, on topics like distributed systems and green tech, and her announcement is what inspired me to spend some time putting this together this weekend.
  • My friend Thomas Countz, a software engineer and advocate for privacy-focused tech, launched a tech newsletter called The Pseudocode a few months ago. I contributed a piece for the first issue, in which I reflected on what ā€œSenior Engineerā€ means to me. I hope more issues follow.
  • The idea to include a few recurring segments is inspired directly by Hmm Weekly, a newsletter that Iā€™m perennially six months behind on, and will eventually catch up with only if they stop making them. For a few months, they published ā€œNineteen Folktales: A Seriesā€, one per week, and I gobbled them up, and have returned to one in particular, ā€œThe Discontented Butterflyā€, every few months since reading it. I donā€™t know if thereā€™s any way for you, now, to go read it, but itā€™s in my email archives (not to gloat).
  • Another inspiration: The Studio Neat Gazette, a brief weekly update from a neat little company in Texas that makes things like Mark One, a very nice pen that I love to write with. Each week the two cofounders just share something they like, and I always enjoy reading it.
  • I got a major kick out of learning about the comedian Ziwe Fumodohā€™s interview show, which she publishes on her Instagram Live. I imagine a lot of comedians are struggling with how to make jokes during the George Floyd protests, and sheā€™s found a way in by mercilessly exploiting the tension that arises from the fear of saying the wrong thing. Definitely turn on notifications for when she goes live.
  • The best thing I read this week was this twitter thread from Ayesha Siddiqi, a writer Iā€™ve learned so much from in the last decade, on the phrase ā€œcancel cultureā€, and what it obscures about the real power dynamics that really exist in the real world.

The Broom

April 19, 2020

Note: this was originally published on Thomas Countzā€™s newsletter Pseudocode, but Iā€™ve copied it here after that website seems to be no longer up. I copied this from the internet archive in September of 2023.

Hi there, Iā€™m Max Jacobson. Iā€™m a senior software engineer at Vimeo, working on Vimeo OTT, a platform where anyone can launch their own paid video subscription service. Thomas asked me to share a bit about my role. In my opinion, being a ā€œsenior software engineerā€ means something different everywhere you go, and often means something different within the same company. Hereā€™s a bit about what it means to me.

In February, the OTT engineering department went to the LeFrak Center in Prospect Park for a team outing (this was back when people went outside). We went curling. You know, like this thing: šŸ„Œ. We split off into teams, learned the rules, learned the basic technique, learned the terminology (itā€™s good to have ā€œthe hammerā€), and played a few ā€œendsā€. Everyone got to try out the various roles: lead, second, vice-skip, and skip.

In the moment, my top priority was to not fall on my ass. In the weeks since, as my team has worked tightly together on a big project, Iā€™m struck by what a good choice of activity it was to illustrate the various ways individuals can contribute to a team. As a senior engineer, sometimes youā€™re the skip: taking a step back to assess the state of things and offering direction for your teammates. Other times youā€™ve got the broom, and youā€™re sweeping furiously at the ice to smooth the glide path for the stone your teammate is throwing. Once in a while, youā€™ll throw the stone yourself.

Making software is hard, especially when youā€™re new. As a senior engineer, you do what you can to make it easier. That can mean all kinds of things: research, plan-making, pairing, answering questions, code review, documenting, white boarding, whatever it takes. Often, the way to have the biggest impact is to sweep the ice and get out of the way.

Some nerds on ice trying to curl Me preparing to throw a stone

Being Austin Powers in the workplace

March 26, 2020

I struggle with pop culture references. When I donā€™t get them, I feel uncultured. When I do get them, sometimes I pretend I didnā€™t get them, so I donā€™t need to acknowledge that, for example, Iā€™ve seen all of the movies in the Marvel Cinematic Universe. Other times theyā€™re just not funny and if you say you didnā€™t get the reference, thatā€™s a polite reason that youā€™re not laughing.

So anyway, Iā€™d like to make a pop culture reference. I really never do this. Thereā€™s that saying that ā€œsarcasm is the lowest form of witā€. I agree with the sentiment: sarcasm is also bad, but for me it places at least above:

  1. pop culture references
  2. photos of signs

But one must sometimes stoop.

Thereā€™s that scene in Austin Powers: The Spy Who Shagged Me (1999) when the title character (Austin Powers) participates in a photo shoot. He breezes in, barks orders at the models and crew, snaps a bunch of photos, and the very moment heā€™s bored, he says, ā€œAnd Iā€™m spentā€, and hands off the camera. He doesnā€™t even look. He just holds it over his shoulder, and an assistant hurries forward to take it.

I think about this thirty second scene all the time. I hadnā€™t actually seen it in twenty years, but itā€™s never really left me. Like all great art, it shows us something true: a confident attitude lets you get away with a lot.

That attitude! In my memory, he tosses the camera over his shoulder, knowing someone would catch it.

Sometimes in the workplace, I feel like Austin. Itā€™s not entirely intentional. Whenever groups of people come together, power dynamics emerge. Iā€™ve been on teams where everyone is so nice. We all glance around to one anotherā€™s eyes, saying things like, ā€œNo, you go firstā€ and ā€œIf that even makes senseā€ and ā€œI could be totally wrongā€ and ā€œI donā€™t want to step on anyoneā€™s toesā€. I respect the impulse here, and itā€™s not that I love to step on toes, but when collective politeness gels into collective inaction, thatā€™s a problem. When that happens, someone is going to do something about it. And Iā€™ve often decided that it should be me, because Iā€™m nice, and Iā€™ll do a good job. Itā€™s probably the case that most dictators also think theyā€™re helping.

Iā€™m definitely the guy in the meeting who says things like, ā€œI think we all agree that we want to do X, for reasons A, B, and C. Some of us think we should approach it this way, but there are some reservations that havenā€™t been fully addressed. Is that right? Can we explore those some more?ā€ Just a little recap, a little bridge building, a little supporting of the points being made, and a nudge toward a resolution. Iā€™m 100% doing my best effort to channel Brian Lehrer, the fantastic radio host who speaks every weekday with journalists and experts in various fields, asking questions that get exactly to the heart of what matters. He also takes calls from New Yorkers, often scatter-minded and emotional, and he helps them tell their story. He rarely offers his own opinions (this morning he offered a gentle defense of the lima bean), but he drives the conversation exactly where he wants it to go.

Social psychologists talk about the fundamental attribution error. This is the one that Carlin was talking about here:

We have privileged access to our own minds, so itā€™s often possible to feel like we know why weā€™re doing the things weā€™re doing, and itā€™s in our self-interest to justify our own actions, so thatā€™s what we do.

Sometimes in a workplace, someone will toss the camera over their shoulder to someone else. They did the fun part, and they got bored, and they want someone else to finish it up. That way, they can go do something else thatā€™s fun. Sometimes we call this delegating, and itā€™s a good thing, because itā€™s giving an opportunity to someone that wants it. Sometimes it kind of sucks for that person. I think itā€™s not always easy to tell which one it is when youā€™re the one tossing the camera. But you do your best.

One last pop culture reference for today. This is related.

Over the last few years, Iā€™ve gotten really into The Mountain Goats, a wonderful and prolific band that has been putting out wonderful records every one to three years for the last twenty-five years. Their most recent album, In League with Dragons (2019) is characteristically wonderful. I particularly like Clemency for the Wizard King, Waylon Jennings Live!, and the final song on the album: Sicilian Crest. That last one has stuck with me. I hate to talk about Trump on my blog, but itā€™s about this moment when right wing ā€œstrong manā€ leaders have emerged here in the states, and in Brazil, and in Hungary, and in Russia. Perversely, it tries to explore and explain their appeal by celebrating it. It suggests that, when things are bad, and the people are scared, weā€™re particularly vulnerable and that vulnerability can be very easily exploited by someone who promises to protect us. Like with Austin Powers, weā€™ll let them get away with anything.

I didnā€™t really get that from the text, I got it mostly from this podcast interview about the song, in which he describes the song as ā€œquasi-fascistā€.

I recommend that podcast very highly, even if you donā€™t like The Mountain Goats, although I suspect you already do or youā€™re about to.

Is it perhaps also the case that weā€™re drawn to Strong Man, Austin Powers types in the workplace? I think itā€™s true that most CEOs arenā€™t just men, but tall men. Even though, you know, thatā€™s very stupid.

(Of course, Austin Powers is hanging a lantern on the absurdity of these men by placing a gnomish weirdo with a bad accent in that position, and thatā€™s why it was great political art as well.)

Look to the West

Look to the man

Bearing the Sicilian crest

Despite my not wanting to celebrate such men, when I saw them play this song live, and I was singing along, Look to the man, I started to believe it. And when they drew the outro out practically indefinitely, letting the piano notes cascade over me in wave after wave, I never wanted it to end.

And Iā€™m spent.

Are my blog posts getting longer?

March 25, 2020

Earlier, I was chatting with a coworker about blogging and speculated that my blog posts have gotten longer over time. Tonight, I thought Iā€™d check if that was true, so I wrote a little script:

$ ruby app.rb
Avg word count by year
2011    1133.0
2012    554.57
2013    639.44
2014    676.81
2015    491.5
2016    1155.29
2017    1573.86
2018    816.0
2019    1125.0
2020    3757.0

ā–‚ā–ā–ā–ā–ā–‚ā–ƒā–ā–‚ā–ˆ

Well, not as clean a trend as I thought. Interesting.

Hereā€™s the quick-and-dirty script which should work for any Jekyll blog:

Dir.glob("./_posts/*.md").each_with_object({}) do |path, obj|
  path.match(%r{^./_posts/(\d{4})})[1].to_i.tap do |year|
    obj[year] ||= []
    obj[year] << File.read(path).split(/\s+/).count
  end
end.
  sort_by(&:first).tap do |word_counts_by_year|
    puts "Avg word count by year"

    word_counts_by_year.map do |year, counts|
      [year, (counts.sum / counts.length.to_f).round(2)]
    end.map do |year, avg|
      puts "#{year}\t#{avg}"

      avg
    end.tap do |avgs|
      puts
      # https://github.com/holman/spark
      system *avgs.map(&:to_s).unshift("spark")
    end
  end

As a fun little exercise, I tried writing without using any local variables. Not to sublog a former coworker, but I did work with someone who I never saw use a local variable. He never mentioned it, and I never asked. Sound off in the comments if you think this is a fun style.

(I donā€™t have comments but do take care).

The chef and food writer J. Kenji LĆ³pez-Alt makes fantastic cooking videos with names like ā€œLate night dan dan noodlesā€ in which he quietly whips himself up a midnight snack without overthinking it too much.

Iā€™ll call this: late night code.

Get a shredder

March 25, 2020

the byproduct of my shredder

Times are weird with the coronavirus, but thereā€™s something you can do that will help you feel more control of your life: get a shredder, and shred your junk mail.

Hereā€™s the one I got: https://www.amazon.com/gp/product/B00YFTHJ9C. Itā€™s completely fine.

Hereā€™s how it works: credit card companies insist on asking you to get a new credit card. Youā€™re asking me this now? Discover Card, youā€™ve asked me this every few months for my entire adult life. Discover this: my shredder.

Hi, The Greater Boston Food Bank. I completely support your cause, and what youā€™re doing is more important now than probably ever, and itā€™s true that I donated to you once, because I went to a wedding in Cambridge where the couple asked us to donate to you rather than get a gift, but I kind of think youā€™ve spent a good chunk of the money I gave you on postage and pamphlets at this point, and now Iā€™ve let you sit on my desk for two months out of some kind of guilt? Iā€™m so sorry, but you know what else is hungry is my shredder. No, thatā€™s bad. Iā€™m leaving the awful joke in and making one more donation. Your long game worked.

Receipts? Why not give them a quick shred?

Flyer from the local dentist? Itā€™s gone now.

Amy Klobuchar postcard from early in the campaign when I was keeping my options open? Itā€™s time for you to come off the fridge and go into the shredder.

When I made the purchase, I was thinking it would be mainly for shredding sensitive documents, and I very occasionally use it for that. But I didnā€™t know I would find it so therapeutic to just make things go away. This is perhaps gruesome, but every time I use it, I think of that one scene in Fargo where theyā€™re putting a person in a woodchipper. I donā€™t find that therapeutic (donā€™t worry, this isnā€™t my confession that Iā€™m a psychopath) but itā€™s very nice to justā€¦ make ā€¦ problems ā€¦ disappear.

Not even disappear, exactly, but make problems into confetti.

Get a shredder.

proof I'm not a monster