What is Radical Programming?
It is a post-Agile software construction methodology which aims at order of magnitude improvements in value delivered through software projects.
The word radical has a Latin root
Webster defines: (1) proceeding from root (2) fundamental (3)unusual (4) cool.
In that respect it recognizes that the primary source of all the value ultimately created through a software is the source code itself. It recognizes that root purpose of the software is to satisfy customer need.
Eight-fold way of Radical Programming.
Aim of any software is to create customer value. Aim of Radical Programming is to create order of magnitude returns on the efforts required to generate that value.
The eight principles of Radical Programming work together to achieve exactly that.
In today's fast moving world with multi faceted sales channel Software Product Line Engineering is the most sensible option. It creates multiple differentiated versions of product by using the same underlying code base and repository of components. As you can see it is component oriented reuse.
1: Four Quadrants
Radical Programming uses a variant of Software Product Line Engineering that simultaneously undertakes parallel activities in four quadrant.
- Quadrant I : Creating and discovering Domain Model. All prototypes, spike solutions and various differentiated product versions reuse the same object oriented domain model.
- Quadrant II: Product Assembly.Various differentiated product versions are constructed using iterative development. Rapid delivery of customer feature is the primary aim. The secondary aim is to achieve maximum reuse possible.
- Quadrant III: Creating Platform code. Most products require common infrastructure and we spend significant time in developing productivity tools
- Quadrant IV: Aspect Orientation.We also spend significant time taking care of global and cross cutting "aspects" like performance, security ease of use etc
Applying lean thinking to Software Engineering it envisions the assembly line where features are continuously "manufactured". A feature starts it life as user story and goes through various development stages of acceptance tests, precondition, post conditions, detailed description and test , design, implementation , unit tests and is finally released. Radical Programming considers software delivery as a Batch Process. Scrum and Kanban are used to deliver the batch. Body of knowledge developed for lean thinking and batch management is then systematically applied.
3:Code is Design
Radical Programming treats Code as the primary expression of Design. It uses code centric approach to development where unnecessary documents are eliminated. Various techniques and concepts like Static analysis, Literal programming and Design by Contract are used. Code is re-factored mercilessly.
One of the ways to achieve great flexibility and productivity is to use standard architecture with predictable interaction between components. N-tier service oriented architecture or plugin based architecture or pipeline like architecture. Emphasis is on implementation agnostic interfaces and loosely coupled interfaces so that components can be readily interchanged. There are many many design principles that can be seen in existing systems and design philosophies. Eg. Unix Philosophy, COM, N-tier SOA with REST etc, Many "component oriented" CMSes.
5:Data Driven Design
One of the main principles of Radical Programming is to use data driven programming. This means program logic is driven by configurable data sets. Every argument that can be made for DSL is equally valid for data driven programming.
6:Fractal Time Boxing
Time boxing is a familiar concept, however time boxing is applied to various time horizons and product definition and planning is handled only at the appropriate level of details. Vision is defined on 1-3 year time horizon, the mission and strategy is calibrated every quarter and quarterly goals are achieved by series of monthly/fortnightly releases. At every "scale" the process looks similar because we deal with uncertainty, deliverable and work to be done at only the appropriate level of details.
Spiral development is different than iterative development. In the context of Radical Programming it means within a sprint product is developed by first building it in big chunks and refining it again and again. Rapid development and progressive elaboration is the mantra.
8:Flexible Team Structure.
In short it is a self organizing team with collective code ownerships and lack of silos. Developers sometimes wear SDET hat and sometimes volunteer to drive issues like product wide secuirty/performance etc. Load balancing is the matra.