By adhering to an incremental, iterative, and lean design process, we are able to create a product that meets both stakeholder and user requirements. Our teams are empowered to incorporate user feedback through process, and to design with the real life applications of a product always in mind. Following Scrum-based and Kanban-based agile practices enables us to analyze user stories to better understand the vision and goals of a project. In this way, the product continuously improves as we learn from each sprint and implement changes in the next.
A test-driven development approach allows us to build quality into our code upfront. Each new feature begins with writing one or more automated tests, which evaluate acceptance criteria. This approach ensures that each feature is covered by an automated test and it allows the developer to write the code to a specification—the test. Until the tests pass, the feature is not done. Writing the test first helps us to approach the feature from the perspective of the user, which allows us to further focus on what the users need.
SemanticBits utilizes Behavior-Driven Development (BDD) techniques in every software engineering project we undertake. The key tenet of this approach is that consistent language is used throughout the development of the system, from User Story elaboration throughout software development and testing. The use of BDD greatly reduces risk of communication breakdown between Developers and Stakeholders, since we are using a ubiquitous language to describe every aspect of the system.
Twelve Factor Apps Approach
We apply implementation and DevOps patterns from Twelve Factor Apps in virtually all of our projects. These patterns can be applied as needed to greatly expedite development, provide a foundation for scalable applications, and minimize errors introduced by manual processes through automation. We find these patterns to be particularly applicable in a cloud-based environment where infrastructure can be defined in simple, declarative templates that support rapidly managing all aspects of the application environment.
The utilization of cloud infrastructure is an important aspect of our Agile implementation approach. It enables our team to be fully empowered by allowing them to manage their environments. Additionally, cloud tooling supports rapid and repeatable management of infrastructure. Cloud infrastructure also provides numerous services, like auto-scaling and load balancing. Our team has utilized a wide range of cloud service providers, such as AWS, Azure, and the Google Cloud Platform, as well as private clouds like Appistry.
Agile Architectural Design
By embracing an Agile approach to architectural design, we are able to avoid large up-front design work with the understanding that design emerges as the project progresses. Specially, we take a Lean approach to architectural design in which we perform design work at the last moment that it is needed to understand and communicate how the system should be implemented. This is accomplished using two primary documentation approaches: 4+1 Software Design Document and Design Notes.
Scaled Agile Framework
We apply aspects of the Scaled Agile Framework (SAFe) for projects of a size and/or complexity requiring multiple scrum teams. SAFe is a collection of patterns for implementing Lean-Agile software and systems development at enterprise scale. We utilize SAFe for work at the enterprise Portfolio, Value Stream, Program, and Team levels. This allows us to pick and choose the aspects of SAFe that are most appropriate to solve a particular challenge in scaling an Agile approach. Some of the most important aspects of SAFe that we apply include: Program Portfolio Management, Product and Solution Management, Program and Value Stream Backlogs, and Agile Release Train.