Loose coupling and high cohesion are two fundamental principles in software design that are often discussed but it’s difficult.
After many failures, I believe I have found the key to solving the above problem: clearly defining the responsibilities and boundaries of each component. In this article, I will explain why this is a crucial step and provide practical guidance on how to achieve it.
When used Modularity and Domain-Driven Design (DDD) together, they can help to create systems that are easier to maintain, more reliable, and more adaptable to change.
Source code management is critical to ensuring project stability, developer velocity, and delivery cadence. Today, several branching workflows are widely used: GitHub Flow, Git Flow, and Trunk-Based Development. In this article, we’ll examine each workflow in depth and explore which strategy best suits feature teams of 2 to 7 engineers during active application feature development.
If you wrote unit tests with JUnit 4, a notable pain point was the lack of first-class parameter support in test methods, leading to extensive boilerplate duplication when validating multiple inputs :-1:. While TestNG addressed this earlier, JUnit 5 introduced native Parameterized Tests to solve this elegantly :heart:.
In the article How to Write Testable Code, I touched on the concept of Mocks. So what is a Mock? And how can you leverage it to make Unit Testing significantly simpler and more reliable?
In the article Introduction to Unit Test, we highlighted the vital importance of Unit Testing. But before applying unit tests effectively in current or future projects, we need a crucial foundation: learning how to write Testable Code (Production Code designed to allow straightforward unit testing). This is often the hardest hurdle, so this article synthesizes key principles to help you write testable code effortlessly.
On the journey to becoming a seasoned developer, understanding and mastering S.O.L.I.D is an essential milestone. It reshapes how you think about code organization, boundary definition, and interactions among modules, classes, and methods—making your codebase readable, clean, and maintainable. It empowers you to write Testable Code for Unit Tests, forms the architectural foundation for IoC/DI, and significantly boosts your confidence during technical interviews :smile_cat:.
In 2015, a defining event completely changed how I think about Testing in the software development lifecycle. It was the first time I had to write a 5 Whys, 9 Steps incident root-cause report. The primary cause of the failure was underestimating Unit Tests, and the consequences were severe. Read on to find out why ;)).
In 2012, when I first joined Global CyberSoft and entered the software development industry full of bewilderment :sweat_smile:, two concepts—Inversion of Control (IoC) and Dependency Injection (DI)—were the toughest for me to grasp. Yet they turned out to be the foundation for modern application architecture. Let’s explore why they are so essential!