Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What to do when you've really screwed up the design of a distributed system?

Related question: What is the most efficient way to break up a centralised database?

I'm going to try and make this question fairly general so it will benefit others.

About 3 years ago, I implemented an integrated CRM and website. Because I wanted to impress the customer, I implemented the cheapest architecture I could think of, which was to host the central database and website on the web server. I created a desktop application which communicates with the web server via a web service (this application runs from their main office).

In hindsight this was rather foolish, as now that the company has grown, their internet connection becomes slower and slower each month. Now, because of the speed issues, the desktop software times out on a regular basis, the customer is left with 3 options:

  1. Purchase a faster internet connection.
  2. Move the database (and website) to an in-house server.
  3. Re-design the architecture so that the CRM and web databases are separate.

The first option is the "easiest", but certainly not the cheapest long term. Second option; if we move the website to in-house hosting, the client has to combat issues like overloaded/poor/offline internet connection, loss of power, etc. And the final option; the client is loathed to pay a whole whack of cash for me to re-design and re-code the architecture, and I can't afford to do this for free (I need to eat).

Is there any way to recover from when you've screwed up the design of a distributed system so bad, that none of the options work? Or is it a case of cutting your losses and just learning from the mistake? I feel terrible that there's no quick fix for this problem.

like image 202
Nick Bolton Avatar asked Mar 01 '10 13:03

Nick Bolton


2 Answers

  1. You didn't screw up. The customer wanted the cheapest option, you gave it to them, this is the cost that they put off. I hope you haven't assumed blame with your customer. If they're blaming you, it's a classic case of them paying for a Chevy while wanting a Mercedes.

    Pursuant to that:

  2. Your customer needs to make a business decision about what to do. Your job is to explain to them the consequences of each of the choices in as honest and professional a way as possible and leave the choice up to them.

Just remember, you didn't screw up! You provided for them a solution that served their needs for years, and they were happy with it until they exceeded the system's design basis. If they don't want to have to maintain the system's scalability again three years from now, they're going to have to be willing to pay for it now. Software isn't magic.

like image 86
Greg D Avatar answered Oct 13 '22 10:10

Greg D


I wouldn't call it a screw up unless:

  1. It was known how much traffic or performance requirements would grow. And
  2. You deliberately designed the system to under-perform. And
  3. You deliberately designed the system to be rigid and non adaptable to change.

A screw up would have been to over-engineer a highly complex system costing more than what the scale at the time demanded.

In fact it is good practice to only invest as much as can currently be leveraged by the business, using growth to fund further investment in scalability, should it be required. It is simple risk management.

Surely as the business has grown over time, presumably with the help of your software, they have also set aside something for the next level up. They should be thanking you for helping grow their business beyond expectations, and throwing money at you so you can help them carry through to the next level of growth.

All of those three options could be good. Which one is the best depends on cost benefits analysis, ROI etc. It is partially a technical decision but mostly a business one.

Congratulations on helping build a growing business up til now, and on to the future.

like image 26
Kurt Avatar answered Oct 13 '22 10:10

Kurt