Robert C. Martin, known as Uncle Bob has been a software professional since 1970 and an international software consultant since 1990. In the last 40 years, he has worked in various capacities on literally hundreds of software projects. In 2001, he initiated the meeting of the group that created Agile Software Development from Extreme Programming techniques and served as the first chairman of the Agile Alliance. He is also a leading member of the Worldwide Software Craftsmanship Movement – Clean Code.
Uncle Bob Contributions:
I- OOP Metrics:
In 1994 Robert “Uncle Bob” Martin proposed a group of object-oriented metrics that are popular until now. Those metrics, unlike other object-oriented ones don’t represent the full set of attributes to assess individual object-oriented design, they only focus on the relationship between packages in the project.
Robert C.Martin wrote an interesting article about a set of metrics that can be used to measure the quality of an object-oriented design in terms of the interdependence between the subsystems of that design.
Here’s from the article what he said about the interdependence between modules:
What is it that makes a design rigid, fragile and difficult to reuse. It is the interdependence of the subsystems within that design. A design is rigid if it cannot be easily changed. Such rigidity is due to the fact that a single change to heavily interdependent software begins a cascade of changes in dependent modules. When the extent of that cascade of change cannot be predicted by the designers or maintainers the impact of the change cannot be estimated. This makes the cost of the change impossible to estimate. Managers, faced with such unpredictability, become reluctant to authorize changes. Thus the design becomes rigid.
And to fight the rigidity he introduce metrics like Afferent coupling, Efferent coupling, Abstractness and Instability.
The number of types outside this project that depend on types within this project.
The number of types outside this project used by types of this project.
The ratio of the number of internal abstract types (i.e abstract classes and interfaces) to the number of internal types. The range for this metric is 0 to 1, with A=0 indicating a completely concrete project and A=1 indicating a completely abstract project
A = Na / Nc
A = abstractness of a module
Zero is a completely concrete module. One is a completely abstract module.
Na = number of abstract classes in the module.
Nc = number of concrete classes in the module.
The ratio of efferent coupling (Ce) to total coupling. I = Ce / (Ce + Ca). This metric is an indicator of the project’s resilience to change. The range for this metric is 0 to 1, with I=0 indicating a completely stable project and I=1 indicating a completely instable project.
I = Ce/(Ce + Ca)
I represent the degree of instability associated with a project.
Ca represents the afferent coupling, or incoming dependencies, and
Ce represents the efferent coupling, or outgoing dependencies
Abstractness vs Instability Graph and the zone of pain
To have more details about this graph you can refer to the Robert C.Martin article.
Here’s the graph generated by JArchitect for the Neo4j framework
The idea behind this graph is that the more a code element of a program is popular, the more it should be abstract. Or in other words, avoid depending too much directly on implementations, depend on abstractions instead. By popular code element I mean a project (but the idea works also for packages and types) that is massively used by other projects of the program.
It is not a good idea to have concrete types very popular in your code base. This provokes some Zones of Pains in your program, where changing the implementations can potentially affect a large portion of the program. And implementations are known to evolve more often than abstractions.
The main sequence line (dotted) in the above diagram shows the how abstractness and instability should be balanced. A stable component would be positioned on the left. If you check the main sequence you can see that such a component should be very abstract to be near the desirable line – on the other hand, if its degree of abstraction is low, it is positioned in an area that is called the “zone of pain”.
For example neo4j kernel has many classes depending on it, so it’s positioned on the left and in this case it’s preferable to be more abstract to leave the orange zone and goes to the green zone.
What’s important is to avoid the zone of pain, if a jar is inside this zone, any changes to it will impact a lot of classes and it became hard to maintain or evolve this module.
II- Open Source Projects
Uncle Bob worked in many open source projects, the most popular one is maybe Fitness.
FitNesse is a tool for specifying and verifying application acceptance criteria (requirements). It acts as a bridge between the different stakeholders (disciplines) in a software delivery process. It’s wiki server makes it easy to document the software.It’s testexecution capabilities allow you to verify the documentation against the software, ensuring the documentation remains up to date and the software is not facing regression.
Mr. Martin has authored and edited many books including:
- Clean Coder, The: A Code of Conduct for Professional Programmers
- Clean Code: A Handbook of Agile Software Craftsmanship
- Agile Principles, Patterns, and Practices in C#
- UML for Java™ Programmers
IV- Contributions in the web
Uncle Bob was very known by its interesting contributions in the ObjectMentor blog, you can access to his old blog post here.
Currently Uncle Bob is active in his new Clean Code website.