Deprecated: Assigning the return value of new by reference is deprecated in /var/www/seafelt-blog/wp-settings.php on line 512

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/seafelt-blog/wp-settings.php on line 527

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/seafelt-blog/wp-settings.php on line 534

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/seafelt-blog/wp-settings.php on line 570

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/seafelt-blog/wp-includes/cache.php on line 103

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/seafelt-blog/wp-includes/query.php on line 61

Deprecated: Assigning the return value of new by reference is deprecated in /var/www/seafelt-blog/wp-includes/theme.php on line 1109

Deprecated: Function eregi() is deprecated in /var/www/seafelt-blog/wp-content/plugins/wp-statpress/statpress.php on line 1139

Deprecated: Function eregi() is deprecated in /var/www/seafelt-blog/wp-content/plugins/wp-statpress/statpress.php on line 1140

Deprecated: Function eregi() is deprecated in /var/www/seafelt-blog/wp-content/plugins/wp-statpress/statpress.php on line 1141

Deprecated: Function eregi() is deprecated in /var/www/seafelt-blog/wp-content/plugins/wp-statpress/statpress.php on line 1142

Deprecated: Function ereg() is deprecated in /var/www/seafelt-blog/wp-content/plugins/wp-statpress/statpress.php on line 979
Flexible Products, Sensible Defaults | seafelt.com

Skip to content


Flexible Products, Sensible Defaults


Deprecated: Function split() is deprecated in /var/www/seafelt-blog/wp-content/plugins/google-analytics-for-wordpress/googleanalytics.php on line 413

There are two ideas at the core of all our development here at seafelt:

  • Our products have to be flexible
  • Our products should have sensible defaults

Flexibility

Writing flexible code is tricky, but it’s not that much trickier than writing inflexible code. The trick is to notice when you’re doing something specific and to make it more generic, but not too much. It’s the judgement call that makes it tricky. Here’s an example from seafelt Reporter:

We wrote originally Reporter to be able to get information from a PostgreSQL database, and do draw charts of any information we passed it, or to draw tables. We mostly assumed that we’d only be reporting on seafelt Performance Manager data, which had a specific structure. But we also figured that you might want to have many instances of SPM running, each monitoring different equipment. We couldn’t assume a single database, so we built the code to handle multiple databases.

And then a colleague of ours asked if he’d be able to report on some different data, that also happened to be in a PostgreSQL database. I had a think about it, and aside from a couple of hardcoded assumptions on one of the forms, I figured “umm, yeah, actually that will probably work.” 10 minutes later, we had a set of reports on a dataset that had nothing at all to do with seafelt Performance Manager. In fact, because of the way we’d written the code, you could report on anything that had a Zope Database Adapter. And thanks to SQLRelay, that meant any database that could speak ODBC… which is basically all of them.

We want you to be able to use our products in ways we haven’t thought of, to solve problems we haven’t thought of. Solving your problems is the whole point, after all, right?

Sensible Defaults

A potential downside of all this flexibility is that you can be spoiled for choice. You’re standing in the supermarket wondering what kind of bread to buy. “Should I buy wholegrain, 5 grain, 9 grain, nuts and seeds, fibre-enhanced, healthy heart, traditional, traditional rye, rye and wholegrain…” If there are a lot of options, and no clues as to what you should choose, you’ll be paralysed by indecision.

We try to make it easy for you by making some informed choices on your behalf. We build in sensible defaults based on the way most people use our products, or what we think is the best way to solve a problem most of the time. But we don’t stop there.

You’ve probably encountered a program that is so helpful that it won’t let you do what you know you want to do. It’s permantly in dummy mode, and assumes it always knows better than you. I personally find this incredibly frustrating. Sure, helpful hints are great the first few times when you’re just learning how to do something, but after you’ve got some skill with the tool, you want it to get out of your way so you can complete the task you’re attempting to perform.

That’s our goal. We want you to be able to complete your task as fast as possible. To begin with, you might need some training wheels, but once you’re starting to build up speed, you need to be able to take off the training wheels and crank it up. That’s why we always have an ‘expert override’, so if you really know what you’re doing, you can do it.

Other Priorities

So what do you think? Do we have our priorities right? Or do you have other suggestions?

Posted in Development. Tagged with , .

0 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

Some HTML is OK

(required)

(required, but never shared)

or, reply to this post via trackback.