Dennis Forbes on Pragmatic Software Development
Subscribe to RSS
 
Wednesday, November 15 2006

In the early days of instant-messaging, ICQ dominated. They had a huge user-base for the period, luring even more in with a rapidly evolving application featuring a market-leading array of features and functions (despite the fact that they had one of the most polluted websites on the net. Worse than even Excite after they went all crazy. Trying to find the latest release or how to reset a password, among any other normal use, was an exercise in seemingly intentional obstructionism).

I used ICQ. Everyone I knew used ICQ. IM was pretty much synonymous with ICQ.

While the people behind ICQ were guilty of forever calling it a beta (a product in wide "production" use is not a beta regardless of any exculpatory, defeatist-shrug labels are affixed to it, and that misnomer needs to be eradicated. At least Flickr made light of it by calling their production a Gamma version), it was very usable, relatively lightweight, and earned its position in the marketplace. It also allowed offline messages since early on, which is a feature that some IM networks still don't offer (usually under the premise that offline messages should be facilitated by email, which would be similar to email refusing to send a message if the recipient is available, forcing you to phone when that option is available).

As ICQ took the market by hold, paranoia was rampant that ICQ was just about to start charging for the client, or per message, or that it'd become infested by pop-up ads, and so on. It just didn't seem to make sense that they offered so much with no obvious revenue model.

Then they were bought out by AOL for a staggering $287 million dollars ($410 million if performance hit targets), proving that they had a brilliant revenue model after all.

In the wake of the purchase, some users stuck with ICQ, or they migrated to AOL's client, but I suspect a huge number of former ICQ users took the opportunity to investigate alternatives. Clearly many moved to MSN. AOL of course was already growing their own userbase, obviously catapulting off of their captive audience (similar to what Microsoft did with Windows Messenger)

I now mostly use Miranda IM or Gaim, connecting to several IM networks, and the majority of users who used to appear in the ICQ list now appear in the MSN list, with only a very tiny number of holdouts. I've never heard a later newcomer to the IM field mention ICQ, much less even know what it is or was.

While ICQ still technically exists under the umbrella of AOL, it's a small and relatively inconsequential niche considering its early complete and utter dominance. Perhaps such a fate was inevitable against competitors who could "cross-sell" IM with one of their other products (be it the operating system or the ISP), and the $400+ million dollar bounty was a mighty fan cash-out.

  IT 
Tuesday, October 24 2006

A while back I posted a complaint about the lack of native spellchecking in the major browsers, stating-

In the forum and blogging world, it would be beneficial if more tools supported convenient and efficient automatic spell-checking (the fact that no major browser has incorporated native TEXTAREA spell-checking thus far is a travesty. Any of them could have a killer feature if they simply added Word-like squiggly underlining of suspect words, with easy alternative corrections). As it is, many tools have nothing at all, and the few that do often host a ridiculously unintuitive, hacked-in partial solution.

For those who like release-quality software, salvation is at hand: Grab yourself a copy of the just released Firefox 2; an already brilliant browser that now also supports native data entry spellchecking, with little squiggly (or at least dotted) lines under suspect text, and a suggested list of alternatives.

Finally!

Hopefully this improves the quality of spelling on the net.

comment

And to head off the inevitable comments, no, the lack of spellchecking clearly hasn't somehow improved spelling (usually argued under the "it makes you work harder at it, therefore growing spell-muscles" explanation). Given that our brains learn spelling by example, even those of us who care are misled by a constant stream of misspellings. With the addition of finger-wagging little squiggle-lines, perhaps the purity of the language will improve.

It doesn't analyze grammar, pointing out errant uses of too or to, whether it's a possessive apostrophe rather than a contraction, or help in the endless "that isn't ironic!" debate, but at least it's a start.

The best browser gets even better.

Monday, October 23 2006

The well-known Hanlon's razor states-

Never attribute to malice that which can be adequately explained by stupidity.

While it's a seemingly pessimistic perspective on the capacity of one's fellow human, it is an undeniable truth that we often mistake carelessness, thoughtlessness, or outright ignorance as malicious intent.

Yet it's a more serene existence -- to the benefit of one's lifespan -- to simply assume that the person who dangerously cut you off on the road, for instance,  is just a moron deserving a bit of sympathy, rather than considering him or her a roadway foe challenging you to a deadly battle of wills.

DSC03452

From a software development perspective, however, I think an inverted variation would serve the industry well.

Never blame others until adequately considering the possibility of your own (negligence | carelessness | stupidity).

As a general rule, the denizens of the software development profession -- it certainly isn't limited to this profession, but given that it's the general focus of this blog it's the one I comment upon -- have a tremendous capacity for assuming the worst of others, far before considering the unsavoury prospect that maybe -- just maybe -- it's actually their own mistake or lack of knowledge that's the cause of the issues they face.

It is far too common to cast a wide net of blame, declaring that Microsoft's products are screwing up, the documentation is all wrong, the server is malfunctioning (maybe because of cosmic ray particles toggling memory bits), the installation tool is a dud, and one's coworkers are surely idiots insidiously and maliciously changing code just to make one's brilliant code poetry fail to achieve its momentous glory.

After such hand-waving, blame-weaving dramatics, in most cases the developer realizes that they skipped an obvious step in the instructions, or they forgot to get latest of the entire branch, or they were copying the wrong file or looking at the wrong folder or running the wrong executable, or they were using the class entirely wrong, or they completely misunderstood how the operating system security system works, or they set a global setting a week back that completely changed how the application functions, or they ignored the email and documentation and group meeting detailing system changes, and so on.

They quietly retreat -- don't expect a retraction -- until they repeat the same mistake the next time something doesn't go exactly as imagined.

The Page Cannot Be Displayed

I've met these people in the industry. I've worked with these people. I've been one of these people.

I think we can all relate to situations where we've railed against a company, a product or a person, only to have the embarrassing realization that we were simply doing something dumb.

And it's not even that doing something dumb is noteworthy: We're humans, and we're bound to make mistakes. The problem is that we often don't even give a moment of time to even the possibility that we could be at fault, instead just assuming the worst of others.

It's far more beneficial to both productivity and team morale to have a little bit of self-doubt in these situations: Assume the worst of yourself before assuming the worst in others.

Epilogue

After hashing out this entry, I wondered why it wasn't appearing on the public blog. After berating various products and services, I remembered that I recently outsourced my DNS (for the reasons described here, using the service recommended by a reader), and forgot to add an entry for the FTP server. Whoops.

As a completely offtopic aside, one of the reasons I switched DNS providers was to have support for a domain SPF record. While it does nothing to stop the tide of pump-and-dump investment scam spams, at least it allows those recipients utilizing the service to immediately dump-bin those that claim to come from yafla (I get about 100 bounces a day, and who knows how more actually get through), knowing that the from: address was forged.

Friday, September 29 2006

The latest Community Technology preview of Visual Studio "Orcas" has been released (see Rob Caron's entry), coming in the form of a configured and ready to run virtual machine (while normally VMWare Player and VMWare Virtual Server can import VirtualPC machines, that doesn't seem to be the case for this release. I'll probe further on that, though at least VirtualPC is free).

Note: you also need the base virtual machine disk, which you can find here. Together it's some 4.6GB of downloads -- I wonder what Microsoft's bandwidth bills are like -- though apparently they'll be using diffs from here on in.

Not overly noteworthy in itself, given that this is a product that is so far out that it's of little practical interest for professional developers (outside of saying "neat!", or if you're in the Visual Studio add-in market and you need to develop for it concurrently), however I mention it because I wrote an entry about this form of delivery a while back, and I think it's a neat development.

Obviously Microsoft has the luxury of releasing their own products on their own virtualized platform without all of the legal issues that an external company would have doing the same. Perhaps at some point Microsoft will release a special appliance version of their server products, allowing 3rd parties to release products on a decked-out virtual appliance running, for instance, Windows 2003, and to do so legally and cost-effectively (they sort of do this with the Storage editions).

This segues to another topic topic that I recently touched upon, which is Joel and his Wasabi language, which is a really high level language (so high that it generates code for really high level languages) that he created to generate builds targeting multiple platforms (e.g. PHP on Apache on Linux, VBScript on IIS on Windows, etc). Joel might be better served simply setting up the platform he needs, and then using all of the functionality and capabilities of the chosen technology stack, and then delivering a ready to run virtual machine to his prospective clients.

Sunday, September 17 2006

While I've used Linux for years in the virtual machine space, primarily as a "native" location for many of the UNIX-style command line tools (even if I'm using them against an SMB share on the network, they're still extremely helpful), it has never been a primary operating system on any of my PCs outside of novelty "let's see what stage they're at" usage. Where I did use a Unix variant, it was always FreeBSD.

I've decided to give it another go, this time in an "Internet Appliance" of sorts.

This opportunity arose when a hard drive in an old eMachines Athlon 2400+ 512MB WXGA laptop I had kicking around died. It was running warmer and warmer until finally it stopped running altogether. Now it's just lounging on a park bench.

DSC03324Given that the laptop saw limited use -- mostly for my daughter to play PeepAndTheBigWideWorld games online -- this didn't cause too many tears, and it gives me an opportunity to pursue the internet appliance desire (perhaps in the kitchen. Something that is zero maintenance or security worry, hopefully low power, and that allows for rich web browsing for the family and guests) that I've been thinking about for some time. What I'm considering is running the laptop diskless (meaning no hard drive or floppy drive, though there will be an optical drive -- unfortunately this particular laptop - an M5312 - can't boot off of the USB key, though I'm keeping my eye out for possible bios options. Note that I do not want a hard drive, so I'm not looking for replacement options for it. This is a fun effort, and as I already have another working modern laptop, I just think a diskless device, minus the noise, heat and power consumption of the hard drive, would be pretty cool).

After some futile efforts with Knoppix, my initiatives thwarted by the fact that it refused to work with the Broadcom wireless (either with the native driver or with the ndiswrapper driver), I switched over to Ubuntu's "LiveCD" desktop version and it works amazingly (though the wireless worked much better with ndiswrapper and the Windows Broadcom bcm43xx driver). With little hassle the machine is booted from the CD, the wireless is operating (with WPA and everything), Firefox is updated with Shockwave and various updates, and it's brilliantly usable with complete mobility throughout the home, low power, low noise, and limited heat. I could duct-tape it to a wall if I wanted to.

The only problem is that it's a temporal state, and once I shut down (or there's a power outage), I need to start from the delta of the CD image once again. The latest release of Ubuntu does have a rather sketchy persistent option where, with a bootup option (which is lame), it basically loads everything from the CD, overlays the contents of a USB key image, so you're still starting from the base and then consuming some of the ghost filesystem with the delta. This is on top of the fact that the persistent functionality uses the USB key almost like a R/W filesystem, purportedly constantly writing changes, which would lead to a very short key lifespan. Also I really don't want to save continually changing state, but rather want to choose a perfectly configured point and solidfy it, with each reboot starting exactly there.

What I'd really like to do is to configure the machine and somehow persist that onto a new boot CD, such that the starting state is exactly what I want (realizing that in the future, I may need to make newly updated CDs). Indeed, it is possible to make your own Ubuntu bootup CDs, and I've successfully done so to some success. However I need to get the changes from this live, no-persistent storage laptop onto the image for burning onto CD (many of the configuration steps are making changes unknown to me, so I can't just modify a couple of /etc .conf files). So I've got a Ubuntu virtual session running*, and I've extracted the boot-image filesystem, but it's the process of getting the laptop image over to the image for burning that I'm unsure of. I've tried rsync to dismal failure.

If anyone has any ideas, I'd greatly welcome them. The laptop has a 1GB USB key which it can access, and working wired and wireless connectivity. On the other end is a Ubuntu session with plenty of RAM and storage, ready with a decompressed image to be prepared for burning into the ultimate, personalized LiveCD.

* - the process described to make a custom Ubuntu boot CD -- such as creating a filesystem within a file, and then copying over from the compressed filesystem, completely borked VirtualPC...multiple times. Not to mention that performance in general was atrocious. I then tried under VMWare Server (the free product) and it worked absolutely perfectly, and the performance was enormously faster.

Normally I'm a fan of VirtualPC, but from here on in I'll be doing all Linux work under VMware.

  IT   Personal 
Saturday, August 19 2006

An oft referenced problem in the Windows world is .Dll Hell (*). It occurs when many applications depend upon the code in a shared .dll (a dynamic link library, which is basically code that is linked at runtime rather than compile time), an often ideal scenario given that you can upgrade security faults in one single location rather than recompiling and distributing static linked library using applications, or searching for disparate private copies scattered across volumes. Problems start to happen, however, if the dll is changed in a way that breaks some of the dependent consumers (for instance one of the applications rolls out a new version that changed the external API), causing inconsistencies or outright failures in other applications.

[* - Sidenote: The Wikipedia article linked from DLL Hell claims that the term was "introduced to the general public by Rick Anderson" in 2000. This is, of course, complete and utter nonsense -- it was a very common piece of terminology many years earlier, and an MSDN article hardly introduces it to the "general public". I come across these sorts of historical revisionisms on Wikipedia far too many times. Is it a Wikiality? I suppose I "introduced SVG to the general public" when I wrote a "paper" for MSDN Magazine, so I should go claim my crown...]

While the problem already existed for classic-code dlls that were stored in a shared location (usually for space-saving reasons), it really became a problem with OCX/COM, where the activation architecture basically demanded that you use the shared copy.

In spirit, similar problems occur even with high-level platforms such as Apache, or even just modules like PHP, where a version change can break a lot of applications that run atop it or depend upon it, causing significant heartache, and making deployment issues much more complex (particularly when you have multiple dependent applications, some of them more adaptable than others) .

There have been many declarations of an "end to DLL hell!", with Microsoft pushing various approaches and strategies, to varying success.

With .NET, the solution is generally "share nothing", to the point that even the various versions of the .NET runtime exist as islands, with a .NET 2.0 application having all of its libraries local (often version linking, so if the same library exists in many applications, but the versions differ slightly, it will be loaded separately and mapped individually), even if they're components used by dozens of applications, using the .NET 2.0 framework island and runtime, while a .NET 1.1 application exists in its own little world, and the same for a .NET 1.0 app. There still exists a classic "shared activation" model via the global assembly cache (GAC); however it's a little used bit of infrastructure.

Storage space is incredibly cheap, and memory space is becoming a non-issue, so this sort of approach has a lot of merit.

Why not take it a level higher? With massively powerful servers, seemingly endless memory, and free virtual server products (from both VMWare and Microsoft), we're entering an era when it is entirely possible, and often ideal, to release your product as a complete virtual server.

Of course, I'm repeating myself now, but this idea really appeals to me.

Some time back, for instance, I was considering making a commercial, corporate web application timesheet tracking system (I've made some of these before. One particular one - an AJAXish DHTML solution I made back in the late 90s - I still think beats out most of what I see today), however a hosted model wouldn't fly with most customers given the amount of information that could be garnered from their timesheets: Many customers would want to host it themselves. Yet then you face the dilemma of releasing a product that can exist within their current architecture and skillset, a particularly onerous task given the many dependencies of a modern web application.

Inevitably you'd be putting yourself out of contention for a lot of customers because you used X instead of Y, and would be endlessly fielding support issues when their platform changed faster (or slower) than your application did.

So why not release your web application (or any type of application) on an "appliance" virtual machine, as it's now getting named? The same goes for application "consumption": If you're a Windows shop, instead of hosting your wiki on Windows, or far worse limiting your choices to the small selection of options that exist for your particular ecosystem of dependencies, perhaps you could just deploy a Wiki appliance with the perfectly ideal configuration of database server, web server, host operating system, and modules.

Configure your appliance to only allow port 80 traffic in (or better yet work on an appliance platform where the accessible ports on each virtual machine can be configured, perhaps by a separate "firewall" virtual machine), and live in an application model, with whatever version of MySQL, Postgresql, or Apache you want, custom configured in a way that perfectly matches your requirements.

Virtual machines have so many advantages, not the least of which is the ability to move them between hardware with minimal hassle. Indeed, I had exactly this scenario recently, where the Team Foundation Server application tier was running on a box that was getting a little overloaded...well it was just a virtual machine, so it was nothing more than pausing the state, moving it to another virtual server hosting box, and starting it up. This balanced the load better, and was completely transparent to the users.

There are downsides that would have to be taken into account - some shops might want a better backup solution than pausing the virtual machine and archiving the entire virtual hard drive (which is, I should mention, a wonderful capability -- the entire "machine" in one single, relatively small file, atomically copyable and restorable. In development I've used this endless to save various platform configurations, restoring to exactly the one that is pertinent for a particular need), however there are endless possible, application specific solutions to this sort of problem.

There's also the issue that Microsoft doesn't take kindly to releasing virtual machines based on their software, so perhaps this is a model that works best when the software you're depending upon is freely distributable (within the confines of the license).

Sunday, June 04 2006

While NTFS hit the scenes with the promise -- or rather the common misunderstanding -- that file fragmentation was a thing of the past, the reality we live with is copious fragmentation, significantly slowing many operations (NTFS is certainly better than FAT, but in no way does it eliminate fragmentation). Hard drives have gotten much bigger, and throughputs have increased significantly, but the time it takes to go from one file fragment to another has barely improved at all in over two decades.

While I sporadically use various defragmenting tools (including having PageDefrag in my startup), the optimal solution would be a bootable CD, allowing me to 100% error check and defragment entire volumes in one pass, as quickly as possible -- no contention over the device, and no files blocked from defragmentation (both of which cause online defragments to be incomplete, and terribly slow).

A Google search has turned up nothing of the sort (presumably the defragment/check utility would have to be Linux or *BSD based to have the operating system infrastructure available, while complying with license conditions. Such a utility could easily be included with a Knoppix or other bootable CD distribution), so I thought I'd throw this one out:

Anyone know of such a utility/bootable CD? Preferrably one that is trustworthy, and even commercial if that's the case. It'd be optimal if defragmentation could space-pack, preferrably with some sort of logic, such as putting bootup files in sequence and in the highest-throughput area of the drive, etc.

  IT 

Earlier EntriesLater Entries

Dennis Forbes - Dennis Forbes is a Toronto-based software architect and technology writer