Breaking Software Down

Jeff Atwood likens software development to tending a garden. I can relate to this. In fact, I would like to ask, if you have a nice plant in one of your gardens, how complicated is it to “copy” that across to another one?

I realise that I am moving away from the analogy here but there is an important concept here. Libraries were born out of the desire to share and distribute code to be re-used.

The idea for Remote Procedure Calls dates as far back as 1976. Microsoft brought along OLE and then COM made this more generic and better.

RPC is widely in use these days and there are several other mechanisms for inter process communication including CORBA, REST & SOAP.

I don’t think software is broken down into small enough components. *nix is great in that you can tag a whole bunch of commands together on the command line to do some amazing things. I have personally piped data through a dozen or so commands and scripts to do some interesting things.

If we could break everything down into individual components that could be linked together, we would have a massive arsenal of interoporable tools that each user can pick and choose to put together very powerful solutions.

How many times have you found a piece of software that does one thing really well, but fails in something else. Then found another piece of software that does the other thing really well.

For example, the extensibility of Firefox is fantastic but I love the rendering of Safari. I love the Contact Management within Evolution and the Mail capabilities of Thunderbird.

Why don’t we break each software down into each of it’s individual components (and I am not talking about libraries here) and allow them to be deployed as services usable by other pieces of software.

In other words, release the contact management capabilities of Evolution as a product of it’s own right with a pre-defined API that any application can link into (including perhaps a web interface). Release the Mail management component of Thunderbird as a service, Release GUI’s as a component. Then we can pick any GUI we want, link into a specific mail component and another addressbook component.

Do one thing and do it well. In fact, let’s take it one step further and release a public API for each software component – an API for Mail, one for Contact Management and so on.

Each software component can then be a black box that delivers this API.

Choice can be a bad thing if it makes it difficult to choose – Subclipse vs Subversive is a good example of this. Let us however, not confuse choice with flexibility.

Let’s say that you want to find all the files within a folder modified within the last 3 days containing the text “abracadabra” and then replace all occurences in those files of the world “super”  with “hyper”.

To do this in linux, all you would do is chain find (to identify files modified in the last 3 days), grep (to identify only the files that contain “abracadabra”) and sed (to do the replacement).

If you know these commands well enough, you could chain something together in half a minute or so. You could probably figure out how to do this with the search tools in Windows within a minute or so but where this really shines is if there are thousands of files that needs to be processed. With other search tools, you would have to wait for the original search results to be returned before running to replace operation. This takes up the users time.

With the chaining of commands, I have run it and worked on something else while it completes.

Let me visualise a brave new world:

In this world, all software would be interoperable components. For example, there would be components for:

  • Mail account management (Perhaps genericised into configuration management)
  • Text composition (usage for mail, documents, plain text et al)
  • Text reading (again, usable for mail, documents, plain text et al)
  • Spam Filtering (already available to some extent)
  • Contact Management (optionally linked into organisation’s LDAP server)
  • Task Management (Standalone Mylyn if you know the product)
  • Scheduling (or calendering if you prefer that term)

If all of these components were interoperable, then there would a GUI that is generic and could bring all of these together. In this way, the people working on each of the components could concentrate on doing one thing and one thing well.

If we then start working on public API’s in a collaborative fashion, each of the component could be fleshed out to be as flexible and complete as necessary to gain maximum benefit.

If these components provided the services as a network based API, it would also allow for the components to be distributed across a network providing redundancy and efficiency. This makes it easier to turn each desktop into more of dump terminal concentrating purely on user interaction and getting closer to the invisible interface.

Software as a service has taken a step in the right direction. Can we take a leap and have software component as a service…

Design

Admitting to being a techie – I have often overlooked design. In fact, I have often explained to (potential) clients, using the analogy of a ferrari that we make the engine and everything else work while somebody else makes it look gorgeous. For me, how something looks was largely irrelevant – as long as it worked well.

This explains why, for a long time, I used a fairly bland desktop environment. My desktop itself was just pure black with no wallpaper. Ironically, I would remove all the icons, so it would be pure black and nothing else.

This should have tipped me off on my own desire for design. I thought my desire for black stemmed from the “good old” days of DOS when the screen was black and my love for the linux terminal. As an aside, I used to reconfigure the terminal windows in X to have a white on black background as well – so much better for the eyes. In fact, I still don’t understand why everyone uses a white background for terminals and such like. Paper was white because that was easier. There is really no reason for the screen to be white too…

Now, this was before I bumped into Enlightenment (at this time, it was E16) and to put it bluntly, I was captivated. This this was absolutely gorgeous. Fairly unusable since I was used to GNOME and of course Microsoft Windows. I thoroughly enjoyed this until it became more of a distraction…

I ended up reconfiguring GNOME to be prettier – in fact, I had the Mac OS X theme for a while which I enjoyed.

I then dabbled with E17 and it was absolutely gorgeous – E16 paled in comparison. I ran into a bug where some java applications would jump a few pixels when changing the decorations. This was a real pain since I was developing a Java application at the time. I spent an entire day trying to “fix” this before I realised that it was E17 screwing it up and not my code… 😦

More recently, I thoroughly enjoyed Compiz with the shaky windows and such like – I just always wished that I could actually throw a window and watch the momentum carry it that extra distance.

Nevertheless, this bridged the gap enough to E17 to keep me happy for a little while.

Last week, I dabbled with E17 again to see if the issue with Java was resolved. To my surprise E17 had changed more or less completely – it was bridging the gap between a window manager and a full fledged Desktop environment.

However, there was a problem. It looked like I couldn’t get it back to its old glory of absolutely fantastic graphics without some effort in configuration. One other issue I ran into was that maximising a screen would fill it up across both my monitors. Another thing I could configure but then, it all seemed like too much effort.

E17 gives me the feeling that this is where user interfaces will end up – it automates so many of the things that makes it quicker to do anything. However, it still lacks some of the “basics”.

E17 is a very good example of a UI that tries to conform to what I call the “Invisible Interface” which I will be writing about later.

To bring it all back to now, I found it a hassle to go through all the available themes for WordPress for the Company Blog as well as my own.

I used to take great pleasure in going through dozens or hundreds of themes and picking ones that I liked but after doing it a few times (for Firefox, Thunderbird, my phone, GNOME, GDM and my flat), it gets a bit repetitous.

Now, for a wish. A website that pulls in all the different themes for all over the world for everything. A one-stop-theme shop. Here, I could go through and pick a general theme that I liked and download it for all the applications, my phone(s), mp3 players (and of course, taking it to the next level, all the gadgets at my flat).

That gives my life more uniformity. Perhaps this is something that Designers could take on… Say Hugo Boss, and design something that even matches your clothes, shoes, hair – everything.

That way, you could have your own unique branding… and while you are at it link it into Gravatars and you are also instantly recognisable

Now for the issue of privacy – I think I best leave that for another day.