Author Archives: Lou Franco

Audio Variables

We can apply principles of visual design to designing audio. In visual design, we can manipulate “visual variables” to get different communication effects. The variables are are:

  • Size
  • Value/Brightness
  • Hue/Color
  • Orientation/Rotation
  • Texture
  • Shape
  • Position

Continuing along with sonifications, here are some analogous audio variables:

  • Frequency / pitch
  • Beat
  • Amplitude / volume
  • Envelope / Waveform: e.g. a beep vs. a buzz
  • Source Location

We have different ways of perceiving visual variables. For example, for some of them, we have an order—size goes from small to big, but shapes are not ordered.

We also have different ideas about how many variations we can tell apart on the same canvas. We can distinguish between a huge number of shapes, but probably only a few levels of brightness.

These kinds of perception apply to audio variables as well. Waveform seems to be related to shape in that there can be many types (instruments), but they are not really ordered.

Amplitude is similarly related to size, pitch is like brightness, and source location is like position.

Using what we know about combining and contrasting visual variables is probably a good start for doing the same with audio.

Self-hosting a Podcast in WordPress

I started a podcast about a month ago that helps programmers develop a writing habit. I looked at all the podcast hosts and ultimately decided to self-host. This is probably not for everyone, but here was my rationale:

  1. I already use WordPress for this blog, and I didn’t want a site specifically for the podcast as it is related to the other content here.
  2. I am unsure if I’ll make new episodes indefinitely, but I know that I want the episodes available indefinitely.
  3. I don’t have plans to add sponsors. If it ever got popular enough where that was an option, I think I’d rather point it towards my own products.
  4. I have enough technical skill to understand how podcast publishing works and can deal with rolling my own pieces if I need to.
  5. I am unwilling to compromise on privacy and the published URLs for files.

Given those attributes, most podcast hosts weren’t worth it for me. I just don’t care about analytics that much. I have no problem parsing web-access logs to get download counts.

So, I looked around and for WordPress, there is a great option, PowerPress, a free podcast plugin from Blubrry.

The plugin will handle generating the RSS feed and will walk you through submitting it to Apple, Google, and other directories. It has embeddable players that you can use on your episode pages.

If you don’t want to self-host, they provide a hosting service that you can access via the plugin with reasonable options, even for small shows.

But, they also support you hosting the mp3 files yourself and don’t require that you use their service at all. They even have a free, minimal analytics service for self-hosters. I don’t use it, because they require that you use their URLs and they redirect.

I’ll follow up this article about how I use Amazon S3 for the mp3 files and how I get some idea what the download counts are.

Great Software Writing (that influenced me personally)

A few days ago a proposed a short-list of great software works. A couple of them are associated with the great works of software writing, and so I started to think about what the top five pieces of great software writing were.

This was a lot harder for me to narrow down, so in the end, I decided to make it personal. What had influenced me the most? This means I have to leave off The Art of Computer Programming, which is undoubtedly a great work, because I haven’t read it.

These works were chosen because they shape how I think about programming anything. They are language and framework independent. I chose three that are more about process and three that were more technical.

This is in the order I read the books or papers.

Process

Technical/Coding

For me, these are works that still affect how I program today. My main lessons:

From Peopleware, that the biggest factors in programming productivity were access to quiet and long blocks of time, and that this explained correlations of productivity within a workplace.

From eXtreme Programming, unit testing, continuous integration, pair programming, small releases, and refactoring which are all part of how I have worked from the day I finished reading it.

From Joel on Software, don’t rewrite software, UI design for programmers, tons of software business. Also, one of the main reasons I applied to (and worked for) Trello.

From Design Patterns, that it’s useful to look for common solutions and give them a good name and description (not the specific patterns, although I obviously had learned from them).

From A behavioral notion of subtyping, I learned about how to progress software. I think about substitutability for almost every line of code I write inside of deployed software. I wrote about this in my blog post on Substitutable Versioning.

From Purely functional data structures, I learned that functional programming was technically possible. I had read about FP (and even wrote about it) in college (~1990), but at the time, it wasn’t conceivable to me that this could work—granted, I was just a student. After clojure came out, and introduced me to Okasaki’s work, I was convinced that FP had a place in my toolset. I wrote about that revelation back in 2008 in my 20 days of clojure series, where I tried to learn clojure quickly because I was helping to host a Rich Hickey talk.

Some notable things that I read but didn’t include are Decline and Fall of the American Programmer (this was interesting but turned out to be mostly wrong), Writing Solid Code, and Code Complete (great, but read it too late in my career to be influential).

Reframing Anxiety

Caveat: This works for me, and I am talking about it in the hope that it can help others. It’s not for everyone.

Over the course of my life I have become a lot better at managing anxiety. I once joked that all I had to do was realize that there’s no logical reason to feel anxious and then wait twenty-five years to see that I was right. That pretty much sums up how I’ve managed it.

Recently, though, I’ve come to see anxiety as as asset.

In my career, I would say that I generally get big things done by being on top of them. By worrying about them. I think about mitigations, like you’re supposed to, but even mitigating the mitigations. It’s probably a bit much, but it works for me. I think of this as being conscientious.

And that’s the reframing that’s helped. My feelings of anxiousness are a flip-side to conscientiousness. They come together. So, to the extent that I am happy about my approach to work, I have to accept that I will often feel unfounded anxiety.

I have come to be thankful for it. When I feel it coming on in an unwelcome way, I tell myself that this part of me is helpful at other times, and it can assuage it.

Write While True Episode 5: Audience and Message

Like many people I write to think. And, it helps. I set out with only inklings of an idea and by the time I am done, I usually have a coherent a complete thought. The writing contains it, but it doesn’t communicate it.

There’s a difference between writing to think and writing to communicate and I finally understand that.

Transcript

Great Works of Software

I was thinking about great works of art attributed to a single person or small group. Things like The David, The 5th Symphony, or Pride and Prejudice. They are each on the short list of the greatest sculpture, classical composition, and novel.

What would the short list for software be? I put together a list, but of course, it is personal to my experience and biases. Here is my top 5 in roughly chronological order.

  • C and UNIX
  • The ARM instruction set
  • TeX
  • VisiCalc
  • Web browser/server

I edited down this list from of about twenty. Notable removals were the collected works of NASA and Pong.

There are some similarities I see that bind them and maybe help to define great works.

  1. They are in wide use over a long period of time. Visicalc is possibly a stretch here, but its influence and core functionality are in 123, Excel, Google Sheets, etc.
  2. They were made to make something else. C was made to make UNIX to make microcomputers. Sophie Wilson used ARM to make microprocessors and Acorn machines. TeX was made to make The Art of Computer Programming [amazon affiliate link]. Dan Bricklin made Visicalc as an MBA student to analyze business cases.
  3. They are mostly attributed to a single person or pair. That was true of many of the entries on my list, especially programming languages.
  4. They define languages. Again Visicalc is a stretch, but I do think of Excel as a Programming Language and Microsoft is releasing Power Fx, a language based on spreadsheets.

This combination is also what drove Alan Kay and his team to develop Smalltalk, Object-Oriented programming, GUIs, etc to try to make Dynabooks, so that presumably they could write content in that new medium.

That work led directly to Macs and is even more directly used in NeXT/Objective-C, which is what Tim Berners-Lee used to make the first browser. And if you use it to edit a Google Sheet on an iPad, it’s on a UNIX variant running on ARM, probably using algorithms documented in TAoCP.

Review: How to Make Feeling Good Your Priority

My running coach, Holly, published a book last month called How to Make Feeling Good a Priority [amazon affiliate link]. The book is part advice and part memoir (as she learns and applies her advice to herself and clients). I am lucky to be a client and have heard much of this from her, but having it all in one place helped me see how it wasn’t just for running.

Holly is a serial marathoner (27 so far) and I have done two under her coaching (and training for a third). We often talk about how to make adjustments during training and during a race to prioritize feeling good. This book is about doing that outside of running—a connection I didn’t make.

There are many lessons, but the one that stuck with me is turning “I can’t” into “How can I?”. I have written about habit triggers before—how you can control your own behavior, in part, by controlling the triggers that prompt that behavior. Anchoring a problem-solving mindset to “I can’t” comes up surprisingly often.

So much of the book is about shrinking the impact of bad feelings and increasing the effect of good ones. There are a lot of actionable tips and strategies.

I can’t say that I related to everything, but a lot of it resonated with me. Her chapter on the Law of Attraction (which always seemed like mysticism to me) resonated with my beliefs about tapping into randomness. I have come to see “attraction” as “focussing”/”awareness”—I don’t think you attracted the thing you wanted, but I do think you were more likely to notice it. And mentioning it to others helps them notice it for you too.

Knowing Holly, I see her personality on the page. She’s a positive person, always trying to find ways to solve the issues I bring up with her. Under her training, I have very rarely missed a workout and I haven’t had an injury—the rest takes care of itself. After reading her book, I do think that her concept of the “runner’s mindset” can be applied to the rest of my life too.

Deliberate Practice by Cloning

If you are trying to learn programming by implementing something new, you are conflating two skills and making it hard to do either of them well.

Yesterday, when I wrote about deliberate practice, I listed the two things you need to do to make practice effective

  1. Break it down so that you are practicing one thing and trying to make it automatic
  2. Set it up so that you have instant feedback on whether you are doing it right

As you work on your program, sometimes you are thinking about the syntax of the language and sometimes you are thinking about where to go next. It’s better if you can stay in one mode for a long period of time until that skill becomes automatic.

And, since there’s no set goal, it’s hard to know if you accomplished it. You have no objective feedback.

I remembered that in a recent Under the Radar episode, Marco Arment and David Smith talked about cloning apps as a learning exercise.

By cloning, we can concentrate on just coding without having to come up with the content too. Even this can be broken down further. Structure your practice sessions to concentrate on one aspect at a time. For example, just the UI.

You can think of the target app as an executable spec, which is easy to compare your work to. If you are learning UI programming you can screenshot both screens and flip back and forth between them to see how close you can match it. This establishes instant feedback.

I recently tried this exercise for the Breathe app on the Apple Watch, only working on the animation and wrote up a SwiftUI animation tutorial on App-o-Mat.

Deliberate Practice for Knowledge Workers

You have probably heard that 10,000 hours of practice leads to expertise, a notion popularized by Malcolm Gladwell. The details are more complex than this and are spelled out by the researcher behind this statement, Anders Ericsson, in Peak [amazon affiliate link]. If you want a good breakdown of it, Badass [amazon affiliate link] by Kathy Sierra is much a better distillation and practical guide to practice than Gladwell. (I gave a talk about Badass for iOS developers a few years ago—there’s a synopsis of the book there)

The main thing to know is that the nature of the practice matters. Ericsson calls it deliberate practice. I think if you’ve taken music lessons, you have probably been exposed to deliberate practice.

Skills are broken down and practiced individually until they become automatic and expert-level in isolation. Bigger skills are built up from automatic ones and you constantly repractice those skills to keep them automatic.

In athletics, deliberate practice is also the norm.

But, what about knowledge work? It’s certainly not the norm to talk about deliberate practice in knowledge work. You don’t see systematic practice very often.

One reason why is that a key element of deliberate practice is instantaneous feedback. If I throw a pitch, I can get the speed right away. I know how it felt. I know where it ended up in the strike zone. Modern technology can give me all kinds of data on it. When I play a guitar chord, I instantly know if I did it right (or at least, my teacher does).

That’s not easy to do for knowledge work.

I do think that, in programming, there’s a big opportunity to introduce a regimen of deliberate practice. There are tons of tutorials on individual tech blogs and Dev that show a market for them. We just need to remember what we need to train.

If you type in code that you read from a blog, you are practicing transcribing, not programming. Since programming is about disambiguation, that’s the skill to practice. Take a vague description of some goal and figure out how to program it. in my Swift Book Companion, that’s all I offer. There is no code to copy—only vague descriptions of code to write.

In Cal Newport’s Deep Thoughts podcast (see Ep. 32), practice is a common topic. He offers these two practice exercises for knowledge workers in general.

  1. Practice working uninterrupted on hard problems for at least 30 minutes and build that up to 1-2 hours. The practice is on not getting distracted and not stopping, not the actual work. You can easily get feedback on that part.
  2. Practice reading hard material uninterrupted. Again, the practice is on the focus.

A similar thing I do everyday for practice is morning pages. I talked about this in the first episode of my podcast. I am practicing “writing on demand”.

The two things to remember if you are designing practice for yourself.

  1. Break it down so that you are practicing one thing and trying to make it automatic
  2. Set it up so that you have instant feedback on whether you are doing it right

Once it’s automatic, it can be part of the next thing you practice.