Welcome to MSDN Blogs Sign in | Join | Help

What is agile development?

How do you know if all this about Agile is not a scam? How do you know if all of it is about a whimsical fashion? Are there not enough cases of sophistry in History by which people have been fooled to put their resources in the hands of swindlers? (Sophistry is briefly discussed in this material from a community of philosophical inquire).

What makes work the ideas behind Agile?

As far as I am able to see, the answer contains something intimately linked to individuals, and not to the ideas themselves. It is about the way individuals think, and about how they learn to improve their thoughts.

What resides at the center of Agile, what is required to inquire into and adopt regardless of name and external ceremonies, is a learning style. A power or ability to put ourselves in a given mental position or attitude, by which we search to be aware of the terrain and give it priority on top of what the map might say.

As no one can think on behalf of other, the responsibility to develop such power or ability resides in the individual.

Posted by marcod | 1 Comments
Filed under:

More on the C++ mindset

The minds behind The Standard C++ Programming Language have been much influential to my own thinking since many years. I am glad they continue their thinking.

Posted by marcod | 1 Comments
Filed under:

Human-oriented software design is error-oriented

Alternate title: Cognitive dissonance in software design.

How to know if a design process is help or hindrance for good decision making?

As the design activity consists of a myriad of decisions, all the way from idea to released bits and back, the whole quality of the outcome is the sum quality of those individual and interrelated decisions. One bad decision could spoil an entire design even if successive decisions would be better ones. The real fix is to go back and remove the decision subtree branched at the wrong choice. If a given design process enables such ability, then it seems to be of help.

The ability of going back in the decision tree often is based on how far we have gone from the wrong choice. How many other decisions are dependants of the wrong turn? Costs in terms of time, effort, money, etc. could prevent us from going back. Hence, a good design process helps us to reduce the amount of dependencies upon a given choice before it has been revisited and corroborated.

Such a design process has to consider that (1) humans are its main players —not computers or tools— and (2) the intellectual nature of the object under design: software solutions to human problems. Therefore, the design process must take into account the ways humans behave when taking decisions and solve problems.

Taking good decisions, solving the right problems, and solving them rightly, are all human endeavors, error-prone, and full of blind spots. A root cause of many software development failures is to ignore those very simple facts —note that I say simple, which could be completely different than easy—.

A human-oriented design process is error-oriented; it plans for the most likely event: human error. Consequently, a human-oriented design process must consider, for one, along with other important stuff, the cognitive dissonance theory in the field of psychology about how the human brain seems to be “designed with blind spots, optical and psychological, and one of its cleverest tricks is to confer on us the comforting delusion that we, personally, do not have any; about how and why people unintentionally blind themselves so that they fail to notice vital events and information that might make them question their behavior or their convictions” —Mistakes Were Made (but not by Me): Why We Justify Foolish Beliefs, Bad Decisions, and Hurtful Acts by Carol Tavris and Elliot Aronson. If such theory describes, explains and predicts a significant number of cases, then it could help to control the process of software design, where there is plethora of decisions to make. For example, it could, with relatively sound basis, help designers to choose the time to revisit a design decision: early and often (that recurrent tenet once again), at least, the most important decisions. Otherwise, if the time to revisit is extended, then more dependencies could amount; or the decision gets justified by the effect of the self-protection mechanism: “we cannot be wrong”.

Mechanisms of preservation of the ego are normal, human; as well as the self-awareness related to the adult life, that where we know what we are doing.

“Drivers cannot avoid having blind spots in their field of vision, but good drivers are aware of them...We cannot avoid our psychological blind spots, but if we are unaware of them we may become unwittingly reckless, crossing ethical lines and making foolish decisions” —Carol Tavris and Elliot Aronson.

“The greatest of faults, I should say, is to be conscious of none” –Thomas Carlyle

Another cause for the blind spots in software designers is the performance metrics in the organizations they are part of. Oftentimes, those metrics are not error-oriented but error-punishers and thus most designers have no incentive to look for disconfirming evidence of the accuracy of their design decisions. For more of this, see Measuring and Managing Performance in Organizations by Robert D. Austin.

Most important decisions in good software design are tentative, provisional —like in a serious scientific endeavor—, kind of timid and bold at the same time. As the number of corroborations increased so the confidence on the goodness of such corroborated decisions. Q: How do you know it will work? A: Because I have been watching it work incrementally already.

Posted by marcod | 0 Comments
Filed under: ,

My Technical Readiness

The category of this post is Personal and is all about Technical Readiness, my own one.

Analysis, synthesis (design), communication, specification, abstraction, logic, assumptions, generalization/specialization, objects, properties, behaviors, classification, and more...are all required skills for good software design.

Studying philosophy is a good way to get deeper on those very skills.

Guess what? I am studying philosophy as part of my Technical Readiness for creating software-based business solutions, as simply as that.

For more about this, see Object Thinking by David West and hear this two-part interview.

Posted by marcod | 0 Comments
Filed under:

Product owner

Writing software for my own—or my kids—use and delight is almost always a fun and successful endeavor, if expectations are not well managed, I throw it away, no problem. Likewise, when programmers write software for their own use, there are more chances the software can be steered gracefully to a useful end.

It is quite different writing software for paying customers when the business value is a moving target. One development management strategy is to isolate the development team from such dynamism for at least a short period of time (30 days in the case of Scrum). Then reflect how close we are from the adjusted target and plan the next short development cycle based on current priorities. Enabling the growth of the functional capacities the business actually needs. The whole point of the adaptive methods of development is to give chance to the related parties —and especially to the Product Owner— to learn, to realize, to corroborate, what is the actual —up to a given point in time— need; and to direct the development effort only toward that need.

In addition, if involved people lack the awareness of what entails this style of development for each role —like the accountability for steering the effort by the Product owner— then, agile and lean fads become the new excuses for brittle software.

Posted by marcod | 0 Comments
Filed under:

Writing

The act of writing demands some skills from the writer, skills of the intellectual kind. Of course, the demand varies accordingly to the type of writing among many other factors.

Writing texts for humans, from blog posts to literature, is challenging if the purpose is to convey a message in a clear and concise way, as possible.

Writing technical texts for humans and computers, also known as the act of artistic programming of digital computers, is also very challenging.

Based on typical conversations between IT professionals nowadays, I guess that only very few people alive today actually know what really entails a common communication between humans and computers through technical texts (also known as source code).

Posted by marcod | 0 Comments
Filed under:

SQA — Are you–really–making sure that quality is present?

What is the idea behind SQA?

If SQA stands for “Software Quality Assurance”, then I hardly find a project team member not under that cap —in a team with agile principles, values and practices, that is.

If SQA stands for “testing” (validation and verification testing, for functional/integration/acceptance testing purposes) then I think the old practice of having a different set of professionals doing destructive testing still is a good advice (if finding bugs is the goal).

Unit testing for Test-driven design is for developers (constructive mindset), validation and verification for functional/integration/acceptance testing purposes is for testers (destructive mindset). Hence, testers’ role does not change very much while adopting agile methods.

Moreover, making really sure quality is in there implies something greater than thinking SQA as a role some people have in a software project.

Posted by marcod | 0 Comments
Filed under:

Where are we -as industry- about delivering business value to customers?

For a hint, see the The Standish Group CHAOS Report summary:

CHAOS Report Summary 2009

"These numbers represent a downtick in the success rates from the previous study, as well as a significant increase in the number of failures", says Jim Crear, Standish Group CIO, "They are low point in the last five study periods. This year's results represent the highest failure rate in over a decade"

Posted by marcod | 0 Comments
Filed under:

Is there such a thing like a method of design?

I have observed, time after time, an author or renowned professional share or publish her opinion about something, said, in time T1. Many people listen to that opinion —with accuracy or with misinterpretation— and then take that view for granted. Moreover, many, many people start behaving like propagandists of such reinterpreted or particular view; they even start enterprises based on generalizations of such views. Sometimes, curiously enough, the original author —who is guided by his own critical powers— find out, in time T2, new corroborated information which become the base for a shift in opinion or a significant improvement over her previous views. Including a complete departure from what he previously said.

For instance, about 1964, Christopher Alexander wrote a book entitled Notes on the synthesis of form. Many people understood that what is important about design is the process or method of design and they emphatically pursued the development of design processes as mean to better designs. Doug Lea wrote about the integration of Alexander’s works to field of software design.

Almost ten years later, the same Christopher Alexander wrote a preface to the paperback 1971 edition of the same book. There he explains that after the book was written, he discovered new information that leaded him to understand how unfortunate is the disproportion portrayed in the book between the attention given to the design method or process and the attention given to the practice of design itself. Mainly, because no one will become a better designer by blindly following the denoted design method, or indeed by following any method blindly.

Posted by marcod | 0 Comments
Filed under:

Central piece of code as a cornerstone for a tool

Sometimes, the idea of a tool could gravitate around a very simple piece of code, an enabling mechanism that gives life to a much larger functionality.

That is the case of a simple tool I am writing for my own use. It is an application, based on Windows Presentation Foundation, which help me to upload files from my local hard drive to a number of Windows Sharepoint sites and folders; following my own uploading and publishing patterns.

The whole of the tool goes around this single piece of code:

Posted by marcod | 0 Comments
Filed under:

The importance of doubt in software design

The acts of exploring and discovering which start from simple doubts —kind of ‘I am not entirely sure about...’ thoughts— is what makes software design and computer programming so exhilarating for me. Doubts from the efficiency or balance of a given design decision to the net and long-term benefits of traditional beliefs about the software development process in a business context.

Based on the results so far from my personal research program on the subject of the act of computer programming, I have corroborated that this activity can be reduced —regarding its essence— to a pure act of design. Hence, further improvement or advancement of the software development profession goes on the road of improving the design skills of practitioners.

Software designers on the road to seasoned software professionals will need education about art —please note that here education is used in its widest sense and not just the popular notion of schooling— and about methodologies of intellectual work in language, literature, history and philosophy. Of course, as is the case for the good education, it is self-inflicted. That is to say, training can be given but education can only be chosen.

Among the set of dexterities in a software designer, the ability to think critically stands as a very important one. The exercise of the critical sense —in contrast with the common sense— has proved very beneficial for the design task and directly related to the quality attributes of its outcome, namely, working software that delivers actual business value.

Posted by marcod | 1 Comments
Filed under:

Know your design tools — The Singleton case

A professional software designer —one whose next paycheck depends on the quality of her software— looks for an ever increasing acquaintance with his design tools.

One of the most important design tools in software is the actual computing machine —abstract, virtual and physical— where the software under design will be executed. The reason why the computer is a design tool is the interacting or conversational exchange with it that allows better design decisions. That is, the practice of a reflective conversation with the situation at hand as described by The Reflective Practitioner: How Professionals Think in Action by Donald A. Schön.

One benefit out of such conversational exchange with the computing environment is that hardware and software components will be utilized closer to their original intent, unnecessary code will not be present and thus simple, clean, less complex, and more maintainable software could be put on the hands of users.

For instance, if you need to implement the Singleton design pattern using Microsoft Visual C# upon the Common Language Infrastructure (CLI) implementation from Microsoft, the Common Language Runtime (CLR), then it is better to first know these design tools in depth instead of trying ‘as is’, the same, unquestioned assumptions from other computing environments.

The point of Singleton is to have a single instance of a class, an exact same object shared across a given CLR AppDomain inside a Windows’s Win32_Process instance, that is, a global state available to all executing threads in the give CLR AppDomain.

The idea is, given this method...

static bool AreTheseTheExactSameObject(object a, object b)
{
  return object.ReferenceEquals(a, b);
}

...that the following assertion will succeed, even if this assertion is executed concurrently by a plethora of AppDomain’s threads:

object a = TimepointSingleton.Instance;
object b = TimepointSingleton.Instance;
System.Diagnostics.Debug.Assert(AreTheseTheExactSameObject(a, b));

The horror of global variables from old structured design techniques strikes back, now in the form of nice-looking object oriented terms. The horror could be kept in control if the shared state is read-only. But, even if the shared object’s state is read-only, there is one state that must be written once at instantiation time: the variable holding the reference to that single and shared object.

At instantiation time the following constructor must be executed only once:

private TimepointSingleton()
{
  point = DateTime.Now;
  Console.WriteLine("Timepoint acquired");
  
  //This simulates resource contention to show up
  //better the multithreading problem when no
  //proper thread synchronization is in place.
  System.Threading.Thread.Sleep(4000);
}

With the following class type member field:

private DateTime point;

The private access modifier in the constructor ensures that instantiation could only occur inside the class; no other place in the program could create objects of this class. The one and only instance of this class is created by the class itself and its reference will be kept in a private static field member and accessed by a static read-only property:

private static readonly TimepointSingleton instance;
public static TimepointSingleton Instance { get { return instance; } }

Of course, the heart of the issue is that multiple threads could invoke that public static read-only property simultaneously; which is not a problem once the object reference is in place —in the reference type variable of the private static field member— because, once initialized, this field’s value (an object reference) is read-only state for those multiple threads.

So the main design decision here is how to write the object reference of the one and only instance into that private static field.

Modern computing environments usually have implicit and explicit mechanisms that ensure the execution of a single thread in a given code point. The implicit ones are provided by the underlying execution environment and are the simplest and easy to use. That kind of mechanism is what we prefer here over explicit mechanisms that could convolute and add complexity to our design unnecessarily. Visual C++ with native code has them, and also Visual C# with the current CLR.

Explicit mechanisms for thread synchronization at initialization time involving single or double checks and volatile fields could be applied successfully, but if simpler, implicit, mechanisms are at hand that could deliver clearer results, then they should be chosen.

Based on empirical analysis and also corroborated from CLR via C# by Jeffrey Richter, that simpler mechanism for the Singleton case is a static constructor, (also named type initializer or class constructor).
From the Microsoft Visual C# Language Specification 3.0, in the 10.12 Static constructors section:

The static constructor for a closed class type executes at most once in a given application domain.

So, the crucial code would be:

static TimepointSingleton()
{
  instance = new TimepointSingleton();
}

This way, the class is not marked with the beforefieldinit CLR metadata attribute that allows the CLR to optimize type initialization for perfomance, and not necessarily for correctness. So the following field initializer accomplishes not exactly the same thing (that is, the beforefieldinit attribute is still generated):

private static readonly TimepointSingleton instance = new TimepointSingleton();

For additional perspectives click here.

Posted by marcod | 4 Comments
Filed under:

An artistic -as in skillful- programming excellent textbook

The mind of Bjarne Stroustrup through the thinking and design style of the C++ programming language has been of critical importance for my own thinking and practice of programming. Yes, he is a philosopher of computer programming, an artistic programmer (as conveyed in Artistic programming as theory formulation).

Newcomers to computer programming and experts alike could benefit from Programming: Principles and Practice Using C++ book, as a variety of concepts and exercises are covered, including historical perspectives. Also, seasoned programmers could find many hints as the book is an instance of how an expert explains and teaches to newcomers.

As a reading suggestion: in section 1.6 Ideals for programmers, a general programming process is explained and the importance of how testing, analysis, design and programming are related is noticed. So, for a perhaps better reading, I suggest the sixth paragraph which says:

“We can describe the process of developing a program as having four stages:”

would be clearer if read this way:

“We can describe the process of developing a program as having four activities:”

Posted by marcod | 2 Comments
Filed under:

Artistic programming as theory formulation

An artistic painter enjoys painting. That is a trait of artful making even when there is no fulfillment other than the act of painting in itself. The same could be said about problem-solving. Financial gratification could be part of the after-the-fact effects of painting or problem-solving but is not related at all with the act of painting or solving complex problems, nor as cause, reason or driver.

As time goes by, as observations and corroborations expand, computer programming —as a material object of philosophical study— looks more and more like a mix of artistic making and problem-solving activities, and less and less like an industrializable or automatable activity; there is a continuum of better tooling but that doesn’t take out a bit of the essence of programming.

But, once again, what is computer programming? Adopting and keeping a reflexive skepticism over what we do as computer programmers and searching for better answers to that question will allow us to enhance our fulfillment and also to evolve the groundwork for the next scientific revolution related to how humans make use of digital computation.

Programming entails communication, between humans and also between humans and digital computers (hence its relation with cybernetics, which is the theory or study of communication and control in living organisms or machines). For communication, we human beings make use of linguistic signs —the association of a concept with an acoustic image, as signified and signifier respectively— which are codified in a language, natural or artificial, as a medium of expression. For digital computing to take place we must, ultimately, articulate and codify our concepts in an artificial language, whether this is a programming language or the language of mathematics.

A frame for effective and precise communication of concepts as justified true beliefs has been the scientific idea of theory, which represents the best effort to explain and to predict something, and yet, it has a provisional character, and never an absolutist position. For computing purposes, a theory and its formulation are the outcome and the process of programming, respectively.

Programming as theory formulation occurs even if the mainstream programmer is not aware of that, perhaps this unawareness is part of the reason of crappy and brittle software. An artistic programmer, on the other hand, enjoys the act of programming, of solving problems, and frames her mind and his expression as a coherent system of general, constant and necessary relationships between concepts.

Happy thinking and programming

Posted by marcod | 3 Comments
Filed under:

The practical disproportion

Some individual or a small group of them have an idea or a system of ideas that look promising out of which come outstanding outcomes. Later, those very same ideas are adopted into the mainstream but a much lesser level of greatness comes out.

I have observed this pattern over a number of dissimilar contexts, software development, business, religion, to name a few.

Why is that?

Is it a fixated perception that —as colored glasses— makes me watch something where there is no such a thing? Perhaps.

Which could be another explanation or reasonable system of interpretation for this pattern of behavior among humans?

A possibility is that an important part of the root cause for that situation is a disproportional focus on the practical side out of everything. Many, many people believing practical consequences are the sole criteria to judge knowledge, meaning and value.

I suspect the obsessive, disproportional and exclusive focus on the practical aspects of a subject matter carries most of the blame.

How many of us could actually explain the difference between theory and practice, theory and hypothesis, reliable knowledge and belief?

Those who are enamored of practice without theory are like a pilot who goes into a ship without rudder or compass and never has any certainty where he is going. Practice should always be based upon a sound knowledge of theory
-Leonardo da Vinci (1452–1519)

The trouble with people is not that they don't know but that they know so much that ain’t so
-Josh Billings (1818–1885)

Posted by marcod | 0 Comments
Filed under:
More Posts Next page »
 
Page view tracker