ProgrammingPro #99: BDD with Go’s gobdd, Docker & AWS AI Tooling, GCC 15.1 Rust/C++ Upgrades, and Netflix’s 2025 Java Stack
Welcome to a brand new issue of ProgrammingPro.
In today’s Expert Insight, we bring you an excerpt from the recently published book, Domain-Driven Design with Golang, which explains how Behaviour-Driven Development (BDD) extends Test-Driven Development (TDD) by using natural language tests to improve collaboration between engineers and domain experts, illustrated with Go examples using the gobdd framework.
News Highlights: AI tooling advances as Docker, Solo.io, and AWS launch new agent frameworks and benchmarks; GCC 15.1 delivers major Rust, C, C++, and Cobol upgrades; GitHub previews its AI-powered MCP Server; and InfoQ’s 2025 report highlights agentic AI, small LMs, and privacy engineering trends.
My top 5 picks from today’s learning resources:
This 150-Line Go Script Is Actually a Full-On Load Balancer⚖️
Scaling API Independence: Akehurst on Mocking, Contract Testing, and Observability🔗
But there’s more, so dive right in.
Stay Awesome!
Divya Anne Selvaraj
Editor-in-Chief
🗞️News and Analysis🔎
AI updates from the past week: Docker announced an upcoming MCP tool catalog, Solo.io released Agent Gateway and Mesh for agent governance, and AWS launched SWE-PolyBench to benchmark AI coding agents.
GCC 15 compilers arrive with Rust, C, C++, and Cobol enhancements: GCC 15.1 introduces major upgrades including full C23 support, initial C++26 features, improved vectorization, and faster compilation for large files.
GitHub Announces Public Preview of GitHub MCP Server: The server enables AI-powered, natural language interactions with GitHub APIs through a standardised client-server protocol developed with Anthropic.
InfoQ Software Architecture and Design Trends Report - 2025: Key architecture trends include agentic AI, small language models, RAG, AI-assisted development, and privacy engineering.
Microsoft previews SignalR client for iOS: The client enables iOS developers to build real-time features like chat and live updates into SwiftUI and UIKit apps using ASP.NET SignalR and Azure SignalR services.
Java News Roundup: Covers the release of Gradle 8.14, the debut of JBang’s Jash shell scripting library, Hibernate ORM 7.0 RC1, updates to Open Liberty and Spring projects, and the end of open-source support for Spring Cloud Data Flow.
The hidden cost of dev stack diversity within an enterprise: ‘Engineering chaos’: A survey by Earthly has revealed that dev stack diversity, enabled by containerization, makes it hard to enforce security and quality policies across teams despite other gains.
🎓Tutorials and Learning Resources💡
Python
💡14 Advanced Python Features: Presents 14 underused yet powerful Python features, including typing overloads, structural pattern matching, generics, protocols, and metaclasses, with code examples and references.
For more Python resources, go to PythonPro
C# and .NET
💡Why C#?: Explains why C# remains a powerful and relevant language, highlighting its modern features, cross-platform .NET ecosystem, strong tooling, and active community as key reasons for its continued appeal to developers.
🎓Using ImmutableSortedSet in C# for memory sharing: Explains how the data structure is ideal for concurrent scenarios where data is frequently read, occasionally mutated, and needs safe, low-cost versioning without locking.
🎓Effortless integration test isolation with .NET, XUnit and database transactions: Explains how to set up realistic, isolated integration tests in .NET using XUnit, EF Core, and PostgreSQL.
C++ and C
💡New C++ features in GCC 15: The version introduces pack indexing, variadic friends,
=delete("reason")
, and structured bindings in conditions—alongside improvements to constexpr support, modules, and more.📄Link-Time Optimization of Dynamic Casts in C++ Programs: Proposes a link-time optimisation (LTO) technique to improve performance and reduce code size for dynamic casts in C++.
🎓How to program a text adventure in C: Explains how to build a text adventure game from scratch, progressing incrementally through 25 chapters covering key mechanics like locations, inventory, parsing, and even multiplayer.
Java
💡How ZGC allocates memory for the Java heap: Covers virtual-physical memory separation, NUMA-aware multi-partition handling, allocation paths, and latency considerations.
💼🎥How Netflix Uses Java - 2025 Edition: Presents how Netflix modernised its Java infrastructure, what tools and frameworks power its services, and why it standardised on GraphQL, Spring Boot, and newer JVM features.
JavaScript and TypeScript
💡Making a small JavaScript blog static site generator (SSG) even smaller using the general async-tree library: Examines how the
async-tree
library simplifies and reduces the codebase of a minimalist SSG.🎓Go to Definition in Typescript Monorepos: Explains how to enable reliable “Go to Definition” functionality by configuring
package.json
exports with a custom condition and updatingtsconfig.json
and Vite settings accordingly.
Go
🎓This 150-Line Go Script Is Actually a Full-On Load Balancer: Demonstrates how to build a fully functional HTTP load balancer using round-robin request routing, health checks, and reverse proxying.
🎓Organize your Go middleware without dependencies: Explains how to organize and manage middleware in Go web applications without third-party dependencies, using custom middleware chains and a simple router type.
Rust
🎓A Visual Journey Through Async Rust: Uses a graphical approach to explain how async execution, concurrency, and parallelism work in Rust by plotting sine wave computations across futures and tasks.
💡Introducing Rust in security research: Describes how a team designed and delivered a Rust workshop for Radboud University’s iHub, focusing on Rust fundamentals and C interoperability.
Swift
🗞️Swift 6.2: A first look at how it’s changing Concurrency: Previews how the version aims to improve concurrency’s approachability, focusing on clearer migration paths, reduced compiler warnings, and easier adoption of async code.
🎓SwiftUI ForEach Explained with Code Examples: Explains how to use SwiftUI’s
ForEach
to create dynamic, repeatable views, covering basics, theIdentifiable
protocol, and index-based iteration.
PHP
🎓Fast string compare function for PHP: Presents a fast, approximate PHP string comparison function that measures text differences by length, character counts, and word frequencies, offering 80–90% better performance.
SQL
💡Anatomy Of A SQL Engine: Breaks down how Dolt’s SQL engine processes queries, covering each phase from parsing (building an AST) to binding (resolving identifiers), plan simplification, join planning and costing.
Ruby
💼Past, Present, and Future of Sorbet Type Syntax: Reviews the evolution of Sorbet’s type syntax, explaining its origins at Stripe, trade-offs between various type system designs, and key constraints that shaped its current DSL approach.
🌟Advanced Concepts🚀
Scaling API Independence: Akehurst on Mocking, Contract Testing, and Observability: Discusses how combining mocking, contract testing, and observability enables API independence in large microservices systems.
Closing the loop on agents with test-driven development (TDD): Explains how developers are applying TDD to AI agents by evaluating behaviours and refining workflows across experimentation, evaluation, deployment, and monitoring stages.
Quality begins with planning: Building software with the right mindset: Argues that software quality must be a shared responsibility across the team and embedded from the planning phase, with developers playing a proactive role.
🧠Expert Insight📚
Here’s an excerpt from “Chapter 8: TDD, BDD, and DDD" in the book, Domain-Driven Design with Golang, by Matthew Boyle, published in December 2022.
BDD
BDD is an extension of TDD that aims to enable deeper collaboration between engineers, domain experts, and quality assurance engineers (if your company employs them). A diagram of how this
works with TDD is shown (in Figure 8.6).
The goal of BDD is to provide a higher level of abstraction from code through a
domain-specific language (often referred to as a DSL) that can become executable tests. Two popular frameworks for writing BDD tests is the use of Gherkin (https://cucumber.io/docs/gherkin/reference/) and Cucumber (https://cucumber.io). Gherkin defines a set of keywords and a language specification. Cucumber reads this text and validates that the software works as expected. For example, the following is a valid Cucumber test:
Feature: checkout Integration
Scenario: Successfully Capture a payment
Given I am a customer
When I purchase a cookie for 50 cents.
Then my card should be charged 50 cents and an e-mail receipt
is sent.
Some teams work with their domain experts to ensure their acceptance criteria in their ticketing system are in this format. If it is, this criterion can simply become the test. This aligns nicely with DDD.
Now that we have a high-level understanding of BDD, let’s take a look at implementing a test in Go. We are going to use the go-bdd framework, which you can find at https://github.com/go-bdd/gobdd.
Firstly, let’s install go-bdd in our project:
go get github.com/go-bdd/gobdd
Now, create a features folder:
Inside the features folder, let’s add a file called add.feature with this inside it:
Feature: Adding numbers
Scenario: add two numbers together
When I add 3 and 6
Then the result should equal 9
Next, let’s add an add_test.go file and the following:
package chapter8
import (
"testing"
"github.com/go-bdd/gobdd"
)
func add(t gobdd.StepTest, ctx gobdd.Context, first, second
int) {
res := first + second
ctx.Set("result", res)
}
func check(t gobdd.StepTest, ctx gobdd.Context, sum int) {
received, err := ctx.Ge
if err != nil {
t.Fatal(err)
return
}
if sum != received {
t.Fatalf("expected %d but got %d", sum, received)
}
}
func TestScenarios(t *testing.T) {
suite := gobdd.NewSuite(t)
suite.AddStep(`I add (\d+) and (\d+)`, add)
suite.AddStep(`the result should equal (\d+)`, check)
suite.Run()
}
In the preceding code, we add a bdd step function called add. This function name is important; the framework knows that when I add 3 and 6 gets mapped to this function. If you change the name of this function to “sum”, you’d need to update the feature file to say, when I sum 3 and 6 together. We then perform our logic and store it in the context so that we can recall it later.
We then define a check function that is our actual test; it validates our assertions. Finally, we set up a test suite to run our code.
If you run the preceding test, it should pass.
This might be your first time seeing a BDD-style test, but I bet it’s not your first time seeing a unit test. Why is that?
As you can see, although BDD tests are closer to natural language, it pushes a lot of the complexity down into the tests. The preceding example we used is trivial, but if you want to express complex scenarios (such as the cookie example we used previously) there is a lot of scaffolding the developer needs to implement to make the tests work correctly. This can be worthwhile if you have lots of access to your domain experts and you are truly going to work side by side. However, if they are absent or not invested in the process, unit tests are much faster and more engaging for engineering teams to work with. Much like DDD, BDD is a multidisciplinary team investment, and it is worth ensuring you have buy-in from all stakeholders before investing too much time in it.
Domain-Driven Design with Golang was published in December 2022. Packt library subscribers can continue reading the entire book for free or you can buy the book here!
Get the eBook for $35.99 $31.99
🛠️Useful Tools⚒️
Magnitude: An AI-powered, open source end-to-end testing framework that uses visual agents and natural language to create and run adaptive tests for web apps.
agenticSeek: A fully local, open-source AI assistant that autonomously browses the web, writes code, and plans tasks with complete on-device privacy.
BitNet: A 1-bit LLM framework from Microsoft designed for ultra-efficient, fast inference on CPUs, enabling low-bit LLMs like BitNet b1.58 to run locally.
That’s all for today.
We have an entire range of newsletters with focused content for tech pros. Subscribe to the ones you find the most useful here.
If your company is interested in reaching an audience of developers, software engineers, and tech decision makers, you may want to advertise with us.
If you have any suggestions or feedback, or would like us to find you a learning resource on a particular subject, just leave a comment below!