A: 

Organic growth in itself isn't bad. It's only bad when it's done badly. However, having said that I would look 3 to 5 years in the future and make a best estimate at what the computing needs of the company will be and architect to that. Try to get honest and realistic information from the management team to base your estimate on.

Jim Blizard
+3  A: 

Without knowing the specifics of your project as a general rule of thumb I would go with the smallest/simplest possible solution that works. If they expect to grow over a long time they should expect their IT solutions to grow with them.

It's unfortunate but it seems most software takes a couple of tries to get it right and even then the natural changes that will occur can be difficult to deal with.

So unless you can make a very clear case why it would be good to invest allot of effort in what might be/happen/is needed in the future I would keep it simple.

And as far as inheriting the organically grown ™ systems I think it's only a bad situation if the stakeholders aren't aware that you started with something simple that might be thrown out once the needs change (but the experience won't!!!!) then it can be nightmarish since you can't do the right thing. But if everybody is aware from the get go what the idea is and that they should expect change in the IT solutions together with the change/growth in the business then there shouldn't be any big problem in my humble opinion.

To summarize do the simplest thing that works and make sure the stakeholders understand that it's not a one time thing.

olle
+2  A: 

Do the simplest possible solution. If you create a "full solution" now, chances are you will miss some important requirements or waste time and money adding unneeded features. That said, design your solution so that pieces can be modified fairly easily.

As a practical example, if you are coding in .NET, create an interface and default implementation for each "service". Program against the interface as much as possible. Later, if you need to break a service out, you will be able to easily drop in a WCF client that implements your interface. Inversion of Control may also help you with this.

Daniel