Saturday, April 28, 2007

Importance of "keeping it simple".

Sometimes you have to keep repeating a message so that everyone gets it, at the risk of sounding like a broken record.

There was a quote in this month's Popular science which applies to  software world as I had been trying to say in earlier posts- "good engineers find solutions to hard problems that are complex and hard to understand, but great engineers find solutions to hard problems that are so simple that you wonder why you didn't think about it in the first place"

Simplicity is not only important in software design but also to the user. I remember working on a product  which had a versioning scheme which was so complex that even the QA required several days of training to understand it. You can imagine the frustration for the customer and how long the feature existed in the product!

The next level of simplicity is in the user interface, Microsoft Office 2007 UI is a great example of how to scare the user by showing all options. 37 signals has some good examples of how to design a simpler UI. Sometimes you just don't want to see the configuration or edit controls unless you need it.

It is the job of every engineer and designer to ensure what they are working on is simple. If not, you are just working hard to make life hard for others!!!

Tuesday, April 10, 2007

ABCs of good design

Good design and architecture has always been identified as a key requirement for a product to succeed in the long term.
But how how can you measure the quality of a design or identify the recipe to come up with the best design always?
These are not questions with easy answers, but help to illustrate the challenges in the area.

There have been many approaches to improve the quality of design in computer software over the course of time:

1. Functions & subroutines - This helped improve the design of monolithic programs by separating commonly used functionality into functions & subroutines. This improved the maintenance and reuse of code by having less duplication etc.

2. OOP - This was another major step forward in design in which we tried to model the objects in real world using classes having methods & properties. This was more natural to humans than working with procedures. eg. Rumbaugh & Booch.

3. CASE - 'Computer aided software engineering' evolved into excellent tools like Rational Rose which helped document the design using UML etc. This indirectly helped to improve the understanding of the system before implementation and added 'engineering' to software.

4. Design patterns - formalized the various constructs used to solve common problems, documented it, gave them names so that the language used to express the design is almost universal.

5. Agile development - uses evolving design approach based on user feedback using a working prototype. It assumes that the user knows what he really wants only when he uses it.

Still, can anyone claim that their design is perfect even if it uses all of the advancements in software design given above? It is probably why one of the comments posted earlier mentioned that you can never learn design from a book, rather it comes from experience and expertise in a variety of disciplines.


There is no secret pill to always come up with the best design, I don't claim to be an expert either but here are some of my thoughts that might help.

1. Identify the goals, requirements and the problem you are trying to solve correctly.Here is where mockups, prototypes and documentation help. If possible, share it with the target user to see if the solution is appropriate.

1. View the problem space and solution from different perspectives. eg. UML has various diagrams which help you do this. A better undestanding of what you are trying to build is always good.

2. Stick to basics and simple constructs. These will stand the test of time rather than the 'fad' of the time. Complexity in design helps nobody.

3. There will be always be related problems which have already been solved. Use the learning from them to improve or adapt your design. Don't try to reinvent everything.


The factors by which I usually evaluate a design are it's simplicity & extensibility. There are many others which are covered in related literature.

1. Simple - this is one of the most underrated features of a good design. If a design is not simple, it is usually not maintainable or extensible either. This is where bulk of your experience, intelligence & expertise in various disciplines come to play.

2. Extensible - this is also related to maintenance & readability which are all required for the design to stay relevant over a long time. The strength of a good design is often proven when the component or product can be easily adapted to un-planned scenarios.

3. Effective - it solves the problems it was meant to. ie. it doesn't fail to address the original requirements or loses sight of it's goals.

In the real world, it is not enough to have a good design to succeed. But it is always a good start!

Wednesday, April 04, 2007

OS Review

I have always been a Windows admirer, but a newly converted Mac fan, so it is probably time to see the OS world in a more 'objective' way!

Today

Linux

  • It is great as a server - controlled environment and free software without support works just fine.
  • It is not a good home machine OS - at least not yet for the typical person who need driver support for his peripherals and who needs to run PC software.

Mac OS X

  • It is technically & visually the best OS for a home machine OS out there though a bit expensive & have limited peripherals - great usability & innovation. I expect to see the iSync+.mac integration in the next version of Windows!
  • It is good as a server - the unix background gives it the required skills, but it is still not acceptable for many businesses as desktop due to lack of support for Outlook etc.

Windows

  • It is a good OS for a home machine - the sheer volume of software & peripherals is good. Security is more of a challenge as it is a popular target.
  • It is ok as a server - Longhorn server with role specific customization should help, but still far from free to use in server farms.

Future

Windows needs to take a step back and stop adding glut to the OS. It is time to give users an upgrade which lowers the memory & resource usage by half and apply the lessons learned with IIS security to the entire OS.  - 'less is better'

Apple will always be a minority player unless they change it so that it runs on any platform.  It seems the only thing to do to get wide user & peripheral support.

Linux needs a pretty face and improve usability. Please stop expecting an user to download the source and it's myriad dependencies to build the binaries. ie. drivers in binary form is a good start.

Google doesn't have an OS yet, but can be seen a company that can potentially tip the scales due to it's collection of  talent & money. It has to stop relying on chaos theory and have a solid strategy. Where is the second wave after search?

Virtualization

Windows franchise doesn't seem to be at risk in the near term, but virtualization & multi core CPUs might be the biggest threat for Windows in the future.

1. Virtualization in the server world is well understood and should make the application more important than the OS or hardware. eg. webserver, database etc.

2. Virtualization in the PC world is less of a threat, but it is what enables 'Parallels' to give access to Windows apps for Mac users.

But the worst case scenario might be Linux with open source Mac OS UI getting customers and thus developer mindshare for apps & drivers - relegating Windows to the guest OS!