All blogs / Software / engineering practice
Jessitron
Jessica Kerr (aka jessitron) is a developer and symmathecist. Here are my accomplishments.
Software / engineering practiceAI / MLDevOps / SRE / infrastructureEssays / personal
- Posts
- 651 from 5 Sep 2011 to 14 Oct 2026
- Posting
- monthly (13 in the last year)
- Kind
- personal blog
- Feed
- https://jessitron.com/feed/
2026 11
- Sharing Theories with Agents
- When individualism worked
- Who are we Now?
- Symmathesy and AI with Kent Beck
- Verum Factum and the Creator’s Confidence
- What is it like to be you?
- Span or Attribute? in OpenTelemetry custom instrumentation
- Communication is hard, but sometimes I can fix it.
- Adding Correctness Conditions to Code Changes
- Working with AI: Do Things Right
- Working with AI: How does it Know?
2025 11
- Speak So They Can Hear You
- What is special about MCP?
- Ritual & its Consequences: book summary
- When efficiency isn’t wasteful
- Fixing Without Understanding
- Augmented Coding: Better with Principles
- Augmented Coding: an Experience Report
- Software development is…
- The world is terrible and great
- Cascading OKRs: We can do Better
- Hitting OKRs vs Doing Your Job
2024 16
- OKRs for Evil and Good
- Productivity v Impact
- Why is every startup’s website so darn useless?
- Command vs Control
- Communication Structures in a Growing Organization
- Who turns software into money? GTM
- How hard can it be to buy software?
- I can write the code. Getting something done is another matter.
- Going Deep on Gamification
- Bridges Summit
- Stupid bash tricks: a self-updating script
- Working with others is different from working.
- Fear and participation
- talk: Experimenting in Sociotechnical Systems
- Double Loop of Value
- Being the Best
2023 22
- Sending OTLP Logs from JavaScript
- OpenTelemetry in a script tag
- Enabling Gaps
- Software is Complicated, Given Enough Time
- Working Skillfully in Complexity (for VDDD)
- Testing an OpenTelemetry Collector deployed as a Daemonset in Kubernetes
- A Developer’s Starting Point for Integrating with LLMs
- Gamification: we can do better.
- Observability for Speed and Flow
- Participation without complicity
- No More Feedback (book summary)
- Why no traces? Traceflags 00 edition
- Accountability for Effective Teams
- Alignment gets expensive. Don’t skimp on it.
- Using ChatGPT in Anger (not real anger)
- Setting up ALB Access Logs in EKS using Terraform
- when the world feels wrong
- Error: missing ‘x-honeycomb-dataset’ header
- How to search for requests (vs all events) in Honeycomb
- bash: get the directory this script is in
- Book Review: Software Design By Example
- Resilience and Waste in Software Teams
2022 14
- Velocity defeats itself. Get acceleration instead
- import { utility} from StackOverflow
- Make https work on gRPC in Rust: load a root certificate into the TLS config
- Why we use kubernetes
- CSS for giving the extra width to the thing in the middle
- The Viable Systems Model, and where my team fits
- Run the OpenTelemetry Collector in Kubernetes for Front-End Tracing
- Why we have containers
- Keep your experiments separate
- Five Measurements You Should Make and Then Ignore (Plus One to Watch Intently)
- Every SaaS Integration needs an Upstream Point of Contact
- startSpan vs startActiveSpan in OpenTelemetry JS
- To share the work, share the decisions
- Starter Elm app that deploys on Netlify
2021 19
- Copy the Questions, not the Answers
- Tracing makes a bug easy to spot
- Software development pushes us to get better as people
- Symmathesies follow a power law, not a bell curve
- Product teams own capabilities, not (only) code.
- Minimum path to a Jupyter Notebook in VSCode
- What is this “product” you speak of?
- Run an OpenTelemetry Collector locally in Docker
- Better coordination, or better software?
- Project to Product asks more of our software, and more of us
- Three Easy Ways to Use Distributed Traces
- the Enterprise eats Software
- Software Design: Beyond Boxes and Lines
- A high-resilience org chart
- Systems Thinking for Developers
- yargs –do-things-right
- Those pesky pull request reviews
- One key trick to becoming a wizard developer
- When costs are nonlinear, keep it small.
2020 80
- 10x developer: work->knowledge->work
- 10x engineers: the Purple Developer
- Nonlinear increases in complexity make unification excruciating.
- UX request: Tell, don’t hide
- Every level is different
- To grow, yet not to control
- Being a responsible subsystem
- Reaction to the Tool
- Control from within
- Clockwork to Complexity: scale in time and software
- Software teams are like Executive Teams
- Code is a coastline
- Aircraft Carriers and Paper Airplanes
- Preserve, no. Sustain, yes
- Stupidity can be a plus in corporations — but not in software development.
- Disincentives are more powerful than incentives
- Back when software was a craft
- Principles of Collaborative Automation
- Grow to where we’re going
- Define roles by what each person increasingly knows
- The visible lines of division are not the meaningful ones
- The service you build doesn’t do a thing. It participates in a thing.
- Spring and JPA: use custom value types inside entities with a custom converter
- Fuzzy translucent background behind text in CSS
- motivate/enable
- skills v. practices
- talk: Shaving the Golden Yak
- Software development is like geriatrics
- Popper’s Three Worlds
- Developing software teaches us to design interfaces.
- Spring Boot log levels for development
- “Just” don’t
- Development as World Exploration
- Podcast: the Changelog
- I turned on Spring Security and my POSTs don’t work anymore
- Spring Security for h2-console
- What functional programming and secure code have in common
- Developer tools: extend your reach (with some work)
- Adding custom fields to Honeycomb traces in Rails by writing a Rack middleware
- Jessitron’s favorite git aliases
- Develop in Docker: Node.js, Express, & PostgreSQL on Heroku
- Honeycomb in Rails with separate dev and production events
- Honeycomb in Rails without hard-coding the API key
- Read a file with promises in TypeScript on Node
- Leverage as baggage
- Everything is terrible, especially software
- Control doesn’t mean you know what’s going to happen
- One Secret to Quality Software
- PowerShell equivalent of find
- Run Alloy on Windows in Docker
- Measuring effort gets you effort
- Subtasks vs Capabilities
- “Software” isn’t a thing
- Certainty as blindness
- I will not install your language tools
- Complication for the win
- PowerShell for `rm -rf`
- How will you collaborate?
- Keynote: Designing Change
- What makes a dependency dependable?
- No Roadmaps for Worldbringers
- Landing Zones, Long-term Desires, and Impossible Dreams
- PowerShell equivalent of ack
- Flow of what?
- Not about me
- Smaller pieces, lower pain
- Great software teaches
- Understanding, inside and out
- illusions of commonsense perception
- Capturing the World in Software
- Definition of DevOps
- Taking care of code … more and more code
- Fun with Docker: “Release file… is not valid yet”
- I don’t want the best
- Avoid Specificity in Expectations
- Go toward uncertainty
- Reducing WIP in laundry and code
- Games or gaming, Work or working
- Waste, fast and slow
- Open your eyes to the nonsense
2019 96
- A Christmas Adventure
- Smarter dishwasher, smarter cook
- How can we develop and operate increasingly useful software?
- Do things right in VSCode
- Basements and galleries
- Rebase on the World: personal shell choice
- Increase capacity, move slower
- Talk: TypeScript for Enterprise Developers
- Game science, programming science
- Work with the business, not for it
- 4 Terrible Ways (and 4 Better Ways) to pacify TypeScript
- Line endings in git
- Keynote: Collective Problem Solving in Music, Science, Art, and Software
- Layers in software: from data to value
- Development aesthetic: experiments
- This verbosity makes me happy
- Morning Stance
- Developer aesthetic: a command line
- Don’t build systems. Build subsystems.
- Nested learning loops at Netflix
- Don’t just keep trying; report your limits
- Stick with “good enough,” until it isn’t
- Rebase on the World
- Library vs service: who controls change?
- From complicated to complex
- A lot of rules
- In defense of rationality and dynamic programming
- Tools -> capabilities -> acclaim
- Safety and Progress
- Moving beyond simplicity
- Learning as becoming
- Don’t know. Find out.
- direct aims, broad interests
- Developers are system changers
- Regret
- To scale it up, smooth it out
- skills and/or understanding
- Increasing potential as a specific output of flow
- Closed games vs Open Games
- Closing the feedback loop from the customer
- Generativity
- The artifact and the process
- Every action has two results (Erlang edition)
- Victory at life
- Keynote: From Puzzles to Products
- An old idea in a new context is new.
- Give me feedback that is qualitative, broad, and random
- Progress in Learning
- Let’s reason about behavior
- Other people’s messes
- Mostly we orient
- Brains and eyes: hierarchies in vision
- Rules are not easy
- Human, or Person
- Why is CSS a thing?
- Implementing all the interfaces
- Rules in context: D&D edition
- These are not the only options. Wineglass edition
- Zooming in and out, for software and love
- Certainty, Uncertainty, or the worst of both
- For cleaner code, write ugly code
- The next architecture book you must read
- When the db is the interface
- Inertia in the interface
- Soft, or hard like mud
- Knowledge resides in teams
- Feature interaction
- Teams are like bread
- Develop before define
- When time gets tight, we make it tighter.
- Domain-specific laws
- From Puzzles to Product
- A definition of play, and how to live
- Correctness vs Change
- Change at different timescales
- Inner coherence vs usefulness
- Tiny dramas, tiny deploys
- Reasons, heuristics, and revealed intentions
- Designing Change vs Change Management
- Never and Always mean “right now”
- Action is a process. Reasons matter.
- Respond to input? No, we create it
- Reductionism with Command and Control
- Probability Spaces as reality
- One skill is not enough
- Adding qualities to systems
- How religion is important
- Five levels of learning
- Design by implementation
- Distance outside of maps
- this is not the beginning
- Predictability is hard, surprises are everywhere
- Mission Statement
- Strong Opinions Strongly Overrated
- Principles of Collaborative Automation
- Open Source needs Open Source companies.
2018 31
- CSS Positioning: a summary
- Growth Loops: circular causality is real
- Your Goals Are Holding You Back
- Shared Values are Overrated
- Things that are hard: trivial POST request from the browser
- Mutual Purpose and Agreed-Upon Methods
- Symmathecist (n)
- How I broke (and fixed) docs.atomist.com
- Advancing the bridge
- Ascendency
- Reading: Ecology, the Ascendent Perspective
- Align the stars (programmatically)
- REdeploy (for the first time)
- References
- Systems and context at THAT Conference
- When knowledge is the limiting factor
- Which came first, the chicken or the egg?
- Reading: Why Information Grows
- Do Things Right with TypeScript
- Do Things Right with npm install
- Kubernetes is like a dishwasher
- the future of software: complexity
- Get happy developers to do what you want
- learning to learn
- shared intentions: leveling up at helping
- Collective problem solving in music, art, science, and software
- Horizonal goals
- Does caring scale?
- Understanding code under change
- a thousand small problems
- Understanding Promises in JavaScript (with yarn and Legos)
2017 41
- a reference to Deference
- Deference or Collaboration: pick one.
- Automation story: GraphQL schema deployment
- Deliberate impermanence
- Why does it work?
- Not “why”
- smaller steps are the best steps
- Reference: Typescript asynchronous sleep that returns a promise
- Folding Tradeoff Space
- nope, can’t do everything
- can’t spend all day on self care
- Effective Use of Slack
- don’t make me think about style
- Shaping our Tools to the Flow of Conversation: Issue Creation
- Dictionary Objects in JavaScript and TypeScript
- the sweet spot: Local Automation
- Migrating some services from AWS to Pivotal Web Services
- personal automation example: deleting a local maven artifact
- See also: Diversity is not a magic pill
- The Golden Yak
- Stupid mocha stupid error
- The Royal Yak
- Trim Yaks
- The Imperial Yaks
- The Attack Yak
- A Taxonomy of Yak Shaving
- Hyperproductive development
- Video: Automating at a Higher Level with Atomist
- Clutter
- time-dependent rate phenomenon
- Code and Coders: components of the sociotechnical system
- The Architects Below
- a Rug story: adding test cases
- Reuse
- Correctness
- Scala Maven rugs
- Dependencies
- It’s Atomist Time
- Today’s Rug: maven executable jar
- Today’s Rug: maven executable jar
- It’s Atomist Time!
2016 13
- Using Rug with Elm
- Talk: Adventures in Elm
- changing systems
- Areas of responsibility
- Provenance and causality in distributed systems
- Stepping Stones
- Harder and better (slides)
- Tradeoffs in Coordination Among Teams
- Haydn or Beethoven
- distributed systems in a band
- Good news, bad news
- Property Testing in Elm
- Scaling Intelligence
2015 43
- Key signatures in piano music: the underlying technology
- Talk: Contracts as Types
- Getting off the ground in Elm: project setup
- Overcome the obstacle, or remove it?
- The Emperor has no clothes: Bad actors in tech
- ElixirConf keynote: Elixir for the world
- This was not OK (regrets)
- Functional principles come together in GraphQL at React Rally
- An Opening Example of Elm: building HTML by parsing parameters
- Data-in, Data-out
- Event-driven philosophy
- Ultratestable Coding Style
- Patterns and details
- make it small in importance in relation to the life of the surrounding world
- git: handy alias to find the repository root
- Teamwork by Design
- Fitting in v. Belonging
- Data v Awareness
- The Quality Wheel
- Isolate Failure Domains with PFWF
- Your Code as a Crime Scene: book review
- Post-agile: microservices and heads-up development
- Charting team course with a Seamap
- Today im getting my bangs dyed pink after the
- Looking for work
- Philly ETE, Design in the small
- Before balance, separation.
- Central vs Distributed Decisions
- Moving the Dot
- Gaining new superpowers
- Estimates and Our Brain
- Responsiveness over Control
- the New User Interface
- Microservices, Microbusinesses
- Fun with Optional Typing: cheap mocking
- Cropping a bunch of pictures to the same dimensions
- Nature vs Nurture vs Now
- Application vs. Reference Data
- Fun with Optional Typing: narrowing errors
- Readable, or reason-aboutable?
- Spring cleaning of git branches
- Special Snowflakes
- Systems Thinking about WIT
2014 57
- Accidental vs Deliberate Context
- My First Leiningen Template
- Dancing With Systems – The Donella Meadows Institute
- Programs v Software
- Learning to program? It’s time for Pairing with Bunny!
- HDFS Capacity
- Logs are like onions
- Contingencies
- A victory for abstraction, re-use, and small libraries
- REST as a debugging strategy
- Software is a tree
- Property tests don’t have to be generative
- Repeating commands in bash: per line, per word, and xargs
- A monadically built generator
- Talk: Concurrency Options on the JVM
- TDD with generative testing: an example in Ruby
- TDD is Dead! Long Live TDD!
- The power of embedded developers
- May I please have inlining for small dependencies?
- Quick reference: monads and test.check generators
- STLCodeCast, and a bit of Functional Programming in Java 8
- Property Based Testing for Better Code
- Stacking responsibilities
- Printing the HTTP status code in curl
- Testing akka actor termination
- A suggestion for testing style in Clojure
- GOTO Amsterdam: Respect the past, renew the present
- How to succeed without knowing how to succeed
- Data Flows One Way
- Limitations of Abstraction, and the Code+Coder symbiosis
- Declarative style in Java
- Highway Speeds
- Left to right, top to bottom
- You get to a point where you can feel like you are
- Work to Rule
- Work To Rule
- Tools
- Weakness and Vulnerability
- Weakness and Vulnerability
- Unreachable Stars
- Testing in Akka: sneaky automatic restarts
- Personal interfaces
- Personal interfaces
- Modularity in Scala: Isolation of dependencies
- Where is the Nanny?
- When OO and FP meet: returning the same type
- Property-based testing of higher-order functions
- Abstractions over Threads in Java and Scala
- ForkJoinPool: the Other ExecutorService
- Scala: the global ExecutionContext makes your life easier
- Choosing an ExecutorService
- Fun with Pool-Induced Deadlock
- Star Trek and Computer Science
- Libraries and Frameworks
- Removing files from git
- Why 2
- Testing akka: turn on debug
2013 59
- JVM Threads, ???, and Open Source
- Talk: Functional Principles for OO Developers (Ruby edition)
- Talk: When code reacts to data
- Trains within trains
- Narratives
- From lists to trains to functors
- git: I want my stash back
- Plan backwards, look forward
- Looking across the lines
- Git: Checkout multiple branches at the same time
- Data Exposure and Encapsulation
- Evolution of a developer
- Tools vs Self-restraint, and a Dystopian vision of FP
- A realistic use case for applicative functors
- Converting from svn to git: salvaging local branches
- Idempotence in math and computing
- Def and Val in Scala constructors
- Program relativity: F = d*c^2
- Special Relativity finally makes sense
- Why Aren’t There More Women Programmers
- Equations
- From Mario Kart to Version Control
- Finding and removing large files in git history
- Converting from svn to git
- From kicking off shoes to event sourcing
- A trick for deterministic testing of random behavior
- Abstractions in adulthood
- What, or how. Not both.
- Aqueductron – toying with dataflow in Ruby
- Pragmatism
- What’s dirtier than comments? Exceptions!
- Jen Myers Tumblings: Three words
- What FP taught me about OO: Liskov Substitution Principle explained
- Twisting the rules of logic in our code
- Behaviour vs Properties
- The Silver Pill
- Two Models of Computation: or, Why I’m Switching Trains
- Spiders
- Formal v Informal Structure
- Evaluating the Value of Code
- Every object you own is another claim on your time
- Property-based testing: what is it?
- Diagramming trick: pointing at text in Omnigraffle
- Scala: when is a val not a val?
- fittest vs fit enough
- Dataflow in Ruby
- Passing functions in Ruby: harder than it looks
- Come, Come, Commala: My husband’s excellent facebook status right now: Just got a message…
- Declarative management
- Unstructured teams
- Welcome All the People
- Baggage makes your life easier, and also crappier
- Scala: talking about yourself
- Jab hook cross
- True in UNIX, true in Functional Programming
- boundaries for freedom
- Mmmm bah
- From imperative to data flow to functional style
- Geeks, Freaks, Nerds, & Programmers
2012 113
- Context
- Jessitron
- TFS and Git: a comparison
- Git, the many parts: five categories of files
- Historical reasons
- Historical reasons
- On order and overhead
- We are all monsters
- The invisible hand that isn’t there
- Causality: tougher than it looks, but we can take it on
- Networking
- Many weapons against one Big Ball of Mud
- Pivot
- Scala: when you wish that Seq was a List
- A speaking experience
- Footnote
- Control limits potential: Internet edition
- sandboxed
- Imagination first
- So you want to be a programmer
- Jen Myers Tumblings: How to be awesome
- The chicken and the egg both come first
- Git Rebase inside IntelliJ IDEA
- Duck typing is like the force
- Why and how
- Sniffing traffic between my app and local CouchDB
- true in Undeath
- relationships
- we don’t know where we are going
- This is not OK
- Confessions of a woman in tech
- RNA vs DNA: tradeoffs
- comfort
- Functors: What the funk for?
- When is code data, and when is it code?
- What is flatMap?
- waste not, grow not
- mastery
- we do not exist in isolation
- Abstraction goes both ways
- perspective
- Iterators in Scala: glory and danger
- def in Scala: equals sign or no equals sign?
- Git: The Good Parts – history is written by the victors
- better than monkeys
- the one and the two, and the third in between
- Git: The Good Parts – moving files between trees
- Breaking stuff apart
- I played clarinet for years but i was never
- Shape your mind
- Unfinished a picture remains alive dangerous a
- When a programmer learns about a cool new tool he
- Bus drivers work only in strongly typed languages
- Your code is your team
- Control limits potential, part 2
- Advancement through operations
- The opposite of simple is not complex
- Brains, computers, and problem solutions
- A third way
- Get the whole story
- Why is code so much easier than people?
- This tumblr is not meaningful
- Amoeba Code
- Victory through failure
- Control limits potential
- Don Quixote was an Enterprise Architect
- What makes a functional programmer?
- Database versioning, Android style
- using checkstyle in gradle
- When a git branch goes bad
- Git Happens: the movie
- Real-life git-flow
- Choices with def and val in Scala
- Mental revolution
- in which I exhibit sexism in the same tweet that I complain about it
- Site search sanity
- the skinny on git-flow
- Saint Louis, Technology City Extraordinaire
- Expect to fly
- Android: Confirmation Dialog
- Connecting Java Projects in Gradle
- Why Functional Matters: Your white board will never be the same
- Return of the Stateful Client
- F# made Java easier today
- Oh, IntelliJ IDEA, how I miss you
- Testing Google Analytics locally
- services on a Mac
- configuring soundex in elasticsearch
- elasticsearch: first things first
- Inserting data into elasticsearch over HTTP: a breakdown
- Lessons from SICP: what is iterative programming?
- Excluding manual tests in Gradle
- Continuation Style Without the Fugly
- Bring the data to the code, or the code to the data?
- The confluence of FP and OO
- One level deeper
- Git: retroactive branching
- VCS as Biographer
- Static Methods Are Your Friend
- Abstractions in methodologies
- Strong Typing in Java: a religious argument
- Video review: Java.next
- Why programming is awesome
- F# Snippet: sequence partitioning
- Daily Javascript: input arguments to scripts
- Daily JavaScript: empty objects
- Cross-platform problem solving: how an Android Pro Tip helps our web app design
- Stupid git tricks: transferring part of one git repo to another
- starting to maybe get the point of node.js
- Encapsulation in Javascript
- Consistency in Scala
- For-confusion in Scala
- Familiarity v readability
2011 25
- IntelliJ IDEA 11
- Gradle is easy: Groovy tests
- Git is hard: applying single commits to another branch
- Git is hard: amending commit history
- Humility in programming languages
- Stupid Gradle Tricks #1: what can I do in this block?
- Lifting the blankets of Gradle
- What to look for in a BPM system
- Dependency Injection vs Functional
- Setting up an Android project in IntelliJ Idea
- Debugging Log4J: where are my log messages going?
- Debugging Hibernate: what database am I connecting to?
- Platforms vs Process
- Profiling for Fun and Profit
- Product vs Platform in Programming Languages
- Dart. What’s the point?
- Keeping Your Cache Down to Size
- Goodbye, MapMaker. Hello, CacheBuilder.
- Stupid Oracle Tricks #1: SQL substitution variables
- Finding Primes in Haskell
- Spring configuration returns home
- Guava: pidgin functional programming in Java
- A small correction: F# active patterns
- Why
- Why now?