A blog by Gary Bernhardt, Creator & Destroyer of Software


PeepCode Play by Play Screencast


Rebase Is Safe
An Aside About Shell Conditionals
Screencast: Custom Vim Refactorings
Screencast: Python to Shell to Ruby
Specificity, Faking It, and Making It
The Tar Pipe
Why I Switched to Git From Mercurial
My Startup Talk From NWPD 2010
A Raw View into My Unix Hackery
Python vs. Ruby: A Battle to The Death
Functional and Non-Functional Testing
Test Double Injection Inversion
String Calculator Kata in Python


On Abstraction
Refactoring A Cyclomatic Complexity Script
The Limits of TDD
How I Started TDD
The Value of Continuous Processes
My Personal Failures in Test Isolation
Cyclomatic Complexity in Vim: First Steps
Dingus 0.2 Is Released
A Brief History of BitBacker, A Startup
Software Craftsmanship: Geographical Distribution
Dingus Screencast: A mock/stub library with automatic isolation
From Twitter: Version Control


Processes spawn faster than threads?
Shell Meme Wins


Human-Readable Encryption Keys
My blog woes have been soothed
Blog woes
Tubes by proxy
Undeletable zombie files on OS X
Globals and cargo culting
When JSON isn't JSON
Adobe, master of the painful install
Texturing and programming
Are your tests lying to you?
Zero to Slashdot in Three Days
PyCon 2007: The Untold Stories
Introducing Another Wildly Ambitious Database Project
Unicode Weirdness
Mutable State Is Manual Memory Management
Measure the Goodness of Your Code
C# 3.0 Looks Promising


Why dynamic typing is useful
Python's default arguments are tricky