Category Archives: Misc

Selecting off-the-shelf software (or, how to avoid buying a lemon)

Here at Isotoma we often get asked what the differences are between off-the-shelf and bespoke software, and how to decide which is the right approach for a given situation.

Generally software that has been written specifically for you (by companies like us) is referred to as “custom” or “bespoke”, while software that is customised, configured and deployed to many customers is referred to as “boxed”, “off-the-shelf” or “COTS” (Commercial Off-The-Shelf).

Isotoma is a bespoke software development company. This means that we take generic frameworks and build applications tailored to our customers’ needs on top of those frameworks, rather than having a single product of our own that meets a particular need that we resell to our customers (for example a content management system or an ecommerce system).

We’re very upfront in our answer to the “bespoke or off-the-shelf” question; if there’s off-the-shelf software that meets your needs we strongly recommend you go that route. While bespoke software brings huge benefits in the right situation it also has limitations, complexities and costs. You need to be sure that it’s right for you before going down the bespoke road.

Equally you need to be sure that you’re assessing the right things (not just features!) when considering off-the-shelf software for your project. All software investments bring risks to an organisation, and the risks of off-the-shelf can often be subtler and harder to spot, yet equally as impactful, as those of bespoke software.

At its best buying off-the-shelf software can be an extremely cost effective way of getting the features you needs and of future-proofing your software investment. But at its worst it can be a way of tying yourself in to a closed environment that is expensive to customise and hard to migrate away from.

Any off-the-shelf product works best when the requirements it serves are shared by lots of organisations. There the economy of scale means that every customer gets a great product without having to pay for the development of all the features. We wouldn’t ever suggest, for example, building a blogging platform from scratch, nor a word processor or an accounting package. These are all problems shared by countless individuals and organisations around the globe where product companies are easily able to serve everyone’s needs.

However, whenever an organisation’s requirements for the product diverge substantially from the needs of the primary customers problems very rapidly occur, meaning either increased cost, compromised experience or, more often than not, both.

When selecting a product consider how much customisation you will need to make the product really sing for your organisation. And consider how you would be affected if you simply couldn’t have half of those customisations you’re imagining (regardless of whether this was through technical limitations or lack of budget for the necessary changes).

Next it’s important to think about the existing customer base of the product. If the product has thousands of customers, many like you, all successfully using it then you can probably feel comfortable that a) the product really is likely to meet your needs and b) the team behind it are likely to be around and supporting the product for the lifetime of your use of it.

Taking on very niche off-the-shelf products or off-the-shelf products from small suppliers can be extremely risky. The worst case is that under the hood each installation is in fact an alteration of the underlying base product, the “licence fee” being used to cover the cost of the developers implementing the features that the salesman told you already existed. Here you risk expensive maintenance costs, delays in implementation and a high rate of bugs, as you were sold something off-the-shelf (and had assumed the time scales that go with that) yet in fact custom software is being developed on your behalf at cut rates and at double quick time.

You should definitely carefully assess products with very small numbers of installed customers. Unless you are extremely confident that it meets your needs entirely unchanged or you are happy to invest in the development of the product in the long term they should probably be avoided. These are often only products in the sense of “hey, we’ve made this thing for so and so, I bet others like them will need it too.”

Potentially as troublesome is the risk of delays or exorbitant fees if the resources of the team behind the product become stretched. If you need to call upon consultancy or professional services will the team be able to support you in a timely and cost effective manner?

Finally it’s worth considering the impact on your business processes. In general products work well for organisations that are just setting out, as any limitations imposed by a boxed product do not conflict directly with the way the organisation wants to do business. In addition, very young organisations do not entirely understand their requirements and so having a set of predefined features given to them allows them to develop their own business processes alongside those features.

Older organisations tend to struggle with products, particularly at the cheaper (and less customisable) end of the spectrum. They have a clear understanding of their requirements and are looking to create efficiency within their organisation. It is no longer acceptable to have predefined solutions forced upon the business, as it is exactly those predefined solutions that are causing the inefficiencies that the company is trying to drive out. In this case bespoke software has huge advantages, being tailored exactly to the organisation’s understanding of its own needs.

So you must consider the scope and scale of changes to your business processes that the new software will bring. How substantial are they? Are you ready for them? Will your users support you in making them? And can you drive them through at the same time as running a new software project?

With all the above in mind, how do you make sure that an off-the-shelf product will meet your needs and that you’re not investing in a lemon?

Here are some questions worth asking during the selection process. There are no right answers, but by having the conversation with potential vendors at this stage you may flush out some problems that you would otherwise have uncovered much later in the project:

  • How many paying customers do you already have for the version you are selling to me?
  • How many paying customers of our installation size and type do you have?
  • Can I talk to at least 2 of your customers about their experiences of the product and your services?
  • What is the average customisation cost of an implementation?
  • How much do you charge per day/per hour for professional services?
  • What is the average turnaround time for professional services requests?
  • Is there a VAR (Value Added Reseller) or partner network around the product that I can tap into if I need extra help with customisation/integration?
  • Is there an API that I can build on and use to integrate with our other systems? (if yes, can we see the documentation before we sign up?)
  • How easy is it for me to export my data from your product in a way that’s possible to import into an alternative?
  • Can I host the product myself? If so, what are the minimum hardware specifications for an installation of our size and type, and who is responsible for performance issues should they occur?
  • Do you offer a support agreement of any sort? What SLA options do you offer and how much might a support agreement cost?
  • When was the last major version released, and how many customers upgraded (and how many do you still have running the old version)?
  • What was the average upgrade cost when customers moved to this major version?
  • When do you plan to release the next major version?
  • Is there a user group for the product that I can talk to or join?
  • How are new features for future versions decided?
  • Do features I request and pay for get rolled out to other customers in future versions?
  • And perhaps most importantly: what is the roadmap for the product over the next 18 to 24 months?

Of course, there are equally detailed lists of questions you should be asking when selecting a bespoke development partner or when selecting an open source project, but both of those are for another day. Hopefully this list at least helps a little with the decision making process.

About usIsotoma is a bespoke software development company based in York and London specialising in web apps, mobile apps and product design. If you’d like to know more you can review our work or get in touch.

Dedicated Server Configuration in L4D2 (or how isotoma play zombies)

Here at isotoma, we’re partial to a few evenings spent giggling like maniacs and coming up with inventive ways to kill as many zombies as possible.
Nothing quite like arguing with a coworker whether an aerial kill with a frying pan is better than a survivor steered into a convenient pool of spit.

Naturally, our game of choice is the rather good Left 4 Dead 2.

However, our experience of the L4D2 lobby system has been variable, with some servers being slow, or configured weirdly. The usual answer for this is to run a dedicated server, as has been done since time untold (Quake).

In L4D2, the tools to do this aren’t immediately obvious, and have a nasty habit of changing from patch to patch.
This is a quick note to show the current method that we have found works.
I won’t cover how to install and set up the server, there’s plenty of guides out there to do that, this is how to configure it, and how to start a game on that server.

Server Configuration

In server.cfg, do this (replace things in [] with a value, including the brackets themselves):

hostname “[SERVERNAME]”
sv_region 3
sv_search_key “[AUNIQUEKEY]”
rcon_password "rcon"
sv_lan 0
sv_allow_lobby_connect_only 0

The important part of this is the sv_search_key setting. This should be a unique key (a steam account name is a reasonable bet), and something that you can type into the game console. Do not attempt to set the Steam group settings that you can find documented elsewhere. This will break the search key, and mean you then cannot reliably connect to this exact server.

Run the server with a line similar to:

./srcds_run l4d2 -autoupdate +ip [SERVERIP] +hostport [PORT] +exec server.cfg

SERVERIP should be the public ip of the server machine
PORT should be the port to run the server on (27203 is our favourite)

Once this is done, you should see some nice console lines scrolling by and your server is now up. The search_key setting means that only people with that key will be able to find and connect to the server using the lobby system. You will be able to connect directly using the server ip and port if necessary.

Connecting

In the game, go to Settings > Keyboard Settings and enable the ‘Developer Console’

To start a lobby game:
From main game screen
Bring down console (~ key, usually next to 1 on a keyboard)
Type: sv_search_key [AUNIQUEKEY]
(This should be the sv_search_key you set above)
Create a game with friends
Do not change the server choice (dedicated, best available etc), leave it as it appears.
You can change game settings, maps etc.
Play

To connect directly:
Bring down console (~ key, usually next to 1 on a keyboard)
Type: connect [server ip]:[port]
This will drop you straight into the server, from where you can invite people to join you.

This is all a bit fiddly, but it works for us. I hope it helps someone who was as equally as lost as me to get this going.

–t

Mixed metaphors and malapropisms from the mire of many meetings

Most of us find ourselves stuck in long boring meetings or conference calls more often than we care to remember. For a while now, I’ve found some respite in my habit of collecting some of the more hilarious manglings of the English language you find in such situations. I particularly love it when phrases end up meaning the opposite of what the speaker thinks they do. Here’s a selection from the past year:

  • Getting “buy-off” on specifications (probably thinking of buy-in or sign-off)
  • An item being “delegated to the bottom” of a menu (meaning relegated)
  • “visa versa”, used to mean something like “for example” (confused between vice versa and vis-à-vis)
  • “The train is already out of the tracks” (I think you meant to say station)
  • Extolling the close, mutually beneficial relationship between their organisation and ours as “incestuous and symbiotic”
  • “Begs the question” used synonymously with “Raises the question”

And some from emails:

  • “By all intensive purposes, I think I have the account setup and everything ready to go.”
  • “These are often required and might shoot you into a foot”
  • “I wonder if he’s been unendated with calls or e mails?”
  • (From a Kenyan security newsletter) “Wait until the crowd has disbursed”

Feel free to add more in the comments!

Good Spam

Following on from this bright idea to use a spamming tool to create a blog from an Open University course feed, the OU asked us to build a plugin for WordPress MU that will automatically create a bunch of blogs from Open University feeds. We also built a WordPress widget, to implement another bright idea, that can then deliver the blog entries for a course in periodic chunks.

So you can consume the course in your feed-reader at a pace that suits. This should be released soon, meanwhile, the testing is very educational.

Every day this week I’ve been mostly learning about James Clerk Maxwell.

On what to do with downtime

There’s a fascinating post over at TCUK today about agencies building their own applications. We even get a mention in the intro with reference to Forkd. The comments get pretty heated too, with some people claiming agencies that have the time to do such things are over staffed while others are worrying about how to fit internal developments alongside client work.

So, given we’re mentioned, how do we feel about it?

It’s always going to be hard getting the balance of client work and your own projects right. We started work on Forkd in summer 2005 and launched it in early 2008. In that time the world and his wife had built a food social networking site and we were on the back foot right from launch. Keeping a focus on internal development ideas while working with clients work is always going to be a killer.

That said we have more in the pipeline and aren’t going to stop…

The reasons (at least for us) are threefold. First up, what better shop front is there than something that you made for yourselves? A real case of putting your money where your mouth is; new customers can see exactly what you could be making for them.

Secondly, scaling a technical agency is hard. You only have the person hour to sell, and growth only comes through selling more person hours. That is, unless you can “productise” some of your own work. And what better than productising something that you and your team enjoy making and using?

Third – it’s always best to learn new technology on something that isn’t so important that your business depends on it. That latest cut of your favourite app server from svn might look like it provides the killer feature (or bug fix) you need, but do you really want to try it on your current big client project?

And to those that claim agencies must be over staffed if they can do work like this… We all know that the entire team will have downtime whether it’s explicit or not (and all of you with “100%” utilisation just have a miserable staff hiding their downtime at the water cooler or on facebook). A shared goal to aim at during that downtime makes the downtime explicit and supported, which makes a whole let of sense to me, anyway.

And hey, who wouldn’t like to be the next Skinny Corp?

Search vs. URL

Watching the TV last night I saw an advert for EMA (Education Maintenance Allowance) which instead of giving a URL suggested that the viewer “search for EMA online”. This is the first time I’ve seen this type of advertising in the UK, although strangely only last week the article about search terms taking over from URLs in Japan over at cabel.name was doing the rounds. Searching for EMA across Google (first both paid and natural), Yahoo! (first paid, second natural) and Live (first paid, third natural) seems like this works in this instance, but I can’t help but fear the torrent of spam that will start to follow major ad campaigns that feature particular terms.

As Cabel says in his article this change seems inevitable for all the reasons that he lists, but it sure is going to make management of search placement a lot more complex over the next few years.

Could not read chunk delimiter

I nearly cried. I went to svn up in a local check out of one of the projects I’m working on, knowing that I was a good few days behind and instead of getting the usual stream of files I got an error message:

Could not read chunk delimiter

I logged on to the server and ran svnadmin verify /path/to/repo and got a different error message:

Decompression of svndiff data failed

Much googling later and I found fsfsverify.py – a script that repairs broken fsfs-type svn repositories. The author (jszakmeister) doesn’t allow comments on the page of his blog that hosts the script, so this is a public thanks for really really saving my bacon!

Favourite Firefox plugins

It’s worth choosing carefully which extensions you install, since too many of them will definitely slow down Firefox and use up memory. Here are the ones I rely on every day:
Firebug. Simply the most indispensible tool for the web developer. One of those rare applications that you love more every time you use it.
FireFTP. Not only will I never need a standalone FTP application anymore, but this actually outperforms any I’ve ever used.
Tab Mix Plus, mainly for the Session Manager. I typically have 3-4 FF windows open, one for each project or aspect of a project, and many tabs in each. It’s imperative that I retain this from one day to the next. Session Manager can reload the last session, or the one before that, or save any number of sessions to a particular name.
Web Developer toolbar. Before Firebug, this would’ve been #1. A lot of its functionality is supplanted by Firebug, but it still has many useful tools and some handy keyboard shortcuts, e.g. Ctrl-Shift-S Toggle CSS, Ctrl-Shift-E Edit CSS and Ctrl-Shift-A Validate HTML. It’s also great for evaluating accessibility.
Netvouz buttons. This is my online bookmark manager. For why I use it instead of Del.icio.us, see my comment (the 5th one) on this review.
Pearl Crescent Page Saver Basic. I need it for one simple reason only: making snapshots of web pages longer than the screen. The basic (free) version creates a PNG on the desktop; the pro version will copy the snapshot to the clipboard.
ColorZilla. It has a lot of functionality that I don’t use, but I find it the quickest way to read colour values off web pages. (I’d need Photoshop open otherwise.)
What are yours, and why?

Firefox keywords (more)

Andy mentioned how useful Firefox keywords are for Trac. Remember a quick way to create your own shortcuts is to right-click on any search form and click on “Add a keyword for this search…” Or even quicker, download this handy set that I adapted from Lifehacker’s. Here’s how to install it:

  • Save the link to your desktop
  • In Firefox, from the Bookmarks menu, choose “Organize Bookmarks.”
  • From the Bookmarks Manager File menu, choose Import. Choose “Import Bookmarks from File.” Browse to and open the file you just saved.

Continue reading to see the list of searches.

Continue reading

Firefox keywords and Trac

Going firmly in the ‘you learn something new every day’ bracket… Karen just pointed the office in the direction of Mozilla keywords. Combined with Trac they mean you can type things like trac 705 into the Firefox location bar and get transported to ticket 705 on your trac instance. Enormously useful when people keep mentioning “#705″ in IRC rather than pasting the link.

  • Add a new bookmark to your Firefox bookmarks for (say) https://projects.isotoma.com/forkd/ticket/%s
  • Give it a keyword (in my case tforkd)
  • Type tforkd 705 into your Firefox location bar
  • Voila!