At CJ, everything revolves around pursuing the best possible product that we can create in a sustainable way. This means we simultaneously have to be excellent at 2 very different things:
- Rapid delivery of relevant & innovative customer-facing features/products
- Maintaining internal quality, technical excellence and refactorability in all the code we write
Well Crafted Code
As Dave Thomas says in Agile is Dead, the essence of the Agile Manifesto is a commitment to agility. And we agree with Bob Martin when he says that the only way to achieve long-term agility is by a commitment to practices that result in high-quality, maintainable code.
For us at CJ Engineering, that means taking clean, well-tested, rapidly deployed code very seriously.
- Red->Green->Refactor: We practice true "test-first" TDD. This means we write a test, then write the code that implements it. Then we (aggressively) refactor.
- Pair/Mob Programming: If code-review & collaboration are such good things, why not do them continuously? That's why we spend our time pair programming and mob programming.
- Self-Documenting Code: You know that "this code needs a comment" feeling? We see that as a sign that our code is not well-designed; Instead of code comments, we refactor until the smell goes away.
- Continuous Delivery: We work directly on our 'master' branches, pushing multiple times a day. Code is then immediately built by our automated build-test pipeline, then proceeds to be deployed using our automated deployment. Our users are shielded from half-baked features by means of feature toggles.
Loosely Coupled, Tightly Aligned Teams
Our friends at Spotify pioneered a simple, novel approach to organizing teams that value agility: the "Spotify Model". Following in their footsteps, we've adopted a squad/chapter/guild structure that seeks to strike the right balance between team autonomy and product alignment (with a bias toward autonomy and experimentation).
- Squad: Similar to a scrum team, your squad is a co-located, cross-functional team that owns a product domain.
- Product Domain: A non-overlapping, customer-focused, "vertical" slice of our product. It includes all the systems & architectural layers involved in solving a particular customer problem.
- Chapter: A group of people charged with maintaining and exemplifying a particular primary technical skill.
- Guild: An informal, spontaneous group of people who meet regularly to share/collaborate on a particular topic.
