{"id":636,"date":"2017-08-23T12:37:50","date_gmt":"2017-08-23T07:07:50","guid":{"rendered":"http:\/\/innoroo.com\/blog\/?p=636"},"modified":"2017-08-23T21:22:57","modified_gmt":"2017-08-23T15:52:57","slug":"interview-with-james-coplien","status":"publish","type":"post","link":"https:\/\/innoroo.com\/blog\/2017\/08\/23\/interview-with-james-coplien\/","title":{"rendered":"Interview with James Coplien"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">It is a great honour to interview James Coplien, who is involved in founding the Software Pattern Movement. He is author of <\/span><i><span style=\"font-weight: 400;\">Advanced C++ Programming Styles and Idioms <\/span><\/i><span style=\"font-weight: 400;\">and &nbsp;co-authored books like <\/span><i><span style=\"font-weight: 400;\">Organisational Patterns of Agile Software Development<\/span><\/i><span style=\"font-weight: 400;\"> and <\/span><i><span style=\"font-weight: 400;\">Lean Software Architecure for Agile Software Development. <\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">James Coplein&#8217;s work on organisational patterns has inspired to include daily stand-ups in Scrum and inspired extreme programming as well. Let us understand his thoughts on <\/span><span style=\"font-weight: 400;\">Speciality of Lean\/Agile Architecture;<\/span><\/p>\n<p><strong>Q.1 What is the most special thing about Lean\/Agile Architecture?<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">James: I feel its strong point is that it is rooted in a very few simple principles of how the world works and in some basics of human psychology. One of the greatest compliments I ever received was to be <\/span><a href=\"https:\/\/business901.com\/blog1\/why-architecture-is-needed-even-in-agile\/\"><span style=\"font-weight: 400;\">interviewed<\/span><\/a><span style=\"font-weight: 400;\"> by <\/span><a href=\"https:\/\/www.linkedin.com\/in\/business901\/\"><span style=\"font-weight: 400;\">Joe Dager<\/span><\/a><span style=\"font-weight: 400;\">, who read the book and liked it. Mind you, he\u2019s a lean guy from the manufacturing world that has little or nothing to do with programming, and he found that the book rang true to his world and the ideas they value. I think the book brings the sector simple but incredibly powerful ideas to software.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In terms of how the world works, we know that there are time-honoured forms in every domain and that it pays to understand them intimately. So, unlike the practice of DDD, we invest in understanding the domain as worthy work in its own right. We build the architecture around that understanding. It is not a collection of guesses, but is grounded in history, breadth, and experience. We can express the forms of these domains in code, as in abstract base classes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">At this point the \u201cwhat-the-system-is\u201d part of the architecture is in some sense complete, but compressed \u2014 <\/span><i><span style=\"font-weight: 400;\">compression<\/span><\/i><span style=\"font-weight: 400;\"> is a key concept in <\/span><a href=\"http:\/\/www.leansoftwarearchitecture.com\"><span style=\"font-weight: 400;\">Lean Architecture<\/span><\/a><span style=\"font-weight: 400;\">. If you and I share the abstract base class declaration for class ComplexNumber, and tap into our shared cultural understanding of what ComplexNumbers are, then the abstract base class is adequate as an architectural specification. It is not abstract because we can concretely agree exactly what answer we will get if we invoke ComplexNumber.+ on a specific object with another specific object as a parameter. The abstract base classes compile and link. As compressed descriptions they are general (to cover a broad market) and robust (they are likely to survive cosmetic changes in market needs).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A second insight into how the world works is that it\u2019s waste to guess in advance, in detail, <\/span><i><span style=\"font-weight: 400;\">how<\/span><\/i><span style=\"font-weight: 400;\"> these parts will do their work. That requires the contextualization of a concrete use case from real end users. (For example, for ComplexNumber \u2014 will we use Cartesian or polar computation?) We wait to fill in the method code and the implementation of roles and classes until we have a concrete use case. The Product Owner can use that use case to develop system tests (yes, POs write tests). That was <\/span><a href=\"https:\/\/www.linkedin.com\/in\/dannorth\/\"><span style=\"font-weight: 400;\">Dan North<\/span><\/a><span style=\"font-weight: 400;\">\u2019s original vision of BDD before the tools people got ahold of it. So we deliver the system incrementally. We don\u2019t deliver classes: we deliver use cases.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As to human psychology, the \u201cwhat-the-system-does\u201d part of Lean Architecture (the agile part, reflected mainly in <\/span><a href=\"http:\/\/fulloo.info\"><span style=\"font-weight: 400;\">DCI<\/span><\/a><span style=\"font-weight: 400;\"> \u2014 see below) is rooted in the developmental psychology principles of Piaget. That\u2019s where <\/span><a href=\"http:\/\/dl.acm.org\/citation.cfm?id=1971922\"><span style=\"font-weight: 400;\">object orientation started<\/span><\/a><span style=\"font-weight: 400;\"> back with <\/span><a href=\"https:\/\/www.linkedin.com\/in\/alan-kay-12a627b\/\"><span style=\"font-weight: 400;\">Alan Kay<\/span><\/a><span style=\"font-weight: 400;\"> and <\/span><a href=\"http:\/\/www.papert.org\"><span style=\"font-weight: 400;\">Seymour Pappert<\/span><\/a><span style=\"font-weight: 400;\">. Over these past 35 years the OO community has devolved its focus from supporting human mental processes to a lot of technical rules and practices and so-called \u201ccomputer science\u201d and \u201csoftware engineering.\u201d<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In Lean Architecture we don\u2019t structure the system in terms of the computer science formalisms of coupling and cohesion: modern CS people reduce coupling at every chance, and they\u2019re just as happy to throw away essential coupling as accidental coupling. Again, the obvious thing is to keep the system as simple as possible, but not more so. That means keeping essential coupling \u2014 for example, relationships between objects \u2014 but finding strategies that can slice the system cleanly along lines that are made clear by thinking about time instead of just data. Most modern computer science has lost the notion that time has form. Much of Lean Architecture is just about seeing clearly and discarding all the bad practices that academia, methods, and consultants have loaded on us, and restoring a few central principles that your grandmother knew (if she was a programmer).<\/span><\/p>\n<p><strong>Q.2 &nbsp;How can we employ Use Cases in a lightweight, incremental and Agile way?<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">James: Use cases got a bad rap in the beginning because software people used them in such a rigorous way. To people from a waterfall heritage they became just another way to encode up-front structured requirements, and tended to be used to capture and structure all requirements up front. Of course that doesn\u2019t work \u2014 and people blamed use cases when things fell apart. However, in fact, use cases were designed to be used iteratively and incrementally to support complex development: that\u2019s what the refinement relationships between scenarios are all about. At their heart they <\/span><i><span style=\"font-weight: 400;\">are<\/span><\/i><span style=\"font-weight: 400;\"> a lightweight, incremental approach: ignorance has led people to use them otherwise. That they fell into disrepute owes to a large and collective misunderstanding about how to use them. My wife and business partner (and co-author of the Lean Architecture book) <\/span><a href=\"https:\/\/www.linkedin.com\/in\/gertrudbjornvig\/\"><span style=\"font-weight: 400;\">Gertrud Bj\u00f8rnvig<\/span><\/a><span style=\"font-weight: 400;\"> has been working in requirements most of her career, and we have worked together to help people adopt what is described here.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So an ignorant agile world took another tack and proposed user stories instead. The idea sounded good: going to the user and getting a story \u201cfrom the horse\u2019s mouth.\u201d And, most importantly, a user story isn\u2019t about writing but just about \u201ca promise for a future conversation between an end user and a developer.\u201d But the concept was quickly lost. If I look in <\/span><a href=\"https:\/\/www.amazon.co.uk\/Programming-Installed-Published-Addison-Wesley-Professional\/dp\/B00HQ1K8SK\/\"><i><span style=\"font-weight: 400;\">Extreme Programming Installed<\/span><\/i><\/a><span style=\"font-weight: 400;\"> (2001) where user stories are first elaborated in publication, we find this as an example of a user story:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For each account, compute the balance by adding up all the deposits and subtracting all the deductions.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Where is the <\/span><i><span style=\"font-weight: 400;\">user<\/span><\/i><span style=\"font-weight: 400;\">, and where is the <\/span><i><span style=\"font-weight: 400;\">story<\/span><\/i><span style=\"font-weight: 400;\">? And this one is lacking the final clause, which is the user\u2019s motivation. In fact, if you look at most contemporary user stories, they\u2019re just pseudo-code! I thought we had gotten beyond pseudo-code 30 years ago. Like many things in agile, they\u2019re the nerds\u2019 revenge. Even if the story comes later, here we\u2019re deep inside the code for audit trails \u2014 about which end users don\u2019t care at all.<\/span><\/p>\n<p><a href=\"https:\/\/www.linkedin.com\/in\/alistaircockburn\/\"><span style=\"font-weight: 400;\">Alistair Cockburn<\/span><\/a><span style=\"font-weight: 400;\"> rescued use cases from the mythology that has come to surround them in his timeless book <\/span><a href=\"https:\/\/www.amazon.co.uk\/Effective-Cockburn-published-Addison-Wesley-Professional\/dp\/B00E31DRCK\/\"><i><span style=\"font-weight: 400;\">Writing Effective Use Cases<\/span><\/i><\/a><span style=\"font-weight: 400;\">.<\/span><i><span style=\"font-weight: 400;\"> And they work<\/span><\/i><span style=\"font-weight: 400;\">. As one example, consider a large project at Systematic here in Denmark to redo the federal gambling tax system. They came in at 40% under budget and substantially ahead of schedule (<\/span><a href=\"https:\/\/www.computerworld.dk\/art\/214270\/saadan-fik-skat-halveret-prisen-paa-stort-it-projekt\"><span style=\"font-weight: 400;\">ComputerWorld Denmark, 29 February, 2012<\/span><\/a><span style=\"font-weight: 400;\">). They explicitly credited two things: Scrum, of course, but even more so use cases. We repeatedly see this in our clients, and can relate many more stories like this. Those using user stories for complex development tend to drown in a sea of unstructured cards and often find themselves doing rework (politely renamed <\/span><i><span style=\"font-weight: 400;\">refactoring<\/span><\/i><span style=\"font-weight: 400;\">) to eventually meet the market need. <\/span><a href=\"https:\/\/www.linkedin.com\/in\/jeffsutherland\/\"><span style=\"font-weight: 400;\">Jeff Sutherland<\/span><\/a><span style=\"font-weight: 400;\"> has always advocated use cases in Scrum but more recently resorts to using the phrase \u201cuser stories,\u201d maybe to avoid alienating his audience too quickly.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We won\u2019t throw the baby out with the bathwater, and we\u2019ll be smarter than to depend on just a single technique like user stories. Scrum requires that the Product Owner instill an <\/span><i><span style=\"font-weight: 400;\">enabling specification<\/span><\/i><span style=\"font-weight: 400;\"> in the minds of the developers (see <\/span><a href=\"https:\/\/www.linkedin.com\/in\/jeffsutherland\/\"><span style=\"font-weight: 400;\">Jeff Sutherland<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/sites.google.com\/a\/scrumplop.org\/published-patterns\/value-stream\/product-backlog\/enabling-specification\"><span style=\"font-weight: 400;\">E<\/span><span style=\"font-weight: 400;\">NABLING<\/span><span style=\"font-weight: 400;\"> S<\/span><span style=\"font-weight: 400;\">PECIFICATION<\/span><\/a><span style=\"font-weight: 400;\">). The journey of understanding a requirement may indeed start with a user story written on a napkin over lunch. To give it more texture and context, it\u2019s a good idea to create imaginary users called <\/span><i><span style=\"font-weight: 400;\">personas<\/span><\/i><span style=\"font-weight: 400;\"> whom we envision using the feature. We give those people names, addresses, ages, and lifestyles to get our minds rooted in reality. And we don\u2019t refer to them as \u201cthe user\u201d but \u201cas the account holder,\u201d \u201cas the approval manager,\u201d \u201cas the eye doctor patient\u201d \u2014 which we can borrow from the first clause of a well-written user story. Then we make a little story (a real story, finally), called a <\/span><i><span style=\"font-weight: 400;\">user narrative<\/span><\/i><span style=\"font-weight: 400;\">, around the feature. (In systems that are central to the functioning of a very large population, or particularly in complex products, we may use <\/span><i><span style=\"font-weight: 400;\">user profiling<\/span><\/i><span style=\"font-weight: 400;\"> instead of personas. Personas and user narratives are a cheap alternative to user profiles, and are suitable to relatively simple products.) After understanding several narratives from one of more user communities we can structure them into a use case.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A use case organises multiple scenarios into a set of flows, and wraps them in important business considerations such as preconditions and postconditions, together with other informal considerations. Each use case tells what other use cases it depends on \u2014 and of course, the use case makes it clear which of its scenarios depend on the others. One very important part of a use case is the user motivation or goal: developers are more likely to build something that meets the customer need (as opposed to just doing what the requirements say to do) if they understand that. That, too, we can glean from the user story \u2014 the last clause in a well-written user story.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If you look at user stories these days, <\/span><a href=\"https:\/\/www.linkedin.com\/in\/mikewcohn\/\"><span style=\"font-weight: 400;\">Mike Cohn<\/span><\/a><span style=\"font-weight: 400;\"> and others have added dependency cards, test case cards, and a bunch of other accoutrements that ironically strive to bring user stories back closer to use cases. So we\u2019ve come full circle. <\/span><a href=\"http:\/\/jpattonassociates.com\/user-story-mapping\/\"><span style=\"font-weight: 400;\">Story mapping<\/span><\/a><span style=\"font-weight: 400;\"> is another valiant attempt but it tries to present three dimensions of concern in two dimensions: dependency information, and therefore time ordering of delivery, gets lost. But this is not to fault <\/span><a href=\"https:\/\/www.linkedin.com\/in\/productdesigncoach\/\"><span style=\"font-weight: 400;\">Jeff Patton<\/span><\/a><span style=\"font-weight: 400;\">, who pioneered them: I think he understands use cases but, like me, has become blue in the face to try to get people to appreciate their benefits. We can pacify them with anything that uses cards on a wall.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Yet, for Scrum, user story strategies are fundamentally flawed (except for the dialogue and the motivation clause) because a user story is just about properties of the deliverable, and does not specify the deliverable itself. The backlog in Scrum is a backlog of product increments. It\u2019s called a <\/span><i><span style=\"font-weight: 400;\">Product<\/span><\/i><span style=\"font-weight: 400;\"> Backlog,<\/span><i><span style=\"font-weight: 400;\"> not a requirements backlog<\/span><\/i><span style=\"font-weight: 400;\">. A user story is one small perspective on some piece of a requirement. Maybe three user stories combine to characterise some product increment. I don\u2019t put the three user stories on the backlog and estimate each independently: the user story is just a dispensable tool that gets me to the point of making an enabling specification of the product increment. It\u2019s that spec that goes on the backlog. User stories should never appear on a Scrum product backlog unless they are trivial.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Use cases aren\u2019t so much about <\/span><i><span style=\"font-weight: 400;\">writing<\/span><\/i><span style=\"font-weight: 400;\"> requirements as <\/span><i><span style=\"font-weight: 400;\">structuring<\/span><\/i><span style=\"font-weight: 400;\"> requirements. Requirements can be complex, and they are just as much in need of structuring as your code is. The focus is still on that conversation with the end user. You can keep use cases lightweight by avoiding commercial tools with their administration, learning curves and bells and whistles. Keep the amount of writing minimal, and try to avoid making things \u201cpretty.\u201d Don\u2019t guess about the future; focus on what you\u2019ll be delivering in the next 6 weeks. Write them knowing you will throw them away after delivering. Tailor the form mercilessly to meet your needs \u2014 there is no \u201cright\u201d format. And socialise them with your users, combining them with the other techniques and approaches I mentioned above that complement use cases\u2019 strengths and weaknesses. Beyond those, reduce your ideas to prototypes, storyboards, <\/span><i><span style=\"font-weight: 400;\">anything<\/span><\/i><span style=\"font-weight: 400;\"> that engages your end user (<\/span><i><span style=\"font-weight: 400;\">end user<\/span><\/i><span style=\"font-weight: 400;\"> \u2014 who may not be your customer).<\/span><\/p>\n<p><strong>Q3. &nbsp;How DCI (Data, Context and Interaction) &nbsp;succeeds where object\u2013oriented programming languages alone have failed to integrate software design?<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">James: I started as a BASIC programmer back in about 1970. (Well, I did some machine coding before that, but we won\u2019t go there.) Back then one could read one\u2019s code, hand-trace it, and understand it. The same was true for FORTRAN, which I learned in 1973. My ability to do that was taken away with the advent of object-oriented programming. I can understand only one method at a time. If that method calls a method on another object (or even on itself!) I must stop manually tracing the execution. I can\u2019t tell where the program counter will end up. That\u2019s by design, and it goes by the name nerds love to use called <\/span><i><span style=\"font-weight: 400;\">polymorphism<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So Java, C++ and Objective-C programs were good when all the processing for a given business feature stayed within one object. They were very good for simple operations in the code of graphical editing programs. But a good deal of complex business processing comes from use cases, and that means understanding <\/span><i><span style=\"font-weight: 400;\">a network of cooperating objects, working together to solve some problem<\/span><\/i><span style=\"font-weight: 400;\">. That was the <\/span><a href=\"http:\/\/dl.acm.org\/citation.cfm?id=1971922\"><span style=\"font-weight: 400;\">original vision<\/span><\/a><span style=\"font-weight: 400;\"> of objects.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The problem is that today we code classes, and we can\u2019t understand object relationships from the classes. It\u2019s class-oriented programming. (Good JavaScript programmers will recognise that they don\u2019t necessarily have this problem, because they do real object-oriented programming.) There is no construct in a Java or C++ program from which we can understand the business flow! So we can understand (and modify) our code only locally at the resolution of a method or class. We can\u2019t understand our programs at the level of a use case. We can only guess. And, as Stevie Wonder said, \u201cYou believe in things you don\u2019t understand, you may suffer.\u201d If we can\u2019t understand them they are very unlikely to be right.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">And that indeed was the historical experience. So, guess what \u2014 along with the rise in popularity in objects came a rise in popularity of testing. Humans are pretty good about generalizing from code, and it\u2019s often easy to argue the correctness of code for a broad set of cases from inspection alone. (If not, the code should probably be re-written.) But to assess correctness through testing precludes treating a \u201cbroad set\u201d of cases: we test one scenario and one precise collection of bits at a time. Testing is expensive, and it doesn\u2019t conclude anything about correctness: it can show only that code <\/span><i><span style=\"font-weight: 400;\">doesn\u2019t<\/span><\/i><span style=\"font-weight: 400;\"> work, not that it <\/span><i><span style=\"font-weight: 400;\">does<\/span><\/i><span style=\"font-weight: 400;\">. It\u2019s a sampling technique \u2014 and it tests a very small sample relative to the full range and domain of interest.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">What\u2019s more, the rise in personal computing made development more and more of an individual task than a team task (and we still have only \u201cindividuals and interactions\u201d with no real recognition of teamwork) so programmers gravitated to <\/span><a href=\"http:\/\/rbcs-us.com\/documents\/Why-Most-Unit-Testing-is-Waste.pdf\"><span style=\"font-weight: 400;\">unit testing<\/span><\/a><span style=\"font-weight: 400;\">. It was a great breakthrough to move <\/span><a href=\"http:\/\/orgpatterns.wikispaces.com\/DevelopingInPairs\"><span style=\"font-weight: 400;\">from one programmer to two<\/span><\/a><span style=\"font-weight: 400;\">, but most of the benefit came from thinking and observing rather than testing \u2014 and it was still usually limited to one class at a time. It was institutionalised to the degree even that the unit test was done first, before the unit was coded \u2014 a practice called TDD, which thankfully is <\/span><a href=\"http:\/\/david.heinemeierhansson.com\/2014\/tdd-is-dead-long-live-testing.html\"><span style=\"font-weight: 400;\">on its way out<\/span><\/a><span style=\"font-weight: 400;\"> after two decades of waste.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">DCI packages use case as self-contained, readable code modules called <\/span><i><span style=\"font-weight: 400;\">Contexts<\/span><\/i><span style=\"font-weight: 400;\">. We can again understand what our code does! The use case logic lives in the Contexts\u2019 <\/span><i><span style=\"font-weight: 400;\">Roles<\/span><\/i><span style=\"font-weight: 400;\"> that describe the interaction not of classes, but of the objects playing the roles. We still have polymorphism in that different kinds (classes) of objects can play each a Role, as long as the object meets the requirement (contract) of the Role it is fulfilling. But the polymorphism is in play only for trivial instance methods on classes: they are primitives, return immediately, and are trivial to reason about. So the Context becomes the locus of understanding a use case. First, there is no uncertainty about the procession of Role methods, since their invocation is statically bound and, second, the programmer does not have to context switch (e.g., between classes) to understand the execution of a use case. These ideas have emerged from more than a decade of focused research between <\/span><a href=\"http:\/\/heim.ifi.uio.no\/~trygver\/\"><span style=\"font-weight: 400;\">Trygve Reenskaug<\/span><\/a><span style=\"font-weight: 400;\"> (who pioneered the idea) and myself (who, in his words, did \u201cthe hard work needed to advance DCI from early theory to practice<\/span><span style=\"font-weight: 400;\">\u201d<\/span><span style=\"font-weight: 400;\">). DCI promises that its programs are easier to reason about than traditional OO programs, so they are more likely to be correct.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We have recently published research that demonstrates that DCI delivers as promised (<\/span><a href=\"http:\/\/dl.acm.org\/citation.cfm?id=3101447&amp;CFID=770784676&amp;CFTOKEN=58867865\"><span style=\"font-weight: 400;\">An Empirical Study on Code Comprehension: Data Context Interaction Compared to Classical Object Oriented<\/span><\/a><span style=\"font-weight: 400;\">, by <\/span><a href=\"https:\/\/www.linkedin.com\/in\/hvaldecantos\/\"><span style=\"font-weight: 400;\">H\u00e9ctor Valdecantos<\/span><\/a><span style=\"font-weight: 400;\"> et al., <\/span><a href=\"http:\/\/icpc2017.unibas.it\"><span style=\"font-weight: 400;\">ICPC 2017<\/span><\/a><span style=\"font-weight: 400;\">). Subjects were more often able to analyse correctly what DCI code does, or to understand it well enough to correctly update it to some new requirement, than they were for Java code. The results are stunningly significant. People can play with a Java-like DCI language called <\/span><a href=\"http:\/\/fulloo.info\/Documents\/trygve\/trygve1.html\"><b>trygve<\/b><\/a><span style=\"font-weight: 400;\"> (GitHub: <\/span><a href=\"https:\/\/github.com\/jcoplien\/trygve\"><span style=\"font-weight: 400;\">jcoplien\/trygve<\/span><\/a><span style=\"font-weight: 400;\">) if they want to learn DCI, but one can use DCI in many modern programming languages. It\u2019s impossible only in one such language, and that\u2019s Java.<\/span><\/p>\n<p><strong>Q4. One tip to write software that can directly be verified against behavioral requirements.<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">James: This indeed is the holy grail of software, and meeting it perfectly has always been and will continue to be elusive. The question seeks a simple answer to what is a complex problem. We can only improve our ability to verify more properties; we will never be able to verify any implementation\u2019s ability to meet the requirements of anything other than another machine. Testing explores only a minute collection of samples that together don\u2019t <\/span><i><span style=\"font-weight: 400;\">prove<\/span><\/i><span style=\"font-weight: 400;\"> anything.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So how do we make things better? Again, we return to human behaviour and basic properties of systems. Code that you can\u2019t understand is unlikely to be correct. Software engineering has long taught us about good coding style, short methods, and good naming. We did some back-of-the-envelope research in Bell Labs that suggests that there is strong correlation between good indentation style and low bug density. A good team has good discipline in these areas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">But these tricks go only so far in an object-oriented world where one can understand only one use case step at a time. New design paradigms like <\/span><a href=\"http:\/\/fulloo.info\"><span style=\"font-weight: 400;\">DCI<\/span><\/a><span style=\"font-weight: 400;\"> allow us to again read our code with a business eye, and to understand the business function that the code delivers. We can understand our code again in business terms, and that makes it more likely that the code meets the requirements. It also tends to structure it around what the end user cares about, instead of what the programmer may otherwise care about \u2014 which has the side-effect of lower cost in program evolution.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So my one tip broadly is: Write readable code. Treat your code as literature. Name variables with the same care as you name a first-born child. Take <\/span><a href=\"https:\/\/www.amazon.co.uk\/Clean-Code-Handbook-Software-Craftsmanship\/dp\/0132350882\/\"><span style=\"font-weight: 400;\">Clean Code<\/span><\/a><span style=\"font-weight: 400;\"> to heart. And \u201creadability\u201d should imply comprehension at the level of the business value generated by the code. More narrowly: learn about DCI.<\/span><\/p>\n<p><strong>Q5. Luke Hohmann says &#8220;This carefully researched, artfully described, and extraordinarily useful handbook of deep wisdom on creating teams that generate terrific software should be on every software development manager&#8217;s bookshelf.&#8221; about your book \u2018Organizational Patterns of Agile Software Development\u2019. What was your motivation behind the research while writing this book?<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">James: People. I love working with people \u2014 people who are focused, passionate about what they are doing, and eager to learn. It started when a colleague, <\/span><a href=\"https:\/\/www.linkedin.com\/in\/moody-ahmad-32552911\/\"><span style=\"font-weight: 400;\">Moody Ahmad<\/span><\/a><span style=\"font-weight: 400;\">, turned me on to the perspective that the interesting problems are on the human side rather than the technical side. My career satisfaction has rarely been about me alone \u2014 that\u2019s a hollow academic posture \u2014 but about working with and helping others see better ways of doing things. I seem to be good at working with people and jointly finding new perspectives, while effectively mixing the human and technical components of work. The large levers there are people and process \u2014 \u201cprocess\u201d not in the ISO sense, but in the sense of celebrating the rituals of harmonised human endeavour. And that itself is a new perspective on organizational maturity and \u201cprocess.\u201d<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In the early 1990s in Bell Labs we were trying to understand what makes work groups effective. We were in the midst of <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Theory_Z\"><span style=\"font-weight: 400;\">Theory Z<\/span><\/a><span style=\"font-weight: 400;\"> times and management believed the power was in the process, as the Japanese had told us. And management\u2019s weapon to implement process was ISO 9000. I did a bit of research and found no correlation between process compliance (in the Western sense) and, well, anything. This led to a secondary question: what <\/span><i><span style=\"font-weight: 400;\">was<\/span><\/i><span style=\"font-weight: 400;\"> it that made a difference?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We followed a hunch that it was all about relationships between people, and launched some research using social network theory \u2014 which I invented in 1993, only to discover that <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Jacob_L._Moreno\"><span style=\"font-weight: 400;\">Moreno<\/span><\/a><span style=\"font-weight: 400;\"> would steal my idea 20 years before I was born. We just gathered all the data we could about how organisations really worked, and sought out recurring themes \u2014 dozens of organisations, all over the world. We made graphical models of the social networks and did a lot of data reduction on them.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A bunch of us got together and launched the pattern discipline at about the same time, so I started writing up the structures we found in the networks of powerful organisations as organisational forms to which one should aspire: \u201c<\/span><a href=\"http:\/\/orgpatterns.wikispaces.com\/EngageQualityAssurance\"><span style=\"font-weight: 400;\">Engage Quality Assurance<\/span><\/a><span style=\"font-weight: 400;\">,\u201d \u201c<\/span><a href=\"http:\/\/orgpatterns.wikispaces.com\/WorkFlowsInward\"><span style=\"font-weight: 400;\">Work Flows Inward<\/span><\/a><span style=\"font-weight: 400;\">,\u201d and \u201c<\/span><a href=\"http:\/\/orgpatterns.wikispaces.com\/DistributeWorkEvenly\"><span style=\"font-weight: 400;\">Distribute Work Evenly<\/span><\/a><span style=\"font-weight: 400;\">\u201d are intuitive examples. We found that these <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Organizational_patterns\"><i><span style=\"font-weight: 400;\">patterns<\/span><\/i><\/a><span style=\"font-weight: 400;\"> proved powerful at capturing organisational practices that worked where process descriptions failed. Patterns also captured <\/span><i><span style=\"font-weight: 400;\">why<\/span><\/i><span style=\"font-weight: 400;\"> these forms worked, and were inspirational enough to encourage teams to try them out. <\/span><a href=\"https:\/\/www.linkedin.com\/in\/neil-harrison-900879\/\"><span style=\"font-weight: 400;\">Neil Harrison<\/span><\/a><span style=\"font-weight: 400;\"> and <\/span><a href=\"https:\/\/www.linkedin.com\/in\/bgcain\/\"><span style=\"font-weight: 400;\">Brendan Cain<\/span><\/a><span style=\"font-weight: 400;\"> joined me and it turned into a research program that lasted a decade and culminated in the <\/span><a href=\"https:\/\/www.amazon.co.uk\/Organizational-Patterns-Agile-Software-Development\/dp\/0131467409\/\"><span style=\"font-weight: 400;\">book<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">All of our work was empirical. One famous result came from my <\/span><a href=\"https:\/\/sites.google.com\/a\/gertrudandcope.com\/info\/Publications\/Patterns\/Process\/QPW\"><span style=\"font-weight: 400;\">analysis of the Borland Quattro Pro for Windows<\/span><\/a><span style=\"font-weight: 400;\"> project which, even to date, is the most awesome software development project ever studied. One of their noteworthy practices was to assemble the architects every morning to review yesterday\u2019s progress, to evaluate blockers, and to plan work for the next 24 hours. I wrote this up as a pattern and, as it was circulating on the web, <\/span><a href=\"https:\/\/www.linkedin.com\/in\/jeffsutherland\/\"><span style=\"font-weight: 400;\">Jeff Sutherland<\/span><\/a><span style=\"font-weight: 400;\"> saw it and <\/span><a href=\"https:\/\/www.vanharen.net\/Player\/eKnowledge\/scrumpapers.pdf\"><span style=\"font-weight: 400;\">decided to include it in his framework<\/span><\/a><span style=\"font-weight: 400;\">. The idea survives (and thrives) today as <\/span><a href=\"https:\/\/sites.google.com\/a\/scrumplop.org\/published-patterns\/value-stream\/sprint\/daily-scrum\"><span style=\"font-weight: 400;\">The Daily Scrum<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">These days we\u2019re working on the sequel: <\/span><a href=\"https:\/\/www.facebook.com\/scrumplop\/\"><i><span style=\"font-weight: 400;\">A Scrum Book<\/span><\/i><\/a><span style=\"font-weight: 400;\">. I lead a group of about 20 direct contributors (including <\/span><a href=\"https:\/\/www.linkedin.com\/in\/jeffsutherland\/\"><span style=\"font-weight: 400;\">Jeff Sutherland<\/span><\/a><span style=\"font-weight: 400;\"> again, but also <\/span><a href=\"https:\/\/www.linkedin.com\/in\/mikebeedle\/\"><span style=\"font-weight: 400;\">Mike Beedle<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/www.linkedin.com\/in\/gbenefield\/\"><span style=\"font-weight: 400;\">Gabrielle Benefield<\/span><\/a><span style=\"font-weight: 400;\">, and many other notables), drawing on the work of thousands of teams, and we\u2019ve been at it about seven years. We\u2019re getting close. We have about 100 patterns. You can read the patterns at: <\/span><a href=\"http:\/\/scrumplop.org\"><span style=\"font-weight: 400;\">http:\/\/scrumplop.org<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><strong>Q6. Have you ever been to India? What is the one thing you like most about how Agile Processes are implemented in India?<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">James: I have indeed been to India several times. Some of the architecture is stunning and the people are great. I have a long-time interest in <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Vastu_shastra\"><span style=\"font-weight: 400;\">Vastushashtra<\/span><\/a><span style=\"font-weight: 400;\">, which resonates strongly with &nbsp;pattern foundations.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In terms of processes, people are people everywhere. They want to do their best. But they are limited by the mores of their culture and workplaces. India is a strongly hierarchical culture and that cripples the dialog that fuels agile development. A ScrumMaster is viewed as a titled position and, in that culture, the right thing for a developer to do is to please him or her when challenged about the progress of a task. So the team often misrepresents the actual state of the product, and that makes transparency difficult.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">But, again, it\u2019s the culture and not the individuals. I have a friend, <\/span><a href=\"https:\/\/www.linkedin.com\/in\/rune-funch-s%C3%B8ltoft-2431151\/\"><span style=\"font-weight: 400;\">Rune Funch S\u00f8ltoft<\/span><\/a><span style=\"font-weight: 400;\">, who was working on a complex financial product here in Denmark. One of the Scrum Teams (mainly Swedes) had deemed a set of features impossible to implement and left them on the backlog for two years. The organisation brought in a new team, all from India (from <\/span><a href=\"https:\/\/www.tieto.com\"><span style=\"font-weight: 400;\">Tieto<\/span><\/a><span style=\"font-weight: 400;\"> in Pune), that have never worked together previously, with members of varying levels of experience. They initially exhibited all the Indian dysfunctions that fit Western stereotypes: they tended to be \u201cyes men;\u201d they often worked harder instead of smarter, and they were very failure-averse. Rune worked with them as their ScrumMaster to make it safe for them to fail, to get them to own that feeling, and to get them into a work style that built on learning from failure instead of avoiding it. In two <\/span><i><span style=\"font-weight: 400;\">weeks<\/span><\/i><span style=\"font-weight: 400;\">, that team delivered what the Swedish team had been unable to deliver for the past two <\/span><i><span style=\"font-weight: 400;\">years<\/span><\/i><span style=\"font-weight: 400;\">. It was a real victory for the Indian team, that became <\/span><i><span style=\"font-weight: 400;\">the most productive team at the client<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><strong>Q.7 Any message you have for our audience?<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">James: Always be ready to give a reason for what you do \u2014 a reason that comes from your heart and soul rather than some book. Most interviews I do explore that aspect of my outlook and approach rather than, as this one has, the technical and professional stuff. The technical stuff, you can get from a book. That\u2019s the easy part. The hard part is the answer to the question: What, and who, are you <\/span><i><span style=\"font-weight: 400;\">becoming<\/span><\/i><span style=\"font-weight: 400;\">? And: What is the path from here to there? I do not stand so much on my accomplishments as on <\/span><i><span style=\"font-weight: 400;\">possibility<\/span><\/i><span style=\"font-weight: 400;\">, and it\u2019s my mission to lead others to do the same. Laurels just fuel the fire that keeps the house warm. These questions are key to a Buddhist worldview \u2014 which is less foreign to you there in India than to me in Denmark. Reach into your heritage and find keys to doing great things in the world of work.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Agile has become a religion, and is very bad in this regard. Object-orientation has devolved to the same place, and there are many other religions ranging from DDD to Six Sigma and microservices. Most of these are fads and, like TDD and on-site customer, research and experience eventually discount them. Some even curry their belief in practices such as <\/span><a href=\"https:\/\/www.scruminc.com\/alternative-to-kanban-one-piece\/\"><span style=\"font-weight: 400;\">kanban<\/span><\/a><span style=\"font-weight: 400;\">, whose inventor says that it is only a stopgap measure and a sign of immaturity that should be completely eliminated from one\u2019s systems. The Toyota Production System (on which Scrum is based \u2014 not Lean!) tends to come with good arguments as to why its approaches work, so it may be a good starting point. But you need to add a free spirit of innovation. A hard message for Indian managers is: don\u2019t be afraid to fail. A failure-averse culture will never have the courage to realise world-changing innovations. As Martin Luther said: <\/span><i><span style=\"font-weight: 400;\">Sin boldly \u2014 but believe more boldly still<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"844\" data-permalink=\"https:\/\/innoroo.com\/blog\/2017\/08\/23\/interview-with-james-coplien\/james-copliens-287x300\/\" data-orig-file=\"https:\/\/i0.wp.com\/innoroo.com\/blog\/wp-content\/uploads\/2017\/08\/James-Copliens-287X300.png?fit=287%2C300&amp;ssl=1\" data-orig-size=\"287,300\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"James Coplien&amp;#8217;s 287X300\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/innoroo.com\/blog\/wp-content\/uploads\/2017\/08\/James-Copliens-287X300.png?fit=287%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/innoroo.com\/blog\/wp-content\/uploads\/2017\/08\/James-Copliens-287X300.png?fit=287%2C300&amp;ssl=1\" class=\"size-thumbnail wp-image-844 alignleft\" src=\"https:\/\/i0.wp.com\/innoroo.com\/blog\/wp-content\/uploads\/2017\/08\/James-Copliens-287X300.png?resize=150%2C150\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/i0.wp.com\/innoroo.com\/blog\/wp-content\/uploads\/2017\/08\/James-Copliens-287X300.png?resize=150%2C150&amp;ssl=1 150w, https:\/\/i0.wp.com\/innoroo.com\/blog\/wp-content\/uploads\/2017\/08\/James-Copliens-287X300.png?resize=60%2C60&amp;ssl=1 60w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/>James Coplien is the father of Organizational Patterns, is one of the founders of the Software Pattern discipline, a pioneer in practical object-oriented design in the early 1990s and is a widely consulted authority, author, and trainer in the areas of software design and organizational improvements.<\/p>\n<p>He has authored books like&nbsp;books <i>Pattern Languages of Program Design<\/i> (with Douglas C. Schmidt), <i>Pattern Languages of Program Design, Volume 2 <\/i>(with John M. Vlissides and Norman L. Kerth), and <i>Advanced C++ Programming Styles and Idioms<\/i>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It is a great honour to interview James Coplien, who is involved in founding the Software Pattern Movement. He is author of Advanced C++ Programming Styles and Idioms and &nbsp;co-authored books like Organisational Patterns of Agile Software Development and Lean Software Architecure for Agile Software Development. James Coplein&#8217;s work on organisational patterns has inspired to [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":845,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[9],"tags":[],"class_list":["post-636","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-interview-series"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/innoroo.com\/blog\/wp-content\/uploads\/2017\/08\/James-Coplien.png?fit=3127%2C1708&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8Rui8-ag","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/posts\/636","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/comments?post=636"}],"version-history":[{"count":7,"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/posts\/636\/revisions"}],"predecessor-version":[{"id":850,"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/posts\/636\/revisions\/850"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/media\/845"}],"wp:attachment":[{"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/media?parent=636"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/categories?post=636"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/innoroo.com\/blog\/wp-json\/wp\/v2\/tags?post=636"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}