Controls Engineering Meetup
Reflections from a recent London roundtable with financial institutions on treating SDLC governance as an engineered, evidence-based system.
good robots do what they're told
Reflections from a recent London roundtable with financial institutions on treating SDLC governance as an engineered, evidence-based system.
A four-week, AI-assisted delivery burst measured against my own historical peaks. What shipped, how I measured it, what the numbers really say, and the guardrails that made it safe.
One that terrifies us all... having to grep that impenetrable log file by hand. Is using a custom Log4j appender the way to avoid this nightmare? Is routing log events to a HTTP server a good idea or a hidden maintenance trap? Let's have a look at it.
Mike Long, Nathan Harvey and I discuss how DORA metrics can be aligned with governance frameworks in the banking industry. We posted the resulting article under the Team Topologies Expert View series.
Deutsche Bank's Bank on Tech event in London, Birmingham, and Dublin brought together technical experts and thought leaders to reflect and learn.
Naming implementation classes 'Impl' obscures intent. Learn why descriptive implementation names matter and how to choose names that reflect behaviour.
Compare an imperative and functional implementation of the Luhn Algorithm. See how functional programming emphasises transformations and immutability over state mutation.
Lead time and cycle time are often confused. Understand the subtle difference, their roots in lean manufacturing, and why DORA uses Lead Time for Changes as a key metric.
Exploring the history and implications of pull requests in software development. This post examines how PRs introduce delays, impact continuous integration, and discusses the relationship between trust and code review practices in agile teams.
How trust, voice, and autonomy shape engineering culture, with practical levers drawn from Westrum, DORA, and Deming.
How to evidence source code reviews in regulated environments. Signed commits and pair programming as a code review mechanism without wasteful bureaucracy.
Step-by-step guide to building and publishing your own Debian/Ubuntu APT repository with aptly, including package publishing, signing with GPG, and client setup.
Package Java, Scala, or Kotlin apps as .deb files and deploy via apt. Level up your distribution strategy with proper Debian package management.
Step-by-step guide to upgrading Raspbian from Stretch to Buster on your Raspberry Pi.
An introduction to refactoring in 10 minutes. Java examples from Martin Fowler's book, plus a free xpdojo.org collection of XP training materials.
Step-by-step guide to upgrading Raspbian from Jessie to Stretch on your Raspberry Pi.
A standard setup guide for Raspberry Pi including OS installation, SSH configuration, and basic system setup for headless operation.
Type classes in Scala provide ad-hoc polymorphism without inheritance. Learn the pattern using implicits and understand when type classes beat traditional OOP.
Build a home brew temperature logger for around $10 using a Raspberry Pi Zero and DS18B20 temperature sensor. Great starter IoT project with Scala server.
Disable the LED on the Edimax EW-7811UN Wi-Fi dongle on Raspberry Pi by recompiling the kernel module. Includes a pre-built binary if you'd rather not compile.
Set up a headless Raspberry Pi Zero using an Adafruit console lead. Step-by-step guide for Mac users on El Capitan/Sierra using the Prolific PL2303 driver.
Pair tests are a poor proxy for real work. After years of giving and receiving them, the author argues for fairer, more realistic interview techniques.
Easily switch between Java versions on Mac using the java_home utility. Includes bash function to set JAVA_HOME for any installed JDK version.
Scala implicit functions convert types automatically when the compiler needs it. Learn how implicit conversion functions work and how to use them safely.
Scala implicit parameters allow the compiler to automatically supply values marked implicit. Introduction to the three categories of Scala implicits.
Quick reference cheat sheet mapping JMock idioms to their Scalamock equivalents. Useful when migrating Java tests to Scala or learning Scalamock.
What does the Scala learning curve look like? Expect quick initial progress followed by a slower ramp into advanced functional features like type classes and implicits.
Scala traits can be used for both polymorphism and mixins, but mixing these uses leads to trouble. Learn when using a trait as a mixin is genuinely appropriate.
Treat exceptions functionally using monadic types like Either, Option, and Try. Captures error handling in the type system and provides system-wide consistency.
My 'What's new in Java 8' course is live on Udemy. Covers lambdas, streams, functional interfaces and more — get 10% off with coupon code BLOG10.
Java 8 lambdas are not just syntactic sugar over anonymous classes. Explores the underlying bytecode differences and why lambdas and anonymous classes behave differently.
Functional interfaces in Java 8 are single-method interfaces. Anywhere you use a lambda, you're using a functional interface. Learn the syntax and built-in examples.
Java 8 method references explained clearly. Four types with real examples: static, bound instance, unbound instance, and constructor references.
IntelliJ IDEA 13 retina support is broken on JDK 7 and JDK 8. Keep running on JDK 1.6 for crisp retina rendering on Macbooks.
Radiate is a TeamCity build monitor that aggregates all build statuses into a single pass/fail — no cherry-picking which failures to ignore.
Currying transforms a multi-argument function into a chain of single-argument functions. Practical examples in both Java and Scala.
Configure Git to automatically rebase instead of merge on every pull. Covers global and per-repository configuration, including IntelliJ IDEA settings.
Calculate the optimal number of threads for a Java application. Covers CPU-bound vs IO-bound workloads and the formula for sizing thread pools correctly.
Handy Mac OS X tips for developers: keyboard shortcuts, Finder tricks, and workflow improvements to speed up your daily development tasks.
Behind the scenes of writing 'Effective Acceptance Testing' — choosing Leanpub for self-publishing, the writing process, and why I decided to write the book.
A collection of useful Git commands including how to delete remote branches, switch between SSH and HTTPS, and other handy tips for everyday Git use.
Java's Stack class is a legacy class with known problems. Use Deque (specifically ArrayDeque) instead for a proper last-in-first-out stack implementation.
Alan Kay's original vision of OOP was about message passing, not method calls. Explores the conceptual difference and why it matters for good object-oriented design.
Daily standups often fail because they become status reports. Learn why standups don't work and what to do instead to improve team communication and flow.
Compare Excel spreadsheets in Java tests using Hamcrest matchers and Apache POI. The simple-excel library makes asserting on spreadsheet content straightforward.
How to use the 'Play Next' feature in iTunes and the iOS music app to queue songs without disrupting your current playlist.
OAuth and HTTP part III: making signed OAuth requests to the FreeAgent API using Java and Scribe. Practical end-to-end OAuth integration example.
OAuth and HTTP part II: calling the FreeAgent API with OAuth. Step-by-step guide to obtaining and using OAuth tokens with the Scribe library in Java.
OAuth and HTTP part I: understanding the OAuth authorisation flow. Covers the three-legged OAuth dance, tokens, and how to implement it in Java with Scribe.
The aftermath of upgrading to Mac OS X Mountain Lion. What broke, what needed fixing, and tips for developers upgrading their Mac.