12. May 2013

How to improve complex software system in 10 steps

1. Introduce small change.
2. Wait and watch the impact. It may take some time to proliferate.
3. Learn about consequences.
4. Point out broken old parts which should be removed or replaced.
5. Prepare stubs and fixes.
6. Dry run. Prepare for quick rollback.
7. Repeat steps 4-6 until you’re sure.
8. Detonate the change.
9. Get ready to fix stuff that breaks during aftershocks.
10. Take a break, enjoy new system and learn something new.

20. October 2012

Observation of software system: Starting with idea

Idea. Idea is starting point for life of software system. Pure raw idea and vision of future able ignite spark of hope that new software could work.

First stages of system evolution are very vulnerable. Idea need to form protective shell from enthusiasts who are helping to grow it. Idea also needs power and resources to survive. Enthusiasts must form some form of protective structure. It could be startup.

Idea is safe for the time being. It starts growing and eating more and more resources.

Time is passing. Enthusiasm is depleting. Dwindling resources could barely support life of idea.

Key turning point. Idea must transform into system which is able to sustain next phases of its life. It must turn into the system which is able to acquire new resources. Sell or bankrupt.

Luck, serendipity or deus ex machina. Somehow it starts selling. Early adopters begin to emerge. They like new system. They sense that it could become something great.

Idea is adapting protective its shell. Startup is no longer viable solution, because original enthusiasts are nearly exhausted. They spent many many hours and sleepless nights to push this idea forward.

Idea is transforming startup shell into company shell. First it is small, but it is growing.

Transformation will take some time. Software system is growing and consuming more and more resources. Balance of income and consumption is critical for survival of idea.

Maintenance. Software system has been around for several years. Idea prospers. New things were introduced with blinding speed, but this is slowing down over the time.

New changes in software system are causing pain. Idea doesn’t like it.

Idea must protect itself and its system. New defensive processes will emerge. Idea is able to deflect all dangerous changes with carefully designed processes.

System continues to grow and attract more resources. It is obvious that everything is ok.

Unfortunately entropy in software is growing. Hidden. Protected. Old parts of system are becoming legacy.

System starts to deflect even good changes by making them hard to implement. Legacy became so big that there is no way around.

Even minor changes must be introduced with careful precision of surgeon. Adding just one line of code to the system could take several days.

Legacy became burden. Development processes are slowing down. Maintenance is burning tremendous amount of resources.

This is a deadly trap. There is no way out. For some companies it is true.

One approach could be to set aside very high amount of resources. Develop wast change and then deploy it in one BIG STEP. It seems to be right! Welcome to booby trap.

More reasonable approach is to diverge small amount of resources from maintenance furnace. Remove clutter and legacy by small steps in the time. Keep a steady flow.


6. March 2011

Just another language

There are miriads of computer languages. It seems to me that developers are trying to find better and better way how to communicate with computer.

Today you have to know many languages to get any reasonable job done. Web is based on many components and services that have to talk together. Those services also must understand each other.

Situation is even more complicated when you start to building UI over these services. Different language = different UI components = different UI paradign = different errors.

Ok, let’s start. Build app that works with few backends and systems.

Let’s be cool and put app on App Engine. We need Python.

We need some UI interface. We need HTML.

We need some templating language. We need Django.

We need some fancy features in UI. We need jQuery and JavaScript.

We need some crossbrowser feature for handling files. We need MXML and ActionScript.

We need communication with some REST services. We need JSON.

We need to implement some enterprise communication connector with enterprise system. We need Java and Bash.

We need to launch some internal processing with some CGI portals. We need Perl.

We need to grab some data from database. We need SQL.

We need some high performance backend for processing images. We need C/C++.

We need to provide integration for some web portals. We need PHP.

We need human readable structured data. We need XML.

We need to talk with some enterprise backends. We need SOAP.

We need to provide component form MS platform. We need C# and F#.

We need to have fancy frontend for Mac world. We need Objective-C.

We need to have some continuous integration. We need Maven.

We need to implement domain specific things. We need domain specific language.

And so on…

I don’t know, but it seems to me little bit insane. This is just small list of mainstream languages for relatively small app.

I’m not talking about different APIs, different frameworks. IT world is getting more and more complex.

Solution? Is there way out of this maze?

It reminds me of few sentences from Zen of Python:

  • Simple is better than complex.
  • Complex is better than complicated.