August 6, 2026

Generational Tech Debt

This Sunday morning, my son played two games I wrote 23 and 24 years ago for a device now long gone:


(This is a "Telenor Smartphone", an ISDN-based beast of a device from the early 2000s)

To be precise, what he played was an HTML5 port of a Snake game and a PacMan clone, running in Chrome on my Mac. Claude Code, with Opus 5 as the underlying model, got both right on the first attempt. When he found PacMan a bit too hard, we added a "cheat mode" where the ghosts are 20% slower and you can eat them for twice as long. Then it was just right, and he had good fun. Which is my first and most optimistic point: AI can make all of us builders, and being more efficient, we can build and tinker much more than before.

As a side track, I also asked Claude to review the old code, expecting to be told I was a genius for having pulled this off on the side while studying. Not so much. When a review opens with "what is most impressive is not the code..." and goes on about the level of reuse we would expect today (it did bring up Fowler; in my defense, what we expected in terms of reuse in 2001 was not quite what we expect now), you know it is not giving you an A+. I did get credit for some architectural choices and for being clear about tradeoffs in the comments and whatnot. I'll take it.

Back from the 25-year-old vintage code. In my role as product manager at Artifik, where I still code even if slightly less than I would like, I estimate AI has made me factors, not percentages, more productive at writing code. We also find AI very useful for testing, for design work and prototypes in particular, and for general office work, but we have a way to go before we see quite the same improvement there. Which brings me to my second point, in the form of a question: Will AI deliver the same level of improvement for all work as it already has for coding? My current best guess is that it very likely will. Going beyond work that manifests itself digitally will likely only happen in the longer term, even if Optimus and others already do impressive limited demos.

This is a slide I often use when I present about our use of AI externally:

(Please go and see "Annie Get Your Gun" on Broadway rather than suing me, image courtesy of Spotify album from the musical. Fun fact: In Norwegian "AI" sounds more like I, so it works even better)

Cheeky, but it feels more and more true.

A concrete signal of that spreading beyond code: Cloudflare has just open sourced Cloudflare OS, the AI productivity environment they use internally. The interesting part is what they call gadgets. When you make a slide deck there, you are not connecting to a slide deck service somewhere in the cloud. The system creates a private instance of the slide deck software just for you, and if it is missing something you need, you ask your agent to add it. A gadget sits somewhere between a document and an application, rewritten by the user with AI as they go, and it blurs the line between apps and data. Worth a pause, because blurring that same line is exactly what SaaS did to the dominant design before it, when your data stopped being a file on your machine and became something living inside someone else's application. SaaS may be about to get the treatment it gave the desktop.

Their contribution policy may be the most interesting thing in the repo, and it is where this stops being about Cloudflare. They are not accepting external code contributions, and the reason they give is worth quoting in full:

"AI has made writing code easy. The hard part, today, is not writing the code, but reviewing it, making sure quality stays high, and keeping the product coherent. In that light, unfortunately, external code contributions are 'donating' the easy part of the job, while creating more of the hard work."

My main point of this post is about tech debt, and not the conventional kind. I am quick to dismiss the "when you use AI you create a lot of code no-one owns or fully understands" worry. This happens with human team members as well. It just happens faster when you are more effective. And getting to know unknown code is something AI does insanely well. In fact you can argue that it does more or less exactly that every time you use it, however perfect your harness is. (Look out for "I had to build my own harness or model router" as the same risk marker as the people who wanted to home-cook their own template engine or dependency injection framework a decade ago, by the way.) None of that keeps me up at night.

The one version of that worry I do take seriously is the one Cloudflare just named: The problem is not that nobody owns the code, it is that right now review, taste and coherence do not scale the way producing code does. I am guilty of producing quite a bit of that work myself, liking to "get things done" with AI.

My real worry, though, is what I will call generational tech debt: the competence, and even the taste, for coding and architecture that never gets built in the first place. I don't mean only that the people who knew a particular piece have left. I mean that fewer and fewer people learn coding deeply, and therefore never build the muscle memory that later shows up as sound architectural choices, and as not making the same mistake twice.

It could be that in the long run we will simply see other competencies mattering more, and that the next generation of software professionals has a different profile. That is a real possibility, not a strawman. But there is some combination of skill, taste and creativity that I think takes longer to develop than AI can currently shortcut, and right now I do see the danger.

Readers of the poker series here will have seen this film before. Solvers arrived, and a generation of players got sharply better and sharply more correct. What did not obviously come along was the ability to look at a specific bad opponent and work out how to take his money, because a solver assumes the guy across the table is playing as well as you are. It also cannot tell you which spot to solve, or what your bet sizes should be, and it hands you an answer per node, while the real work is compressing thousands of those into something you can use at the table without a laptop.

I think coding is running the same experiment, with one difference that should worry us more, not less. In poker there was a ground truth. You could go home, run the spot, and find out you were wrong. There is no solver for "should this be a separate service", and no printout telling you your abstraction was bad. The bill arrives three years later, disguised as something else, usually as reduced velocity.

Which leaves a tension I have not resolved. My first point was that AI makes all of us builders. But at this moment in time, AI coding is still at its best in the hands of people who were already very good at coding and building manually. Both of those look true to me. The uncomfortable question is: Where should the next cohort of already-very-good software people come from, if the ladder they climbed is the part being automated? This is the more fundamental tech debt, and a generational one, with potential impact beyond individual companies.

This might of course change. For casual users, AI already mostly catches your intent correctly, where 6-12 months ago you had to get the prompt just right. I suspect much the same will happen to coding. It could be that when humans look back, what amazes them will not be "you can instruct computers in your own language to do things from scratch", but the perhaps relatively brief period of give or take 70 years where we actually had to have specialists communicate with computers in their language, rather than use ours.

So what do I want my son to do to be prepared for this world, besides playing the games I coded a quarter of a century ago? I don't have a clean answer, which is a little uncomfortable in a post that spends this long on a danger. The cliché is still the best I have: Enjoy what you do, be very willing to adapt, and love learning. I know the feeling of being in the steepest part of the steepest S-curve is partly a feature of getting a bit older, but heck, things are moving faster than ever. At least I do enjoy the ride. The title was not intended as a pun on what I owe my son in advice or tech training. But as an installment on that debt, I try to supplement Mark Rober (former NASA engineer, of thinking-like-an-engineer YouTube and Netflix fame, and one of my son's favorites) as best I can.

May 24, 2024

What I have been up to

Long time, no blogging. And this is not really an attempt at getting back to it at all, but just intended as a quick update of what I am doing now and have been doing lately:

  • Artifik is where I am spending most of my time, as CTO - after being CEO getting us beyond MVP and to the first ten early access customers. We are building a procurement platform where it is easy to do things correctly and follow legal requirements that apply in particular to public procurements. At the time of writing, we are passing 20 paying customer and are around the same number of people involved in total (around half of that, counted as FTEs). A very exciting place to work as we are entering the scale-up phase, utilizing AI and cloud native serverless architecture.
  • Ledidi has been growing up. I am out of the day-to-day with them having an employed CTO and their own development organization, but I am still part of the board and a significant shareholder despite selling some shares. They won a very important contract before Christmas with the largest hospital organisation in the country and things look great.
  • Prokarimi - our startup in partnership with Genetic Analysis that is doing analysis of gut microbiota, often associated with irritable bowel syndrome (IBS), with home tests - have built a platform and have sent out their first test kits to paying customers. My good friend and partner Fredrik is heading this now and I am somewhere between a hands-off CTO and an advisor and board member here.
  • Apprendly intend to revolutionize how game-based training can be created and consumed, using AI and the same engines that power state-of-the art computer games. 
  • Comono has moved even clearer in the direction of being a consultancy not looking for clients, but rather mostly working on our own stuff - meaning startups or projects where we can have a stake beyond selling hours. 
Following up on the last point, do get in touch if you have superb domain knowledge and a solution to a problem that you believe could be a startup. We often provide specialists in full- and part time roles, early funding and/or work for sweat equity.

As for the development in Comono: When we got together in Timisoara in the late summer last year, we counted around 35 people from partners - including Enovatika that were excellent hosts and we own half of,  startups we have founded and Comono itself. This was amazing to see and experience, going wine tasting in Recas with colleagues and friends. Comono now includes Comono India, which itself runs the startup Prevale that provides compliance as a service. In Oslo we are around ten people, with offices in Gamlebyen Loft, next door to Fuglen coffee. 

And if you wonder "weren't you in edtech?", that is absolutely the case, but not so much these days beyond the board seat in Apprendly - with our reading platform Lesemester being acquired by Lexplore, where I was part of the board for a while and has helped a bit here and there as an advisor. Inspera is still going strong, but beyond coaching a small team we have helping there, I am not involved much anymore. I do help Creaza a bit still. Finally, I am sometimes being asked to assist on things like DD processes and reviews of software development organizations as a subcontractor to one of the big strategy consultancies.

On the private side, I enjoy being a dad, still like poker as a hobby (100% cash rate in the Main Event!), have picked up eFoiling as a great alternative to surfing given our relatively wave-free location of living in Oslo and feel like I have nailed the work/life balance a bit more than when I routinely worked 70+ hours a week. 


August 25, 2020

Balance and board coverage

Let's leave poker for a bit and turn to the almost as thrilling game of rock, paper, scissors... Let's say you meet someone for the first time and you are going to play 1000 times, having written down all decisions upfront. Having no specific info on the opponent, it is pretty intuitive that the strategy that cannot be exploited is to choose each of your options 1/3 of the time.

Let's consider another game of rock, paper and scissors. This time you know that your opponent will always play rocks after being beaten by scissors when holding paper. What do you do the round after winning with scissors? You win again with paper. You just exploited your opponent's (maybe your young nephew's?) unbalanced play of rock, paper and scissors.

Similarly, in poker there are situations in which you need to make your opponent indifferent what decision to make (in principle not being able to exploit you, even if they knew your overall strategy in this position - formally you can read about Nash equilibriums where neither player can change his strategy to improve in a zero-sum two-player game), unless you want to open up for potentially being exploited.

One example of this, is to bluff just enough. If you always bet your strong hands and never when you miss, you become easy to play against and you never get paid off with your monsters. Conversely, if you bluff all the time, you will get called down by marginal hands beating you ("bluff catchers").

Another usage of the term balanced in poker, is about the hands you play from street to street - you might hear people discussing keeping ranges balanced. In the combos example, I threw in a hand in the other players range that some of you might be surprised to find there, A5s. That was not completely random, even if it is highly debatable if this specific example was "good". The same concept applies to each of the actions, ways you continue in the hand. If you never have a strong hand on certain rivers after checking the turn, you will be easy to exploit.

This leads us to the last topic of this article, namely board coverage. What I mean by board coverage is closely related to balance, but has the specific meaning of hitting flops - or other later streets - that might not be expected by your opponent (or conversely, make it hard for him to make exact estimations about which flops you hit).

Let's say you play AK, AA, KK and QQ a certain way preflop. If this can be recognized by a skilled opponent and the flop comes 589 rainbow, you opponent might easily take the pot away from you with nothing. But what if you decide to play for instance some percentage of 76s and some percentage of T9s the same way you play aces from UTG pre-flop? The exact profitability is hard to compute, but for sure you have made yourself harder to play against post-flop.

It should be noted that taking the board coverage so far as to mainly play hands for their ability to make surprising hits on the flop, is highly unlikely to be profitable. The best way to make money at poker is still to get chips in good, meaning you have a better range than your opponent. But mixing in some hands with decent equity is almost certainly better than playing 100% ABC and nitty. An important part of this is also to get paid off when value betting. You could almost just as well hold a T9s for the busted straight draw as your AA overpair, right?

Similarly, you may hear people talking about "balancing their check-back range on the flop". Same thing here: If your opponent know that if you check back flop, you never beat top pair, then you have a problem. Thus you should take some combinations, or some frequency with some hands, to check back. Top set is actually a decent check-back on some dry flops (as it blocks top pair very hard and is not so concerned with protection, the argument against is that it really wants to build a large pot - so this applies mostly when not extremely deep-stacked), as can weak top pairs be. Also, if you decide to check-raise sometimes as a bluff, you need to do the same with some value to avoid being too predictable.

Practically, if you decide to check back top set half - or some other percentage - of the time, you can do that based on suits of the cards you hold or simply by using a watch - for instance the tournament clock looking up "to check the current blinds" - and using the seconds to determine the action.

I realize this short article clearly can not teach you about balance in any complete or maybe even meaningful way by itself. I do hope it inspired further learning and research, though - a good next step can be the two Play Optimal Poker books by Andrew Brokos (as mentioned in the previous article, my name is in fact in the acknowledgements-section in POP2, after having found a couple of small "bugs" in an early edition!).

This actually completes the small 7-part series on poker math - boldly nicknamed "gems". As I mentioned in the intro, I might come back with some more advanced topics later - skill and time permitting. Shout out if there is something that you would like to see here, and I'll do my best. I do plan to write a small piece with some book recommendations as well, so stay tuned.


Basic (but badass!) understanding of blockers

In the previous article, we implicitly touched the topic of blockers. Since we were holding QQ, there was only one combo of QQ out there. This is an obvious example of blockers, i.e. effects of your cards on your opponent's possible holdings. Let's look at a few more, including a few more subtle ones - including using blockers for deciding to bluff or not, which is what I am thinking might approach the badass part of the title.

Let's look at two samples:

Blockers can increase the value of a call

Hero: TT
Board: 78
32♠J

Let's say we face a 2X pot overbet on this river. For some players that can literally mean that they either have T9 or that they are bluffing (maybe not a fair assumption, but even if T9 is only part of the value range, the point we are about to make will hold), for instance with the missed diamonds or spades. 

Even if your opponent is playing completely unexploitable here (i.e. has exactly as many bluffs in relation to value as he should, which for a 2X pot bet should be 40%[1]), your cards give you extra information that likely makes this a profitable call: Since you hold TT, you automatically cut the number of T9 combos from 16 down to 8. Furthermore, if you think your opponent would only play the suited version of T9 given the action and positions, it is actually just two combos available out there.

Blockers can give profitable bluffs

Hero: A9
Board: 78
T♠2♠3

Let's say we face a 1/3 pot bet on this river after our open-ended straight draw bricked. This bet is not very polarizing, and could probably be top pair, overpairs, two pairs and the like - depending on the action so far in the hand. Since we hold the ace of diamonds, we can be hundred percent sure our opponent does not have the nut flush. Thus a very large raise should be a more profitable play than if we did not have this card.

Bunching - the least exact blockers that are

In the example of pot odds, we were waiting for an ace. Do you think the likelihood of getting that ace is different from getting a ten - if that was what we were missing? In fact it might be. Using bayesian probabilities, we might estimate that hands with aces are played much more often than hands with tens. So even if we don't know this, the number of players choosing to see the flop might very well give us useful information. This concept is sometimes referred to as bunching. It is not a super important concept, but interesting enough - we can maybe think about them as (very!) fuzzy blockers. I've seen arguments, I think Barry Greenstein made it back in the days, that if 7 people folded in front of you, it can be enough to make AK a favorite (it is normally around 47%) against low pocket pairs all-in.

For more on blockers, I strongly recommend the two Play Optimal Poker books by Andrew Brokos (hey, I am even mentioned in the acknowledgements-section on the second after having found a couple of small "bugs" in an early edition!). Having briefly touched on blockers, we'll jump to a similar light-touch introduction to balance before concluding this mini-series of 7 gems of poker math. 

[1] - This follows from a formula Bet/(2*Bet+Pot) that we have not covered, as I want to keep this very practical and I have found it relatively hard to use in practice - but it has to do with the pot odds you offer your opponent. The effect of the formula is that if you have plenty of bluffs, but also some very strong hands, you can bet very large. And if you are less polarized based on the action so far, you'll "run out of bluffs" and thus could be exploited by overfolding if you bet very large.

Counting combos to calculate rough equity

In the pot odds example you had the luxury of knowing exact which hands the villain was holding. Real poker ain't like that. You may, however, find yourself in situations where simple math can help you make the long term profitable decision, given the right assumptions.

Let's get specific - and still have the luxury of knowing what the opponent is playing, but only as a range of cards: You hold QQ and get 4-bet pot-sized in position (for instance on the button) from a player doing this with AK, AA, KK, QQ, JJ, TT and A5s. Is it profitable to call? Let's assume you get to realize your equity exactly against each hand (will only be exactly true if you have just that pot sized bet behind).

To answer if the call is profitable or not, we can use a range vs. hand equity calculator like Flopzilla and get the answer directly (and it is useful to know a few common match-ups by heart). But we can also use a more manual shorthand approach that is somewhat feasible at the table. We break down the opponents possible hands into:

- AA and KK, which have you crushed (80/20) - a total of 12 combinations, 6 for each pair. To count the combos just practice starting with Ah - which has three aces to combine with, then two more for Ad not yet considered, etc.

- AK (16 combos) and QQ (one combo) that you roughly flip with

- JJ/TT (6+6=12 combos) that you have crushed (80/20)

- A5s (4 combos) that you have dominated (almost 70/30)

In this example, we can easily see that the hands we crush and the hands we are crushed by cancel each other out in terms of combos. Since there is money in the pot - in fact the pot odds is 33% - and we get around 50% equity, we should clearly call, unless there is some specific reason to be risk adverse, like a tournament bubble. If your opponent sometimes includes 99 or AQ when doing this (as an exercise, count the combos of AQ - remembering you have two queens!), the call becomes even clearer.

If they never do this with QQ, JJ or A5s, suddenly we can see that we are up against roughly 40% (12/28 or 43% at 20% equity) combinations that crush us and 60% (16/28 or 57% at about 55% equity) that we flip with. Thus we can weight our equities in our head to a bit less than 40% by doing the 0.4*0.2+0.6*0.5 in our head. 

If doing arithmetic in your head is not your strongest side, a neat technique can be to visualize 20% and 55% in your head and go about 60% of the distance between them to find the estimate. The difference between 20 and 55 is 35, so you should go about 21 percentage units up, or to around 41% (which is in fact closer to the exact value than my rough math above where I substituted .5 for .55 to simplify the arithmetic). Still a call in our example, but getting closer - and the method and not the answer is the point here.

The same technique of counting combinations of bluffs (which busted flush draws can your opponent likely have given the action on the river?) and value can be used on the river, where you usually have much more information and also more known cards. Some of the known cards are in your hand, which is commonly referred to as blockers - which is the topic of our next small piece.

Implied odds, fold equity and EV estimation

I have not introduced the EV, expected value, concept formally in the previous articles, and will not end up doing it now either (but you'll find the Wikipedia definition of expected value linked, if interested), as I promised to not spend time defining basic statistics. That being said, I'll present to you some poker-specific nuances of how to calculate EV.

Maybe you noticed how the pot odds samples I gave you were all from the river facing a bet? This means there were no more actions to come (unless you raised, which we excluded from the game rules here by manipulating the stacks) - and since you knew what the opponent could hold, at least with a certain frequency, the EV estimation of a call had a final answer.

In our first example on the basic probabilities, there was more cards to come, though. To recap:

Hero: JT
Board: KQ23

Here, when facing a 1/2 pot bet, we know from the pot odds that we need 25% equity for it to be profitable to call as such. But since there is potential for more action on the river, we might win more than the current pot if we make the call. This is called implied odds. In this specific example, we need at least an additional 8% or so implied odds to make the call - as we calculated before that the pot odds were 17% or so. Since this is based on the turn pot size, even a small river bet paid off - the exact % of a pot-sized-bet would in fact be the same as the "missing" pot odds on the turn - will make this a call.

When calculating implied odds, do not assume you can always get the opponent's stack if you hit your hand. Think practically about if some of the outs are likely to give your opponent an even better hand - often called dirty outs. This can for instance be outs that also complete a flush, when you have a straight draw. Furthermore be careful counting on implied odds for outs that make it very unlikely that you will get paid. Four to a flush or four to a straight on the board are prime examples of the latter. That being said, implied odds helps us quantify exactly how much extra you need to get compared to the raw pot odds. So while it is still a judgement to make, we can quantify what the result of that judgement needs to be to make a call profitable.

Open or not - do I have the best hand?

The title might be promising a bit too much. If this post could really tell you if you have the best hand or not, I would charge you for reading it. What it will give you, is a thought experiment I did lately and found useful for thinking about whether to open or not from a given position.

To estimate if it is likely that I have the best hand in a given position, let's do this thought experiment:
- Let's rank all opening hand combos from 0 to 1 linearly
- Let's say you are in the position with N players left to act behind you

So, how strong a hand do you need for it to be likely the best? If you are in the SB in an unopened pot, it is pretty obvious that the chance of you having the best hand is 50% before you look at your cards. And if you look at your cards and see a hand of strength 0.75 (let's call this S), it means you have a 75% chance of holding the strongest hand.

A bit more formally, we might define the function P(S, N) such that it gives the likelihood of your hand strength value being higher than all the ones behind you. You might already have guessed that given random distributions (that I hope your poker room or home game has!) that this probability will be (we'll treat the individual hands as independent and ignore the effect of folded cards, which is safe enough anyway - a word on so called bunching will follow in the last article of this series):

P(S,N) = S^N

You'll find range builder software that will give you answers to exactly what a particular range will translate to in terms of cards. I will not claim to have the final answer, but a "15% range" (meaning the bottom being S=0,85 the way we defined it) might look like this:



The bottom of this range, which might for instance be the hand QJo or so, is only 27% likely to be the best if opened from UTG (under-the-gun, the first position) 9-handed. Opening on the button with only the two blinds left to act, it is about 72% to be best, following our simple model.

This is very simplified, since playability and not only raw hand strength decides which hands to open and not. In any case it is pretty stunning how position affects the likelihood you actually have the best hand, right? Of course your opponent knows this as well, which might make the UTG bluff more effective than the button bluff... Trying to approach that mathematically will be for another article at a much later time, though - let's just say that it is a clear mathematical bound to how many hands you can open for a profit. Let me know if you think my approach here was too simplistic (or too complicated, for that matter).

Anyway, the calculations here are not intended to really give you formula to give you a correct range of hands to play for each position. They are however intended to show you that it is clearly correct to play a significantly different range from the first and last position. Missing how large this difference is supposed to be, is one of the major weak points of beginner players. After the flop UTG will also often play out of position (act before anyone but the blinds), which should also strengthen the requirement to open UTG or other early positions.

And then you might be thinking: If I follow this "recipe", everyone will know exactly what I am playing from every position? Yes and no, and we'll try to touch on this in a later article about balance and board coverage. The short answer is that we should make sure to include some less obvious hands and that beyond that it does not really matter, in fact if you play 100% mathematically sound you could inform your opponent about your entire strategy and still the best they could would be to break even against you.