Category Archives: Personal

February 2025 Blog Roundup

I started using Cursor in February. I went from 0 to a usable commit in less than 20 minutes. Here is my progression:

I continue to be impressed by Cursor and use it for almost all programming now.

I wrote about catalysts at work (inspired by an old post: An Unnamed Programmer in Peopleware is One of my Heroes):

I am working on a book about tech debt called Swimming in Tech Debt. I spent some time thinking about swimming:

I continue to write about code reviews

Fluent Forever Review

I’m learning German for a trip this spring. Last week, I found out about the book, Fluent Forever [affiliate link] by Gabriel Wyner, which I really love. He also has an app with the same name—it’s fine, but very buggy. It’s hard to recommend the app, but I am convinced his process is going to work for me, and the app is better than trying to his process without it. I bought it after trying it out—despite the bugs. If you read the book, and want to do the process, then you should consider the app.

One reason Wyner’s process resonates with me is because it is centered on Spaced Repetition flash cards, which I already use for other things. I use Anki for spaced repetition practice, but his process isn’t easy to implement in Anki.

Wyner recommends building very custom flashcards that don’t use translation. So, I wouldn’t put an English word on one side and the German translation on the other. Instead, he recommends using an image in place of an English word. He wants you to associate the new language with an image so that you map the word directly to a concept, and don’t have to mentally translate through your native language. Since, I am thinking about how to Apply Program Language Learning Techniques to Learn a Foreign Language, and I never translate between programming languages, this makes sense to me.

Each card in his system is personal to you. He doesn’t supply pre-made cards—he wants you to build them. Building them is part of the process. For example, when I made the card “Großmutter,” I spent at least 10 minutes looking at pictures of my grandmother before I found the perfect one. To represent a concept, sometimes I need to combine several images. That time helps cement the concept before I have even tested my memory with the card. Also, I know what I mean by the image—this would be hard to do with someone else’s images.

The Fluent Forever app helps you build cards, implements a spaced-repetition algorithm, speaks the words (to teach pronunciation), and has many other helpful features. Like I said, if you want to learn this way, the app is better than trying to replicate it with Anki or paper (although the book does show you how to do it). It’s also cheaper than the popular language learning apps. The book, though, is worth a read if you want to learn a language.

Swimming to Focus on a Problem

Yesterday, I wrote about how I use Swimming as Meditation. The extreme solitude afforded by the sensory depravation and the rhythmic repetition of strokes, kicks and breaths keep my mind in the present. Usually I try to think about nothing, but sometimes I decide to use the time to solve a problem.

I start the swimming session with a question. I will keep asking myself the question over and over. It’s similar to Natalie Goldberg’s suggestion in Writing Down the Bones to start your writing practice by repeatedly finishing the sentence “I remember…” She is using this as a prompt to keep you writing. I am using a question as a prompt to generate ideas.

One I use often is “What should I blog about today?” The last time I swam, since I am trying to learn German, I asked myself to name German words I know. The questions that work best can be repeatedly asked and answered—meaning, they prompt me to make a list. It’s hard to have a complex string of thoughts that I can remember without being able to write anything down.

Because I can’t write them down, if I have any good ideas, I have to just keep repeating them to myself until I am done swimming. I try to come up with mnemonics that will make sure I remember them. I number them and incorporate them into my stroke counting. That’s usually good enough to keep it top of mind until I can get to my phone.

It seems like it might be hard to swim and think, but actually it’s easier. If I am doing a 30 minute swim, then I will definitely think for 30 minutes. There is literally nothing else to do.

Swimming as Meditation

I don’t have a regular mediation practice, but I’ve started to think of my swimming sessions as one. When I go into the pool with this frame, it gives the meditation more purpose and the exercise extra meaning. I have intrinsic motivation to do each, and it gets combined.

Before swimming, most of my meditation has been guided by an app. I learned how to do it with Headspace, and then moved onto the Apple Watch Breathe app for lighter guidance. But, I do need some prompt to direct my thoughts. Swimming has that built-in because I need to refocus on the parts of my technique constantly.

Whenever I notice that my thoughts have drifted, I count my strokes, kicks, or breaths—or concentrate on their polyrhythmic interplay. I have a cadence of each I am trying to meet, so counting them makes it more likely that I will do it correctly. I also have a target stroke count per lap, so counting is already a part of my swimming. It incidentally keeps me in a meditative zone.

It also helps that the pool is a sensory depravation chamber. I wear non-corrective goggles and earplugs, so my vision and hearing are dulled to start, and being in the water gives me nothing to see or hear anyway. It’s the only workout I do without any distraction, and so I have been avoiding underwater headphones to keep it that way. This may be the only waking part of my day with extreme/literal solitude.

I picked up swimming again because it’s the central metaphor of my book on tech debt. This meditation frame also applies to coding. When I’m in a coding flow, I must stay present to extend it. Like swimming, the interplay of the purpose of my work and enjoyment of meditation makes me want to keep going.

Applying Program Language Learning Techniques to Learn a Foreign Language

I’m an “expert” in learning programming languages. Just counting languages that I have worked with professionally for at least 5 years, I know more than a dozen and I am 4 years into adding TypeScript to that list. But, I only speak and read one non-programming language, English, proficiently.

Learning traditional languages has not been easy for me. I learned French in school just enough to pass my statewide tests and didn’t retain enough for practical use. I tried DuoLingo for Spanish a few years ago, but felt like I got caught in a rut of naming farm animals.

But now I am planning on going to Germany for vacation this year, and I would like to know more than I do now. I know a little tourist-level German from having to travel there for work regularly in the early 2000’s. Not enough for even a simple interaction, though

Since nothing I have done has ever worked, I want to do something different this time—perhaps building on my programming language learning experience. The easy thing to see is that put serious time and energy behind learning a traditional language. I don’t have that problem with learning programming languages. I usually spend several hours a day using them when I want to learn them. Also, I have external motivation: when I got a .NET job with 0 .NET experience, I needed to learn C# fast, but I was paid to do it.

My motivation will be to have fun experiences when I am in Germany. Most of the time I will be able to use my phone to translate written text (e.g. a menu). If I need to know something quickly, it will likely be because something is being spoken to me. I might want to interact a little better with people in hotels, restaurants, and other tourist attractions (where taking out my phone would be awkward). This means more of a focus on listening exercises.

Finally, when I learn a programming language, I usually start to make something practical early into it. I can do this because I can program already, but for novices, I recommend starting with whatever canonical language book was written by the designer and to generate focused exercises that use only what you know. I’m a novice, so that’s the approach that I think I should take.

So, here’s the skeleton of my plan

  1. Allocate serious time to it.
  2. Convert some of my random YouTube and podcast consumption to German audio content.
  3. Find or generate exercises beyond DuoLingo so that I can practice remembering more vocabulary.

January 2025 Blog Roundup

In January, I posted every day. Here were the themes:

I brought my podcast back. I kept it in season 4, which is about the lessons I’m learning while writing a book about tech debt.

Writing every day is part of my marketing strategy for the book. I outlined that here:

I wrote a bunch of articles about Code Review. I had written If code reviews take too long, do this first in December. Here are some follow-ups.

I did a series of 3 posts about how to triple the number of posts you write:

I wrote a few posts about AI

I’m also proud of this toot:

Post by @loufranco@mastodon.social
View on Mastodon

Which I thought of while revisiting We Keep Reinventing Injection Attacks

I’ve been getting interested in helping entry-level developers more. These posts are what I think about it:

The Lorraine Hotel

I’ve been to Memphis twice, which means I’ve been to the National Civil Rights Museum at The Lorraine Hotel twice. The first time was in the early 90’s and the second time was in 2022. My memory of the first time was that it was just the Lorraine Hotel and walking through it was a fairly short, but powerful experience. After seeing a retrospective of MLK’s life and the 60’s era civil rights movement, I watched a video of his “Mountaintop” speech where he seemed to predict his own death, and then walked to his room, and then to the exit. Everything was quiet. We were within a few feet from where he was shot. I just stood there and let all of it overwhelm me as it should.

A photo of the Lorraine Hotel. There is a flower wreath at the spot of MLK's death. The hotel has been preserved to what it looked like then with two cars from the time parked outside.

A Tale of Two Blogs

I have a blog here (the one you are reading) and another at App-o-Mat. This one is on WordPress, and App-o-Mat used to be a Django site, but is now a static site generated by that Django app, which I run locally. I had to do this because my hosting company sunset their support for Django, and I didn’t want to pay for better hosting.

So, for this blog, all I have to do to write a post is login, tap the “Add a Post” button and type type type until I am happy with the post. For App-o-Mat, I have to do a bunch of steps I forgot to write down. I think I could figure it out—it was something like:

  1. Run the Django app locally following the steps in the README (this will have a side-quest of getting Python environments figured out again)
  2. Go to the Admin and add a post entity to my DB
  3. Use curl (I think) or maybe wget to crawl the whole site and dump HTML
  4. I should probably diff this against the site to make sure it worked
  5. SCP the changed files over to my server

Now that I have written this down, I actually feel like I should write a new post soon because this is the most momentum I have had on this site since I had to migrate it last April. The change before that was to migrate from Bootstrap to Tailwind. I do more futzing with App-o-Mat than writing. But, whenever I change the site, I write about it here, so I am using my waste.

I’m not always prolific on my main blog, but that’s not the fault of the software. I was thinking about this earlier today, and now there’s a post. Whenever I have ideas for App-o-Mat, I forget them before they had a chance to exist.

Do Software Developers Need a Brand?

When someone hears that you are working on something, your brand is what they think will happen. So, the question isn’t whether or not you need a brand, because you already have one as long as people hold some opinion of your work. The questions to ask are (1) what is the brand, (2) how consistent is it, and (3) how widespread is it.

The most important thing is that the opinion people have about you is generally positive, but there are a lot of options for what that is. It could be that people generally believe you are highly skilled. Or they could believe that adding you to a team is good because you help teams jell. Or perhaps adding you to a startup is a good idea because you have a large network of peers to recruit from who like to work with you. Or maybe you know a domain on a deep level. Each of these are examples of a positive brand, and they all can work well (or even better in combination). Whatever your brand is, it is built from your visible accomplishments.

So, in addition to accomplishing things, if you want those things to be part of your brand, make them visible. If the work can’t be public, then you could still make sure your team understands your contribution, ensure your manager understands it enough to use in a promotion packet, or talk about it on an internal blog. If the work is public, then having some public explanation of the benefits of that work is worth adding to it. If you use LinkedIn, I would say that this should show up in your headline, summary, and job history section. There is no need to make posts for this, but I do think having a trickle of LinkedIn activity is helpful to help people remember you or get them to look at your profile.

A positive brand is always helpful, but a consistent one becomes more important as your career progresses. You can’t always control exactly what you work on, but you can improve how that work is understood by using emphasis. I have done this on my LinkedIn profile and when applying for a job by making custom resumés and cover letters.

For most of my career, I concentrated on doing good work and having positive interactions. But it’s easier to communicate this by fitting that work into a narrative. I emphasize the parts of my career that are more likely to result in relevant work, and I expand it in direct conversation if it makes sense.

I’d like to think that this was all intentional, but it wasn’t really. This narrative is something I found after the fact. There are alternative brands that I could use, but don’t, like “FinTech Engineer” or “Mobile Engineer”, which are positive but not consistent with what I am trying to do. I don’t want to be hired to do those things, so it’s only important to talk about them if a specific engagement needs that in addition to what I try to sell. But, to get the job at Trello ten years ago, I emphasized the “Mobile Engineer” and “Startup early engineer” narrative and downplayed my management experience.

But when developers ask whether or not they need a brand, I think they are mostly asking about the “widespread” part. In that case, the answer is easy. No. You do not need a widespread brand. My career has been successful without one, and I think I’m the norm.

I am not well-known outside of my network. This is true even though I have written a book, spoken at conferences, been on some podcasts, written for tech publications, and worked on a fairly well-known app. To the extent that these things touched people outside of my network, I don’t think it resulted in a widespread brand. But, I do think the people that know me have a positive association with me in a way that is consistent with my narrative.

The more important thing is that your positive and consistent brand be widespread within your communities: inside your current employer, among your ex-colleagues, and among your clients. If you participate in developer online communities, then in there too. To the extent you are on social media, then among your followers, no matter how small a list that is.

Rather than working to grow your brand to strangers, I would first recommend you grow it within your network. The best way to do this is by doing good work in the way you want to be known. Then, build a consistent and widespread brand by tying it into the narrative you want people to have about you when they hear your name.

Books That Propelled Me in 2024

These three books did the most to help me make progress in 2024

1. Nonfiction Alchemy [affiliate link] by Jordan Ring

I already finished a draft of my book before I read Nonfiction Alchemy, so I learned some of his lessons the hard way. The biggest change I made after reading it was to my title. I had been using a more literal “promise” based title, but wished it was pithier. His description of how he came up with his title and why helped me come up with Swimming in Tech Debt, which I think works a lot better. The subtitle will do the work of conveying my promise.

The new title is more visual and communicates my main metaphor of using your encounters with tech debt as a trigger to make progress—“swimming” rather than “drowning” in tech debt.

I wrote more about this in Titling a book and Book Title as Visual Metaphor.

2. A Philosophy of Software Design [affiliate link] by John Ousterhout

So many gems—it should be required reading in any CS program. Ousterhout’s target is complexity in software, which is very related to technical debt. My book is more about any code that resists change, which includes well-written, simple, easy to understand code that just can’t be changed in the way you need it to be. This book is about understanding the sources of complexity and fixing them.

3. Slow Productivity [affiliate link] by Cal Newport

This is Newport’s latest book in a continuing series about his approach to work and life. If you haven’t read Deep Work [affiliate link], I would start there and move onto Digital Minimalism [affiliate link]. This book shows how to make big things at a slow pace. I worked on my book in my marginal time: a hour or two a day. But writing hundreds of words a day, a thousand every week, builds up. There were edits, restarts, rewrites, etc. But the pace was sustainable, and I owe a lot of that strategy to this book. (Also see The Four Disciplines of Execution [affiliate link] — which is referenced in Deep Work)