All projects are unique. Recognizing this, we have developed a flexible framework that provides the essential building blocks to rapidly craft software development processes tailored to the specific goals, team dynamics, level of maturity, and requirements of our projects.
The meta process outlined in this article includes the following building blocks:
We've defined seven key principles (inspired by methodologies like Extreme Programming (XP), Lean Software Development (LSD), and Kanban) to handle the challenges we often face. These principles are not just theoretical; they're practical tools that shape our decision-making and problem-solving approaches.
Clear and effective communication is key in project management and software development. Regular, straightforward conversations help team members effectively share knowledge and ideas. Openness about processes and decisions ensures that everyone has the necessary information for successful teamwork and project completion. It’s also vital that we communicate well with the customer to make sure we’re on the right track and to set clear expectations.
“Communication” (XP), “Transparency”, “Make policies explicit” (Kanban)
We solve problems in a practical way, focus on what’s needed, and avoid unnecessary complexity. We eliminate anything that doesn’t add value to the customer and aim for efficient solutions that meet the project’s needs without extra complications.
“Simplicity” (XP), “Eliminate waste” (LSD)
We pool skills and resources to achieve common goals. Individual team members are backed by their team and teams are backed by the organization. We promote an environment of openness and honesty where each team member’s contributions are valued and acknowledged. We understand that leadership is not about exercising authority, it is about helping the team.
“Empower the team” (LSD), “Respect” and “Courage” (XP), “Agreement”, “Balance” (Kanban)
When we come into a project we’re emanating positive energy. We set a steady and manageable pace of work and make sure that there is always a sense of urgency. Bottlenecks and blockers are identified and addressed quickly. We focus on the current tasks and prevent overloading of team members. We create and maintain momentum and inspire others via example.
“Deliver as fast as possible”, “Limit work in progress” (LSD), “Manage flow”, “Leadership” (Kanban)
Continuous improvement is an ongoing process of learning, adapting, and refining. We start with what we do know, encourage feedback, learn from our experiences, and aim to make decisions at the right time. With each step, we seek better and more efficient outcomes. We are always curious, try new things, and are open to releasing work quickly to gain insights for future steps. Our decisions are based on the information available at the time, and we’re ready to make adjustments as more information comes in.
“Feedback”, “Simplicity” (XP), “Decide as late as possible”, “Amplify learning” (LSD), “Improve collaboratively, evolve experimentally” (Kanban)
Delivering true value to customers is not just about the quality of the output, but also about its timeliness and relevance. We recognize that prioritization is often the most challenging aspect of a project. It involves discerning not only what needs to be done but also understanding the impact and timing of each element. Our goal is to optimize the entire process, ensuring that every task we undertake contributes meaningfully to the end goal. This optimization helps us avoid inefficiencies and focus our efforts where they are most needed.
“Optimize the whole” (LSD), “Customer focus”, “Flow” (Kanban)
While we may start with something simple and iterate on that, we always aim and plan for excellence. We value craftsmanship and make sure that the project is always in a state we’re proud of. On-boarding of new team members should be something to look forward to. Our projects are neatly structured, easy to contribute to, everything that should be automated has been automated, and the code is maintainable and reliable.
“Build integrity in” (LSD).
Team composition and specific practices vary between projects, but the workflow usually follows a specific pattern.
We explore existing ideas, conditions, and constraints. The goal of this phase is to have a good understanding of what needs to be done, who the key stakeholders are, and to document any relevant limitations. The exact details we’re looking for may differ slightly from project to project, but we’re typically aiming for the following outputs:
We work in increments to realize the goals of the project. While our primary focus is on iterating functionality, we still operate within time-boxed cycles (typically one week) to establish a rhythm:
Below you’ll find a set of recommended practices that cover aspects from coding to communication, designed to boost efficiency and collaboration. Use this section as a flexible toolkit to shape your team's unique development process.
Backlog: Keep a prioritized list of items that provides a clear view of everything that needs to be done and in what order.
Roadmap: A strategic plan that defines a goal or desired outcome and includes the major steps or milestones needed to reach it.
Kanban board: A visual tool that helps in managing work at various stages of the development process.
Estimating effort in software development: How we approach predicting the amount of effort required to complete a task or project phase.
"Energized Work" in XP is about recognizing that the best work is done when people are fresh, focused, and motivated, rather than tired and overworked. It's a shift from the traditional mindset of measuring productivity by hours spent, to a more holistic approach considering the quality and effectiveness of the work done.
"Sit Together": A practice that emphasizes the importance of physical proximity and collaboration among team members working on a project. The idea is to have the entire team, including developers, managers, and customers (when possible), working in the same space.
Proactive design: Ad-hoc design can be very costly.
Test-first approach: An approach where tests are written before — or at the same time as — the actual code.
Code reviews and pair programming: These collaborative practices focus on improving code quality through shared efforts.
Spikes : When you encounter something unknown or unclear (e.g. a requirement that is hard to estimate, or a problem that doesn’t have an obvious solution), do research or create a proof of concept. A "spike" in XP is a specific type of task aimed at reducing risk and uncertainty and it is a practice use regularly.
Automate that which can be automated: Tests, integrations, builds, deployments, formatting, migrations, provisioning, backup and restoration, security scans, API documentation — anything that is repetitive or prone to error should be automated to reduce risk for manual error and to improve project speed and consistency.
Scheduled “cool-downs” : Schedule regular cool down periods where you turn down the velocity a little to focus on refactoring parts of the project that needs to be refactored, solve technical debt, look over automation etc.