What software engineers bring to AI-assisted software development LLMs don’t mean the end of software engineering as a profession.
Why tech companies encourage their software engineers to use LLMs It's not news that many tech companies are encouraging or even requiring use of LLM coding tools like Claude Code. While reading Sean Goedecke's post about bad code at big companies, it occurred to me that tech companies are happy to have their software engineers use …
Streamlining my user-level CLAUDE.md This post follows up on my post about getting good results from Claude Code. I've recently streamlined my ~/.claude/CLAUDE.md based on: * Informal observations about what Claude does and doesn't do well * A desire to avoid conflicting with principles that seem to be built into …
Getting Good Results from Claude Code: Writing Good Prompts Key to getting good results from Claude Code (and similar LLM programming tools) is writing good prompts. This is one area where your own programming expertise comes into play; you need to use it to provide guidance to the LLM and nudge it in the right direction. Good prompts are …
Give your LLM Coding Tools Their Own Tools Model Context Protocol (MCP) allows LLMs to call "tools" that can do anything: interact with your filesystem, search the Web, hit an external API, or even help guide the LLM through a structured problem-solving process. A single MCP server provides one or more tools; for example, a research …
Getting Good Results from Claude Code An updated version of my user-level CLAUDE.md is featured in this post from December 2, 2025. I've been experimenting with LLM programming agents over the past few months. Claude Code has become my favorite. It is not without issues, but it's allowed me to write …
Cocoa’s mutable-subclass pattern is an antipattern We know we can’t mutate a mutable array while enumerating, and yes, we have to take care to avoid that. But wait a second—why is that *our* problem, as users of Apple’s Foundation framework?
Be Proactive: Use Reactive A high-level, easy-to-grasp intro to the core concepts behind reactive programming.
Casting in Swift 1.2: a brief summary Swift 1.2, in beta with Xcode 6.3, makes some changes to casting. Here’s how as, as?, and as! work: * as is for guaranteed conversions. That is, use as when the compiler can type-check that the conversion is valid; and Swift won’t compile a as cast it …
IBOutlet declarations in Swift Xcode’s default IBOutlet declarations are weak references to implicitly unwrapped optionals. This is wrong.
Subjective-C: I use property (dot) syntax liberally I have long argued that methods which look, walk, and talk like getter methods should be called with dot syntax.
A list of Auto Layout DSLs, Categories, Etc. Everyone has their own Auto Layout helpers. Here’s a list.
The problems with due-process-compatible cryptography Over a sufficiently long timetable, we can only trust cryptography, not due process.
Why non-engineers should care about “Technical Debt” Technical debt is an abstract concept, but it will impact your customers in tangible ways.
Why Reactive programming techniques are valuable Reactive programming gives us better tooling to deal with mutable state.
Physics in Interstellar I was willing and ready to accept pretty much all of the science in Interstellar. But I have one big problem: rocket fuel.
Back Buttons for Web View Controllers If Zawinski's Law applies to desktop software, then I propose a corollary for iPhone apps: every app expands until it includes a web browser. In-app browser design is something I care deeply about, mostly because everybody gets it wrong.
Real World Singleton Design A discussion of practical architectural concerns when designing a singleton for a real-world iOS application.