Author Archives: Lou Franco

TL;DR Yourself

If you write long-form text, people are going to paste it into ChatGPT to get a summary. Do it yourself and put a well-written summary near the beginning.

If that summary is sufficient, delete the rest of the text.

Write While True Episode 39: Dark and Light

The white pastel can draw white on top of the charcoal, so now I can make white marks, which can also be smudged and mixed. It’s giving me a range of values I couldn’t get before. Throwing white highlights onto a dark drawing is a way of directing attention and makes it more interesting.

Black and white, on a drawing, are the extreme values. If I try to apply this idea to writing, it should also be a juxtaposition of opposite extremes.

Transcript

Shut Up & Write

I went to a Shut Up & Write meetup today at a café here in Sarasota. It’s a simple idea. You get there, you say hi, some chit-chat, then you shut up and write for an hour. I decided to spend it doing stream-of-consciousness writing and just keep the pen moving across the page for an hour.

You’d think I could salvage something from it for this post today, but I had some weird dreams last night I wanted to work out.

Anyway, Shut Up & Write was fun. There are events everywhere if you want to try it out.

Be Skeptical of Points-based Productivity Claims

I do not personally use Story Points in my estimates because I know that everyone outside of development will translate them to time and I want to do that for them.

But, consider this claim: Adopting GitHub Copilot will increase productivity by 20%. I actually believe that to be true, but can you show it with Points? No, you cannot.

Here’s how it should go

  1. You do 10 sprints, you see that you have a steady state velocity of 100 Points
  2. You introduce GitHub Copilot
  3. Maybe for 2 sprints, you see velocity go up because developers over-estimate their stories. Let’s say it’s 120 now. Better report that quick, because …
  4. Then, devs start to adjust their estimates and velocity goes back to where it was.

Productivity went up, but velocity should stay constant because points are just time. You don’t get more time because of productivity gains.

If you see sustained velocity improvements (without changing the number of team members), then I would suspect gaming or a misunderstanding of how points are supposed to work.

Points and Velocity are best for front-line managers to understand what is going on with their teams and to size sprints. They should not be reported outside of the team, because they will be misunderstood and misapplied.

Making My Own CMS Worked Out in the End

In 2013 I started App-o-Mat to host content I was creating to teach iOS Development.

App-o-Mat is a totally custom CMS built with Django and Python that I have kept up to date for 10 years. It has been migrated from version to version of Django, from Python 2.x to 3.x, and I just recently replaced all of the Bootstrap with Tailwind.

I had learned Django in 2006, which is also when I learned Python. At the time, Ruby and Rails was probably the more obvious choice, but I’m actually glad I chose Python. Python has proven to be more enduring and useful in more contexts (e.g. AI).

From 2013 to 2021, I was full-time on iOS Development. App-o-Mat was the only web development I did. But, now all of the things I want to make are either for the web or best to be done in Python.

I know that making your own CMS is kind of nuts, but if I didn’t do that I wouldn’t know Python and my webdev knowledge would have atrophied. I think using some back-burner (non primary) tech stacks in side-projects might be a good idea—or it least it was for me.

Don’t Make a Phone-a-Taxi App

In 2007, seeing the iPhone and owning a taxi company, you might think it was a good idea to make an app. After all, people need taxis when they are out and about. Maybe, you think, that people will stop using pay phones, so they won’t see the stickers you plastered there with your phone number.

So, you get Phone-a-Taxi made so that people can use an app to call you up. They tell you where they are and you send a cab. There are hardly any apps in the store, so you get a bunch of downloads and calls, and things look great. You are riding the smart phone hype wave.

And then Uber comes along.

That’s what a lot of LLM features feel like to me. Technically, they are using LLM technology, but mostly just trying to shoehorn chats and autocomplete into apps that were not designed around LLMs. Even GitHub Copilot is guilty of this. I love it, but in the end I still have the same amount of code I had before. I don’t even want code—I just want the program.

Like the Phone-a-Taxi app, they are still doing things the old way.

Not Rejected, Just Not Picked

When I was interviewing software developers in the 1990’s, it was very common that people would apply that could not code at all. I don’t think they were nervous or that the question was unreasonable. We were a C shop and the question I opened with was in K&R and just a simple question about arrays. Many candidates could not give any answer. I wasn’t the only one seeing this, which is why FizzBuzz was created.

These days, I hardly ever see that. Nearly everyone I interview can code and can answer the simple questions. Many can answer any reasonable question. This means that we often had more than one good candidate.

But we still had only one job.

The problem is similar to what I wrote yesterday about layoffs. You might need to layoff a person you would hire if you had the budget. In both cases, that person is not really rejected, they just didn’t get picked from (what was probably) multiple good options.

Comparing People is Not Transitive (Another Reason Why Stack Ranking Doesn’t Work)

Layoffs are hard, but we shouldn’t try to make it easier with stack ranking because ranking is inherently one-dimensional and forces you to compare pairs of people. For layoffs, you should want to compare different multi-dimensional teams.

In programming, we know that whatever algorithm you use to sort a list, you need a function to compare two items. But sorting this way only works if comparing is transitive. This means that if a<b AND b<c then a<c. This works for numbers, but you need to be careful when you make your own comparators.

There’s no natural way to order people, so when you make one up, it’s often not transitive. The second problem is that the comparator only has the two people to compare, not any other context. That means that when you are considering the “value” difference in a pair of people you are not using the context of the team that they will be on.

Instead of sorting, consider this visual aid:

A spike graph that shows multiple dimensions

I explained this graph in Raising The Bar is a One Dimensional Concept. Each spike represents an attribute of a team member that you value. For example: coding skill, team gelling skill, writing ability, domain knowledge, code-base knowledge, mentoring—you can have as many as you want. Your team members may each excel in some, but lack skill in others. For each member, put a dot somewhere on each spike of the graph and connect it to make a polygon. By overlaying the individual graphs, you can see if you have a balanced team with diverse abilities and interests.

Here’s how I suggest you use this. Let’s say you have 10 developers and you need to lay off 20% of total salary. To decide, try evaluating each member on all the dimensions you value and create a team using your budget to pick the ones that result in the team you want.

Let’s say you start with some obvious top-performer. They have the most seniority, have mentored well, write great documentation. They are all-around a person that you want to keep. The next person to add is probably not someone similar to that. You want to end up with a good mix of junior and senior people, so the next person might be someone relatively unskilled, but perhaps with other desirable attributes.

The key is that you are thinking of that junior person in combination with the senior one, not comparing them against each other. To the extent you are comparing team members to add, you are considering which one is a better multi-dimensional addition to a multi-dimensional team, not looking at them in isolation. As you build up the team, you may notice things the team needs, and pick the next person based on that. You should try this a few different ways, with different starting points, and see if they converge.

Instead of thinking of people that you need to cut, you focus on building the best team you can afford. You should already know how to do this because this is a good way to recruit as well.

Write While True Episode 38: Content-free Sentences

I’m reading a book by Stanley Fish called How to Write a Sentence. I found this book by Googling that exact question because I wanted to find anything that might be a fit for what I’m podcasting about this season.

Transcript

You Can’t Rank Order Multi-Dimensional Things

One of the most surprising things I learned in math was that complex numbers had no natural ordering. Meaning, less-than and greater-than are not defined for complex numbers. It makes sense when you think of it for a minute. The same applies to other multi-dimensional things like matrices and vectors.

So, why do we think we can rank order people? I’m specifically talking about companies that do this for their employees, but it comes up in other contexts (e.g. class rank).

Even if you were to think of people as a number, it wouldn’t be expressed as a 1-dimensional one. When I wrote about the concept of lowering/raising the bar, I said that that a bar is a 1-dimensional concept. So is rank ordering.

Just like with complex numbers, you can make up an order if you want. But then you lose information. For example, if you choose to order based on magnitude, then direction would no longer matter. Similarly, when you rank team members by, say, seniority, you lose orthogonal characteristics, like the ability to catalyze others.

The reason companies do this anyway is when they are looking to downsize. If they do need to lay someone off, it might well be the lowest ranked person, but it’s a terrible way to do this. I do have a suggestion, but I’ll get to that Monday. [EDIT: Here it is – Comparing People is Not Transitive]