Dec 2nd, 2008 | Concepts, Design, Practices, Productivity, Skills
Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away. – Antoine De Saint Exupery
The approach to programming is concerned with finding the best ways to translate programmer’s intention into the good system design and code.

The programming is communication. The programmer continuously add, change and refine ideas in the code. Source code has two important goals: tell a computer what to do and tell people what the computer should do. The program code is the only true medium for storing and communicating ideas about the software system behavior. Quality of the ideas expression in the code directly affects overall quality of the system.
So, what are characteristics of the good code?
- clear – easier to work with ideas;
- minimal – less effort to understand and change ideas;
- testable – easier to validate ideas.
These are 6 top reasons for bad design and code:
- lack of expertise
- unrestrained technical curiosity and creativity
- missing big picture: system purpose and customer goals
- blindly following popular methods and over-using technology
- sloppiness; lack of attention to details
- over-complicating design to have more work or increase job security
The programmer can write better code (and avoid most of these problems) by improving programming style and approach.
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (2) »
Oct 28th, 2008 | Concepts, Process, Teams
“If you do not change direction, you may end up where you are heading.” – Lao Tzu
Software teams have three main strategies to achieve success: retreat, evolution or revolution.
- Retreat – refusal to act or the art of knowing when to say NO.
- Evolution – continuous improvement and generation of ideas stemmed from existing set of ideas.
- Revolution – rapid advance with radical and disruptive ideas, overhaul of existing core ideas.
How can software teams choose the best strategy? They should consider three components:
- The Players
- The Game
- The Dynamics

Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comment (1) »
Sep 22nd, 2008 | Concepts, Process
What does produce better ideas in software development – revolution or evolution? Revolution is a rapid triumph of the new ideas and breaking open of the old concepts. Evolution is the process of small frequent changes to improve and adapt to environment. The main difference – revolution replaces old ideas with the new promising unproven ideas, evolution gradually and continuously improves existing working ideas.

We often face this dilemma in software development – should we enhance existing features and improve the ways we work or should we instead come up with something radical and revolutionary.
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (2) »
Sep 9th, 2008 | Concepts, Process
Recently I’ve been thinking that Software Development is a game. The goal of this game is to discover and implement the best solution for customer’s needs. There are other important goals as making money, empowering business or keeping people happy, but they matter less for the purpose of the game.

Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comment (1) »
Aug 5th, 2008 | Concepts
My wife worries about me. She worries when I’m staring at the monitor with the strange text for hours – sometimes desperately, sometimes in excitement. She worries when I skip movies, ignore parties and talk with my computer. She worries why I’m so excited about such boring activity as programming even outside my work. She shouldn’t worry – there are few good reasons to love programming. I want to take an opportunity to share these reasons with all non-programming spouses over the world.

Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (7) »
Jul 11th, 2008 | Concepts, Design, Process, System
From the first sight biological evolution looks too unpredictable to have any value for the constrained software development. We just don’t have time, money and resources for these wild experiment, unlimited trials and errors. It really seems that Nature could learn from us how to make things fast and effectively.
However, there are some principles that helped evolution to come up with amazing and efficient designs that made life flourishing on the Earth. This post will explore what software development could learn from biological evolution. See my previous post for the review of evolution concepts and mechanisms and how they could be applied to software development.

Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
No Comments »
Jun 17th, 2008 | Concepts, Practices, System
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 >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (3) »
May 19th, 2008 | Architecture, Concepts, Design, People, Practices, Process, Productivity, Skills, System

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:
- Knowledge Creation and Retention – parsing, memorization and comprehension of the system ideas
- System Organization – elements, relations and structure in the system
- Sustaining Emerging Order – support evolution of the system and gain control over chaos
- Minimize Noise and Purify – avoid adding unnecessary stuff to the system
- System Discovery and Learning – making sense of the system
- Mental Models – our internal explanations for how things are working in the real system
- Shared Knowledge – ideas exchange, reconciliation of opinions and creation of mutually enhanced knowledge.
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (6) »
Feb 26th, 2008 | Concepts, People, Process, System
“Ruin in community is not caused by witches with broomstick but it’s something that starts in people’s heads.” – Prof. Preobrazhensky (Michail Bulgakov’s “The heart of a dog”)
The newborn software system looks beautiful inside after the few weeks of development. Several talented programmers put their souls together into this amazing software idea. But week after week the system become older and uglier. It could still look exciting for users, but the system rots inside. It is much more difficult to modify, it breaks often, development time and cost soars. Programmers become scared to work with it. The system becomes Frankenstein. Why could it happen?

Three reasons
There are hundred objective reasons why it could happen – complex technology, changing customer needs, management pressure, time to market and many more. But some teams still deliver a good system under these conditions. And some teams cannot deliver even in the most favorable conditions. Why?
Degradation of the system starts in the people heads and there are three main reasons:
- Incomprehension – developers don’t understand the purpose, ideas, design or technology behind the system
- Inarticulateness – developers unable to express ideas through clear and effective architecture, design and code
- Inconsistency – developers cannot act consistently or don’t care about the system
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (5) »
Feb 6th, 2008 | Concepts, Economics

Thought-provoking and interesting author Nicholas Carr has published a new article in Financial Times, where he expands on his ideas about transformation of IT services into utility. He compares IT with electric power generation 100 years ago:
Like data-processing today, power generation was assumed to be an intrinsic part of doing business. But with the invention of the alternating-current electric grid at the turn of the century, that assumption was overturned.
Suddenly, manufacturers did not have to be in the power-generation business. They could run machines with electric current generated in distant power plants by big utilities and fed to their factories over a network of wires. With remarkable speed, the new utilities took over the supply of industrial power. Scores of private power stations were dismantled.
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
No Comments »