Seven weeks in to our lockdown, my social sphere seems to be talking less-and-less about a “return to normalcy” (at the same time as several US states are, prematurely, beginning to attempt a “reopening”).

It does feel like we’re past the point where “it’s going to get worse before it gets better”. Italy has announced a timeline for easing lockdown measures, and New York Governor Andrew Cuomo has hinted that there might be a similar announcement on the horizon.

“There is no doubt that, at this point, we’ve gone through the worst,” [Cuomo] told reporters in Albany. “And as long as we act prudently going forward, the worst should be over.”

I’ve given up on guessing when the Washington lockdown will end. In any event, it’s not looking good for reopening indoor crowded spaces. By extension, offices – especially “open offices” – are probably going to be a no-go for a long time.

At work, I’ve heard rumblings of facilities teams starting to plan out what reopening offices would look like. Maybe people would only come in on certain days of the week? I get the sense I’ll be in this WFH pattern for the upcoming ~months.

One concern that I hadn’t given a lot of thought to, as raised on a recent episode of Do By Friday, is that even when restaurants can reopen, many won’t generate enough revenue to stay in business. As I understand it, most non-chain restaurants operate on super thin operating margins, which rely on being able to pack their space with as many customers as possible – this, of course, will not be realistic with mandates for social distancing. Beyond restaurants, this type of realization highlighted to me that “normalcy” is still a long way away, and the effects of the pandemic and ensuing lockdown will be, to many, unexpected and irreversible.

In the end, we’re still in a holding pattern for… some indeterminate period of time. I’m glad that we’re past the worst of the first wave of COVID-19 cases.

Cooking

True to what I committed to last week, I didn’t make any bread this week. Instead I’ve been going through the extra bread that I froze – and it tastes surprisingly good! I didn’t expect bread to freeze and reheat so well, but it tastes about as good as the day after I baked it.

I also tried this recipe for Shakshuka. It turned out quite well! I think one of the key tricks is to use good quality canned tomatoes. I usually use diced canned tomatoes, which tend to be kinda acidic. For this recipe, I used a big can of whole peeled tomatoes – not San Marzanos, because our store didn’t have them, but the highest quality whole tomatoes I could find – and it made a notable difference.

Clojure

I continued learning Clojure this week using the “Brave Clojure” book. I’m just barely past the “hello world” and basic control flow stage of learning the language, but I continue to be intrigued.

I’ve found that the Haskell I learned last year has been helping a bunch in learning Clojure. Clojure feels a bit like “Haskell-lite” – you get similar immutable-by-default semantics, and the way functions are applied feels similar. But, Clojure has a much looser type system. This is nice in a way, because you can hack on things faster without worrying about satisfying a type checker, but you lose the “if it compiles, it’s probably correct” property of Haskell.

This one sentence popped out to me from the chapter on Functional Programming:

In OOP, one of the main purposes of classes is to protect against unwanted modification of private data — something that isn’t necessary with immutable data structures. (Source)

It’s a fairly obvious observation about OOP vs. FP, but for some reason I never really internalized that in FP, the concept of property visibility is less important because everything is immutable. Of course, property visibility can still be useful for providing simpler interfaces / APIs, but in FP visibility isn’t needed for “safety”.

One nit that I’ve had with Clojure is that the Lein REPL doesn’t handle Ctrl-C gracefully. It either (1) doesn’t interrupt execution or (2) exits the REPL. Apparently this is a long-standing known issue, which is disappointing.

For posterity, I setup a repository for my solutions to the books exercises.

Media

I’ve been slowly watching through the latest season of Westworld. [No content spoilers, but general opinions ahead] I thought the beginning of the season was… not great. There are aspects of the show (its entirety, not just this season) that are legitimately thought provoking, but it’s also interspersed with a bunch of head fakes and “I’m 14 and this is deep”-esque pseudointellectual nonsense. The first few episodes of this season were particularly eyeroll-inducing. However, now that I’m about 4-5 episodes in, there have been a couple interesting developments that have kept me interested enough to continue. Also, Aaron Paul is now a major character of the show? So, that’s cool.

In books, I’ve been reading Olivia Butler’s Wild Seed for a (remote) book club. It’s an interesting novel, but probably not one I’d read on my own. The world-building is excellent, as is the portrayal of inter-character relationships. Though, it’s a bit of an emotionally rough read. As someone in my book club commented, “It seems like the main themes of this book are slavery and gas-lighting”.

Finally, this week I started listening to Edward Snowden’s memoir, Permanent Record. So far, it’s mostly been about Snowden’s upbringing as part of a family dedicated to military and civil service. He does a good job explaining the experience of growing up in the Capital Beltway, and the ways that civil service changed because of 9/11.

This week’s links are more programmer-y than past weeks, but that was the mental space I was in.

  • Someone posted this amazing Rust test suite on Twitter. I think the purpose of this is to stress test the Rust compiler with a bunch of bizarre, but technically valid, expressions. Among the test functions are evil_lincoln, zombiejesus, and my favorite punch_card:
fn punch_card() -> impl std::fmt::Debug {
    ..=..=.. ..    .. .. .. ..    .. .. .. ..    .. ..=.. ..
    ..=.. ..=..    .. .. .. ..    .. .. .. ..    ..=..=..=..
    ..=.. ..=..    ..=.. ..=..    .. ..=..=..    .. ..=.. ..
    ..=..=.. ..    ..=.. ..=..    ..=.. .. ..    .. ..=.. ..
    ..=.. ..=..    ..=.. ..=..    .. ..=.. ..    .. ..=.. ..
    ..=.. ..=..    ..=.. ..=..    .. .. ..=..    .. ..=.. ..
    ..=.. ..=..    .. ..=..=..    ..=..=.. ..    .. ..=.. ..
}
  • I saw this tweet by Aaron VonderHaar scroll by, and decided to tune into a bit of his programming stream on Twitch, where he’s building a recipe app using Elm. It’s a fun watch! (Though, it’s several hours long, so I mostly skimmed it…) Elm has been in my periphery for a while now; it seems like a good candidate to do a side project with.
  • In a similar vein, I enjoyed Tom MacWright’s review of the Elm language and associated review of the Dark language that he wrote regarding a recent project of his. I’d never heard of Dark before, and it looks like it’s still in a private beta, but it has some interesting public documentation that I enjoyed reading through.

    Dark is a language and framework for building web backends: REST API endpoints, asynchronous background workers, scheduled jobs, and persistent storage. Dark’s framework is tightly coupled to the infrastructure, and as you write code you’re able to develop from real incoming requests/traces.

  • I stumbled upon the “bald and bankrupt” Youtube channel, which features an British guy traveling through various parts of Russia and Eastern Europe. It reminded me of my experience of traveling in Slovakia (right down to my overenthusiasm over Soviet-era artifacts and architecture) and was a fun bit of vicarious travel while being locked down. His video titles are quite clickbait-y, but I enjoyed the content. (Update: I’ve since watched more videos from this channel. Some of the commentary is… not super PC, so be warned.)