Circle Around the Requirements

Bakdar was the only technical person at PromoCorp, a marketing company. When someone finally launched a technical project, he was ready. The product was a cutting-edge web-to-print technology, in which Joe User could easily upload an image of his plumbing company’s logo onto a mock-up of a pen, and send it to PromoCorp with his order. It would save time, money, and provide a revenue stream for PromoCorp. The project was big, the project was technical, and the project was the attractive sort of thing that made careers. Bakdar was over the moon.

It was a brilliant idea, with one problem. PromoCorp didn’t have the internal resources to create the web interface on their own, so they contracted a third party, Weblutions, to do it for them. Bakdar was the liaison between the two, tasked with making sure things went smoothly. The interface between Weblutions and PromoCorp was supposed to import the images from Weblutions so that they could be emblazoned onto things like crappy t-shirts nobody would ever wear. The finished goods would then be returned to the customer who initiated the request.

Jarvis was the lead developer at Weblutions, and was Bakdar’s point of contact. Jarvis provided FTP access to the cache of uploaded files and order documents (in XML, of course). What Bakdar got from there were piles of very low-resolution, raster-based PNG files that wouldn’t look good in Minecraft, let alone printed on promotional items.

“Hey, Jarvis,” Bakdar said over the phone. “Listen, I got into the FTP and pulled the images, but they… they aren’t what we’re hoping for?”

“The largest image is 640x480. If I printed these logos on some promo balloons, it would just look like some sort of smeared blob.”

“Alright, alright, that’s cool. So what can Jarvis do for ya?”

“Well, you either need to give us the images in a vector format, or give us much higher resolution raster files.” Bakdar explained the importance of DPI and print size. “Something like SVG files for vector art would be the best.”

“Well, why didn’t you say so, man?” Jarvis said, ignoring the fact that the requirements document clearly stated valid minimum resolutions. “I’ll get ’em to you by the end of the week!” Jarvis brimmed with confidence. “Vectors, man. Vectors!”

Bakdar should have been relieved, but he couldn’t seem to shake his unease about the situation. Still, Jarvis was the lead developer, and Bakdar hadn’t written anything from scratch in years. He gave Jarvis the benefit of the doubt, vowing to check back on his progress at the end of the week.

Friday afternoon rolled along, and there was still no word from Jarvis. Bakdar shot off a quick email, hoping for an update, but instead got an out-of-office message: “I’m out of the office for the next week, dudes and dudettes! Surfing trip, WOOOOOO!” Bakdar furrowed his brow as hard as a brow can be furrowed.

When Jarvis returned from vacation, he replied to Bakdar’s original email: “So sorry, bro. I forgot to tell you that I redid everything like you asked. It’s all SVGs now! Peace ~ Jarvis”.

Bakdar did his best to ignore the fact that Jarvis had wasted a whole week of his time, and connected to the FTP site to import the new images. The progress bar crept up to 5% and stayed there. For an hour. Bakdar canceled it and had Jarvis remove all but one image from the directory so that he could test the import.

The process got past 5%, but was glacially slow for a single image. This gave Bakdar time to imagine what would be waiting for him when it was done. He half expected a PNG file with its base64-encoded data embedded in the SVG file, but that would be silly.
Silly, and much, much better than what Jarvis did. Jarvis’s “ingenious” vectorization algorithm created a file which contained a circle node with a radius of 1px for every single pixel in the (still woefully low-resolution) original PNG file. The 3kb PNG file blew up to a 3.7Mb SVG file. Chrome and Firefox committed browser suicide rather than render it. Adobe Illustrator tried its best for 20 minutes before its proverbial head exploded. Past WTF evidence should have told Jarvis that circles are nothing but trouble, but nonetheless, he came up with this atrocious solution.

Bakdar called Jarvis. “Jarvis, we need to chat…”

“Right on, bro. What’s up?”

“I can’t use this. The file sizes are far too large, and it renders the system inoperable.”

“Hold on a sec, buddy. After our last call, I went back to the requirements. Section 4 says the images can either be high-resolution raster files, or- and check this, dude, direct quote- ‘an SVG file’. That’s what I gave you. It meets the requirements.”

“Yeah… but… well… let me get back to you.” Bakdar rushed to the requirements document in hopes of finding the logical flaw in Jarvis’s response. Sadly, the document said nothing about file sizes or processing times.

Bakdar had to go back to his superiors and explain how their high-res image project would be delayed while he worked through some kinks with the web vendor. Any urgent client requests for promotional items would be limited to tiny logos on small trinkets until Bakdar found a way to claim “SVG file” precluded Jarvis’s pointillist solution. Suddenly, the whole “manage a technical project” thing had lost its glamor.

[Advertisement]
BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

Featured Comments

TRWTF for me? A technical guy that doesn't review the technical specs for sanity first before liaising with the web devs...

In his defence, it has to be pointed out that there exists an expectation of some sort of quality when liaising with a third party.

I was in the embarrassing position once of being the customer-facing guy in front of a prestigious client, presenting a product upgrade that was in practice completely unusable. The problem was, there was nothing in the specification which covered the specific points of issue:

a) Nothing which said: "When you try move the cursor off the screen, it will not beep and throw an error message, but simply stay at the edge of the screen and quietly not move, and most certainly will not beep-and-error for every single keypress in the input buffer, thereby going "beep-beep-beep-beep-beep ..." after someone has injudiciously held their finger down on the up-arrow key."

b) Nothing which said: "In order to move the cursor one character to the right, press the right-arrow key. We do not want to have to press F1 then the right arrow key to move one character to the right. Similarly with the left hand key."

c) Nothing which said: "Objects created in error must have a tool on the application which allows simple deletion of the object. It should not be necessary to open a text editor and edit machine-generated source code in order to delete something."

What I did find in the spec, on inspecting it in some detail, was a clause which stated the exact programming standards that would be applied, such that in order to achieve those standards there was a two-page function which to increment its parameter and return it.