Author Archives: Lou Franco

Shitty Blog Post First Drafts

In Bird by Bird [amazon affiliate link], Anne Lamott’s book on writing, she recommends writing “shitty first drafts”. I am using this advice as I bank blog posts. This morning I reviewed The Practice, and about 5 minutes ago I finished writing the post about banking posts. At the end of that post, I wrote that I had more tactics, and shitty first drafts is one of them.

Right now, I am typing this out as fast as I can, not editing. Just writing. This practice makes it so I have some raw material to work with. Since it’s now January 28th, and this post won’t be published until February 11th, I have 2 weeks to edit it.

Having gotten this far, I think I might leave this one the way this is so that you can see what a bad first draft looks like. In general, I would try to tighten it up—I can see that this one is a bit wordy already.

At this point, I’m just leaning into it. If this is going to be a shitty post, I might as well make it extra shitty so that you can see that there’s no need to have a polished post right away.

The only hard part is coming up with some kind of ending, but I usually find one in the edit.

Banking Blog Posts

Today is January 28th at 6:45pm. This blog post will be posted on February 10th at 10am.

This morning, I wrote a review of The Practice which published on February 9th. In that post, I mentioned that I published 30 posts in the last 30 days, but, I wrote those 30 posts in 19 days, and set them up to publish over 30 days.

Since I’ve been actively reading and writing notes, I have a big backlog of ideas and nascent writing. Blogging has been mostly about assembling these notes into posts, and banking them has taken all of the pressure off in trying to blog every day. With the pressure off, I sometimes write a couple of posts a day.

I have a few other tactics I use to make sure I publish every day, which I’ll post in the next few days (but I’ll write them right now).

Review of The Practice by Seth Godin

I started this blog in December 2003. Up to 2020, I made an average of 9 posts per year, with a high of 38 posts in 2008 and had several years with none.

During this time, I wrote a book, wrote on App-o-Mat and for Smashing, and so generally, I’m at peace with my writing output. Honestly, though, I had intended to write a lot more. I just never did it.

I finished reading The Practice: Shipping Creative Work by Seth Godin in early January. It’s essentially 219 short, blog-like chapters making the argument that you can choose to ship every day.

Here’s my review.

It is 30 days since I finished reading The Practice, and I have shipped 30 blog posts and an update to one of my apps. Will I keep this up? I have evidence and confidence that I will, mostly because I buy his argument that I can just do it, and doing it will improve my writing. It’s a practice only if I practice it. It’s an infinite game.

The Practice helped me understand “the why” to shipping daily, and that’s enough for me. Doing it with this mindset has made me realize that it’s actually not that hard.

That’s it. That’s the review. I read the book. It changed by behavior.

I have a lot more to say about my practice, but to add more info to prior posts, my daily Big 3 almost always includes writing a post, and a time-block is reserved for it. I chose my yearly theme, Hone, because it’s about improvement via repetition. I put “Practice” on my Habit Totem so that I am reminded to do it constantly.

Robotic Pair Programmers

If search engines ever get eclipsed, I think it will be by something in the environment that just brings things to your attention when you need them. I want this most when I code, like a pair programmer that just tells me stuff I need to know at exactly the right time.

When I’m in Xcode, there are so many times when I need information I don’t have. To get that information, I need to initiate a search. It breaks my flow to do this.

What I want is that information to just be in the environment.

One way this already happens with with code comments. In my source, I trust all of the editors, so I would like to see all of their comments and commit messages. This is actually possible if I turn on the Authors sidebar in Xcode.

But, what more could I get? Let’s say I index every Xcode project in GitHub, every iOS tutorial, every iOS question in Stack Overflow. Could that be distilled somehow and then shown to me at the right time?

One way that seems fruitful to me is rare API calls. There will be times when I am using an API that appears very infrequently in the corpus or my own repositories. In that case, it should infer that I probably need more help than usual and offer up a tutorial or the top Stack Overflow questions.

Another trigger might be my new comments. If I comment before I code, then it should be interpreted as a search query:

// Parse the JSON I get back from the data task

That should bring up links to likely API classes in the help pane (just like it would if I already knew the class). Maybe offer up imports to auto-add. Maybe offer a snippet. In Xcode it would be similar to the auto-suggested fixes for compiler errors.

This is just the beginning, and we can do a lot more. Whatever we do, we need to make sure that nearly every suggestion is useful, because we risk knocking the developer out of flow. Conserving flow should be the driver for how this works.

Soundtracks for Apps

A few days ago, I wondered about soundtracks for books. I had an aside where I mentioned that game soundtracks are synchronized with the player’s actions (like a book’s would have to be).

That is also true of a non-game app. If an app had a soundtrack, then it would also be synchronized with behavior, state, situations, etc.

Apps often use system sounds. So, if you do something that isn’t allowed, you could get an error beep. Alerts similarly come with a sound. That’s been around probably since the first GUIs. Those aren’t soundtracks.

But, I’ve been trying to think about all apps as potentially games, or having game design drive the app design. So, that means sound design has to be part of it. In fact, I think it’s a tell that not being able to conceive of sound design for an app means that it isn’t using game-driven design. What’s the soundtrack to MS Word?

In Pokémon Go vs. Apple Workouts, I said that game-design doesn’t drive the Workouts app—it’s slapped on. And even though I play music while doing a workout, that’s not a soundtrack either.

But every workout app could have a sound layer to let you know what is going on. in Sprint-o-Mat, I give you a ding when it’s time to start sprinting. Apple workouts have pace alerts.

But, what more could you do? In AR opens up playability, I said that even mundane apps could become games with AR (e.g. Grocery List vs. Zombies). We have a kind of AR right now with just headphones, so maybe the right sound-design (more than music or system sounds) could make a workout more like a game.

So, if the game in Sprint-o-Mat is a race, here are some ideas for a game-design driven soundtrack:.

  1. Crowd sound
  2. Have the crowd yell out your name
  3. Give a sense of the location of the pace-setter
    1. Footsteps
    2. Heavy breaths
    3. Friendly banter: “C’mon keep up, don’t let me pass”
  4. Add in band music that you pass (is at a physical location that you approach and leave)
  5. Have an announcer yell out your name and final time at the end

Sprint-o-Mat 2020.2 is Released: Run in KM

From the beginning of Sprint-o-Mat, I always internally represented distances as an enum with an associated value:

public enum Distance {
  case mile(distance: Double)
  case km(distance: Double)
 
  static let kmPerMile = 1.60934
}

So, adding kilometer support in Sprint-o-Mat was mostly about adding in some UI.

I added a button to flip the units, but I didn’t want a straight conversion. I wanted it to round to the closest tenth.

public func flipUnitsAndRound() -> Distance {
  switch self {
  case .mile(let d):
    return .km(distance: round(d * Distance.kmPerMile * 10) / 10)
  case .km(let d):
    return .mile(distance: round(d / Distance.kmPerMile * 10) / 10)
  }
}

I do the same for paces, and round them to the nearest 15 seconds.

With this done, it was mostly hunting down all of the places I was lazy—mostly inside of my HealthKit code that is getting running distance from the Watch in miles.

I left that as is, but made all of the mathematical operators for Distance work for mixed miles and kilometers, so I could could construct a .km Distance and then += .mile distances onto it, and the conversion would be automatic, keeping the units of the left-hand side.

public func + (left: Distance, right: Distance) -> Distance {
  switch (left, right) {
    case (.mile(let ld), .mile(let rd)):
      return .mile(distance: ld + rd)
    case (.km(let ld), .km(let rd)):
      return .km(distance: ld + rd)
    case (.km(let ld), .mile(let rd)):
      return .km(distance: ld + rd * Distance.kmPerMile)
    case (.mile(let ld), .km(let rd)):
         return .mile(distance: ld + rd / Distance.kmPerMile)
     }
}

func += (left: inout Distance, right: Distance) {
  left = left + right
}

If you run in kilometers, check out the new version.

How to Use Rejection

One of the more exciting things in life is to be accepted to do something that was competitive, and where you stood a good chance of rejection. That could be our stretch choice college that seemed out of our reach. Or that new job or promotion that we technically don’t qualify for. Or as simple as getting a date with someone out of our league.

It’s exciting to punch above your weight.

But, the chance of rejection can sometimes make us not try. We say that we’re not ready. That is probably true. In fact, the more chances you take, the more likely it is to be true.

But, rejection is a great way to find out how to get ready. It’s not something to be avoided. It’s a tool we can learn to use.

Here are ways we can use the possibility of rejection

  1. To motivate us to practice and prepare
  2. To focus our requests for help

Here are ways we can use actual rejection

  1. To ask for specific feedback
  2. To drive a post-mortem
  3. To improve our approach for next time
  4. To help others in our position

Soundtracks for Books

When you read, your visual senses are completely flooded. You should also be engaging in Slow Thinking (System II type thinking) as described in Thinking, Fast and Slow. This is self-aware, effortful thinking.

You are generally not capable of directing slow thinking at two tasks, which is why you shouldn’t text and drive. And it’s why you can’t read and listen to a podcast.

But what if you could listen to something? What ever the book is for, could your audio senses augment what you are reading?

I am not just talking about an embedded audio clip. To listen to that, you’d stop reading. I am talking about a book’s soundtrack.

In a movie, the soundtrack is integrated to provide a deeper experience. Sometimes it’s meant to be as prominent as the foreground, and other times, it might not be consciously noticed.

Movie visuals and audio are synchronized. So, to do this, the reading device would need to know exactly what you were reading at any point. In this sense, it’s more like a video game soundtrack, which is also synchronized, but has to follow the player’s actions.

Let’s assume that’s possible. Given a book device that knows exactly what you are reading at any point and can produce sound, here are things it could do:

  1. If you stop and stare at a word or phrase that is jargon the book defined, it quickly reminds you of the definition.
  2. Like Peter and the Wolf, we could assign small musical themes to the major ideas of the book. When you are reading something that is related to one of those ideas, the theme would play.
  3. It could use generated sound or music that goes from calm to more of crescendo as you progress through a chapter, giving you a sense of how close you are to the next break. For example, rainfall that becomes more of a storm—an audio progress bar.
  4. I think fiction would use this more for entertainment/art, but one exception is trying to read Shakespeare. I remember the left-hand side page having contextual information for the script on the right-hand side—maybe the context could be delivered aurally while you read.

If we could do this, it would drive book design to take sound into account (rather than it just be guessed at by a device) and eventually evolve the medium further away from text-only books.

Programming With the Joy of a Thirteen Year-Old

One of the exercises in How to Make Feeling Good a Priority by (my running coach) Holly Johnson is to list out the things that gave you the most joy at different stages of your life. For my teen years, I listed programming. I also listed it for later stages, but thinking about it, it was a different activity.

Programming as a teenager had no real point except to do it. At fifty, I still program nearly every day, but mostly as a job. I love it, but it’s different.

Most of my teen programs were unfinished—many times I just wanted to accomplish one effect and then moved on. Many of them were assignments in programming classes, but outside of that, they were unshipped.

I ship way more of my work now, but I wonder what I would make if I had no intention to ship.

Use Deprivation to Make Space

The Artist’s Way Week 4 asks you to engage in “reading deprivation”. For a week, you refrain from consumption (reading, TV, movies, and of course social media), but not music. It’s meant to open space for you to do your own work.

I wrote about my writing during reading process, which means I need to read a lot to drive my writing. So, this task was hard to accept as useful.

But, it did have its intended affect. With nothing to distract myself with, I wrote a lot more than usual in this blog and in my personal notes.

Indefinite reading deprivation would eventually exhaust my reserves, but this was an exercise worth repeating.