|Think about Loose Coupling|
I wrote - way back - a quick and dirty little program to find people who had attached their own hubs/switches to the network. I have just started dabbling in Perl and SNMP, so the first few scripts were quite horrible, inefficient, and (worst) similar to each other.
Several years later, the tool is still in use, but has a built-in Web interface (that needs to be re-written to use CGI;, now that I know how), many different kinds of reports, much better SNMP handling, and a built-in arbitrary MIB query tool for the desparate debugger (usually me).
Naturally, only one of these functions is actually used by any number of people, despite the fact that I hear them whine every day about not having this piece of info or how the ports are set on xx device. "~ has done that for years," I say. Blank stare. Sigh.
At least there are two guys who use some of the more interesting features on a regular basis. These two understand 'intelligent laziness'. Sure, you *could* do it manually, but what's the point, especially when you need to do it accurately, and you need to do it 30 times?
Ironically, the best thing to come out of the whole project - aside from my drastic knowledge gain in Perl, SNMP, and several other related topics - is that a lot of the app is written as modules. Originally, this was just to speed the thing up, since modules (and SelfLoader) were a great way to only load and interpret the code for the report I wanted. But later, I realized that several of the modules became what modules are meant for: I'd built a fairly functional API!
Since then, I've used those modules (and CGI, and...) to create several other Web apps (and cron jobs), and those for some reason are much more appreciated. Go figure.
The whole thing is due for another rewrite. I still do a lot of things manually that Net::IP, Net::IPv4, CGI, several other modules do better and faster. But it was certainly fun!
If anybody wants to play with the app, it's called 'JScan' (named after me, originally, since at first I didn't anticipate that others would use it), and is at JScan.