Beyond mere software design
No, I am not going to talk about how to design a system, I am going to take it as granted that you are aware on all the traditional checklists for good design and are actively applying them. What I wold like to talk about are the parts that a lot of people tend to forget until they find out about it after the system is already at the hands of the users.
I am going to talk about Rhino Security as an example to that. The predecessor for Rhino Security was a proprietary piece of software that worked on top of some incredibly confusing set of business rules. (You may not see a product vNext if you have a contract for vPrev in the last year over some dollar value, as an example). Rhino Security's design was heavily influenced by that project, including the inclusion, as a first level concept, of the "explain the reasons for this security decision". The hours I spent debugging the security system only to find out that it was absolutely correct has thought me that much, if nothing else.
So the hooks for make the system understandable are built in, they are explicit and the design and are a major advantage when it comes the time to implement, experiment and deploy the system.
Another important concern is handling errors, logging, tracing and alerts are all important concepts. Do you have a backup procedure? Do it have a way to SHOUT that the backup have failed? Do you have scheduled jobs? Do you get NOTIFIED when they do? (A lot of the problem in software occur when a scheduled job hasn't been running for three months straight)
You ask the system to do some operation. In any sort of non trivial system, figuring out why it reached this decision is as important, if not more so, than the decision / operation made. Do you plan for that? Logging isn't it. I am talking about planing for that at the infrastructure and operation levels, exposing this as a first level ability/feature in the user interface and making this visible. Give the user control over what the system is doing. You'll find that the level of understanding that they gain from it will enable them to get a far higher productivity.
As an aside, it is extremely helpful in troubleshooting, but that is beside the point.
Is your system stable? Stable in the sense that new features don't break old ones, that deploying a new version is a straightforward process. Stable in the sense that the approaches you take in the beginning of the project are stable enough to last the lifetime of the project (another way of putting this, avoid hacks in the infrastructure).
The development environment. Have you given it any thought? Do you have a well defined process for developing new functionality? (Well defined process == you have thought it out, not documented it in excruciating details). Did you consider the source control story? Did you consider the ability to split the system into independent parts?
Versioning concerns - do you need to run in a multi version environment? Do you need to support just upgrade from old version?
Tracing / auditing - this is BAM, but I don't like the term. Do you have the ability to see what the system is doing?
As you can see, we have a few separate grouping here. One is visibility and transparency of the system, second is operational issues, and last is the developer environment story. I find that all too often people are ignoring those issues completely, in favor of complete focus on architecture and application design. Those are important, but they are only part of the story.
Comments
I recently developed a system which takes orders for documents as input and, depending on a large number of rules, may or may not send out document(s) to fulfil that order.
Logs are kept which state why decisions are being made, but they have a problem: Processing correctly and efficiently requires several stages. When information is written to the log, it ends up like this:
Order X: Something happened.
Order Y: Something happened.
...
Order X: Something else happened.
Order Y: Something else happened.
... etc.
The real log has many more entries than this example - so for our customers, viewing the full list of decisions made about Order X is painful.
Having the ability to find out what decisions were made about individual orders isn't something that's vital to the product, but it's certainly annoying for me (and some customers) that it's not as easy as it should be to extract this information.
Perhaps some day I'll get the chance to work on the system again and will come up with a better way to log - or to present the logged information.
This is something that you can solve easily with just filtering, no?
Filtering would be easy and quick if the log was going to stay in a database table, but I'm going to have to move it to log files as the database is too large for MSDE (and possibly SQL Server Express) which is what our customers are using.
So that would mean grepping...
Yeah, and grepping is OK solution for short things.
Or you can generate a log file for each client / order
"A lot of the problem in software occur when a scheduled job hasn't been running for three months straight."
Oh, goodness, yes. Imagine the panic that comes from the top when the new system isn't generating a certain report correctly. This can't be, maybe we should scratch the entire system and roll back!!!!
Uh, that report hasn't been generated properly in three years.
Ouch.
Comment preview