
{"id":2421,"date":"2016-06-08T11:08:36","date_gmt":"2016-06-08T11:08:36","guid":{"rendered":"http:\/\/www.codergears.com\/Blog\/?p=2421"},"modified":"2018-04-04T13:30:57","modified_gmt":"2018-04-04T13:30:57","slug":"people-who-influenced-the-programming-world-series-uncle-bob","status":"publish","type":"post","link":"https:\/\/codergears.com\/Blog\/?p=2421","title":{"rendered":"People who influenced the programming world series : Uncle Bob."},"content":{"rendered":"<p style=\"color: #333333;\">Robert C. Martin, known as\u00a0\u00a0Uncle 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.\u00a0 He is also a leading member of the Worldwide Software Craftsmanship Movement &#8211; Clean Code.<\/p>\n<p style=\"color: #333333;\"><strong>Uncle Bob \u00a0Contributions:<\/strong><\/p>\n<p style=\"color: #333333;\"><strong>I- OOP Metrics:<\/strong><\/p>\n<p style=\"color: #333333;\">In 1994 Robert \u201cUncle Bob\u201d Martin proposed a\u00a0group of object-oriented metrics that are popular until now. Those metrics, unlike other object-oriented ones don\u2019t represent the full set of attributes to assess individual object-oriented design, they only focus on the relationship between packages in the project.<!--more--><\/p>\n<p style=\"color: #333333;\">Robert C.Martin wrote an interesting\u00a0<a href=\"https:\/\/linux.ime.usp.br\/~joaomm\/mac499\/arquivos\/referencias\/oodmetrics.pdf\">article<\/a>\u00a0about 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.<\/p>\n<p style=\"color: #333333;\">Here\u2019s from the article what he said about the interdependence between modules:<\/p>\n<blockquote style=\"color: #333333;\"><p>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.<\/p><\/blockquote>\n<p style=\"color: #333333;\"><span id=\"more-126\"><\/span><br \/>\nAnd to fight the rigidity he introduce metrics like Afferent coupling, Efferent coupling, Abstractness and Instability.<\/p>\n<p><strong>Afferent Coupling<\/strong><\/p>\n<p>The number of types outside this project that depend on types within this project.<\/p>\n<p><strong>Efferent Coupling<\/strong><\/p>\n<p>The number of types outside this project used by types of this project.<\/p>\n<p><strong>Abstractness<\/strong><\/p>\n<p>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<\/p>\n<blockquote><p>A = Na \/ Nc<\/p>\n<p>Where:<\/p>\n<p>A = abstractness of a module<br \/>\nZero is a completely concrete module. One is a completely abstract module.<br \/>\nNa = number of abstract classes in the module.<br \/>\nNc = number of concrete classes in the module.<\/p><\/blockquote>\n<p><strong>Instability<\/strong><\/p>\n<p>The ratio of efferent coupling (Ce) to total coupling. I = Ce \/ (Ce + Ca). This metric is an indicator of the project\u2019s 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.<\/p>\n<blockquote><p>I = Ce\/(Ce + Ca)<br \/>\nI represent the degree of instability associated with a project.<br \/>\nCa represents the afferent coupling, or incoming dependencies, and<br \/>\nCe represents the efferent coupling, or outgoing dependencies<\/p><\/blockquote>\n<p><strong>Abstractness vs Instability Graph and the zone of pain<\/strong><\/p>\n<p>To have more details about this graph you can refer to the\u00a0<a href=\"https:\/\/linux.ime.usp.br\/~joaomm\/mac499\/arquivos\/referencias\/oodmetrics.pdf\">Robert C.Martin article<\/a>.<\/p>\n<p>Here\u2019s the graph generated by <a href=\"http:\/\/www.jarchitect.com\">JArchitect <\/a>for the Neo4j framework<\/p>\n<p><a href=\"http:\/\/javadepend.files.wordpress.com\/2013\/04\/abstractnessvsinstability.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-748\" src=\"http:\/\/javadepend.files.wordpress.com\/2013\/04\/abstractnessvsinstability.png\" alt=\"AbstractnessVSInstability\" width=\"595\" height=\"595\" \/><\/a><\/p>\n<p>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.<br \/>\nIt 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.<\/p>\n<p>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 \u2013 on the other hand, if its degree of abstraction is low, it is positioned in an area that is called the \u201czone of pain\u201d.<\/p>\n<p>For example neo4j kernel has many classes depending on it, so it\u2019s positioned on the left and in this case it\u2019s preferable to be more abstract to leave the orange zone and goes to the green zone.<\/p>\n<p>What\u2019s 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.<\/p>\n<p style=\"color: #333333;\"><strong>II- Open Source Projects<\/strong><\/p>\n<p style=\"color: #333333;\">Uncle Bob worked in many open source projects, the most popular one is maybe <a href=\"https:\/\/github.com\/unclebob\/fitnesse\">Fitness<\/a>.<\/p>\n<p style=\"color: #333333;\"><span class=\"fitnesse\" style=\"font-style: italic;\">FitNesse<\/span>\u00a0is 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&#8217;s wiki server makes it easy to document the software.It&#8217;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.<\/p>\n<p style=\"color: #333333;\"><strong>III- Books<\/strong><\/p>\n<p style=\"color: #333333;\">Mr. Martin has authored and edited many books including:<\/p>\n<ul class=\"buckets-list left\" style=\"color: #000000;\">\n<li class=\"buckets-list-title\" style=\"font-weight: bold;\"><a class=\"title\" style=\"color: #004f7f;\" href=\"http:\/\/www.informit.com\/store\/clean-coder-a-code-of-conduct-for-professional-programmers-9780132696173\">Clean Coder, The: A Code of Conduct for Professional Programmers<\/a><\/li>\n<li class=\"buckets-list-title\" style=\"font-weight: bold;\"><a class=\"title\" style=\"color: #2e87b2;\" href=\"http:\/\/www.informit.com\/store\/clean-code-a-handbook-of-agile-software-craftsmanship-9780132350884\">Clean Code: A Handbook of Agile Software Craftsmanship<\/a><\/li>\n<li class=\"buckets-list-title\" style=\"font-weight: bold;\"><a class=\"title\" style=\"color: #004f7f;\" href=\"http:\/\/www.informit.com\/store\/agile-principles-patterns-and-practices-in-c-sharp-9780131857254\">Agile Principles, Patterns, and Practices in C#<\/a><\/li>\n<li class=\"buckets-list-title\" style=\"font-weight: bold;\"><a class=\"title\" style=\"color: #004f7f;\" href=\"http:\/\/www.informit.com\/store\/uml-for-java-programmers-9780131428485\">UML for Java&#x2122; Programmers<\/a><\/li>\n<\/ul>\n<p><strong>\u00a0IV- Contributions in the web<\/strong><\/p>\n<p>Uncle Bob was very known by its interesting contributions in the \u00a0ObjectMentor blog, you can access to his old blog post <a href=\"http:\/\/butunclebob.com\/\">here<\/a>.<\/p>\n<p>Currently Uncle Bob is active in his new <a href=\"https:\/\/sites.google.com\/site\/unclebobconsultingllc\/\">Clean Code website<\/a>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Robert C. Martin, known as\u00a0\u00a0Uncle 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 &hellip; <a href=\"https:\/\/codergears.com\/Blog\/?p=2421\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;People who influenced the programming world series : Uncle Bob.&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2421","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/2421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2421"}],"version-history":[{"count":14,"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/2421\/revisions"}],"predecessor-version":[{"id":2509,"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/2421\/revisions\/2509"}],"wp:attachment":[{"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codergears.com\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}