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:
- Principles: the key principles on which we base our processes and follow in our daily work.
- Workflow: the basic workflow we follow in every project. We try to keep it as light as possible. No charts, no unnecessary rituals.
- Practices: concepts and tools that are employed in order to enable the workflow and drive the principles.
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.
Principle #1: Communicate
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)
Principle #2: Adopt a practical approach
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)
Principle #3: Work together cooperatively
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)
Principle #4: Set in motion and persistently propel forward
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)
Principle #5: Continuously improve
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)
Principle #6: Deliver the right value at the right time
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)
Principle #7: Be proud, but stay humble
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.
Project inception and discovery phase
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:
- A document detailing the clients current tech stack and environments, key stakeholder names and contact information, team members and roles, any non-functional requirements known at the time, and a summary of the goal of the project and its intended end-users.
- A first roadmap that includes the different major milestones of the project and the value they would bring to the end-users or organization.
- A list of the roles and skills required execute the first release.
- A rudimentary backlog containing the most crucial work items.
- We identify the smallest possible releasable outputs that provide the highest value, and an understanding of the work required to achieve them.
- A high-level draft of the architecture that includes any existing data or infrastructure, infrastructure that needs to be introduced, the applications and services that are going to be needed and how they will be connected etc.
- Initial user interface design documents and wire frames. Keep it very simple, it is just a first draft created to get the team to start thinking about interactions.
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:
- The cycle starts with a meeting where we discuss the current state of the project, what we should focus on, where we are in relation to our goals, what we can improve, and if there are any blockers. We go over the backlog together to identify potential problems, synergies between stories, priorities etc.
- The team checks in every morning to discuss the currently active work items, synchronize efforts, raise alarm on any potential problems etc.
- The highest priority work items are selected and worked on. Once a work item has been broken down into actionable steps, designed, implemented, reviewed, and tested, it is merged into the project and automatically deployed into the appropriate environments. Upon completion, work starts on the next priority item.
- When work should be released depends on the project, what type of release we’re dealing with, and what stage the project is currently in. We always strive to release work as soon as possible (because work doesn’t have any value until it has been released), but sometimes we have to work with planned releases in order to coordinate efforts across several teams.
- We continuously consult and review the roadmap and make sure the backlog is prioritized according to the current needs.
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.
Project planning and management
- 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.
- Avoid overtime and allow for flexible schedules when possible, so team members can work when they feel most productive.
- Encourage regular breaks and regularly assess team members’ workloads to ensure they are manageable and are not leading to burnout.
- Create an environment where team members feel comfortable discussing workload and stress levels.
- "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.
- When team members sit together in the same room, communication becomes easier and more natural. Quick questions can be resolved immediately, reducing misunderstandings and delays.
- Physical proximity encourages spontaneous discussions and brainstorming, leading to more creative solutions and better team cohesion.
- Schedule regular sessions where the team gets together to work from the same physical location.
- 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.
- Set clear objectives for the spike and allocate a fixed amount of time.
- Carry out the research or experiment. This could involve coding (the resulting code is not intended to be used as is in the final product, it is about experimentation and discovery), testing, or researching.
- Review and document your findings. Share the results with your team and make decisions based on the new understanding.
- 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.