Kuro5hin.org: technology and culture, from the trenches
create account | help/FAQ | contact | links | search | IRC | site news
[ Everything | Diaries | Technology | Science | Culture | Politics | Media | News | Internet | Op-Ed | Fiction | Meta | MLP ]
We need your support: buy an ad | premium membership | k5 store

[P]
Crossing the Rubicon (Op-Ed)

By mirleid
Sat Aug 6th, 2005 at 11:57:59 PM EST

Software

How often have you lovingly designed a system, using proven guidelines and patterns, making sure that there are consistent and coherent interfaces, only to have it butchered later in the development stage by others more concerned with immediate goals like processing X transactions per second, rather than longer term ones like maintainability and scalability?

This has happened to me more than once in projects that I worked on. The end result was always a system that performed according to spec, but that was not viable in the longer term.

So, I ask you: What is more desirable?
  • A system that is consistently designed along coherent guidelines, using well understood design principles, even though those design principles might cause it to perform less efficiently than it would otherwise perform if some of those principles were relaxed or altogether dropped
  • A system that is designed around achieving the end performance targets but suffers from design inconsistencies (i.e., different components being designed using different approaches) due to addressing performance concerns in inappropriate ways


The questions above become intensely relevant when the task at hand is building a mission-critical enterprise system of any meaningful size, with a projected lifespan in the order of 8-12 years. In fact, the very nature of the system and its life expectancy make issues like technology choices, maintenance and scalability of solution increasingly important. And, I would argue, the system's expected performance normally stands in the way of making the right choices at design time. "What would be the point of creating a beautifully designed system that does not meet performance requirements, and is thus not fit for purpose?" you ask. If you are interested in my take on it, please read on.

Technology choices

When initiating a programme to build a system such as the one described above, one of the first things that needs to be decided is what technologies should be used to support it. By this I mean making choices like
  • Should we go WinTel or Unix (oversimplifying the issue, because we can have Linux running on Intel machines, but it'll serve to illustrate the point)
  • Which type of programming language should we use (Java, .NET, C++)
  • Do we want a relational database or an object database
There are people saying that the targeting of the system should only happen later in its development cycle, but I would argue that these choices need to be made up front. You might not get down to the level of selecting specific vendors, but you need to have a clear idea of what you are going to have available at product level when designing the system. For instance, if the system is required to support a 24/7 mode of operation, and the regulator for the specific market the company is operating on requires you to have two live-live data centers, with a DR site in a different country, this might influence you to chose a specific database vendor and product, due to the parallel operation and data replication requirements that this implies.

Maintenance

This is where things start getting hairy. Let's assume that, after examining your requirements, you decided that what you need is a system running on Solaris targeted at a J2EE-based execution platform. Well, writing EJBs (and doing it properly) is not something that anybody can do and is a skill that is hard to find (contrary to what most people posting CVs on the job sites would have you believe; and, yes, there's a bit more to J2EE than writing JSPs). So, you decide that you need to create some infrastructure code that will be used by the developers employed to write the system: this infrastructure code will materialize a number of patterns and coding guidelines aimed at "dumbing down" J2EE and thus making it possible to employ people that only know J2SE. Furthermore, creating this piece of infrastructure will ensure that there is a consistent "theme" to the code produced, making it simpler to code review and debug (or so you hope). It should also have a beneficial effect on the maintenance of the system, since the code that comprises it will fit a particular pattern that should be well documented (if not simple to understand).

Obviously, there is a flip side:
  • Developers will start complaining almost instantly: this piece of infrastructure will necessarily restrict what they can do, and developers do not like to be restricted. If you hired consultants from the Big 5, their expectation is that, by being staffed to your project, they will acquire J2EE coding skills, which your infrastructure is preventing them from doing.
  • By its very nature, your infrastructure piece will introduce overhead. This overhead means that there's less time for business logic to execute if SLAs are to be achieved, which leads to more complaining from the developers, because infrastructure is preventing them from delivering to spec. Overall, you are effectively slowing the system down by adding infrastructure.

Scalability

Given that the system must live for quite a long time, it needs to be able to cope with (hopefully) expanding business volumes. In other words, it needs to be able to scale. In order to make sure that it scales, your architecture is based on asynchronous communication, so that you detach the producers from the consumers, enabling you to tune your system and allocate resources where they are most needed.

On the flip side, you have also decided that messages should be passed not in binary format, but in XML, because you communicate with a number of external systems (which is expected to grow) and you do not want to have to keep updating translation code throughout the life of the system. And, from a scalability perspective, this all makes perfect sense: asynchronous communication ensures that you can deploy more consumers if you need to process messages faster (even when the system is live and running), XML ensures that you have decoupled your internal data formats from what external systems expect to see. The problem is that all this has introduced more overheads. And the system has, as a result, become less performant.


So, what do you do?

You are now between a rock and a hard place. Your design achieves all the desired targets except for the one that you'll primarily be measured upon: the system being able to process those business transactions as fast as the business costumers have (more often than not, arbitrarily) decided they should be processed.

The big question is: do you start compromising, "cutting corners" in the architectural design so as to accommodate specific performance requirements (i.e., allowing some components to invoke another synchronously), or you just tell your client to buy (rent/lease/whatever) bigger boxes?

I would argue that the right option is the "bigger boxes" one. Obviously that this is not to say that you should not perform optimisations on your system, nor this is to say that you can get away with producing crap code that runs like a dog. What I am saying is that, in the long run, and at the rate that technology is evolving, you can always throw a bigger box at the problem, assuming your system scales (which is something that you might not even be able to achieve with the "optimised" approach to designing the system, given to the fact that you created a system that uses different techniques and mechanisms in different parts of it, and they respond differently to hardware based scaling). What you cannot do is to revert this state of affairs once you have gone down an "optimised" approach.


Bottom line

Prepare to be confronted with the "what-are-you-talking-about-16-cpus-the-current-system-works-fine-on-1-and-runs- pretty-fast" syndrome. People that say this neglect to say that that the current system is written in assembler and nobody can maintain it, except for those two contractors that have been around for 10 years earning more money than the CEO. And that there is a reason why it is being replaced.

What they also neglect to say (or put a dollar/pound/euro value on) is that the system cannot be extended because it simply wasn't designed for it: everything that was done to it over the last 10 years was to add yet another patch to something that now looks like prime hippy handicraft. So, try to argue your point, and argue it strongly. When you finally lose (which you will 9 out of 10 times), remember to get in writing that it was their option. Otherwise, may God have mercy on your soul.

Sponsors
Voxel dot net
o Managed Servers
o Managed Clusters
o Virtual Hosting


www.johncompanies.com
www.johncompanies.com

Looking for a hosted server? We provide Dedicated, Managed and Virtual servers with unparalleled tech support and world-class network connections.

Starting as low as $15/month
o Linux and FreeBSD
o No set-up fees and no hidden costs
o Tier-one provider bandwidth connections

Login
Make a new account
Username:
Password:

Note: You must accept a cookie to log in.

Related Links
o More on Software
o Also by mirleid


View: Display: Sort:
Crossing the Rubicon | 57 comments (37 topical, 20 editorial, 0 hidden)
Veni Vidi Vici? (none / 0) (#56)
by treefrog on Fri Aug 12th, 2005 at 01:05:44 PM EST

What has the content of this post got to do with its title?

I don't really see any connection withthe poster's problem - business pressures vs architectural elegance, and Julius Cesaer's decision to cross the Rubicon (border of Italy) and seize power in Rome, overturning the constitution?

Someone please enlighten me?

Regards, treefrog
Twin fin swallowtail fish. You don't see many of those these days - rare as gold dust Customs officer to Treefrog

offtopic, but maybe helpful (none / 0) (#55)
by ccdotnet on Wed Aug 10th, 2005 at 12:09:18 AM EST

Everyone I know that started their own business was driven in large part by the need to do it "better" and on their own terms. They all saw short-comings in the way they were forced to do things to make time or budget constraints. They knew (whatever the product or service was) it could be built/delivered better than they were. And what an opportunity, right? Do it better, make a killing.

The reality dawns shortly after they go out alone. Perfection has no place in the business world. Take your high expectation, and bring it down into the realm of what's affordable to the client. Yes it can be built better, yes it can be executed better. But when they say "the client is always right" I interpret it as "the client sets the quality bar, not you".

You need to lower your standards to what the market will bear. Your concerns about long-term benefit and "doing it right" belong in your hobbyist/side-project. In your day job, the result is what counts, not whether or not the solution is elegant.

Seems like the customer is confused (none / 0) (#51)
by keiff on Mon Aug 8th, 2005 at 10:21:58 AM EST
(keiffster@gmail.com)

As soon as any major consultancy gets involved, then they will have to reduce the technology level down to their common denominator.

Lets face it, their business model is many many minions on site for as along as possible learning as much as possible, to either

  1. Market their new skills to the next customer
  2. Learn everything of value, create a new business unit and sell those skills to the next customer
  3. Learn everything of value, create a project and sell it to the next customer
You see a consultancy is only as good as the next big out sourcing deal, that only comes from showing you have the right skills, how do you get those skills, well you train your staff on existing customer sites

As soon as a consultancy gets involved, you know exactly what they are going to do, trash everything already their, state that nothing will ever work, put in a case for complete re-design, re-simplification and/or re-write, but only with 10 times their own staff, and a tasty bonus



results oriented vs process focused (2.50 / 2) (#37)
by ColloSus on Sun Aug 7th, 2005 at 09:43:04 AM EST
(suspension.colloidal@gmail.REVERSEcs.com) http://www.opera.com/download

The choice you are really talking about is whether to be results oriented or process focused. It really is a choice for the young graduate who gets hired and has to adapt to the realities of the enterprise and forget the habits acquired in University, where sometimes it's more important to learn how to go about solving a problem than to actually solve it. But once you spend some time in the real world, you realize that there is no place left for process focused individuals and they don't play well with others, unless they change their ways. Being process focused betrays a certain inability to deal with changes and adapt to a rapidly evolving environment. It is also a prelude to obsessive compulsiveness.

Cheers!
"Democracy is the art and science of running the circus from the monkey-cage." Mencken
architecture astronauts (none / 0) (#35)
by nml on Sun Aug 7th, 2005 at 03:48:50 AM EST

Your design achieves all the desired targets except for the one that you'll primarily be measured upon

sorry, but if your design doesn't meet one of the primary requirements (i.e. speed), then it's not a good design. I'm presuming you knew well in advance that you'd have to meet this target, so why did you wait to the end of the project to deal with it? You sound like you've been in this situation before - why didn't you anticipate it?

"what-are-you-talking-about-16-cpus-the-current-system-works-fine-on-1-and-runs- pretty-fast"

why is it unreasonable to expect that your new system will perform within an order of magniture of the old? If it's hand-coded in assembly then newer code will be slower, but why such a huge gap? Besides, if your new system is so wonderfully maintainable, why can't you just optimise it? After all, a maintainable system should be able to be adapted to meet new needs, and you've now got a need for speed.

What they also neglect to say (or put a dollar/pound/euro value on) is that the system cannot be extended

so why didn't you deliver the system that they asked for? If they didn't pay for it, they can't complain about not getting it. Because it sounds like you ignored their requirements and built a system with a lot of infrastructure to satisfy your desire for 'maintainability' and a lot of features, instead of building what they asked for.

Given that the system must live for quite a long time, it needs to be able to cope with (hopefully) expanding business volumes. In other words, it needs to be able to scale.

of course, the problem with this assumption is that your system that 'scales' can't even cope with the existing business volume, thanks to all the layers of buzz-word laden crap you've designed into it. The whole point of design is to make intelligent tradeoffs, not to insist that 'scalability' 20 years down the track requires XML-based asychronous message passing and huge overheads. Do what you were paid to do - design a system that works now. Implement it in a clean, consistent way. Optimise as necessary. You can't possibly anticipate all future needs, so don't try. Remember, you aren't going to need it



-1, I'm sorry. (1.00 / 8) (#32)
by What Good Is A 150K Salary When Living In NYC on Sat Aug 6th, 2005 at 05:06:09 PM EST
http://slashdot.org

Look, I really wanted to vote this piece to the front page and all but I just cannot see what at all this has to do with negroes. Therefore I cannot in good conscience cast my vote in the realm of positive or neutral.


Skulls, Bullets, and Gold
Wintel/Unix - languages (none / 1) (#27)
by lukme on Fri Aug 5th, 2005 at 07:04:59 PM EST

Both of these issues are somewhat religous.

As far as the Wintel/Unix - it depends on your application. If you need to optimize on disk access, then the higher end Unix machines will beat Wintel every time - they are a more balanced system. The Wintel boxes are processor heavy and will beat the Unix machines if the entire process can be cached in to the processor cache.

As for languages, It really doesn't matter which one you choose. Choose one that gives you the option of coding in an easy to read section for the parts that don't need to be optimized (also for the first iteration of the code), and then only optimize what the profiler says needs to be optimized for your application. Quite frankly, it is better to have slow code in hand then vapor.




-----------------------------------
I wonder as I wonder out under the sky
I sympathise with you (none / 0) (#26)
by emmanuel.charpentier on Fri Aug 5th, 2005 at 06:54:21 PM EST
(emmanuel.charpentier@nospam.free.nospam.fr) http://echarp.org/blog/

it's been my experience that management want and demand silly things, that we must live with a historic system that seem like a prehistoric house in the middle of manhattan.

Currently I'm trying to recover from my past projects. The last one was designed for education, and all of france. It was for one million concurrent users. Yes you read me right, mgmt was ambitious to says the least.

So I designed something, and fought and fought and fought. At the end they understood that file synchronisation was viable and most of all, easy and straightforward. What a pain for such a simple and obvious result!

Of course the company tanked, and we had not one user :-(

Nowadays I think in simpler terms. Start with a caban, but one that can evolve into a house, and if necessary, a building. Malleability is the key. And only write what is necessary today and tomorrow. I guess it looks like extreme programming, at least some part of it. And I love the idea that documentation is not allways required, good simple and obvious code is necessary!

But well, management controls money, which in the end controls our work, our time... I'm going to learn hypnosis :-)

+1 FP (3.00 / 3) (#25)
by Veritech on Fri Aug 5th, 2005 at 01:24:21 PM EST

Has words like "it", "be", and "the" in it.

+1, non-obscure programming article (none / 0) (#24)
by More Whine on Fri Aug 5th, 2005 at 12:48:40 PM EST

Thank you for not using dozens of acronyms or obscure language that only programmers would understand.  This is an interesting article and deserves to be voted up (and I normally hate anything that has to do with programming because I find the general concept of programming to be so tedious and life-consuming that I don't see how programmers don't go insane).

Relational or object databases (none / 0) (#21)
by chase the dragon on Fri Aug 5th, 2005 at 11:46:10 AM EST

It was my impression that object databases are fairly rare in industry. I've never understood why, except that many IT professionals have invested a lot of time and expertise in relational databases. J2EE projects often use object relational mapping that makes the relational aspects fairly redundant. In my opinion, it's only a matter of time before the relational part is abandoned entirely.

Relational/Object Databases (3.00 / 5) (#17)
by alby on Fri Aug 5th, 2005 at 06:14:45 AM EST
(alby@bleary-id.co.uk)

Do we want a relational database or an object database?
Neither.

I'll be using FLAT FILES!1!

--
Alby <alby@bleary-id.co.uk>

I watch six years ago (none / 1) (#9)
by IceTitan on Fri Aug 5th, 2005 at 03:09:31 AM EST

as IBM implemented SAP R/3 worldwide. It crashed. They threw money at it. It got fixed. It crashed again. They threw more money at it. They then needed different functionallity in it, so again, more money. The current system was heavily modified from the original base. Some in the know claim the two aren't remotely the same anymore. It's been patched, repaired, added on to, sliced, diced, julianned. IBM just keeps throwing money at it to make it work.

My current employer does work for IBM. We use their system. We wanted to expand, so we got different contracts and a different system. Guess what? My company didn't have the money to throw at the problem the way IBM did. What we are currently left with is a system with lots and lots of manual work arounds. This system has been active for about two years. We were even testing moduals that we were later informed the company had not purchased. My modual that they did purchase won't even work the way we set up the business. So I'm resigned to a spreadsheet instead of a paperless automated system.

The way I see it, when you bring in an already designed enterprise level system, it was already built around a certain model. Often, as in my case, the model conflicts with the current or previous way business is done. You can either throw money at it and have it your way. Or you can conform to the new preset model. Or you can half ass it the way my company did and continues to do.

The primary problem I see with mine and probably most system implementations is incompetent managment. But that is another rant.

My professional opinion (2.50 / 6) (#8)
by localroger on Thu Aug 4th, 2005 at 08:42:02 PM EST
(localroger@hotmail.com) http://www.kuro5hin.org/prime-intellect/

Speaking as the guy who probably designed that current system that is written in assembler and it's true, nobody can maintain it except me because they don't fucking teach the techniques any more, but you neglect to mention that it also never crashes...

I predict this upgrade will be a complete disaster no matter what path you take. I've seen it at least a dozen times and the result never varies. The new system will indeed need 16 Pentium CPU's instead of 1 486-based dos box to do less less reliably and you know what? Nobody will be able to maintain it either because there will be so many hidden and undocumented dependencies and throughput bottlenecks and un-sanity-checked inputs that will bring the system to its knees every time someone enters a time and date that isn't in valid format into some HMI box on the shop floor.

But the people responsible for chucking the system that worked will blame all the problems on the operators, and higher management will believe them instead of the operators who have kept their business running since 1975.

(Incidentally, while I do our stuff for customers I don't do our in-house accounting stuff, and this even happened to MY company in 1999 when they chucked our much reviled but rock-solid IBM System 36 for a Wintel-network based system that has never, ever worked very well and whose authors can't seem to fix it no matter how meticulously we detail its myriad bugs, race conditions, and crashes.)

I am become Death, Destroyer of Worlds -- J. Robert Oppenheimer

Context dependent (3.00 / 2) (#6)
by GileadGreene on Thu Aug 4th, 2005 at 03:12:04 PM EST

This problem is entirely context-dependent. Why does the customer need the performance they claim they need? If it is truly arbitrary, then it is a tradeable design parameter - and where you draw the line depends on how much the customer values short-term performance versus long-term scalability. If the performance figure is not arbitrary, then you must meet that requirement. How you meet it is another question, and basically becomes a short-term cost (bigger iron) versus long-term cost (maintainability and scalability) issue. Again, that will depend on what the customer needs/wants. There is no "one size fits all" answer to the question you pose.

Crossing the Rubicon | 57 comments (37 topical, 20 editorial, 0 hidden)
View: Display: Sort:

kuro5hin.org

[XML]
All trademarks and copyrights on this page are owned by their respective companies. The Rest � 2000 - 2005 Kuro5hin.org Inc.
See our legalese page for copyright policies. Please also read our Privacy Policy.
Kuro5hin.org is powered by Free Software, including Apache, Perl, and Linux, The Scoop Engine that runs this site is freely available, under the terms of the GPL.
Need some help? Email help@kuro5hin.org.
If you can read this, you are sitting too close to your screen.

Powered by Scoop create account | help/FAQ | mission | links | search | IRC | YOU choose the stories! K5 Store by Jinx Hackwear Syndication Supported by NewsIsFree