Sunday, February 5, 2012

On Being a Cathedral Builder

Nowhere to be seen was the construction site or building that was being built but a group of laborers were working on cutting stones in a quarry. A noble enlightened man was passing by the area and wondered what these laborers were working on since he could not see the construction site. Hence, he decided to ask the laborers what they were working on – he approached a certain unmotivated looking laborer and asked:
  • What are you doing?
  • The stone cutter answered, I am cutting stones; can’t you see?
The enlightened person, still puzzled, went to another laborer and asked him,
  • What are you doing?
  • I am making my living out of shaping stones, answered the laborer with dejected emotion and look on his face. This guy was sure enough counting hours looking forward to go home.
Again, the enlightened person wanted to try his luck in quenching his thirst to get an answer and approached a laborer who was singing while cutting stones, smile on his face,
  • What are you doing? Asked the noble man.
  • Oh sir! I am a mason and building a cathedral answered the laborer. He was about to say more when the enlightened person interrupted him and said – aha, I get it now and left. The laborer went back to singing and cutting stones, smile on his face, singing, chiseling away for a cathedral …
Which laborer resonated with you? I am sure you have seen these types of people in your work place – whatever type of trade you are involved in. The cathedral builder is the person that takes his job with purpose, believing in the final result of his work well in advance at the early stage, and looking forward to what he is going to accomplish – even if the final result is years away. The cathedral builder surely sees the forest from the trees … He/she is the one who gets up in the morning and go to work having the cathedral he/she is helping to build in mind – with purpose, and not much about cutting stones.

For my colleagues (and people in the software development industry), how do you answer the following questions:
  • When you fix a bug, do you think of removing the error (or the symptom) or do you think of the user who would be using your system without encountering any issues?
  • When you build a system, do you think of writing methods, classes, components, frameworks or do you think of the final product being used by a user?
  • Is your happiness limited to the time when you implement an excellent algorithm, or do you imagine how a user will be able to benefit in doing his job because of your creative solution?
I can definitely guess what your answers are. Actually, I know what your answer is going to be for each of the questions – you would say ‘I am a cathedral builder’.

P.S: The above story is an old story – as many of other old stories, it could have many different versions by now (check it out on the web).

Currently reading: Service Design Patterns: Fundamental Design Solutions for SOAP/WSDL and RESTful Web Services

Saturday, September 10, 2011

On Manichean Perception

Manichean theory or perception of the world started with a Persian by the name Manes/Mani - who founded an ancient religion espousing a doctrine of a struggle between good and evil. Manichean has an over-simplified view of the world – everything is reduced to a dualistic view of the world, dividing things into good or evil, light or dark, black or white, entertaining no middle or in between states, no shades of gray.

Just by taking time to blog about this, you may be wondering about my infatuation on this old religion, which at first glance seemed even not logical in these day and age. For that matter, the last time I heard an important person, a person with world changing power at that, with this kind of view was some ten years ago when the then American president George W Bush said to the world – ‘You are either with us or against us’ - during the first days of war against terrorism after the sad days of September 11, 2001.

Even though very sublime, this perception is making a comeback and really out for anyone to see. Again, I started seeing people involved in American politics, needless to mention the party’s name, espousing the same kind of approach to their view of American ills and the way to get out of the current predicaments. I started really being afraid of this kind of perception and started seeing the impact it may have on people.

I am running into the danger of oversimplifying the issue but here are the obvious sign that I see on people with such perception:

  • Thinking in between such as the good or bad is painful so people jump to make conclusion on one side. This thinking will make people lazy – forcing them not to think. It is easy to pick one side without spending time to analyze if there is another way.
  • For some people, it will compensate for the lack of morality or help them to appear morally high by siding on one aspect that looks ‘good’ to them.
  • People will make something look bad just because they want to make their side look good. They do not recognize any good point to be accepted on the other side – this is nihilistic by nature.
  • Add on top of this lack of basic humanity or civilization, a simple difference between people will lead to killings or war that is difficult to understand by reasoned people.
Manichean perception is proved to make people myopic and narrow minded. People with small set of yardstick to measure the world will be disruptive to progress and menace to society. When encountered with a tough situation, these people resort back to their yardsticks to see problems. Our world is changing fast – there is a tremendous amount of knowledge in the digital world that people are using now. A lot of people have a superb communication mechanism at their fingertips. With all this advancement, our world is becoming complex – the digital advance will continue to challenge us with its diversity of knowledge coming from all sides of the world. This advancement is unacceptable to Manicheans. Manichean perception should not have a place in this era – it should be dead; dead with old time that we do not want to remember.

Tuesday, October 26, 2010

On Pragmatism

For most of my careers as software developer and software development manager in the application development area, I tried to be pragmatic in the decisions I made and the paths I follow. Unquestionably, it served me very well to move forward in project executions and business problems resolutions. Time and again, I followed my gut and tried to be pragmatic at heart. I still remember and approve some of the decisions that I made in the past based on pragmatism – for small tactical problem resolution; when time is a big factor to provide solution; when short term gain is appropriate; and so on.

Various definitions of a pragmatist person includes: one who acts in a practical or straightforward manner; one who values practicality or pragmatism; one who acts in response to particular situations rather than upon abstract ideals; one who is willing to ignore their ideals to accomplish goals.

Web dictionary defines pragmatism as:
  1. character or conduct that emphasizes practicality.
  2. a philosophical movement or system having various forms, but generally stressing practical consequences as constituting the essential criterion in determining meaning, truth, or value.

Based on the definitions above and from my own experience, you may take that I like being pragmatic. I am indebted to all the benefits I ripped from being pragmatic in the past. I still believe being pragmatic is appropriate and beneficial in certain circumstances – most beneficial for solving tactical issues. But, I am realizing that unchecked pragmatism can be dangerous in the long term.

I am recognizing that pragmatism also:
  • limits solutions at an average level since solutions are not well thought out and solution devised as a continuation of what already exists
  • hinders progress by keeping one to the area that is well known and hence prevent from exploring new ideas
  • confines one to think in myopic terms or making one to be purposeless as opposed to having a forward looking and drive things toward a bigger goal
  • justifies short term gains over the long term benefits; as many of software development professional remember, there is a phrase coined in software development called ‘technical debt’ that I believe mostly a product of being pragmatic
  • limits, above all, one’s ability to innovate.

Michael Wade in his blog describes pragmatism’s problems. Wade states five problems with pragmatism (Wade provides fair explanations on his post):
  1. Pragmatism can be a convenient cloak for opportunism.
  2. Pragmatism can lower performance standards.
  3. Pragmatism can encourage a "can do" attitude that sacrifices action for thought.
  4. Pragmatism can be tiring. The rushed nature of pragmatism can be exhausting.
  5. Pragmatism can encourage hubris.

In conclusion, I am not discounting or ruling out being pragmatic – on the contrary, there are many situations where being pragmatic is applicable. But, you need to understand also that it limits one to an average status if kept unchecked and continuously applied in the long run. It limits thinking to be quick action oriented where an average solution is usually the outcome. It encourages a status quo or limited progress since it is evolutionary by nature. Be aware of these facts – be pragmatic on these facts.

Saturday, March 27, 2010

On Enlisting Others

Leadership is said to be influencing others to participate, contribute and reach to a shared goal. Do not take this as a definition but as one of the many explanations that is out there on leadership. I have seen this in practice and the below is how I captured the approach. I know that I am running the risk of oversimplifying what leadership is - but here it is.

If you are in a leadership position and if you have an idea, share it with others and if necessary repeat it with them so that they have it in mind. Try to make your idea to be understandable – making it concrete using data or using beautiful explanation. Try to make your idea visible, put your idea somewhere, and ask people to comment on it. Then, enlist and ask people to participate in a brain storming session to discuss the idea, and generate next action items. Try to illicit others to take up on action items and provide feedback.

At this point, the idea is shared, amended, and possibly accepted and supported by others. If this is the case then it will cease to be your idea and becomes 'our' idea. You have passed the biggest hurdle and you are on to the next step. This is where you have to be careful and meticulous - you are getting into the execution step. Most ideas do not get implemented due to lack of will or participant, among other things.

Illicit execution ideas the same way from others, especially from those who saw the benefit from your idea - guide on what needs to be done and leave the ‘How’ to do it for participants. You can count on excellence in execution when people are choosing and allowed to provide feedback on implementation approaches. The main point here is to make them to feel like they own the idea as well as the implementation. Once execution is started, your task is to motivate, provide constructive feedback, be active participant – chances are the implementation process will be enjoyed by the participants and success may be achieved.

Remember - people strongly support what they help to create. This means they contribute with what they have to the implementation and thus to the success of what they set out to do. This is true in the case of failure or success. Credit for success will be shared and failure does not cause finger pointing.

Currently Reading: A Political History of the Tigray People's Liberation Front (1975-1991) by Aregawi Berhe.

Wednesday, October 28, 2009

On Software Quality Factors

Software Quality can be looked at from different angles in software development. These quality aspects manifest themselves at different situations and usually in combination. Some of the quality factors are listed below – these are usually referred to as software ‘ilities’ (based on the last five letters of their names). Some people argue against paying attentions to such factors as all of them may emerge in software development if the project development team uses the proper engineering principles. My take is that these factors provide conceptual clarity on the aspects of software quality at least at the higher level. I used the IEEE definition of these quality factors.

Reusability: The degree to which a software module or other work product can be used in more than one computing program or software system [IEEE]. It is the ability of a component/module to function and integrate in more than one environment. It is always manifested in and is considered as characteristics of high quality software. To achieve this quality, component or modules should be designed and implemented so that they can be reused in many different systems.

Maintainability:The ease with which a software system or component can be modified to correct faults, improve performance, or other attributes, or adapt to a changed environment [IEEE]. Maintainability provides a way of measuring the ease with which a program can be corrected if an error is encountered, adapted if its environment changes, or enhanced if the customer desires a change in requirements.

Flexibility: The ease with which a system or component can be modified for use in applications or environments other than those for which it was specifically designed [IEEE]. This concept encompasses the hardware, software and software combination in using a system. It is the effort required to modify an operational programs when environment of the system where it is running is changed.

Testability: The effort required to test a program to ensure that it performs its intended function.

Extensibility: It refers to the ease with which a program or module can be adopted with newer requirements with out affecting the existing one. It is the ability or property of a module that allows changes in many aspects such as performance, functionality, etc… within the same existing framework while retaining partial or complete compatibility among systems that belong to the same framework. Extensibility like other qualities can be achieved in varying degrees. An extensible system allows easy addition of new designs in an exiting one.

Related Post:

On Practices in Design: Modular Design (Modularity)

Thursday, September 24, 2009

On Practices in Design: Modular Design (Modularity)

Recently, I read an article on Java Modularity on InfoQ (Modular Java: What Is It?) and forced me to revisit my notes on modularity from the 1990s. As expected, every bit of the principles espoused then are applicable now. The following is what I learned then.


In Modular design, software is divided into separately named and addressable components, called modules, which are integrated to satisfy problem requirement. It implies a system decomposed into “natural” components that can be developed and maintained independently.


Many researchers are advocating the benefit of using a modular design approach. Bertrand Meyer (in his book Object-Oriented Software Construction) came up with a set of criteria to characterize modular design. These criteria provide a first step in formalizing the design practice of modularity.


Meyer’s Five Criteria for achieving modularity:

  • Decomposability - the facility with which a design method helps the designer to decompose a large problem into sub problems that are easier to solve.

  • Composability – the facility with which a design method ensures that program components (modules), once designed and built, can be reused to create other systems.

  • Understandability – the ease with which a program component can be understood without reference to other information or modules.

  • Continuity – the ability to make small changes in a program and have these changes manifest themselves with corresponding changes in just one or very few modules.

  • Protection – an architectural characteristic that will reduce the propagation of side effects if an error does occur in a given module.


From the above criteria, Meyer suggests five basic design principles can be derived for modular architecture:

  1. Linguistic (such as Java) modular units

  2. Few interfaces

  3. Small interfaces (weak coupling)

  4. Explicit interfaces

  5. Information hiding

Effective modular design practice always encompasses the well-understood software development principles such as Abstraction, information hiding, and Functional independence. The concepts of abstraction and information hiding help to focus on the relevant element during design and development. The main focus of functional independence is to design modules that serve one function and limit excessive interaction to other modules. The two methods that are used to measure the independence of a module are Cohesion and Coupling. Thus, the main goal of modular design is to minimize Coupling and to maximize Cohesion.


Since Modularity is a process of creating or structuring a system in to manageable size of modules, it may suggest that creating many modules to be an optimal solution. But, there are some principles to be considered here:


  • On what bases is the modularization effort to be conducted, i.e, by functionality or by size?

  • When do we know we have crated optimal modules for the solution?

  • What are the procedures to achieve modularity?

  • Is the process reversible?

  • What properties are available to measure the conformance of the modules with?


In order to answer the above questions, I suggest the use of SOLID principles from Robert Martin (Agile Software Development, Principles, Patterns, and Practices). These principles provide two aspects: the first one is that they help in the development activity to attain good design and the second aspect is to evaluate an existing design or during a design review activity.

I will continue to revisit my notes and share the interesting ones on the up coming posts.


Currently Reading: What Got You Here Won't Get You There: How Successful People Become Even More Successful by Marshall Goldsmith and Mark Reiter.

Thursday, September 3, 2009

On Treating Others

I am in a software development business and working with immensely talented people. I have been in this business for 15 years and worked for four companies - the talent pool always seems to be the same. As I see it, these talented people come with exceptionally different behavior - some of them do have an elephant-like ego; some of them modest, a few are real geeks that seem to be oblivious to their surrounding, and others ... ok, you get my drift. Working with these talented people taught me a lot on how to respect differences and be able to work with each other. I hope this lesson will stay with me forever.

Treating people require basic decency and that should be applied to all people regardless of their position in the company hierarchy or by their popularity amongst other people. If you work with a full-time employee and a contractor (temporary employee with short period of contract) you should see both of them the same way. Both of them are human beings and both of them do have feelings and emotions - it is unnatural to consider the contracto to be different or as somebody to be pushed around.

Early in my career, I was working for a consulting company. I was assigned to different client sites working on specific projects with my own colleagues or working embedded in the clients' development teams. At that time, I was having back pain that was bothering me - the pain was unbearable so I contemplated to have surgery. I told my my colleagues from the client company and they felt my situation. Some of them were very compassionate and even helping me looking for the right doctor. ultimately, the news reached to the team manager. One day when I was about to go home at the end of the day, I met the manager in the lower deck of the parking lot while he was smoking cigarette. He stopped me and asked me when I was going to have surgery. I was sure I did not discuss it with him since I did not make the final decision yet. At the beginning, I was very happy that he was concerned about my situation - so, I thanked him for being concerned. Before I finished my sentence, he waved his hand to signal me to stop and he said he does not care about my surgery. He went on to say that his concern was to get appropriate replacement. Wow - the disparaging hand wave and the words following after that got into me. It was a blow - I went quietly (and probably shaking my head) to get my car on the upper deck (lucky him I did not park my car on the lower level:-) ). How did the lively and seemingly nice guy turn out to be so insensitive? Do not get me wrong - I am not being a cry baby and I understand the situation he had to deal with. But, was this the right way? Would he treat full-time employees the same way?

The moral is to treat everybody with respect - recognize that we are emotional animals. Actually, We all need to be emotionally intelligent so that we can work with others in the new and continuously changing world. Having an emotional intelligence is one of the main qualities for a leader and it all starts with treating people right. We all do have strengths and weaknesses - working in a team of people requires understanding each other well. Diversity in behavior, culture, interest, and other traits should not be seen as a challenge but as an opportunity. Opportunity that can take us all to a different level; opportunity that can bring about our survival best - it is a healthy relationship to have.

Currently Reading: Outliers: The Story of Success by Malcolm Gladwell

P.S.: I did not go through surgery - I learned to live with back pain via physical therapy. It was not affecting me for a long time other than occasional hick-ups here and there.