John’s Blog

My personal journal and blog. Subscribe via RSS


March 13, 2020

An Interview with Matt Mullenweg About Working From Home

Ben Thompson interviews Matt Mullenweg about Automattic's distributed workforce. Ben and Matt are two of my favorite people on the web, so it's delightful to hear them discuss this topic. The interview is behind Ben's subscription paywall, so if you're not already subscribed, you should!

Mullenweg:

People are surprised when I say this, but I think in-person is really key. And so we just flip it, so instead of saying you have to be an around your colleagues 48 weeks of the year and do whatever you want for a month, we say be wherever you want for 48 weeks out of the year and for three or four weeks a year we're going to bring you together. And that might be once a year for the whole company, and then your individual team, which is probably five to 15 people, you'll see them two or three times a year and you can build that trust. There's nothing, no technology, VR or otherwise, that has the same effect of breaking bread across the table or sharing a drink with someone, for building trust, for building communication, for getting to know someone.

Working remotely in a distributed company shouldn’t replace all face-to-face communication and interaction. It’s just not the default.

And, later:

I think that when you become a truly distributed company versus just trying to recreate your meetings and everything else you do online, you start to realize how much more valuable it is to move things to be asynchronous versus synchronous because that opens up a ton of flexibility, autonomy, and agency between all of your colleagues.

Bingo. Synchronous communication (where everyone must stop and do something at the same time) is my number one productivity killer.

March 12, 2020

Om Malik's Coronavirus Live Blog

Great list of resources and updates on Om Malik's blog, in a 'live blog' style approach.

Like everyone else, I have become anxious about the Coronavirus Pandemic. It is hard to discern the actual impact, especially since social media is conflating facts with fiction. I have begun keeping a document that is full of links to articles, research, commentary, and videos that come from experts — scientists, immunologists, viral disease researchers, and sources that could only be said to be biased toward logic and caution. In other words, I am paying very little attention to the self-proclaimed experts who are investors, car company chiefs, or anyone else who thought Corona was just a beer till about a month ago.
Instead of keeping it on Google Docs, I have decided to share it here on the blog, and I will be continuously updating it with new links. I am no expert, but I have a pretty good sense of who to ignore and when to pay attention.

March 12, 2020

Links: Coronavirus and Working from Home

It’s been a busy week for remote working fans and first-timers with all of the safety measures being put in place for COVID-19. Here are some of the better links I’ve found recently:

More to come, I’m sure!

Update March 13, 2020:

Coronavirus and working from home – a primer to get your team started
"If your work happens in front of a computer, it can happen remotely. Yes, face-to-face interaction is the best way to transmit complex ideas, details of the tasks, hilarious jokes, and deadly viruses."

Kevin Roose: Sorry, but Working From Home Is Overrated
I think he’s missing the point here. Working from home shouldn’t (and doesn’t) mean working in isolation. Communication, breaks, and personal health should be focused on whether working in an office or remote!

March 5, 2020

Tot

I’m really enjoying Tot, a new utility from The Iconfactory. It's a simple little window with a few scratch pads for text, organized by color. Tot appears to be a very basic app on the surface but features an exceptional level of design quality and attention to detail. Interesting pricing model too: free on the Mac, $20 on iOS. During the week I have about a million little text windows open with all sorts of scratch information. On iOS I've struggled to find a similar solution for these quick notes and pieces of text. I don't need to keep them forever, sometimes just a few minutes, so it's nice to have a little scratchpad that syncs. Tot also uses a small subset of Markdown, which is really handy for basic formatting. Even better: the library for handling Markdown was open sourced on Github. Worth the $20 price alone just to fund this library's development.

February 21, 2020

Tally

Last week I open sourced a new Ruby library called Tally. Tally was created over the past few years as a part of a number of products I’ve worked on and I’ve always wanted to open it up to the public for anyone else to use as they see fit. It's a bit techy, so it doesn't feel right here in the journal, but I posted a bit about it here, in case you're curious.

February 21, 2020

Introducing Tally

Last week I open sourced a new RubyGem called Tally. Tally was created over the past few years as a part of a number of products I’ve worked on and I’ve always wanted to open it up to the public for anyone else to use as they see fit.

Tally is a quick utility for collecting counters and stats throughout a Rails application. Technically I suppose it could be used outside of Rails in a standard Ruby app, but that’s not my use-case so I haven’t spent any time optimizing it for that.

Tally sits on top of Redis for fast collection of these counters. The goal of the stat collection was to make it as fast as possible so that counters could be incremented throughout your application code in real-time.

Periodically throughout the day the counters are extracted from Redis and archived into a standard ActiveRecord model within your application. There’s a single table added to your database that keeps track of the counters each day after they are archived.

That’s it. It’s a quick and simple way to get basic stats reporting into an application. There are certainly bigger players in this space, and I’ve used several before as well. StatsD is a great example of a much more robust and scalable tool for this sort of thing. But in my recent use cases, it’s just a bit overkill. Sure, I could spin up StatsD and get it all to work. But I had bigger areas that I wanted to focus on, so Tally is a great place to start.

Side note: if you’re wanting to collect millions and millions of data points, you probably need something different here. Tally can work, but there are better tools for that job.

I’m currently using Tally for few specific needs, which I think are perfect use cases for the project. Here are a few use cases so far…

Use Case 1: Tracking Ad Impressions

First, I run a private ad server for a current project. I didn’t want to use a third-party ad server for privacy concerns and because I generally don’t trust that industry. That’s another story, for another day. However, it is important to report to our brand advertisers on how well advertising campaigns are performing. This includes impressions (views of each ad) and clicks. For video-based ads I also track the number of plays and completion percentage to see how well everything is performing. All of this is done privately with no user or personal information whatsoever shared with anyone.

Here’s a quick mockup of how it works. There is an AdUnit model in our database. It just stores basic data about the ads. Click-through links, the artwork for the ad, video streaming locations, and that sort of thing. Within that model, we use the Tally::Countable concern:

# app/models/ad_unit.rb
class AdUnit < ApplicationRecord

  include Tally::Countable

  # ...

end

Then, in the controller that renders the ad unit, we simply increment the impressions counter each time it is displayed:

# app/controllers/ad_units_controller.rb
class AdUnitsController < ApplicationController

  # GET /ad-units/:id
  def show
    @ad_unit = AdUnit.find(params[:id])
    @ad_unit.increment_tally(:impressions)
  end

end

We have a similar process to handle tracking for when an ad is clicked. To preserve the privacy of our readers we don’t directly link to the advertiser’s site. When an ad is clicked the link first goes through our server to clean any identifiable information from the user. This is also a great place for me to increment the clicks counter so I can accurately track how many people clicked on each ad.

From these two Tally counters we can derive something that looks like the screen below and see how many impressions and clicks each ad unit received:

Tally counters for tracking ad impressions and clicks (This data is all fake, don't read into it!)

The tracking for all of this is incredibly simple and with a few queries to get the data out of Tally, we have enough information to share with advertisers on how well their campaign is performing.

Use Case 2: Tracking Subscriber Counts over time

My second current use case is to keep track of the total number of subscribers (aka users) of my product on a daily basis. Since Tally is created specifically to track counts by day, this is a perfect way to collect data.

I could increment a counter of each time a new subscriber signs up. But that’s a bit unnecessary since each time someone signs-up there will be a new Subscriber record in my database. So I’m using Tally’s custom calculators feature to quickly count the number of subscribers and store it along with Tally’s other records.

Here’s a quick and dirty example of how I do this:

# in an initializer file,
# something like config/initializers/tally.rb

Tally.register_calculator "SubscribersCalculator"</code></pre>

Then, I have the calculator in a service class inside my app folder:

# in app/calculators/subscribers_calculator.rb
class SubscribersCalculator

  include Tally::Calculator

  def call
    start_at = day.beginning_of_day
    end_at = day.end_of_day

    count = Subscriber.where(created_at: start_at..end_at).count

    {
      key: :subscribers,
      value: count
    }
  end

end

The Tally::Calculator concern automatically sets up an initializer and the day variable is the current Date, or the date that we want collect data for. Each time the Tally archive process runs (I run it hourly) this calculator is run and the data is stored alongside the other Tally counts I’ve collected.

To make things a bit more detailed we can also store the number of signups for each referral source. This is helpful to know where subscribers are finding our site from when they sign up each day. (Are people finding us from search, social media, organic traffic, a paid traffic campaign, etc.) In my use case, I have a source enum value on the Subscriber model that stores this information when the subscriber registers:

class Subscriber < ApplicationRecord

  enum source: %w( organic search social paid )

  # ...

end

If we wanted to collect subscriber counts by source, we could modify the calculator to something like this:

class SubscribersCalculator

  include Tally::Calculator

  def call
    start_at = day.beginning_of_day
    end_at = day.end_of_day
    result = []

    scope = Subscriber.where(created_at: start_at..end_at)

    # store the total number of subscribers for this day
    result.push(
      key: :subscribers,
      value: scope.count
    )

    # store the number of subscribers for each source
    Subscriber.sources.keys.each do |source|
      count = scope.where(source: source).count

      result.push(
        key: "#{ source }_subscribers",
        value: count
      )
    end

    result
  end

end

This updated calculator will store the total number of subscribers each day, and also the total number of subscribers per referral source. After a few days of gathering data we can produce a simple report like this to show a graph of our new subscribers:

An example of Tally counters placed into some charts (This data is all fake, don't read into it!)

So that’s the initial release of Tally. It’s a simple but very powerful tool for collecting stats in a Rails application. It’s been very useful for me over the years, and I hope it can be useful to others.

The full documentation and README for Tally is available on Github and I’m certainly open to Pull Requests, Issues, bug reports, or other feedback.

February 19, 2020

The Paywalled Garden: iOS is Adware

Steve Streza, with a great look at how pushy Apple has become with its services:

[…] Apple has resorted to insidious tactics to get those people: ads. Lots and lots of ads, on devices that you pay for. iOS 13 has an abundance of ads from Apple marketing Apple services, from the moment you set it up and all throughout the experience. These ads cannot be hidden through the iOS content blocker extension system. Some can be dismissed or hidden, but most cannot, and are purposefully designed into core apps like Music and the App Store. There’s a term to describe software that has lots of unremovable ads: adware, which what iOS has sadly become.

February 19, 2020

Boy Scouts of America files for Bankruptcy

From the BSA’s leadership:

We are outraged that there have been times when individuals took advantage of our programs to abuse innocent children and sincerely apologize to anyone who was harmed during their time in Scouting. We believe victims, we support them, we provide counseling by a provider of their choice, and we encourage them to come forward. We believe that all victims should receive our support and compensation – and we have taken decisive action to make that possible. Our plan is to use this Chapter 11 process to create a Trust that would provide equitable compensation to these individuals.

It is incredibly sad to see what the Boy Scouts has become. As a kid I spent so much time at scouting events, campouts, and meetings. My memories are all incredibly positive and the experience I gained from scouting has been a big part of my life. However it is clear that my story is certainly not the only story. It’s easy for me to say from my position of privilege that this organization is all good. But it’s heartbreaking to hear these stories of repeated and institutionalized abuse. I hope this is the first big step towards correcting these wrongs and fixing the problem for good.

February 19, 2020

James Taylor: "I was a bad influence on the Beatles"

Nice piece in The Guardian by Jenny Stevens about the great James Taylor.

Taylor boarded a flight to London shortly after New Year's Day 1968. His friend had given him the number of Peter Asher, the brother of McCartney's then girlfriend Jane Asher; he had just been hired as a talent scout for the Beatles' new label. Asher liked Taylor's demo and arranged an audition with McCartney and Harrison. "I was very nervous. But I was also, you know, on fire," he laughs. "In my sort of mellow, sensitive way." He played his song Something In the Way She Moves (a line Harrison pinched for the opening line of his song Something) and they signed him then and there to make his eponymous first album. At the time, the Beatles were making the White Album. "We intersected in the studio a lot," says Taylor. "They were leaving as I was coming in. I often came in early and would sit in the control room and listen to them recording – and hear playbacks of what they had just cut." Did you hang out together? "Yeah," he says. I ask if the band was unravelling by that point. "Well, it was a slow unraveling, but it was also an extremely creative unravelling."

I had always thought it was Taylor using that line from Harrison. Great story.

February 14, 2020

NBA Players' Phone Numbers

Yaron Weitzman, for Bleacher Report:

Most Americans go through life with one cellphone number. They receive it in middle school or high school, keep it through college and bring it with them into the workforce. They use it to call their bosses. They use it to call their mothers. It never changes. Everyone—from their bosses to their mothers—knows how to reach them.
NBA players aren't like most Americans, and not just because they're graceful and tall. "Imagine walking down the street and knowing that every single person you see wants something from you," one National Basketball Players Association executive said. Selfies. Interviews. Seed money. A video for a nephew's bar mitzvah. And what better way to gain access to an NBA player than by seeking out his personal phone number?

According to this, some players change their numbers anywhere from a few times a year to weekly. What a crazy look into a world most of us never see.

February 13, 2020

The High Cost of a Free Coding Bootcamp

Zoe Schiffer and Megan Farokhmanesh, reporting for The Verge:

Lambda's intentions appear to be well-meaning, if also a bit self-serving. Of course, Silicon Valley's solution to upward mobility and education boils down to teaching people to code. After all, engineering jobs demand a skilled workforce, and these gigs pay remarkably well. But the startup ethos of prioritizing efficiency, speed, and scale is incompatible with many people's ability to actually learn.
Still, it's easy to see the appeal of a school built upon a financial agreement that aligns the schools' incentives with the goals and aspirations of its students. With the ISA, if a student succeeds in landing a job, the school gets paid. If a student can't find work within five years after completing the program, the ISA is automatically dissolved.

And, again yesterday, in a follow-up:

In December, online coding bootcamp Lambda School quietly partnered with Edly, a digital marketplace that helps schools sell income-sharing agreements (ISAs) to accredited investors. The arrangement allows Lambda to receive money from the ISAs upfront, rather than waiting for students to find jobs. But it also flies in the face of the values Lambda typically espouses: namely, that ISAs align its incentives with the goals and aspirations of the students.

February 13, 2020

Paging Michael Bloomberg

Thomas Friedman in The New York Times, who I don't normally quote or agree with, I think is spot on here:

So who is the right Democratic candidate? Well, for starters I will tell you who it is not. It is not Bernie Sanders. On which planet in the Milky Way galaxy is an avowed "socialist" — who wants to take away the private health care coverage of some 150 million Americans and replace it with a gigantic, untested Medicare-for-All program, which he'd also extend to illegal immigrants — going to defeat the Trump machine this year? […]
Please, Democrats, don't tell me you need Sanders's big, ill-thought-through, revolutionary grand schemes to get inspired and mobilized for this election. You want a revolution? I'll give you a revolution: four more years of Donald Trump, unencumbered by the need to get re-elected. That will be a revolution! And it will do permanent damage to the institutions and norms that have sustained this country since its founding, not to mention our environment, which Trump has been selling off to oil, gas and mining companies at an alarming pace. […]
If Democrats can choose a candidate who can hold the core Democratic base and also appeal to these same independents, moderate Republicans and suburban women in the key swing states, they can absolutely defeat Trump.

February 13, 2020

Fujifilm X100V

A great look at the latest iteration of the beautiful X100 series from Fujifilm by Jonas Rask. Just lovely all around.

February 8, 2020

Flighty

This week I was in New York kicking off a project with a new agency partner of ours. (More on that another time, but it's something I'm very excited about.) As an ice-breaker during the meeting they asked everyone to talk briefly about a favorite new app or website we're using. One of my favorite new apps over the past year or so is a flight tracking app called Flighty. The app appears simple, but the level of information and attention to detail in its design is extraordinary. Flighty's flight tracking service will send push notifications about each step of your trip, and in my experience is always ahead of the actual data you receive from the airline itself. It lets me know when the flight plan is filed. It lets me know when the plane I'm taking arrives at the airport. And perhaps most importantly it tracks that inbound plane for a day or so in advance of my flight so if there's going to be a delay, I know about it early. The app keeps track of a flight's history so you can see the on-time percentages historically as well. There's also a ton of other flight nerdy tidbits, like the weather and time zone changes necessary for the arrival city. Highly recommended. Flighty is a joy to use. App Store Link

February 7, 2020

Hey

HEY, a new email service is coming soon from the Basecamp folks.

HEY is our love letter to email, and we’re sending it to you. Coming April 2020.

Great domain name. I’m a sucker for Basecamp/37signals products, and this one sounds great. Can’t wait to give it a try. A few more details from DHH on Twitter:

Email is so damn good that we have to rescue it from the travesty that is its capture by the likes of Gmail, Outlook, and a handful of other big tech providers. They've successfully fooled everyone into thinking the highest ambitions in email is a new gmail client. Ugh. So with HEY, we're going full stack and full integration. An email service that doesn't require paying fealty to Google or Microsoft or anyone else. A new, fresh way to cut that big tech umbilical cord.

February 7, 2020

Type Capsules

New from H&Co: Type Capsules:

FoundationDigitalLiterary

This is a great idea. I hope it takes off and we see even more of the pairings.