London · Software Development
Writing Code Is the Easy Part… Empathy Is What Makes Teams Effective
Creating ambitious products that enhance the capabilities of users fuels my motivation. I combine technical depth with business awareness to deliver outcomes that matter.
Hire Me — Full‑Time or Contract
"Every day I feed my addiction by learning about technology, psychology, business, and any other field that edges me closer to being a complete problem solver."
— Nick, NTCoding
The Challenge Most Teams Face
Developers are problem solvers — not just programmers. Yet too many teams are inhibited by a lack of business awareness, slowing delivery and misaligning priorities.
Distributed Systems Done Right
Building applications that span multiple machines demands careful thinking about availability, scalability, and fault tolerance. I've worked extensively with Akka clustering, Elasticsearch, and Lucene to build resilient search‑based systems.
Read the Blog
Building Winning Teams
Putting together a high‑performing software team is no easier than the code itself. I've developed strategies grounded in culture definition, motivation obsession, and principles‑driven hiring — approaches that correlate with teams that consistently deliver.
Explore the Strategy
Continuous Delivery with Confidence
Thoughtworks GO and Docker form a powerful, completely free and open‑source combination for managing build, test, and deployment pipelines. I've written extensively on automating delivery so you always know what was deployed, when, and by whom.
Read the PostsBuilding software with empathy means understanding not just the code, but the people who write it, maintain it, and rely on it every day. An empathetic approach to development places user experience, team wellbeing, and clear communication at the heart of every project. When developers genuinely care about the outcomes their work produces, the result is software that feels intuitive, reliable, and thoughtfully crafted.
Continuous delivery transforms the way teams ship software by making deployments predictable, routine, and low-risk. Rather than treating releases as high-stakes events, a well-designed pipeline ensures every change flows through automated build, test, and validation stages. This approach shortens the feedback loop dramatically, allowing developers to catch issues sooner and deliver value to users with confidence and consistency.
Test-driven development remains one of the most effective disciplines for producing clean, maintainable code. Writing tests before implementation forces clarity of thought and establishes a safety net that catches regressions early. The practice encourages smaller, more focused units of functionality and gives teams the courage to refactor mercilessly, knowing that a comprehensive suite of tests stands guard over the behaviour of the system.
Functional programming principles bring a level of predictability and composability that makes complex systems easier to reason about. Languages on the JVM, including Scala, offer powerful type systems and immutable data structures that reduce entire categories of runtime errors. Embracing these paradigms leads to code that is more declarative, easier to test, and inherently aligned with the demands of modern reactive and distributed architectures.
Lean thinking applied to software delivery focuses on eliminating waste, amplifying learning, and deciding as late as responsibly possible. By mapping the flow of work from idea to production, teams can identify bottlenecks and optimise their process continuously. Metrics and feedback loops play a central role, giving everyone visibility into throughput, quality, and the real impact of each change on the people using the software.
The tools we choose shape the way we think about problems. Working with Linux as a primary environment fosters a deeper understanding of the operating system, networking, and the toolchain that underpins modern applications. A preference for open-source ecosystems, from Arch to Debian-based distributions, reflects a commitment to transparency, customisation, and the collaborative spirit that drives so much of the software industry forward.
Architecture is not a one-time decision but an ongoing conversation about trade-offs, constraints, and the evolving needs of the business. Effective architectural thinking balances long-term vision with immediate practicality, ensuring that systems remain adaptable without over-engineering for hypothetical futures. The best architectures emerge from teams that communicate openly, challenge assumptions, and keep the focus firmly on delivering real value to users.
Reading widely across the field of software development fuels continuous growth and fresh perspective. Books on psychology, systems thinking, and engineering practice offer insights that transcend any single technology stack. Reviewing and reflecting on these works helps sharpen judgement, introduces new mental models, and reinforces the understanding that the hardest problems in software are rarely purely technical in nature.
A career in software is a journey of perpetual learning, where each project brings new challenges and opportunities to grow. The excitement of solving difficult problems and the satisfaction of seeing your contribution make a tangible difference are powerful motivators. Whether leading a team, mentoring colleagues, or diving deep into a new technology, the drive to improve and create remains at the core of meaningful development work.
Empathetic Development Guided by Business
Applying technical expertise, passion, and collaborative skills to understand business needs is what makes teams truly effective. Using tools like the Business Model Canvas, I help bridge the gap between technology and value creation.
Learn the ApproachReady to Level Up Your Team?
Whether you need a hands‑on developer who understands distributed systems, or a technical leader who can shape team culture — I'd love to talk.
Get in Touch