Category Archives: Software Development

Triangle Estimates

I estimate using time, not points. I do this even though I have mostly worked on product development teams inside of companies and not as a contractor for clients.

But, estimation on product development is not as high-stakes an activity as it is if you are billing based on it. The judgement of a successful product development project is based on whether it moves some business needle, not whether it was under budget. The margin on successful product development dwarfs reasonable overruns. There is also a lot of appetite for risk, where we know that we’ll win some and lose some.

That’s not true if the work is for clients. If they pay by the hour, they expect the estimate to be accurate. But there are very few (if any) big software projects that can be accurately estimated. When you’re wrong, you either have to eat it or have a very difficult conversation.

I don’t have a good answer, but I would start with triangle (or three-point) estimates. To use them, you estimate a most-likely estimate and then a best and worst case on either side. The three numbers describe a distribution (see the wikipedia page for how to combine them). The result is an estimate with a error range and a confidence interval. I would recommend sharing that instead of a single number.

The only task management system that I have seen that offers this option is DevStride, which carries three-point estimates throughout its system.

More Page-o-Mat Updates

I am working on making some books for Amazon KDP using Page-o-Mat, so that’s driving feature development right now.

I decided to create cover art using vector drawings, so I added the ability to add a list of drawing objects to a page. I currently support rectangles, ellipses, lines, text, and QR codes. Each object has keys to set stroke, fill, alpha, and other parameters.

A cover in KDP needs to be big enough to support the trim, bleed, and spine, so it ends up that page size is an arbitrary number. I had only supported standard sizes, like A5, Letter, etc. Now Page-o-Mat supports custom sizes and orientation.

I uploaded some books to KDP today. When they are approved, I’ll announce them here.

“What do you do?”

Just heard this template from The Art of Charm ep. 782 for how to answer “What do you do?” when you are meeting someone in a business context.

The idea is that you want to tell them something they can remember and repeat to the right person. So, you lead off with the kind of people you help, and then you say how you help them.

For me that’s something like: “I help B2B software companies by advising them on their product engineering.” I would somewhat alter that based on who exactly I was talking to (maybe niching down to fintech or mobile). It’s intentionally not very detailed to either invite questions or to let the conversation move on.

Later, if that person meets someone who works at a B2B software company that says something like “I wish I could get a handle on our developer productivity”, they might think of me.

Page-o-Mat Minor Update

I made a minor update to Page-o-Mat to add a few features I need for a journal I want to make.

New keys

  • subtitle: for adding a subtitle to a page. There are also the font, color, and alignment variants
  • show-title: a boolean that controls whether or not to show the title. You can use a string expression based on the page/section/variant indexes. This allows you to have a title that might only be on the first page of a section. (there is also show-subtitle)
  • footer-space: For lined journals, this allows you to have some blank space at the bottom. I also renamed heading to header-space, but support both for backwards compatibility (I believe that New Versions Should be Substitutable)

My plan is to use this to make a writing practice / morning pages journal with prompts (see my podcast episode Write While True Episode 19: Prompt Your Morning Pages for the rationale behind this).

Moore’s Law of Football

A few weeks ago, I wrote about what computing did to baseball, which was that it had doubled the number of stats they report every 18 months.

Right now, I am watching the Jets on Monday Night Football. It’s been a while since I tuned into a game live because I don’t live in NYC any more, so the Jets are hard to watch.

The thing that stands out to me is that there don’t seem to be any new stats. Maybe football really is just yards and points.

More likely is that there have advances in stats that help scouts, but the announcers have concluded that they are boring. They are right.

Pull Requests for One

I work alone on my programming projects, but I still make pull requests. I also review my PRs. It feels silly hitting the Approve button in BitBucket, and BitBucket knows that. It keeps warning me that my PR doesn’t have any external reviewers.

In 2003, the first year of this blog, I wrote about using Source Control for One, where I agreed with Eric Sink that source control was useful when working alone. It’s hard to think that there was a time when that would be non-obvious advice, but it wasn’t.

Today, in 2023, I think making PRs when working alone is probably common. I think that reviewing them isn’t. I’m not sure if I can convince you, but the reason I do it is that I keep finding problems. Also, it keeps me honest and makes sure that I keep Constructing PRs to Make Reviewing Easy.

What is Art? What is Code?

Yesterday, when I wrote about the semantics behind art and content and making and whatever it is I do, I said that I know that calling my code “art” was a stretch.

There is code that is accepted as art. Games or any code that creates visual art or music are examples. But what about the payment system for a B2B SaaS app? I think a lot of people would call that craft.

But, I recently read Art & Fear and I am convinced by their distinction between art and craft.

In essence, art lies embedded in the conceptual leap between pieces, not in the pieces themselves. And simply put, there’s a greater conceptual jump from one work of art to the next than from one work of craft to the next. The net result is that art is less polished — but more innovative — than craft. The differences between five Steinway grand pianos — demonstrably works of consummate craftsmanship — are small compared to the differences between the five Beethoven Piano concerti you might perform on those instruments.

[…] your job as an artist is to push craft to its limits — without being trapped by it. The trap is perfection: unless your work continually generates new and unresolved issues, there’s no reason for your next work to be any different from the last. The difference between art and craft lies not in the tools you hold in your hands, but in the mental set that guides them. For the artisan, craft is an end in itself. For you, the artist, craft is the vehicle for expressing your vision. Craft is the visible edge of art.

– Bayles, David; Orland, Ted. Art & Fear (CRAFT) / emphasis mine

To Bayles and Orland, the Artist is using craft to explore Thousands of Variations of an idea. They are not seeking perfection. If that’s the distinction, I personally resonate with the idea that my code is more art than craft. I could see others thinking the opposite about theirs.

Make Art, not Content

The word “content” has become a catch-all for things that creators create. You hear it most on YouTube, which is weird to me because almost everything the “creators” there do is make videos, so I don’t know why they call it content or why they even call themselves creators. If they needed a catchall, we already had “Art”, which is what I use.

I know “Art” is a stretch, especially for the code, so, even though I use it, I don’t call myself an “Artist”. I usually call myself a “maker” to encompass programmer, writer, podcaster, sketcher, and graphic designer—but there isn’t a good equivalent word for the collection of output. Maybe “Works” or “Work” would be better, but it’s hard to use that word without explaining it. Art is also misleading, but I want to have that discussion.

I’m not always consistent. I call App-o-Mat a “content site”, because that’s what other people would call it. If there’s one thing good about “content”, it’s that people generally know what it means. But I don’t call this site ( a content site. In both my podcast and this blog, I refer to what this is as “art”.

Make Art with Friends is about my search for collaborators, but I think it was also the first time I realized this.

The First HTML Page Still Renders

If you look at the headers from GET’ing, it has these lines:

HTTP/1.1 200 OK
Last-Modified: Thu, 03 Dec 1992 08:37:20 GMT

I believe that it really hasn’t been updated since 1992. Look at the top snippet of the HTML to see why I think this:

<TITLE>The World Wide Web project</TITLE>
<NEXTID N="55">
<H1>World Wide Web</H1>The WorldWideWeb (W3) is a wide-area<A
NAME=0 HREF="WhatIs.html">
hypermedia</A> information retrieval
initiative aiming to give universal
access to a large universe of documents.<P>
Everything there is online about
W3 is linked directly or indirectly
to this document

There are a few obvious differences between this and modern HTML

  1. No enclosing <HTML> tag
  2. <HEADER> instead of <HEAD>
  3. <P> is being used like <BR/>

But, Safari renders it as I think it was intended.

Is this because bad HTML has always been rendered? Or is HTML somehow backwards compatible to this? I suspect the former.

I’ve always been annoyed that browsers render bad HTML. I think it makes it harder to find problems. But, I also love long-lived systems that don’t require human intervention and substitutable versions, so I hope that it’s planned backwards compatibility instead.

Tailwind Final Thoughts

I just finished migrating App-o-Mat from Bootstrap to Tailwind. Here are some things I recommend if you are trying something similar

  1. Don’t try to keep the same markup. It’s likely you can make it a lot simpler.
  2. If you need icons, use Heroicons.
  3. If you use @apply, use it to style tags or to make more utilities.
  4. Generally, Tailwind seems mature enough that what you think of as an edge-case is covered somehow.

The next thing I will try is using it in a React site (with TailwindUI components)