Tech Debt in a 3 Month Old Project

I’ve been working on a new web app since October. The backend is a GraphQL API on top of a database schema. Each entry point unpacks the request and then calls a function that queries or mutates the database. There are some complex mutations—ones where there might be updates, inserts, and deletions that all need to succeed or fail together.

I know that I’m supposed to do this with transactions, but I was also using an ORM that I’m not very familiar with, and wanted to make progress quickly. I decided to pay lip-service to transactions, wrap some functions in them to indicate to myself that I needed to think about them, but mostly just ignore them. I would never not do transactions in a production app, but for this, it made sense.

After MVP, a month or so ago, I’ve just been adding minor things while my partner onboards some trial users. Eventually, I tried to implement a feature where the API call could result in many inserts and deletions, and I could see in tests that I could cause this to fail in ways that corrupted the data.

So, I had to stop, learn how to do transactions in this ORM, and then implement them in my data code. It took a few hours, and now the debt is paid off.

I do this kind of short-term borrowing/paying of debt all of the time. I am borrowing to keep myself in flow. I try to keep the debt top-of-mind by making it very evident in the code. It’s like using a credit card where you pay it off inside the grace period.

Accountability Affinity

Last year, I struggled to find a local author’s group, and realized that it mattered if the others were basically in my genre. The first one I tried was mostly attended by memoir writers. The second, Shut Up & Write, was mostly fiction writers. It was fun to attend, but I didn’t find much common ground, and so I stopped going to them.

Yesterday, I joined the Useful Books community, which is a community of authors that are writing non-fiction books based on ideas in Write Useful Books by Rob Fitzpatrick. He’s in tech, but the community is more broad than that—the genre is described as useful non-fiction: “to create a book so useful that readers can’t help but recommend it.” I went to a virtual writing session yesterday and did end up getting a lot done—and it carried through to the rest of the day.

It’s early on, so I don’t know if this will stick yet, but I do think having something in common with the group helps. Not just that we’re all trying to write, but also the type of thing we’re writing.

4DX: Applying the Fourth Discipline

See 4DX: Applying the Third Discipline to get a summary of the WIGs and Lead Measures.

The final discipline is to have weekly accountability meetings that are only about 4DX, the WIG, the lead measures and how to do better in the coming week.

This is hard because I mostly work alone. I do a weekly retrospective, so I mostly need to just make sure I always review my scoreboard from the 3rd discipline.

For my fitness goal, I go to Crossfit which puts me in a room with several coaches and peers. I track my lifts in the gym’s app, which I share. If I stumble with this goal, I may add more direct accountability.

For my work goal, I have a partner and we already have weekly status meetings. They are not 4DX specific, so again, if this goal is not reached by March 31, then I may ask for 4DX meetings.

For my personal growth goal, I have decided to share my progress in a weekly podcast. I just joined the Useful Books community in order to meet like-minded people and perhaps join an accountability group.

For all three of my WIGs, I am not yet really doing the fourth discipline correctly, but I will try to move towards that as I progress.

Grouper with Orange Sauce

Today is my wife’s birthday, and I don’t have time to write, so I’ll just share a recipe for part of the dinner I made for her

Ingredients

  • 1 fillet of Grouper, approx 1/3 pound
  • Flour to dredge
  • Butter (a few pats to cook and then about 1-2 tbs for the pan sauce)
  • Olive oil (1 tbs)
  • Juice from 2 mandarin oranges (I put peeled oranges in immersion blender and strained)
  • Zest from 2 mandarin oranges
  • Shallot, very finely minced, about 2-3 tbs
  • Thyme (1 tsp)
  1. Heat a pan over medium heat
  2. Put flour on a dinner plate, season with salt and pepper to taste
  3. Dredge Grouper in flour
  4. Melt pats of butter in olive oil in pan
  5. When the pan is hot, place grouper in it, don’t move the fish—let it sear.
  6. Depending on thickness, turn when first side is ready (4 or more minutes). Fish should be easy to flip—look for some browning.
  7. After second side is cooked, put aside or move to side of pan off direct heat (make sure it’s cooked through)
  8. Put shallots and zest in pan for about a minute
  9. Deglaze pan with juice
  10. Add butter, continue deglazing
  11. Add thyme
  12. Put grouper back in pan and coat with sauce
  13. Put sauce on plate and fish on top of it

If you want more instructions, see this page for how to pan sear grouper. They have a different sauce, which you might also like.

I served with roasted red potatoes and steamed haricot verts with almond slivers.

Enjoy!

4DX: Applying the Third Discipline

Previously:

Now we have Wildly Important Goals (WIGs) and Lead Measures to act on.

  1. Work: Get to no launch blockers in the product by March 31 by spending 4 hours per week on them
  2. Fitness: Go from 23% body fat to under 20% by December 31 by doing 4 strength workouts per week and having 5 high-protein breakfasts per week.
  3. Personal Growth: Publish two 50-page books by December 31 by working on them 5 days per week for at least one hour per day.

The third discipline is to build a compelling scoreboard. The idea is that it’s like a scoreboard in any sport—you can look at it and instantly see if you are winning.

The trick is to build a player’s scoreboard and not a coach’s one. In basketball, a coach would have free-throw percentages, blocks, assists, and many useful pieces of data. The player has points and fouls and little else. Player’s need signals to help them make quick decisions, not tons of data to analyze. While we’re working, we’re players, and we need to know if we’re winning at a glance. The other data is collected and we (or our managers/coaches) might analyze them, but we don’t need to see it all of the time. We always need to know the score and whether we’re winning.

To keep this simple, I decided to dedicate a page on my journal to the first 13 weeks. I have 13 rows (one for each week) and then columns for each lead measure. I just need to put an X in the column when I do it. I can see my current week and compare it to the past. I’ll make a new grid every 13 weeks.

A page from a journal showing the WIG / Lead Measure scoreboard for 13 weeks.

I also track in software. Since I use an Apple Watch, I just start a Strength Workout on it right before I start to lift. The data shows up in many fitness apps I use daily. For the other two WIGs, I am using personal productivity software I am developing. I like the combo of paper and software. The software keeps it in my face when I am at my computer and my journal is always around when I’m not.

4DX: Applying the Second Discipline

The second discipline of The Four Disciplines of Execution is to act on lead measures to accomplish the Wildly Important Goal (WIG). I defined my three WIGs yesterday

  1. Work: no launch blockers in the product by March 31, 2024
  2. Fitness: Go from 23% body fat to under 20% body fat by December 31, 2024.
  3. Personal Growth: Write two 50-page books and put them up for sale by the end of 2024.

For each of those, I have inherently expressed them in a way that defines a “lag” measure. On March 31, I will have launch blockers or not, but there will be nothing I can do on that day to change it. Each day, I will go on my scale and see my body fat %, but I will not really be able to do something that directly affects that in the short term.

4DX asks us to define lead measures that are things we can do right now that will lead to us accomplishing our lag measures. It measures our real-time activity, not the end result of the activity.

For work, it’s going to be time spent coding on launch blockers. I think I can get through the list if I spend 4+ coding hours on launch blockers per week. That might seem like too little—which is common in 4DX goals. You must accept that you still have all of the operational things you have to do. My partner and I are still experimenting, supporting early users, and possibly pivoting. I obviously need to work more than 4 hours per week on the project, but the majority of them are spent dealing with what the business needs today. My WIG is about how we get to the next level.

For fitness, I am accepting that my amount of body fat is very hard to lower (I have lowered it a lot, but have been stuck for a year), and so I am going to work on my amount of muscle mass, which means that I will do more strength training. My lead measure is to do 4 sessions of 10+ minute weight training workouts per week. It’s not 4+, because rest is important. It’s only 10 minutes, because I am working one body part fairly heavy and to failure. I am doing other workouts—these are in addition to what I am already doing, usually on the same day.

To support this, I am adding a secondary leading measure of eating a high-protein, lower carb breakfast 5 days per week. I usually eat oatmeal and fruit, which is perfectly sensible, but perhaps not supporting my WIG as well. I am not a low-carb person (quite the opposite), but I want to reduce this kind of carb. My new staple breakfast will be an egg substitute I make from soaked mung beans (similar to Just Egg) and tofu or tempeh. There is also a cafe near me that makes Just Egg omelets that I will have when I’m lazy. I might also use protein shakes, but rarely.

For my personal goal, since I am aiming for 50 page books, it might be tempting to have a weekly page count goal, but that won’t work for me because I write in drafts. Like my work goal, I think the easiest lead measure will be hours per week, so I will work on the book for at least one hour on five days per week. This will result in 5+ hours per week, but I think it’s important to have a daily practice of writing and not just do 5 hours in one day per week. It seems low, but I have other things I am doing besides this to maintain my level of output. I still want my blog and podcast to be going at the same time. The WIG is about what I can do to get to another level, not something I do instead of what I am doing now. In 6 months, that’s about 130 hours, which should be enough time to write and edit 50 pages.

You might disagree with my goals, and how I am trying to accomplish them. That’s ok, but that’s not the point. The point is that I am trying to accomplish big goals by concentrating on a process that is much more short-term and something I can definitely do (4DX calls this playing a winnable game). I will be checking in every 13 weeks to see if I am moving the lag measure, and adjust if not.

4DX: Applying the First Discipline

In yesterday’s post about The Four Disciplines of Execution, I quickly went through the disciplines and how I am applying them. Today, I want to talk more about the first one, which is to choose one “Wildly Important” goal (WIG), and my thought process as I chose mine.

The first thing to notice is that the book asks you to choose only one WIG. I may be going off script by choosing three, but I am choosing them in very different areas of my life. I have only one work-related WIG, one health WIG, and one personal growth WIG. The book is mostly about work, but I have time carved out for health and personal growth that is separate from work. I have separation between them, so I my focus on one does not affect my focus on another (at the appropriate time).

To find a WIG. The book asks you to define (1) Where you are now (2) Where you want to be, and (3) by when. It’s the same idea as SMART goals.

For work, I am working on a startup with a partner, where I am doing the technical part.

  1. Where am I now? We have an MVP, and we use it every day along with a few trusted users. We have a series of gates we want to get through to launch. Right now, it’s usable, but we’re still missing some core features.
  2. Where do I want to be? Ideally launched, with users, and with some revenue. But, that depends on a lot of factors outside of my control, so it would be hard to put a deadline on it. To make it possible for me to accomplish the goal, it needs to be expressed as something I can do without dependencies.
  3. By When? It’s not ideal for a WIG, which should be longer term, but I think this project will go through phases with different goals right now as we progress through gates. So I am doing this quarter by quarter.

So, my WIG for this is to have no launch blockers in the product by March 31, 2024. There are several features missing that make it impossible to launch today (e.g. signup, forgot password, billing). There aren’t too many of them, and it’s very doable by March. To support our experimentation and product design, there are still other things we should do, but they are not blockers. We may not launch for other reasons, but not because of basic functionality.

My health/fitness WIG is simpler because it inherently doesn’t have dependencies.

  1. Where am I now? I am happy with my level of fitness and health. I have been vegan for a few years and I can generally stay in the weight range I want to be. However, since I was obese for many years, I still have more body fat than I would like. I use a body fat scale that says it’s about 23%, which is accurate enough for my purposes.
  2. Where do I want to be? I have been stuck at this level for a while. Realistically, I could shoot for less than 20%.
  3. By when? The end of 2024.

Fitness WIG: Go from 23% body fat to under 20% body fat by December 31, 2024.

My personal growth goal is related to writing, which is the main thing I have been working on for the past 3 years.

  1. Where am I now? I write regularly in this blog, and I have a writing-themed podcast that is intentionally off-an-on. In 2013, I got a book published by Manning and I have been paid to write articles for Smashing and other places.
  2. Where do I want to be? I want to have more longer-form published work that I sell.
  3. By when? One by June 30 and another by December 31.

Personal Growth WIG: Write two 50-page books by the end of 2024 and put them up for sale.

Tomorrow, I’ll show you how I applied the 2nd discipline.

How I am applying The Four Disciplines of Execution

I read The Four Disciplines of Execution (4DX) a few months ago. It was recommended to me several times—I wish I had read it sooner. It’s in the genre of business productivity systems, which is not surprising since one of the authors, Sean Covey, is the son of Stephen Covey (author of The 7 Habits of Highly Effective People).

Like many books in this genre, the book is part of an entire ecosystem, with courses, videos, etc. You can get a good overview there.

Here is a quick summary of the 4 disciplines (it’s more complex than this—the book is worth reading for details)

  1. Have a single important goal that would make a meaningful difference (in your business, life, etc). This will have some lagging indicator.
  2. Figure out a leading indicator that you can act on and track. This is something you can do every day that will build up to the important goal.
  3. Build a compelling scoreboard that tells you if you are winning (achieving the leading indicator).
  4. Have regular (weekly) accountability meetings where you only discuss the goal, leading indicators, and how to put points on the board

To give an example, here’s how I am applying it to my fitness:

  1. Important goal: Reduce Body Fat %. I am doing this primarily by increasing muscle mass. My lagging indicators are goals in bench press and strict pull-ups.
  2. Leading indicator: Days per week doing resistance training.
  3. Scoreboard: I track the workouts on my Apple Watch. I can see the count in the fitness apps I use. My scale tells me Body Fat % to make sure I’m on track. I am also tracking hours in Zone 2 and higher as a secondary indicator.
  4. Accountability: I review it weekly and schedule the next week’s workouts. I also go to Crossfit, which gives me access to coaches that can help.

My personal growth goal is to publish some pamphlets (short books) this year. Here’s my 4DX

  1. Important goal: publish pamphlets. Lagging indicator is 2 books.
  2. Leading indicator: Hours writing per week.
  3. Scoreboard: I’m using personal productivity software that I am working on.
  4. Accountability: I am making season four of my podcast about this where I will discuss my process and progress.

My work goal is to launch the productivity tool I am working on

  1. Important goal: Launch
  2. Leading indicator: Hours coding
  3. Scoreboard: Also tracking in this tool
  4. Accountability: I have weekly meeting with my partner where we discuss progress.

All of my leading indicators are in SMART goal format: Specific, Measurable, Achievable, Relevant, and Time-bound. The main difference is that they are very short-term and more about process.

Obviously, it doesn’t matter if I achieve the leading indicators, but not the lagging ones—the lagging ones are the real goal. The idea (from 4DX) is that leading indicators are something you can act on and track each day. You trust yourself to pick things that are likely to result in the bigger goal. You adjust if they aren’t.

Announcing Season Four of Write While True

I have been planning out season four of the Write While True podcast. Here is a recap of the first three seasons

  • Season One (Episodes 1- 15): Theme: The basics of a writing practice. Topics include first drafts, editing sweeps, keeping a schedule, and note taking.
  • Season Two (Episodes 16 – 27): Theme: Not quitting. Topics include Stopping vs. Quitting, using your imperfections to generate work, and planning a break.
  • Season Three (Episodes 28 – 39): Theme: The tools and materials of writing. Topics include complex sentences, words of the day, content-free sentences, and zombie nouns.

The theme of Season Four is writing a pamphlet (i.e. a short book). It will be 13 episodes to coincide with the first 13 weeks of the year. At the end I hope to have actually written a pamphlet and also to have explained the process I am using to do it. All episodes of Write While True end with a writing exercise. If you follow along with this season, I hope that you will also have a pamphlet to publish.

The first episode will be available this Sunday, January 7.

My Current (2024) Blog Stack

This blog is 20 years old. I started with static files generated from CityDesk and hosted on a simple server. Then, I went to static files generated from RapidWeaver on Mac. In 2012, I realized that I needed it to be easier to post, so I migrated to WordPress.

I very rarely updated this site in 2012. I finally decided to bite the bullet and get everything into WordPress so that I could update from any machine, not just the one I had RapidWeaver installed on. I immediately got a bunch of benefits (1) the site has a mobile theme (2) I can update from my phone or iPad using WordPress apps (3) dealing with images and other media is a lot easier and (4) publishing is automatic and fast. Since the migration, I have maintained about a weekly update schedule.

I have been on WordPress since then and can’t see any reason to change. A few years ago, I migrated to DreamHost, which I recommend for WordPress hosting. They can do more than WordPress—I also host App-o-Mat there (which is a custom Django site).

My theme is WordPress’s Twenty Twelve. Each year they make a new theme (named for the year). It was the default when I migrated, and I didn’t look for anything else because I wanted something plain, which it is.

I really try to limit my plugins. There are three that I recommend if you need the features they implement.

I use the Blubrry plugin to help me self-host my podcast. It generates the podcast feed automatically from blog posts.

I use the Contextual Related Posts plugin to put related links at the bottom of each post and the Exclude Pages from Navigation plugin to let me control which pages show up in the navigation.

Aside from those, I just picked the most popular ones for generating a sitemap and to make it easier to embed videos hosted on YouTube and Vimeo.

I use Hover as my domain name registrar.

I have no plans to change anything. I do keep an eye on the CMS sites that offer some distribution (Medium, Substack, etc), but I care too much about owning my URLs and keeping content in something I could easily migrate away from.