I'll summarize my premise first. Sensible work flow trumps the number of features when you're implementing the software version of a set business process.

In The dangers of perfection, and why you should stick with good enough, redhotpenguin brought up the issue of quality as a component of software design, and went on to break that into technical quality and business quality. This node started life as a reply to that. I found myself branching so far from that thread's topic, though, that I decided this might be a whole new meditation. In that thread, redhotpenguin stated that the business quality of software had to do with the number of features. In some cases, and moreso in a competitive public product market, that's right. However, the relationships among the steps involved in turning your input into your output is sometimes far more important than which features of the software are involved in those steps. Central questions of usability, functionality, suitability to task, and later code maintenance can be addressed partly by focusing on a process rather than a document model or feature list.

I'd encourage everyone to stop thinking of the business case of "not broken" as "has list of X features" and to start thinking of it as "has features implemented in such a way that accomplishing something useful with the product flows sensibly from start to finish".

The integration of features into a sensible (even if not ideal) work flow is far more important, IMHO, than the number of features. Start by finding out what data would be transformed in what way in what order in a typical manual arrangement. You can start with those most common features and make sure they actually make sense together. You might even be able to model the interface itself around the work flow instead of around the document object. Then, as optional or less frequently used methods become needed, they can be fit into the best place relative to what currently exists.

Once the most basic features are incorporated in the project, it may become more apparent how to best integrate what I like to call the "smaller checkbox" items. Those are the things you'd like to have on your checklist, but which are less important than your "big checkbox" items -- the features you'd advertise in bold. This is a good time to consider a plug-in architecture, a scripting engine, a transformation rules engine that's accessible between other steps, or coding the lesser features in directly. By knowing the common steps and having them already implemented, adding optional behavior to the major steps or minor tweaks between them becomes, IMHO, more clear than trying to plan for every feature up front. Since you already have the code for the major features in place (and hopefully debugged before starting on minor features), design and implementation details for the inputs and outputs of a pluggable module or the hooks needed for a scripting engine become clearer.

Have a clear relationship among the features which makes using the software make sense. Your end users will be far happier with that. By focusing on 20% or 80% more features and throwing them in, you often end up with a confusing maze of menus. The options on those menus are often grouped by some artificial categories based on what they generically do. This might be to make the software more flexible or just because the features are the central concern. However, if you're writing an application to solve a process problem rather than a wide range of unguided data manipulation issues then the process should take the lead in design and implementation. A word processor or spreadsheet is about flexibility, and a categorized menu system makes sense when the document is the end result. However, when the main point of your application is to follow a more defined process, minimizing interaction with the interface will make the program seem more powerful.

One reason I think web-based applications are becoming so popular is because of this process-based modeling. Part of this is a happy accident. The HTTP protocol being stateless and transactional lends well to small changes being made one after another. While JavaScript, XMLHTTPRequest, and the browser DOM make some fairly heavy state maintenance on the client possible, it's still often being based around a process that makes the applications so friendly. This is the same idea as wizard-based applications. While many programmers and power users prefer a menu or even a textual interface, there are times when a guided approach makes more sense for the majority of tasks. Chained web forms, even with fancy controls, model this pretty well.

Many web-based applications are modeled after the old screen-based input of the mainframe and minicomputer business applications of twenty to forty years ago. Many of those applications for banks, airlines, hotels, POS systems, government agencies, and similarly process-bound businesses have changed little over that span of time.

If you're working on a creative work like a graphic or presentation, a wide array of options at every point is helpful and being railroaded into a single track is frustrating. However, I think too many applications are modeled after Photoshop or Word when they ought to be modeled more after a reservation system, a government questionnaire, or even a semi-custom manufacturing process.

How about a nice, tidy example? Engine size, trim package, stereo head unit, transmission, wheel and tire size, type of seats, and more can be specified for a particular model of car rolling off the same assembly line. That line can start by making every car the same, and as each option is designated by the designers and engineers it is added to the line. At each step, two or more options might replace the single unit that was involved before, which narrows the point of changes to a local portion of the line. The particular model of car doesn't change, and the overall process of assembling the car doesn't change. Every once in a while, there's a hook in the process where a box can be checked to specify an option instead of the default.

In software terms let's say you're periodically putting together the same report (we'll use a monthly fiscal report as an example). You'll be pulling data from multiple places and transforming it to make a presentation. You'll probably be pulling the same data from the same places most of the time. You'll probably also be presenting it in a somewhat standard format. However, some department might need a more detailed accounting of expenditures on, say, office supplies one month and perhaps expense reimbursements the next. This is often accomplished as a second, separate report because messing with a general fiscal report in a word processor or spreadsheet for one customized report means major changes to the document model. However, if you're just summarizing each set of data as it comes in and placing it in a template of the final report, you can easily change how a certain section is summarized. That's a document-centric vs. process-centric difference.

It's similar to the difference between mingling your presentation and code and using a template system in a web project. Mingling them ties you to the presentation, while using a template frees you to work on process. Process, after all, is what most general-purpose programming languages model really well. Presentation is what markup languages model really well. There's much already written about the division of presentation and process, MVC, templating systems, and similar topics. I'll skip over anything deeper on those topics here.

One of the most important questions to ask yourself during software design is often overlooked. It should be considered before how many features you need. It's possibly more important than visual polish on a publicly released product, and definitely more important for internal projects. It's even more important than asking which features you need. That question, though, is really simple. Ask yourself, for every project, "Are we dealing with a document or a process?"

If you're working on a general document type without a set process, you'll want your features to be more widely and readily accessible. You'll also be working on a rare type of requirement which is usually already well represented by other software. However, if you're working on implementing a process, having the basic process flow correctly is your first concern. Fitting options and less frequently used features into the process should come after a default output can be created.

In the process-centric scenario, "good enough" becomes "which outputs can we produce from a given set of inputs?" rather than "do we have X of Y requested arbitrary features?". People don't pay for software fully customized to their needs in order to have a shiny checklist like on a shrink-wrapped box. They pay for it to get their information from specific input formats they can already access to specific output formats they want or need to use in their business. That can be as simple as a web form that asks the right questions instead of a generic comments form. It can be as complex as typesetting a book from a manuscript, or building a home from blueprints and materials specifications.

The point is, when you're filling a business need in software your customer is often better off having a business process they already perform automated. Often what they get is general, flexible software that can be used to manually perform the same tasks in a digital medium instead of on paper. Using a digital medium is good, but automating parts or all of the actual process is a much bigger deal. The interface often matches the flexibility of the tools involved, which can slow or even overwhelm less savvy users. If the interface is modeled on the process, and option check boxes and optional interim transformations of the data appear as steps within that process, it will feel more natural and be less error-prone for the user. It also helps minimize the interaction of the features to well-defined steps (and perhaps some features are only available once or twice in the whole process). That minimizes not only searching through menus and the conceptual overhead of the features, but also the places in the code you'll find features creeping into the data representation.

Update: added readmore tags
  • Comment on Document-centric vs. Workflow-centric design

Replies are listed 'Best First'.
Re: Document-centric vs. Workflow-centric design
by locked_user sundialsvc4 (Abbot) on Mar 12, 2008 at 20:25 UTC

    My recommended approach would be:   “product- and project- centric.”

    First of all, your piece of software is “a product,” even if it is “just” for in-house use. You are spending a lot of time and money on it, even if you're “just” doing it for yourself. People are going to need to rely upon it, even if that group of people “just” includes yourself.

    Secondly, your piece of software is a project, which means that the very best time and place to plan it all out ... and to plan it all out ... is at the very beginning. You don't have to figure things out as you go along. You don't have to take off at a full gallop on your horse while you fumble around in your back-pocket to see if you even remembered to bring your map with you. You can create a schedule for yourself and track your progress against it. You can work out specifications, including appearance and procedures, before you start to write anything, and the time spent doing that will be time very well spent. What works so well in the construction trades works just as well here. (Try it.)

    The more you work on clearly-separating this design work from your coding, the more you'll realize that “coding it” is pretty much drop-dead easy. It's a task that you basically perform by-rote. The hard work is the design, and what's actually been making software-writing seem “so damn difficult” is the tremendous amount of scrap-and-rewrite that undisciplined methods were causing you to do. You were “going off half-cocked,” time and time again. Acting as though computer-programming were rocket science, when even a rocket scientist doesn't do things that way.

    Once you have decided exactly what you're going to do, and how (perhaps among many possibilities) you're going to do it, then both the documents and the workflow just follow on as necessary consequences. Again, more or less just by rote. (I simplify, but only slightly.)

    Mind you, the project does not have to be worked-out in exhaustive detail before you can actually start to do something useful. More likely, it's going to be an incremental, cyclic process that goes through many iterations many times ... but not as “a voyage of discovery.” Do all your discovery with a map, in port (or on the leeward side of the most-recent Tahitian island), then set sail (again).

    “If you fall off the edge of the ocean, it's your own damn fault.”   ;-)

      You make some good points, but nowhere did I mean to advocate not planning ahead. I mean that the plan should focus on how the user is going to use the software. The plan should include how the features are going to complement one another, how closely they will be tied together, and whether they should be used at random times or in a fairly set sequence.

      Once one understands how the input would be transformed into the output by a skilled and experienced member of the future end-user staff, one can design the interface around the process. The most important features are those that are used in every case, and the other features can be iterated in once there is a working and tested base of code that produces the default outputs.

        I did not consider my comments to be mutually-exclusive with yours. Nor was I speaking in “in dissent” with what you said. Your points are well-argued and, I think, well-taken.