Dec 24th, 2009 | Concepts, Practices, Process
Jason Cohen posted an interesting and provocative argument against Release Early, Release Often principle followed by many agile teams.
His main points:
- Ideas. The best ideas are not coming from users and they are bad in providing feedback (iPod). So, there is no point to release early to get their opinion and ideas.
- Features. Minimal early set of features could be unattractive for majority of users and will turn them down for future use (Apple Newton)
- Quality. A buggy and unpolished product could ruin your reputations
- Architecture. An incorrect initial architecture creates waste and serious problems down the road (Netscape, Twitter)
Therefore, Jason against releasing early and often. I don’t agree.
My answer: it depends!
Evolution is the process of small frequent changes to improve and adapt to environment.
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comment (1) »
Nov 16th, 2009 | Concepts, Practices, Process, Productivity, Teams
The manager slams a door and tells us that we are in a big trouble. Our old customers complain about many bugs and bad performance, new customers complain about delays and lack of dedication. And, top management considers our department financially unsustainable and wants to deeply cut expenses.
The manager tells that we are brilliant programmers, work very hard and create cool software solutions. But there is something wrong and we cannot work this way anymore.
Anxiety started to penetrate our souls. We know what is wrong: our team is short of people, we have too many commitments, our code is becoming a big mess, new technology and our new software version makes something bad with servers. A snowball of different problems makes us stressed, distracted and incapable of productive work.
What could our manager do next?
- Distrust. Become a dictator, make own decisions including hiring external consultants to recommend what to do or even replace us. However,
- we are good programmers and know our business well – the problem is not in lack of skill and knowledge
- external people will take a lot of time to understand the system and they will have different motivation and won’t care about the long-term success
- people will be demotivated and the manager cannot make effective decisions without active team involvement
- Faith. Give to team the full power to fix a problems and make own decisions in hope that smart people, motivation and technical expertise will do magic. However,
- fresh outlook and thinking out of box are hard when a team immersed for a long time into difficult situation
- a team possibly doesn’t have understanding and control over external forces – management, customers, finances
- changing of reality is tough (especially in people heads) and requires more than technical experience
There is a third way. Place improvement practices in the core of development process. Make self-improvement inevitable and required for any activity. Do it every day.

Toyota Way is the best example of large-scale reliable self-improvement process. It focuses on eliminating waste, solving problems at root cause and making right decisions. Toyota Way reduces problems, increases internal efficiency and makes a company successful. This is the best receipt for coming out of crisis.

Targets:
- Problems - emergencies, fires that require immediate fix: bugs, server crushes, deadline slips
- Waste - inefficient and non-value adding activities: waiting, misinformation, stress
- Challenges - adaptation to external forces (market, competitors, customers, society): new trends and technologies, changes in users expectations for user interface and functionality
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (5) »
Oct 6th, 2009 | Concepts, Management, Process, Productivity, Teams

A software project is a creative, unique and therefore unpredictable endeavor. We are not building the same thing over and over again, but solve new problems, address increasing demands and use perpetually changing technologies. Under these conditions, people – smart, creative and productive – are the most important factor of success . Software development process can only support and compliment these people, but it cannot guarantee success alone and make the factor of people negligible.
But, business wants predictable, reliable and successful results. I bet they don’t want to be at mercy how cards are shuffled in their talented development team. The answer is in establishing a process that increases chances of success and aligned with present nature of software development (unpredictable, empirical and heavily dependent on people).
The Toyota Way can be a great example that worth to learn. Toyota evolved from a small looming equipment shop to the largest car manufacturing company. The main foundation of successful growth is the system of few core principles that enables best quality, high productivity, lowest cost, shortest time and long-term success.
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comments (2) »
Jan 18th, 2009 | Concepts, Design, Practices, Process, Productivity, Skills
A really great talent finds its happiness in execution. – Johann Wolfgang von Goethe

source
Qualities of well composed code:
- Quick discovery and understanding of programming logic and components
- Clear organization (for human brains)
- Ease of reuse, modification and evolution
- Close connection between customer ideas and system implementation
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comment (1) »
Nov 12th, 2008 | Job, Practices, Process, Skills
“I made this program longer than usual because I lack the time to make it shorter.” – paraphrasing Blaise Pascal

The Elements of Pragmatic Programming Style is the collection of rules for pragmatic programmers. This collection doesn’t pretend to be comprehensive guide how to program. Rather it concentrates on fundamentals: how any programmer can build better software for the customer. Some of the rules are obvious, but, surprisingly, many programmers don’t even think about them. They make same mistakes over and over again. I hope this post will inject a healthy dose of pragmatism into your programming style and make it a bit better .
Style Components:
- Intention - understand your task and how to get it done
- Approach - basic principles of writing code
- Composition - organization of code
- Expression - expressing ideas in code
- Object Oriented Pragmatic Style
The goals of Pragmatic Programming Style are
- Building reliable software fast.
- Delivering maximum value for the customer.
- Writing code that is easy to understand, change and share.
Intention
“Everyone hears only what he understands.” – Johann Wolfgang von Goethe
Understand your task and how to get it done

Sidereal
Read full post >>
Posted by Andriy Solovey |
Permalink |
Trackback |
Comment (1) »
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) »
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 »
May 19th, 2008 | 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) »