RSSAmplifier

Blog

bad.robot

good robots do what they're told

baddotrobot.comRSS feed ↗108 posts

Latest posts

Controls Engineering Meetup

Reflections from a recent London roundtable with financial institutions on treating SDLC governance as an engineered, evidence-based system.

Man vs Model

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.

A Spooky Story

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.

DORA Metrics Meet Governance in Banking

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.

Bank on Tech Panel Discussion

Deutsche Bank's Bank on Tech event in London, Birmingham, and Dublin brought together technical experts and thought leaders to reflect and learn.

Don't name classes 'Impl'

Naming implementation classes 'Impl' obscures intent. Learn why descriptive implementation names matter and how to choose names that reflect behaviour.

Luhn Algorithm

Compare an imperative and functional implementation of the Luhn Algorithm. See how functional programming emphasises transformations and immutability over state mutation.

Lead Time vs Cycle Time

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.

Pull Requests and Trust

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.

Establishing an Engineering Culture

How trust, voice, and autonomy shape engineering culture, with practical levers drawn from Westrum, DORA, and Deming.

Evidencing Source Code Reviews

How to evidence source code reviews in regulated environments. Signed commits and pair programming as a code review mechanism without wasteful bureaucracy.

Creating Debian Repositories

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.

Easily Deploy Java to Debian

Package Java, Scala, or Kotlin apps as .deb files and deploy via apt. Level up your distribution strategy with proper Debian package management.

Upgrade Raspbian

Step-by-step guide to upgrading Raspbian from Stretch to Buster on your Raspberry Pi.

Refactoring in 10 Minutes

An introduction to refactoring in 10 minutes. Java examples from Martin Fowler's book, plus a free xpdojo.org collection of XP training materials.

Upgrade Raspbian

Step-by-step guide to upgrading Raspbian from Jessie to Stretch on your Raspberry Pi.

Standard Raspberry Pi Setup

A standard setup guide for Raspberry Pi including OS installation, SSH configuration, and basic system setup for headless operation.

Type Classes in Scala

Type classes in Scala provide ad-hoc polymorphism without inheritance. Learn the pattern using implicits and understand when type classes beat traditional OOP.

Home Brew Temperature Logger

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 Edimax Wifi Dongles LED

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.

Pi Console Lead

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 Testing Doesn't Work

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 JDK on Mac

Easily switch between Java versions on Mac using the java_home utility. Includes bash function to set JAVA_HOME for any installed JDK version.

Implicit Functions in Scala

Scala implicit functions convert types automatically when the compiler needs it. Learn how implicit conversion functions work and how to use them safely.

Implicit Parameters in Scala

Scala implicit parameters allow the compiler to automatically supply values marked implicit. Introduction to the three categories of Scala implicits.

JMock to Scalamock Cheat Sheet

Quick reference cheat sheet mapping JMock idioms to their Scalamock equivalents. Useful when migrating Java tests to Scala or learning Scalamock.

Scala Learning Curve

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 Mixins: The Right Way

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.

Dealing with Exceptions as Monads

Treat exceptions functionally using monadic types like Either, Option, and Try. Captures error handling in the type system and provides system-wide consistency.

Udemy Java 8 Course

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.

Classes vs. Functions

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

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.

Method References in Java 8

Java 8 method references explained clearly. Four types with real examples: static, bound instance, unbound instance, and constructor references.

IntelliJ IDEA Retina Support JDK 1.7+

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.

Yet Another TeamCity Build Monitor

Radiate is a TeamCity build monitor that aggregates all build statuses into a single pass/fail — no cherry-picking which failures to ignore.

Currying Functions in Java & Scala

Currying transforms a multi-argument function into a chain of single-argument functions. Practical examples in both Java and Scala.

Automatically rebase on git pull

Configure Git to automatically rebase instead of merge on every pull. Covers global and per-repository configuration, including IntelliJ IDEA settings.

Calculate the Optimum Number of Threads

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.

Mac Tips

Handy Mac OS X tips for developers: keyboard shortcuts, Finder tricks, and workflow improvements to speed up your daily development tasks.

Writing my Book

Behind the scenes of writing 'Effective Acceptance Testing' — choosing Leanpub for self-publishing, the writing process, and why I decided to write the book.

Useful Git Commands

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 Stack vs Deque

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.

Sending Messages vs Method Invocation

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 Don't Work

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.

Diff Excel with Java and Hamcrest

Compare Excel spreadsheets in Java tests using Hamcrest matchers and Apache POI. The simple-excel library makes asserting on spreadsheet content straightforward.

Play it Next App

How to use the 'Play Next' feature in iTunes and the iOS music app to queue songs without disrupting your current playlist.

FreeAgent, OAuth & HTTP (Part III)

OAuth and HTTP part III: making signed OAuth requests to the FreeAgent API using Java and Scribe. Practical end-to-end OAuth integration example.

FreeAgent, OAuth & HTTP (Part II)

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.

FreeAgent, OAuth & HTTP (Part I)

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.

Mountain Lion Carnage

The aftermath of upgrading to Mac OS X Mountain Lion. What broke, what needed fixing, and tips for developers upgrading their Mac.