Thoughts
Argued opinions and practical notes on building, buying and running software: languages and frameworks, AI-assisted engineering, architecture and the business side. Written by Paul.
-
The AI coding agent workflow: the spec is the work
Copilot Workspace put the plan before the diff in 2024. Two years on, coding agents pay off where the spec and its review are treated as the engineering work.
-
The cost of adding AI to an app is mostly engineering
GPT-4o halved GPT-4-class prices in May 2024. Two and a half years on, the model bill rarely decides an AI feature's cost; integration and upkeep do.
-
B2B SaaS free trial length: set it by time to first value
Fourteen or thirty days? For B2B software the trial should match the time a customer needs to reach first real value. Measure it before you pick a number.
-
Cloud redundancy is not a backup: keep a copy outside your provider
In May 2024 Google Cloud deleted UniSuper's private cloud, replicas included. Keep one tested copy of your data where your main cloud provider cannot reach it.
-
EU AI Act obligations for small businesses: start with an inventory
Start an AI Act review with the systems you use, your role and their purpose. Chatbot providers must assess output marking as well as disclosure to users.
-
Treat your hosting exit plan as a business responsibility
A locked hosting account can affect your website, email and recovery access. Keep control of your domain and backups, and rehearse the move before you need it.
-
Kotlin Multiplatform vs Flutter: share the logic, keep the interface native
Kotlin Multiplatform can share business rules while keeping interfaces native. Assess fit against your app's complexity and your team's Kotlin and UI skills.
-
Next.js caching explained: why version 15 stopped caching by default
Next.js 15 turned off default caching for fetch, GET handlers and page navigations. Why the old default served stale data, and how to audit a Next.js 14 app.
-
React Compiler and useMemo: audit skipped code before deleting useMemo
React Compiler skips components that break the Rules of React, without failing the build. In an inherited app, use it as an audit first and delete useMemo last.
-
Does your SaaS vendor train AI on your customer data?
The Slack AI debate showed why SaaS buyers must read agreements and referenced policies together. Six checks for model training, opt-outs and data exports.
-
Use server-side sessions until JWTs solve a specific problem
For a web app with one backend, server-side sessions make logout and access changes easier to control. Use JWTs when independent verification earns its cost.
-
Is Stack Overflow dying? What the OpenAI deal showed developers
The 2024 Stack Overflow and OpenAI deal showed who controls public developer answers. Two years on, the knowledge a company can rely on is what it writes down.
-
Software development outsourcing: decide who owns delivery
Choose what to outsource, compare development partners, and use a responsibility worksheet to agree acceptance, access, support, and exit before work starts.
-
Mobile app development cost: planning a native iOS release
Understand the work behind an iOS app estimate: user journeys, device features, backend integrations, App Store release, and ongoing maintenance.
-
MVP development cost: what belongs in the estimate
Compare MVP development estimates by user journey, integrations, acceptance criteria, ownership, and the costs that continue after launch.
-
MVP vs prototype: what should you build first?
Choose a prototype, proof of concept, or MVP by the question you need to answer. Use a decision table and a practical first-release brief.
-
Planning custom software development: scope and cost
Prepare a custom software development brief: users, workflows, integrations, scope, cost drivers, and acceptance checks before you ask for a proposal.
-
Software maintenance cost: what your budget should cover
Estimate maintenance for an existing web app or SaaS: separate takeover, upkeep, support and feature work, then compare what each quote includes.
-
Vibe coding cleanup: how to hire help for your app
Need help with an AI-built app? Define the failure, agree a repair scope, and ask for evidence on permissions, recovery, deployments and tests.
-
Web app vs mobile app: choose the first platform
Decide whether your first product needs a web app or a native mobile app. Compare user journeys, device needs, offline work, release scope, and ownership.
-
Choosing a language for software you will maintain
Rust, Rails or another stack? Choose for the application, the people maintaining it and the cost of operating it, rather than a benchmark ranking.
-
Codebase takeover checklist: what to inspect before accepting a system
A reusable checklist for taking over software from another developer, agency, or team: access, production, data, change safety, dependencies, security, knowledge, and cost. Use it before you agree to own the system.
-
Production-readiness checklist for AI-generated applications
Thirty concrete checks that separate a working AI-generated (vibe-coded) prototype from production software: security, data, failure handling, operations, coherence, dependencies, and ownership.
-
What a good software handover should contain
The seven artifacts an outgoing developer or agency should hand over with a software system: access, environment map, operating manual, architecture notes, decision log, open issues, and a recorded walkthrough.
-
Software needs an owner
Software becomes expensive when nobody clearly owns it. Ownership is a role, not a repository permission, and most struggling systems are missing it.
-
Repair or rewrite?
A rewrite is a conclusion you reach after understanding a system, not a starting point. Most systems proposed for rewrite need an owner, a plan, and a few months of repair.
-
Taking over software after the developer leaves
A practical sequence for inheriting a system whose builder is gone: secure access, understand production, write down what nobody wrote, then change things.
-
AI-built software still needs an engineer
AI changes how code is produced. It does not remove technical responsibility. Software generated quickly still needs someone who understands it and answers for it in production.
-
Maintenance is product work
Most of a product's life happens after launch. Treating maintenance as a cost to minimize is how software quietly degrades and how the best improvements never get made.