<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Marco Dorantes&amp;#39; WebLog</title><subtitle type="html">&amp;quot;Computer science is no more about computers than astronomy is about telescopes&amp;quot; -Edsger W. Dijkstra</subtitle><id>http://blogs.msdn.com/b/marcod/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/marcod/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2011-03-01T10:04:00Z</updated><entry><title>Egoless architecture</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2013/03/01/egolessarchitecture.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2013/03/01/egolessarchitecture.aspx</id><published>2013-03-01T13:26:00Z</published><updated>2013-03-01T13:26:00Z</updated><content type="html">&lt;p class="ident justif idea"&gt;What is architecture? Which could be the shared properties among diverse schools of thought and practice of architecture? Complexity management is possibly a common property among these kinds of design disciplines. Such complexity is present in many respects; some are of essential complexity, some of accidental complexity; some are about people interaction, some others about process, and others about technology &amp;mdash;to mention just a few. Yet another respect, which is all-encompassing, is the &lt;em&gt;usage&lt;/em&gt; of the thing being architected.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;My main point in this brief comment is that complexity management is pervasive and architecture needs to be practiced by all participants in a project for building any non-trivial system, not just by those with the word &amp;lsquo;architect&amp;rsquo; in their job title. Mainly because, in software, the role of the bricklayer is perfectly fulfilled by the compiler and the computer itself &amp;mdash;as these core technologies are very good at repetitive and non-creative tasks.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;The same key observations and good practices proposed by &lt;a href="http://www.addall.com/New/compare.cgi?dispCurr=USD&amp;amp;id=14057&amp;amp;isbn=9780932633422&amp;amp;location=10000&amp;amp;thetime=20130301052133&amp;amp;author=&amp;amp;title=&amp;amp;state=AK" target="_blank"&gt;Gerald M. Weinberg&lt;/a&gt; can be applied here: &lt;em&gt;egoless architecting&lt;/em&gt;. For an evidence of why this is relevant, reflect on possible responses from a so-called architect when his work is challenged or its defects are pointed out.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;Composing software is a recent activity, perhaps just 60 years old. It is like an infant among other adult professions, like architecture &amp;mdash;the well-established one. The tendency of a child to mimic the adults around him is a completely normal human attitude, just as normal as the overcoming, later in life, of such attitude. The same child, and if he grows up, starts to be aware of his own identity and the quest for independence continues.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;The software industry has tried to mimic old and outdated perspectives from manufacturing; for instance, the notion of division of labor. This notion has been, in part, behind the idea of roles like &amp;lsquo;analyst&amp;rsquo;, &amp;lsquo;designer&amp;rsquo;, &amp;lsquo;programmer&amp;rsquo;, &amp;lsquo;tester&amp;rsquo;. These roles can be mapped exactly with related stages of the waterfall lifecycle model: analysis, design, programming, testing. Hence, &amp;lsquo;architect&amp;rsquo; and &amp;lsquo;architecture&amp;rsquo;, as an independent role and as a discrete stage in the lifecycle, respectively, is another evidence of the imitation many people in this industry continue doing; also, it is an evidence of the childish age of this industry. If we think in a linear sequence and pick one of those activities as the first stage, followed by another as a second stage, and so on, then accidental complexity is added unnecessarily.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;On the other hand, in more mature sectors of this industry, composing software that works robustly and flexibly across many successive releases requires all capacities at once. In this way, specification, testing, architecting, deploying, analyzing, etc., are not stages in the software lifecycle but concurrent activities. As we grow up as more complete and more mature software professionals and software consumers, we can focus more in the &lt;em&gt;usage&lt;/em&gt; of the software, and less in our egos, and we can also realize that it is about architecting, not about &amp;ldquo;architecture&amp;rdquo; or about &amp;ldquo;architect&amp;rdquo;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10398496" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="design" scheme="http://blogs.msdn.com/b/marcod/archive/tags/design/" /><category term="agile" scheme="http://blogs.msdn.com/b/marcod/archive/tags/agile/" /><category term="architecture" scheme="http://blogs.msdn.com/b/marcod/archive/tags/architecture/" /></entry><entry><title>Good programming styles</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2013/02/10/goodprogrammingstyles.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2013/02/10/goodprogrammingstyles.aspx</id><published>2013-02-10T16:22:50Z</published><updated>2013-02-10T16:22:50Z</updated><content type="html">&lt;p class="nflat justif"&gt;A presentation by Bjarne Stroustrup, creator of C++, about good programing styles. This presentation was dedicated to Dennis Ritchie, creator of C.&lt;/p&gt;
&lt;p class="nflat justif"&gt;Note of relevance: The C programming language, in one way or another, is at the bottom of all existing computing.&lt;/p&gt;
&lt;p class="nflat justif"&gt;&lt;a href="http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style" target="_blank"&gt;Day 1 Keynote - Bjarne Stroustrup: C++11 Style&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392472" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="detailed design" scheme="http://blogs.msdn.com/b/marcod/archive/tags/detailed+design/" /></entry><entry><title>Empirically controlled?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2013/02/08/empiricallycontrolled.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2013/02/08/empiricallycontrolled.aspx</id><published>2013-02-08T17:56:00Z</published><updated>2013-02-08T17:56:00Z</updated><content type="html">&lt;p class="nflat justif idea"&gt;The creation of software-based business solutions, also known as application development, could benefit a lot from specific kinds of development processes; in particular those controlled empirically, like those with an iterative and incremental kernel inside, like Adaptive, Crystal Clear, DSDM, Scrum, FDD, Lean, XP, and &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank"&gt;others&lt;/a&gt;.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;What does it possibly mean to be empirically controlled? Well, to start with, it should mean that a process is not controlled by &amp;laquo;&lt;em&gt;a priori&lt;/em&gt;&amp;raquo; rationalizations alone &amp;mdash;which is still a major trend in today industry, with big up-front architectures, Gantt charts with timelines expressed in months or years, and fear-based strategies and tactics for risk management. Instead, on the other hand, an empirically controlled process springs from &amp;laquo;&lt;em&gt;a posteriori&lt;/em&gt;&amp;raquo; strategies and tactics executed continuously and in batches of small size.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;One example of such strategies and tactics are found in musical performances. If you are interested in an increased level of performance within application development projects, then &amp;laquo;&lt;em&gt;rehearsal, rehearsal, rehearsal!&lt;/em&gt;&amp;raquo; is a basic tenet of excellent performances both, in musical performances as well as in creative performances of software-based business solutions. For example, as deployment is an important part of a value stream in a software delivery performance then let&amp;rsquo;s execute, early and often, a rehearsal for such a procedure in a realistic way before touching the end-user.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;More, much more, about this is coming...interested?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10392234" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="agile" scheme="http://blogs.msdn.com/b/marcod/archive/tags/agile/" /><category term="science" scheme="http://blogs.msdn.com/b/marcod/archive/tags/science/" /><category term="architecture" scheme="http://blogs.msdn.com/b/marcod/archive/tags/architecture/" /></entry><entry><title>Further steps in theoretical groundwork for software development</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2013/01/31/semat.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2013/01/31/semat.aspx</id><published>2013-01-31T21:17:00Z</published><updated>2013-01-31T21:17:00Z</updated><content type="html">&lt;p class="nflat justif idea"&gt;Time ago I posted about the obsolescence of some theories for project management (&lt;a href="http://blogs.msdn.com/b/marcod/archive/2006/09/01/obsoletetheory.aspx" target="_blank"&gt;The underlying Theory of Project Management is Obsolete&lt;/a&gt;) and, hence, about the need for better theories not just for management. In my journey as a software professional, to the extent that I was becoming aware of how important is the theoretical effort to improve practice &amp;mdash;and vice versa&amp;mdash;, to the same extent I have searched for theories that scientifically uphold our activity. Then, it was very gratifying to know that more professionals were doing theoretical efforts (&lt;a href="http://blogs.msdn.com/b/marcod/archive/2010/03/23/workingonsoftwaretheory.aspx" target="_blank"&gt;Working on software theory&lt;/a&gt;) in our field.&lt;/p&gt;
&lt;p class="ident justif"&gt;Now, it is very pleasing to learn more about the current progress on the theoretical work of people like Ivar Jacobson, Pan-Wei Ng, Paul E. McMahon, Ian Spence, and Svante Lidman:&lt;/p&gt;
&lt;p class="ident justif idea"&gt;&lt;a href="http://www.amazon.com/gp/product/B00B1PEM02/" target="_blank"&gt;The Essence of Software Engineering: Applying the SEMAT Kernel&lt;/a&gt;&lt;/p&gt;
&lt;p class="ident justif idea"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="quoted"&gt;&amp;laquo;The kernel in this book represents a software development effort as a continuously operating abstract mechanism composed of components and relationships. The project does not move from position to position within this mechanism as in the assembly line metaphor. Rather, there is a continuous flow through the mechanism as opportunities are transformed into requirements, and then into code and tests, and then into deployments.&amp;raquo;&lt;span style="font-style: normal;"&gt; &amp;mdash;from the foreword by Robert C. Martin&lt;/span&gt;&lt;/p&gt;
&lt;p class="ident justif"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="quoted"&gt;&amp;laquo;Software projects everywhere look for methodology and are not finding it. They do, fortunately, find individual practices that suit them; but when it comes to identifying a coherent set of practices that can guide a project from start to finish, they are too often confronted with dogmatic compendiums that are too rigid for their needs. A method should be adaptable to every project&amp;rsquo;s special circumstances: it should be backed by strong, objective arguments; and it should make it possible to track the benefits.&amp;raquo;&lt;span style="font-style: normal;"&gt; &amp;mdash;from the foreword by Bertrand Meyer&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10390069" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="agile" scheme="http://blogs.msdn.com/b/marcod/archive/tags/agile/" /><category term="science" scheme="http://blogs.msdn.com/b/marcod/archive/tags/science/" /></entry><entry><title>Architecture and empowerment</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2012/12/09/architectureandempowerment.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2012/12/09/architectureandempowerment.aspx</id><published>2012-12-10T03:22:00Z</published><updated>2012-12-10T03:22:00Z</updated><content type="html">&lt;p class="nflat justif idea"&gt;How bad could organizational hierarchies be for the advance of professionalism in the business of software creation? In particular, command and control organizational hierarchies derived from misinterpretations of the concept of &amp;lsquo;governance&amp;rsquo;.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;I suggest that the advance of professionalism should be part of the strategic interests of a business for both, the short and the long term. That is why the inquiry of the opening question is relevant to a software business.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;A proper association between authority and responsibility, that is, a proper empowerment, is crucial to a mature professionalism; otherwise professional accountability has little ground on which to build upon. Hence, unbalanced levels of authority and responsibility work against the advance of professionalism; therefore, against the business. That is, if a level of authority has been given to a person to take strategic design decisions then the same person should have the same level of responsibility for the consequences of those very same design decisions. How authoritarian hierarchies help or hindrance a proper empowerment for a given software project? Of course, the original design of those authoritarian hierarchies could not be intended to care for the professionalism in software.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;This inquiry is not about the formal discourse on the matter but about the actual happenings on a given software endeavor when unmanaged complexity shows its ugly face. Also, this inquiry is intended, first, to understand what those actual happenings are; and, second, to transform those happenings into other possibilities based on a greater level of professionalism.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;One cause for improper empowerment is contextual mismatch. For example, if architectural decisions, or most design decisions, are based on previous experiences in the same business domain &amp;mdash;at best&amp;mdash; and those decisions are taken by people at a different level of empowerment than those in the actual development team, then there are good chances that those previous experiences relate to an older context, even in the same domain, because of a non-trivial number of changes in the factors of the current context, which by now has become a significantly different context. Most of the people are different, most of the technology is different and, most importantly, most of the problem is different.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;&amp;ldquo;&lt;em&gt;..&lt;/em&gt;&lt;em&gt;but&lt;/em&gt;&lt;em&gt;, the difference is not that much...&lt;/em&gt;&amp;rdquo;, if there is not enough and solid evidence to support such opinion then it should be regarded as a mere manifestation of wishful thinking. Traits of mature professionalism relate less with wishful thinking than with critical thinking.&lt;/p&gt;
&lt;p class="ident justif"&gt;How important critical thinking is for emotional and intellectual maturity. Examples of the traits of critical thinking: before taking a position and having a discussion with someone on any given subject, learn about the counter arguments. The purpose of critical thinking is to gain better understanding and to get to the truth of the matter, not about "winning" a debate. If you want to truly understand counter arguments to your position and to be persuasive with people, learn to put yourself in the shoes of the person holding different views. Think of yourself as an actor taking on a role which is different than yours: learn about the person, their values and their background. Do not only focus on attempting to refute their position.&lt;/p&gt;
&lt;p class="nflat justif"&gt;Some references for further thinking:&lt;/p&gt;
&lt;p class="ident justif"&gt;&lt;a href="http://cleancoder.posterous.com/what-killed-waterfall-could-kill-agile" target="_blank"&gt;What Killed Waterfall could Kill Agile&lt;/a&gt;.&lt;/p&gt;
&lt;p class="ident justif"&gt;&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=335889" target="_blank"&gt;Scrum will never be the same&lt;/a&gt;&lt;/p&gt;
&lt;p class="ident justif"&gt;&lt;a href="http://youtu.be/6C893IoCA3Y" target="_blank"&gt;What Critical Thinkers Can Learn From Actors&lt;/a&gt;&lt;/p&gt;
&lt;p class="nflat justif idea"&gt;Notes:&lt;/p&gt;
&lt;p class="ident justif"&gt;1. My post could be discussed in an application architecture community, but it could also be relevant for a discussion within an enterprise architecture community because it could relate to &lt;a href="http://pespmc1.vub.ac.be/PETERPR.html" target="_blank"&gt;The generalized "Peter Principle"&lt;/a&gt;.&lt;/p&gt;
&lt;p class="ident justif"&gt;2. Do not miss an historical perspective from the first referenced hyperlink in my post: &lt;em&gt;What Killed Waterfall could Kill Agile&lt;/em&gt;.&lt;/p&gt;
&lt;p class="ident justif"&gt;3. I am aware of the schools of thought, in the realm of philosophy of art and literature, that regard architecture as something not related to the concrete nuances of engineering; whereas I see great transformational value in those schools of thought, especially from their ability to bring about new narratives with different interpretations of reality, I also see that, in software, those &amp;ldquo;engineering nuances&amp;rdquo; are not so different than a well-crafted ontological reasoning. So, in software, there is not a radical dichotomy between &amp;lsquo;architecture&amp;rsquo; and &amp;lsquo;engineering&amp;rsquo;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10375944" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="design" scheme="http://blogs.msdn.com/b/marcod/archive/tags/design/" /><category term="architecture" scheme="http://blogs.msdn.com/b/marcod/archive/tags/architecture/" /></entry><entry><title>Measure of trust</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2012/11/22/measureoftrust.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2012/11/22/measureoftrust.aspx</id><published>2012-11-22T23:54:00Z</published><updated>2012-11-22T23:54:00Z</updated><content type="html">&lt;p class="nflat justif idea"&gt;Building trust is precisely what I look for when I think about adaptive development in general. We, as creators and as consumers of software, need better levels of trust at many levels. The directors of the European Space Agency surely wanted a better level of trust in their software after the Ariane 5 explosion (caused by a software design error). I want a better level of trust in the WCF service I am designing and programming right now, which will be enterprise-level deployed and to be called by dozens of enterprise applications.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;How do I know I am not fooling myself, and my project team, into believing that my effort estimate is right?&lt;/p&gt;
&lt;p class="ident justif idea"&gt;How do I know I am not fooling myself, and my project team, into believing that my WCF service is ready for deployment?&lt;/p&gt;
&lt;p class="ident justif idea"&gt;For better levels of trust, of course, the first principle is, as said by Richard P. Feynman in regard to a trait of scientific thought, do not fool yourself, neither your team, neither your customer. The methods of science have built-in ways to not fool ourselves &amp;mdash;from all those useful combinations of different schools of thought known as rationalism, empiricism, and skepticism.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;As of right now, for example, an increasing number of automated tests passing at each build of my set of WCF services amounts for an increasing level of trust. But those tests are not all. There is a number of feedback loops from an increasing set of client applications and, ultimately, end-users which also helps to not fool ourselves into believing that &amp;ldquo;&lt;em&gt;we have the belief that we are on the right track&lt;/em&gt;&amp;rdquo; or &amp;ldquo;&lt;em&gt;we want to believe...&lt;/em&gt;&amp;rdquo;. If we have that belief or not is not important, what is relevant is what we can prove based on a number of kinds of evidence, diverse, wide, and non-trivial kinds of evidence.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;Should I trust my teenage daughter that she is going to do her duties? Is there any evidence or pattern of behavior for that? Then I have my answer. The words in themselves are not evidence. It is not a matter of trust, it is ultimately a matter of evidence.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;The historic record to deliver good software on time and on budget, by a particular project team, could be good evidence on which to base my trust. The plans and good intentions are not evidence in themselves.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;So, a measure of trust in X is going to be based on measures of actual evidence for X &amp;mdash;for any relevant value of X.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;If there are only words, plans and good intentions without an historic record backing up those words, plans and good intentions then there is little trust to measure. In that case a plausible action is to start building that historic record for particular project teams.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10371012" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="agile" scheme="http://blogs.msdn.com/b/marcod/archive/tags/agile/" /><category term="science" scheme="http://blogs.msdn.com/b/marcod/archive/tags/science/" /></entry><entry><title>Dark Manifesto for Agile Software Development. Take 2</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2012/11/10/darkmanifestoforagilesoftwaredevelopment2.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2012/11/10/darkmanifestoforagilesoftwaredevelopment2.aspx</id><published>2012-11-11T01:09:00Z</published><updated>2012-11-11T01:09:00Z</updated><content type="html">&lt;p class="nflat justif"&gt;In addition to &lt;a href="http://blogs.msdn.com/b/marcod/archive/2012/11/10/darkmanifestoforagilesoftwaredevelopment.aspx" target="_blank"&gt;this&lt;/a&gt;:&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "We are uncovering better ways of developing software by doing it and helping others do it." people tend to adopt "We are uncovering the only ways of developing software teaching others."?&lt;/p&gt;
&lt;p class="ident justif"&gt;Yes, I have often seen a kind of indoctrination into the new &amp;laquo;one and only true agile cult&amp;raquo;. But that is because people do not actually read and reflect on what writing software and agile are about. So the problem is radical dogmatism: people imposing unquestionable ideas over other people; that kind of dogmatism has the consequence you are contrasting. There is another kind of dogmatism that is chosen by an individual upon herself provisionally, as a stage in her apprentice path; about this look for &amp;lsquo;Shu-Ha-ri&amp;rsquo; in the agile literature.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Individuals and interactions over processes and tools" people tend to adopt "Individuals and interactions and not processes and tools"?&lt;/p&gt;
&lt;p class="ident justif"&gt;Yes, I have recently seen a development director that forced their teams to use Post-it on the wall whereas they have a fully functional development suite of wonderful tools to have a &amp;lsquo;single system of record&amp;rsquo; of project reality; one consequence is that those teams now have two systems to keep in synchrony, wasting effort that could otherwise be in more useful activities.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Working software over comprehensive documentation" people tend to adopt "Working software and not comprehensive documentation"?&lt;/p&gt;
&lt;p class="ident justif"&gt;I have seen no significant change with the problem of documentation. I still see much of both, too much ineffective documents and too little concise and useful forms of documents that help to communicate, and to preserve, important justifications of why the software is as it is.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Customer collaboration over contract negotiation" people tend to adopt "Customer collaboration and not contract negotiation"?&lt;/p&gt;
&lt;p class="ident justif"&gt;I would be interested to see what might come out of such a tendency: "Customer collaboration and not contract negotiation". I still see too much protectionist focus on the terms of the contract, out of pure fear from both the customer and the provider. I would like to see more about designing value-streams that end at the end-user level.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Responding to change over following a plan" people tend to adopt "Responding to change and not following a plan"?&lt;/p&gt;
&lt;p class="ident justif"&gt;I see that teams must respond to change but they do it in different ways depending of their context, and with different business consequences. Some, by contract restrictions, certainly must wait until the current plan ends; others, who provisioned proper contract clauses, can adapt to new business priorities more quickly. Many could respond to change quickly but also can break things more quickly; I still see fewer teams who are able to actually change quickly and not breaking a single feature at the same time.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "That is, while there is value in the items on the right, we value the items on the left more." people tend to adopt "That is, while since there is no value in the items on the right, we value only the items on the left."?&lt;/p&gt;
&lt;p class="ident justif idea"&gt;I think that we people fool ourselves into thinking that we understand something new without proper application of the tenets of critical thinking. We often fail to challenge properly our own presuppositions and then misread new concepts, relating them with what we already have in our memory; mere opinion is misinterpreted as knowledge. So, little or nothing new is actually learned. For example, an agile development process is seen as a sequence of steps or discrete iterations instead of an integrated set of value streams.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10367497" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="agile" scheme="http://blogs.msdn.com/b/marcod/archive/tags/agile/" /></entry><entry><title>Dark Manifesto for Agile Software Development</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2012/11/10/darkmanifestoforagilesoftwaredevelopment.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2012/11/10/darkmanifestoforagilesoftwaredevelopment.aspx</id><published>2012-11-10T20:38:00Z</published><updated>2012-11-10T20:38:00Z</updated><content type="html">&lt;p class="nflat justif idea"&gt;For those interested in answer a survey or questionnaire by Giancarlo Succi and Andrea Janes: &lt;a href="http://darkagilemanifesto.org" target="_blank"&gt;http://darkagilemanifesto.org&lt;/a&gt;&lt;/p&gt;
&lt;p class="ident justif idea"&gt;Let me also post here my comments for further discussion:&lt;/p&gt;
&lt;p class="ident justif idea"&gt;&lt;strong&gt;Part 1&lt;/strong&gt;&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "We are uncovering better ways of developing software by doing it and helping others do it." people tend to adopt "We are uncovering the only ways of developing software teaching others."?&lt;/p&gt;
&lt;p class="ident justif"&gt;If &amp;ldquo;doing it&amp;rdquo; is removed then there are lesser chances to reflect, to inspect, and to adapt on the search for the specific business value &amp;mdash;which often is a moving target&amp;mdash; in a given context. Key parts of software development could be seen as epistemological endeavors; thus, if the empirical or experimental part is removed then the justification of a claim for an achieved business value could be dramatically diminished.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Individuals and interactions over processes and tools" people tend to adopt "Individuals and interactions and not processes and tools"?&lt;/p&gt;
&lt;p class="ident justif"&gt;If the processes and tools do not help for better communication between individuals then those processes and tools should not be followed or used. Instead, an open dialog among practitioners should define proper processes and tools that help them to practice their values and professional principles.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Working software over comprehensive documentation" people tend to adopt "Working software and not comprehensive documentation"?&lt;/p&gt;
&lt;p class="ident justif"&gt;The lack of a proper way to remember or to communicate relevant things to future or distant people is certainly a problem that should be solved in a project or product. That is a different problem than the problem of effort wasted in obscure and ineffective documents that nobody read. Besides, there is a plethora of recording technologies that could help to preserve and transmit relevant and valuable things about a project.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Customer collaboration over contract negotiation" people tend to adopt "Customer collaboration and not contract negotiation"?&lt;/p&gt;
&lt;p class="ident justif"&gt;And for that matter: who, on the face of the Earth, is going to listen to the end-user?&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "Responding to change over following a plan" people tend to adopt "Responding to change and not following a plan"?&lt;/p&gt;
&lt;p class="ident justif"&gt;If &amp;laquo;a plan&amp;raquo; no longer follows discovered and corroborated reality, then it is wise to make all sort of proactive adjustments or an entire new plan. The key to follow, of course, is not the outcome &amp;mdash;a plan&amp;mdash; but the frequent practice of planning. Conversely, blind reactions to whimsical moves, without awareness of the related costs, pave the path to diminished business value or business failure.&lt;/p&gt;
&lt;p class="quoted"&gt;Do you think that instead of "That is, while there is value in the items on the right, we value the items on the left more." people tend to adopt "That is, while since there is no value in the items on the right, we value only the items on the left."?&lt;/p&gt;
&lt;p class="ident justif idea"&gt;A part of the problem is a psychological pattern of neglected interpretation. It is not, of course, something exclusive of agile methods but it is a pervasive lack of education that permeates politics, economics, and many more spheres of society. The root cause is a very, very poor foundation in important areas of life, whereas it is called science, philosophy, history, mathematics, ethics, etc. In addition to that, the absolute reign of the hunt for short-term gratifications aggravates the odds to potential exits from the previous condition.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;I am fully aware that a commercial interest in profits with software does not have an inherent responsibility to advance the state of the practice of the software development profession at the individual level, but it is not difficult to see that doing so is for the best of precisely that interest. Otherwise, an increasing number of consumers in the general public will start to not pay for software that does not deliver value fast and robustly.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;The need for better software practices has been stated constantly, and yet, there is still way too much wishful thinking in our industry, mainly from non-practitioners, which persist in their lack of awareness about the long-term consequences.&lt;/p&gt;
&lt;p class="ident justif idea"&gt;What prevents us from learning a new concept is the preconception that usurps its place. See what Derek A. Muller has to say in the case of scientific concepts:&lt;/p&gt;
&lt;p class="ident justif idea"&gt;&lt;a href="http://youtu.be/eVtCO84MDj8" target="_blank"&gt;http://youtu.be/eVtCO84MDj8&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10367482" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="agile" scheme="http://blogs.msdn.com/b/marcod/archive/tags/agile/" /></entry><entry><title>Sugar-free C# – Part 2: Iterators 1</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2011/04/09/sugarfreecs2.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2011/04/09/sugarfreecs2.aspx</id><published>2011-04-10T00:28:35Z</published><updated>2011-04-10T00:28:35Z</updated><content type="html">&lt;p class="nflat"&gt;Task: as a breadth developer, I need to analyze a set of VB6 legacy applications and enlist all stored procedures invoked per subroutine per application.&lt;/p&gt;
&lt;p class="nflat"&gt;Is this a task for a breadth developer? Let&amp;rsquo;s consider this criterion: if the number of concepts needed to successfully apply an effective solution to the problem exceeds what the developer could understand and apply in one day, then it is not a task for the breadth developer.&lt;/p&gt;
&lt;p class="nflat"&gt;Let&amp;rsquo;s try C#&amp;rsquo;s iterators to scan a large set of VB6 legacy projects to group invoked stored procedures from each subroutine from each VB6 form and module. In our problem, all the VB6 projects&amp;rsquo; code at hand has the same basic organization: classes, forms, and modules with subroutines from which stored procedures are invoked, the names for all stored procedures are in the code of each subroutine and start with the prefix &amp;ldquo;&lt;span style="font-family:Courier New"&gt;usp&lt;/span&gt;&lt;span style="font-family:Courier New"&gt;_&lt;/span&gt;&amp;rdquo;. The folder structure where all VB6 projects reside is a two-level only structure: a root folder with child folders for each VB6 project and its related files.&lt;/p&gt;
&lt;p class="nflat"&gt;A sample of the required output is:&lt;/p&gt;
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;project1.vbp&lt;/span&gt; 
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;module1.bas&lt;/span&gt; 
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;subroutine1&lt;/span&gt; 
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;usp_select1&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;usp_insert2&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;form1.frm&lt;/span&gt; 
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;subroutine2&lt;/span&gt; 
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;usp_select3&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;subroutine3&lt;/span&gt; 
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;usp_delete4&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:Courier New"&gt;usp_select5&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="nflat"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="nflat"&gt;With &lt;a target="_blank" href="http://social.msdn.microsoft.com/Search/en-US?query=C%23%20iterator"&gt;C# iterators&lt;/a&gt; we could return all the .vbp files scanning the root folder structure where the VB6 code is located. For each &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa716294(v=VS.60).aspx"&gt;VB6 project file&lt;/a&gt;, we could use iterators to return all its forms and modules. From the text of each code file, we could use iterators to return all its subroutines. For each subroutine, we could use iterators to return all the names of stored procedures in it.&lt;/p&gt;
&lt;p class="nflat"&gt;The overall structure for a C#&amp;rsquo;s iterators-based solution could be like this:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun;color:blue"&gt;void&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;mso-bidi-font-family:NSimSun"&gt; f(&lt;span style="color:#2B91AF"&gt;DirectoryInfo&lt;/span&gt; VB6Root)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;DirectoryInfo&lt;/span&gt; folder &lt;span style="color:blue"&gt;in&lt;/span&gt; VB6Root.GetFolderHierarchy())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;FileInfo&lt;/span&gt; vbproject &lt;span style="color:blue"&gt;in&lt;/span&gt; folder.GetVB6Projects())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;FileInfo&lt;/span&gt; vbcodefile &lt;span style="color:blue"&gt;in&lt;/span&gt; vbproject.GetVB6CodeFiles())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;VB6Subroutine&lt;/span&gt; subroutine &lt;span style="color:blue"&gt;in&lt;/span&gt; vbcodefile.GetSubroutines())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue"&gt;string&lt;/span&gt; storedprocedure &lt;span style="color:
blue"&gt;in&lt;/span&gt; subroutine.GetInvokedStoredProcedures())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green"&gt;//...&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;&lt;span style="mso-spacerun:yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:
9.0pt;font-family:NSimSun;mso-hansi-font-family:Calibri;mso-hansi-theme-font:
minor-latin;mso-bidi-font-family:NSimSun"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="nflat"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="nflat"&gt;The definition for the methods in the structure above could be like this: &lt;i&gt;to be continued...&lt;/i&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10151738" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="detailed design" scheme="http://blogs.msdn.com/b/marcod/archive/tags/detailed+design/" /></entry><entry><title>Sugar-free C# – Part 1: Introduction</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/marcod/archive/2011/03/01/sugarfreecs1.aspx" /><id>http://blogs.msdn.com/b/marcod/archive/2011/03/01/sugarfreecs1.aspx</id><published>2011-03-01T15:04:00Z</published><updated>2011-03-01T15:04:00Z</updated><content type="html">&lt;p class="nflat"&gt;There is the notion of breadth developer, which encompasses the attitudes of the practical mindset: &lt;i&gt;How can I do such and such &lt;/i&gt;&lt;i&gt;task &lt;/i&gt;&lt;i&gt;in a straightforward way?&lt;/i&gt; For example, I need to analyze a set of VB6 legacy applications and enlist all stored procedures invoked per subroutine per application, how can I use C#&amp;rsquo;s iterators to scan a large set of VB6 projects and VB6 source text files to group invoked stored procedures from each subroutine from each VB6 project?&lt;/p&gt;
&lt;p class="nflat"&gt;There is the notion of depth developer, which &amp;mdash;seems to me&amp;mdash; encompasses some attitudes of &lt;a target="_blank" href="http://www.bing.com/search?q=mort+elvis+einstein"&gt;Elvis and Einstein developer stereotypes&lt;/a&gt;: &lt;i&gt;Why such and such works this way?&lt;/i&gt; For example, why &lt;span style="font-family:Courier New"&gt;yield return&lt;/span&gt; statements are allowed within C#&amp;rsquo;s iterator blocks whereas &lt;span style="font-family:Courier New"&gt;return&lt;/span&gt; statements are not?&lt;/p&gt;
&lt;p class="nflat"&gt;I like to think about breadth or depth developer, or &lt;a target="_blank" href="http://www.codinghorror.com/blog/2007/11/mort-elvis-einstein-and-you.html"&gt;Mort, Elvis, or Einstein developer stereotypes&lt;/a&gt;, as roles we could play accordingly to the task at hand. One difference between these stereotypes is the number of concepts that you need to understand before you can do any production-grade work. Whereas the breadth developer enjoys any amount of syntactic sugar that helps to get the job done with a reduced set of conceptual prerequisites, the depth developer enjoys sugar-free programming &lt;i&gt;in order to&lt;/i&gt; fully grasp what is behind the scenes of what was just done while in the breadth developer role; also, to jump from a mere effective to a more efficient solution.&lt;/p&gt;
&lt;p class="nflat"&gt;I have done some contemplative explorations on the MSIL code generated by the C# compiler that have been found useful to satisfy my curiosity about iterators, deferred execution, extension methods, eager/lazy evaluation, lambda expressions (anonymous function expressions, anonymous method expressions), anonymous delegates, query expressions, etc.&lt;/p&gt;
&lt;p class="nflat"&gt;I will share my findings with those contemplative explorations in future posts.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10135542" width="1" height="1"&gt;</content><author><name>Marco Dorantes</name><uri>http://blogs.msdn.com/marcod/ProfileUrlRedirect.ashx</uri></author><category term="detailed design" scheme="http://blogs.msdn.com/b/marcod/archive/tags/detailed+design/" /></entry></feed>