Software Creation Mystery - http://softwarecreation.org

Archive for the ‘Practices’ Category

How to use search skills to become an effective programmer

No man is an island unto himself every man is a part of the whole – John Donne

It is possible to program a web page or small application with little knowledge of programming. Use Google to search for examples and if you are lucky, you will find ready code and your are almost done. Even experienced programmers often retreat to search to save time and effort for finding solutions for their problems.

Modern effective programming is unthinkable without using search, the  Internet and collective intelligence. Therefore, search skills are becoming primary for an effective programmer.

Now we don’t need to know and remember how to solve many programming problems – we can use search. We are becoming more effective, productive and able to solve wider range of problems. But does it mean that good search skills are enough for building software? This post will review the role of search skills in forming programmer knowledge and how to use search effectively.

Types of knowledge and how it grows in programmer’s brains.

Read full post >>

Comparing Intelligent Software Evolution to Chaotic Biological Evolution

Software Evolution is similar to a Bible Story: we, software creators, have a plan and goals and pursue them to create the perfect solution. We carefully select and add new features according to our grand design. We try to keep design clean and optimal. Things sometimes go wrong and the software system goes berserk, but we intentionally intervene and fix the problems to continue fruitful functioning of the system.

Biological Evolution is a different story: chaotic raise and fall of different species, without any plan and goals. New traits and variations appear all the time and many are useless or even harmful. Small modifications accumulate over time, cause significant changes and emergence of new species, better adapted for the evolving world. Survival of individual organisms and species is the matter of chance, pressure from environment and competition with other organisms.

Intentional growth of software versus chaotic evolution of organisms… Do they have anything in common?

Biological Evolution

In biology, evolution is the process of change in the inherited traits of a population of organisms from one generation to the next.

Species - a group of organisms that can reproduce with one another and produce fertile offspring.
Population – a localized group of individuals belonging to the same species.
Traits – particular characteristics of an organism.
Genes -portions of DNA molecule, which control inherited traits.
Genotype
- complete set of genes within an organism’s genome.
Phenotype - the complete set of observable traits that make up the structure and behavior of an organism. These traits come from the interaction of its genotype with the environment.
Variations – the variation in phenotypes in a population reflects the variation in these organisms’ genotypes.

Most of the genome of a species is identical in all individuals of that species. However, even relatively small changes in genotype can lead to dramatic changes in phenotype: chimpanzees and humans differ in only about 5% of their genomes.

Read full post >>

The Secret of Building Effective Software Systems

I can’t wait to share this simple secret with you right now.

The Secret: Effective Software Systems are the systems that easy to understand and operate with human brains.

Programmers are more productive with effective software systems. Programmers can better learn and grow these system. Programmers have less problems, work faster and make better decision with them.

Now, you can avoid spending time reading this post if you already know this secret and you know how to avoid building the software system that:

  • almost impossible to understand in reasonable time
  • has confusing and convoluted swamp of logic and structure
  • scary to change as nobody has any clue what will be broken, but sure that it will be broken


If you are still interested, lets find out what makes software systems effective.

Software Development is a pure mental endeavor (except typing on keyboard) that includes 3 main activities:

  • Understand - learn and know system concepts and implementation
  • Evolve - build, modify and support growth of the system ideas in the code
  • Share - communicate and exchange ideas about the system


Programmers should care about 7 areas to make the system better suited for our brains:

  1. Knowledge Creation and Retention – parsing, memorization and comprehension of the system ideas
  2. System Organization – elements, relations and structure in the system
  3. Sustaining Emerging Order – support evolution of the system and gain control over chaos
  4. Minimize Noise and Purify – avoid adding unnecessary stuff to the system
  5. System Discovery and Learning – making sense of the system
  6. Mental Models – our internal explanations for how things are working in the real system
  7. Shared Knowledge – ideas exchange, reconciliation of opinions and creation of mutually enhanced knowledge.

Read full post >>

Is Refactoring a Necessary Waste?

Can we say that clearing house from rubble and debris after home repair is a necessary waste for construction workers? Can we say that making design of the car that could be easily supported and repaired by mechanics is a necessary waste for engineers? Can we say that making ideas clear, easy to follow and understand is a necessary waste for the influential writer?

Amr Elssamadisy posted an interesting opinion on InfoQ about refactoring:

… there are two types of waste in Lean: pure waste, and necessary waste. Pure waste is one that has no value to either the team building the software or the customer using the software. Necessary waste, on the other hand, is the best way we currently know how to do a job even if it does not have customer value. Refactoring is clearly an instance of the latter.

Amr tries to make an important point – minimize refactoring that doesn’t contribute directly to customer requirements under development. It is a reasonable point, but I don’t like word the ‘waste’ and belittling of one of the most important practice of the modern developer. This post sparked a very interesting discussion around value of refactoring with many insightful comments (including Kent Beck and Tom Poppendieck).

We, software professionals, sometimes forget that source code is the most important representation of our ideas about how software should work and what it actually does. In the essence, software development is communication, processing and coding of people ideas. We substantially reduce value of our software if we leave messy, convoluted and difficult to understand software ideas, though correctly implemented. This code will waste time and effort of people who evolves and supports our software (including ourselves). And therefore, it will reduce value of the software for the customers who expects that it will be well supported, easy to change and become better over time. Refactoring is the practice that forces us to improve code and represent software ideas better.

Certainly, as with any complex human activity, we should learn when, how and why we should do refactoring. We should learn how to balance refactoring and development of the new features – software consolidation and expansion phases (read an excellent article from Brian Foote and William F. Opdyke). Refactoring should be not only targeted to reduce technical debt, but also to reduce comprehension debt – understanding, refinement and enhancement of implemented ideas. Finally, refactoring is the essential part of our professional mastery, which distinguish ace programmers from amateurs or indifferent hirelings.

Software Creation Mystery - http://softwarecreation.org
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License .