"Some applications offer you a grace period before your password expires," Michel van Zoest wrote, "I think I'll leave instructions in my will to have one of my great-great-great-great-great-great-great-grandchildren change the password for my database in about 50539024859478222 years. If we survive the death of our sun, that is."
"Often my login will expire on my e-learning portal and I will receive a message that I must login again," Ross wrote, "logging in again produces the above error message."
"I'm pretty sure they have the sale concept backwards," wrote Peter Senft.
"Yes, I would like to connect to Nafta.mdb but you can't find it," Geoff wrote, "why are we having this conversation?"
"I got this weird error message from my Chinese video recording software," Cosmin wrote, "setting aside bad grammar, how am I supposed to read it if my video card is not installed?"
"The Mercury newspaper publishes selected 'reader comment' messages from their online site in the following day's print edition," notes Charles, "it seems they thought Rosie of Hobart's eloquent message was worth publishing... but forgot to actually paste her comment in."
"This was the last page of the company survey we had to fill out," writes Chris Linstid, "apparently we're not allowed to not have any further comments."
"When logging off a remote server, this message was displayed," Aleksander R. Rødner writes, "I clicked 'yes', but, in retrospect, I could just as easily gone the other way."
"I was trying to get answers from GoDaddy tech support," Jacob B noted, "but the response I got from their tech support seemed to just have a lot of questions."
"Windows hates me!" writes LJ Earnest, "I've suspected it for years, but now I have proof."
All three of today's Tales from the Interview are from R Huckster.
The Interupting Rebutter
The job sounded right up my alley: it was in a field that I was experienced in, offered a laid-back environment, and employed a young and hip workforce. After passing a few programming brainteasers and describing my experience in the field, I thought I was a star candidate. That is, until the interviewer asked me specific details about my previous job.
"So, you were a front-end developer of the web application," he asked, "how was the back-end organized?"
"Well," I answered, "they used a Java framework using JBoss and —"
"JBoss?!" the interviewer jumped in, "why didn't they use Tomcat, if they were going to use Java?"
"I'm not sure," I shrugged, "the head developers there were trying a bunch of different servers before choosing JBoss. I am not involved in the back-end at all, so I don't know the detai—"
"And they should have used Python!" he said, cutting me off.
"Well," I carefully responded, "we used Python for some of our more computational back-end stuff, but the Java backend was really involved more with some MySQL database acce—"
"You used MySQL?" he snarled, "why didn't you use Oracle?"
"They chose MySQL a long time ago," I explained, "it was back when we were almost entirely a PHP shop. They're considering switching to Oracle now that we've scaled th—"
"Why didn't you start out with ASP?"
"I don't know," I paused, "all these choices were made years before I started there."
Things continued downhill from there. The interviewer barely touched on what I did at my previous employer and seemed much more interested in the decisions management and other people made in software I wasn't even involved with. Apparently, my inability to influence past decisions limited my employment opportunities at this new company.
The Final Word
I was being considered for a position at a software company that specialized in software for high-end professional exercise and physical therapy equipment. The job itself sounded nice, and the people seemed very nice, but the only problem was that the commute was an hour-and-a-half each way, and that's only on a good traffic day. Still, I wanted to at least give it a shot; maybe it'd be a great job and the daily drive wouldn't be all that bad.
I was told to expect a full-day, interview marathon, but it felt more like running the gauntlet. For six hours, I talked to a dozen different people and answered the same questions over and over and over again. Some technical, some experiential, and some personality. I figured this was a good sign, as most of the duds would probably only last half an hour. The final interview was by far the most challenging, as the interviewer presented some very challenging programming puzzles. Although there were a few I struggled with, I left a good impression.
"Don't feel bad about the two problems you couldn't answer," the final interviewer reassured me, "In all, you did well. Better than most people I've interviewed so far. So, here's how it works. The folks you've met today will discuss how you answered all of our questions, and we're going to make a hiring decision very soon. By Friday at the latest. So, if you get a call from us by Friday, expect a job offer. If you don't, then you can fuck off."
I was floored by his deadpan delivery of that last sentence. He looked at my face, which was a mix of confusion and amusement. I wasn't offended, but simply shocked. Throughout the whole interview process, everyone was very straightforward and professional, so it was the least I was expecting from anyone in this office.
A few days later I was, in fact, offered a job, but I turned it down. Not because of the f-bomb, but because of the commute.
The Jury Rig
I was a little skeptical when I heard about the job opening, but somehow the recruiter convinced me enough to apply. The hiring company started with a phone interview, in which I learned they were a drug test analysis firm that worked especially with professional sports organizations to determine if a player had any illicit drugs, among other things, in their blood or urine. It seemed to be an interesting business, so I asked about their technology."
"Well," the interviewer responded, "we are a place that likes to use the right tool to solve the right problem. You're going to see that we use every technology out of the sky, .NET, Java, Python, PHP, JavaScript, MUMPS, Perl, Ook!, C++, C-Pound, Lisp... you've heard it, we've used it. We like to think outside of the box. For example, we had someone who needed to connect an LDAP server to a JavaScript application using a serial port... it took some jury rigging, but he got it done."
Needless to say, I was quite confused... they started out saying they liked to use the right tools for the right job, yet proceeded to use LDAP, JavaScript, and serial port in the same sentence.
"We aren't all just software engineers, either... we do it all. There was a software engineer who noticed one of the lab technicians would take a sample out of one box, scan its bar code, and then put it in another box. He thought that was very inefficient, since the lab technician had to use one hand for the sample, and another hand for the scanner. So, he took an office lamp with one of those bendable arms from an empty office, ripped off the head, took some velcro, and taped one side of the velcro on the scanner, and the other side to the arm... then, he took a rubber band and positioned it over the trigger so it would keep the scanner turned on. The technician was so happy she could simply scan the samples the same way you would scan groceries at the supermarket!"
At the end of the phone interview, they expressed their interest in having me stop by for a face-to-face. By this time, I was running into hard luck finding a job, so I decided, despite all the strange oddities about this company, and despite the fact they work directly with urine, I agreed to visit. One thing the recruiter stressed in preparing me for the interview was to have a sense of humor. Working with human waste makes for some awkwardly amusing conversations, and the recruiter wanted me to try to use some humor in the interview without being too brash, since they were also looking for a colleague who could fit in socially, yet professionally.
When I was at the in-person interview, I started by asking, "What are your testing and quality assurance environments like? I assume in a field like this you need a lot of scrutiny to make sure you don't get a false positive, which could ruin an athlete's career and make you liable... and I sure don't want to be responsible for getting Tom Brady on the chopping block for being incorrectly accused of steroid abuse." The question returned several chuckles. It turned out that, thankfully, they did exercise a lot of scrutiny through the use of code reviews and very specific and detailed test plans and unit tests.
During the interview they made a few humorous jabs at the Marshall Report and shared funny stories about doctors doing really stupid things to get easily caught by officials for providing performance enhancers, and tall tales about college students who mistook their urine sample for lemonade. We were on a roll, and the interviewers devolved into 45 minutes of sophomoric toilet humor which I simply played along with as the interview came to a close.
I was escorted out of the facility by a manager who was not in the conference room for the interview and asked me some last-minute questions about my salary expectations and other hypothetical questions should I be selected. He said, "This company is growing a lot, as we find demand for these kinds of tests expanding outside of professional sports and into colleges and even high schools and local amateur teams. We have a lot of great stuff down the pipes."
I automatically chuckled and said, "Pipes... heh, good one." The manager stopped in his tracks and gave me a disgusted look. Oops, did I just use the same 3rd grade humor I had just listened on a seemingly more stoic project manager? I tried to recover, but was at a loss for words.
I never heard from that employer again.
Have interview stories of your own? Send them to me, I'd love to read them.
If Peter Moberg were to give a single criticism of his colleague's work, it would be that it represents a complete and total misunderstanding of the principles of software development.
Criticisms #2 and #3 would probably center around typos/misspellings and completely superfluous code. Today's example illustrates all three.
public bool IsListconntSmalleThaOne(IList<IContact> listOfResults) { if (listOfResults.Count >= 1) { return false; } else { return true; } }Gary's company has an "enterprise" application, and like any enterprise application, it was built to be all things for all people, by people that didn't have a clear picture of which things it was supposed to be to whom. While a customer could, in theory, install and configure it on their own, pretty much everyone paid for a consultant to handle the setup for them. Gary was one of those consultants.
Gary was scheduled to be at the client site for a week, which was plenty of time for the basic install and configuration. But before he could even get three steps through the door, the company "Security Czar", Norman, tackled him and then locked him in a dingy, windowless room with a two foot tall stack of forms. Of course, Gary was used to signing NDAs and the like, but Gary's management usually handled the negotiations, and the documents were usually a few pages of legalese, not a Neal Stephenson book.
"You couldn't fax these over ahead of time?" Gary asked during one of the breaks he needed to shake out the writing-induced cramp in his hand. "It would have saved a lot of time."
"These forms are confidential," Norman explained. "They're not allowed off-site."
The two spent the first half of the day signing forms. Gary half-expected Norman to give him a pat-down, just to ensure that he hadn't pocketed one of those super-secret NDA pages. Then again, he didn't need to; Norman's eyes had been locked on Gary during the entire morning.
Norman escorted Gary from security's dingy, windowless room to IT's dingy, windowless rooms. Gary met the IT supervisor, briefly, and was shown to a computer. He sat down, grabbed the keyboard, and asked, "How do I log on?"
"Get away from that!" Norman swatted the keyboard and mouse out from under Gary. "Did you even read those forms? You're not allowed to touch those."
"What?"
"It's against company policy for a non-employee to touch a keyboard connected to our network," Norman growled. "We'll be giving you a typist. He should be here any moment."
The typist arrived and introduced himself as Louis. "Just type rm -rf / to get started," Gary joked. Louis dutifly started tapping away at his instruction, but Gary quickly stopped him before anything bad happened. "Um, have you ever done any IT work?"
"Nope," Louis said. "I'm in the management training program."
"Hunh," Gary murmured under his breath, "first lesson: don't institute stupid policies like this."
The remainder of the week made transcribing James Joyce's Ulysses — by hand — seem like fun.
"Ok… scroll down. No, too far. Up. Up. That line there. No, below that. Next one down. Put the cursor there. No, there. Type an opening angle bracket. No, that key. Right, the 'less than' sign. Now type 'configuration'. Little 'c'. Capitalization matters. No, you mispelled it. No, there isn't a spellchecker."The week would have gone faster if Gary had been typing with boxing gloves on. The entire setup process should have taken one or two days, leaving the remainder of the week for configuration and burn-in. Gary did his best through gritted teeth, and privately swore that, if this company ever sent anyone to his office, he'd expect them not to use any oxygen while in the building. Security, after all.
Near the end of the week, Gary went back to the IT supervisor to explain that things wouldn't be finished, and that his company would need to send out another consultant to finish the job. "I understand," the supervisor said. "But it doesn't really make sense to fly more people back and forth. Why don't I get you set up to remote in, and you can finish the configuration from your office. We have a secure VPN, after all."
Diego was excited. A vendor — one that, for the record, he had no choice but to work with — finally put together a web service. This was big news because it meant that Diego would no longer have to battle proprietary TCP protocols to get data extracts; he could use a simple, well-established protocol to download the data he needed.
When the vendor delivered the service documentation, however, Diego was a little disappointed. It was a little more... simple... than he had imagined.
string WebRequest(string parameter)There was a single method, and it has a single string parameter and returned a single string. The "parameter" string was actually a multi-parameter and represented any number of parameters concatenated together. But instead of being comma-separated or otherwise delimited, it was a fixed width concatenation and depended on the operator. For example, if you wanted to search for records with "JACOB" in the last name and "NEW YORK" as the state, the method call would look something like this.
var result = WebRequest("SRCH JACOB NY ");Put "JACOB" at position 24 instead of 25, and you might get records with first names ending with "J" and last names of "ACOB". All told, it was an even worse API than the proprietary TCP method, so Diego called the vendor to ask if they had a saner interface, perhaps one that communicated in XML.
"Actually we sure do," the developer on the other end enthusiastically replied, "if the first character of the Web Request is an X, then the results will be returned in XML instead of the normal fixed-width format!"
Skeptical, Diego tried the "X" trick and, lo and behold, it returned XML.
<?xml version="1.0" encoding="iso-8859-1" ?> <result> <fields> <field>NAME</field> <field>LAST NAME</field> <field>MOTHER MAIDEN NAME</field> <field>BIRTHDATE</field> ... </fields> <data> <row> <value>MARLENE</value> <value>RUTH</value> <value>DE MARCO</value> <value>1973-02-24 00:00:00</value> ... </row> </data> </result>At least it was well formed XML.
"I searched for a route to walk from Southampton to Edinburgh(UK)."Albert writes," but for some reason, Google Maps wants me to slip over the border into France, back to UK, back to France, then again to UK!"
"This package of Ramen noodles is honest," Hannah wrote, "fill in your own date... it won't ever go bad."
And this is precisely why John Rasch needs to upgrade to the Spam Hammer.
John Munro isn't exactly sure who's investigating the issue, but he's not very confident in its resolution.
"Microsoft Word is apparently not installed," writes Anders, "at least... according to Microsoft Word I installed on my computer."
Robert got this random spam in his Gmail.
"Duh," writes Stryder, "of course a Microsoft.Tools.WindowsInstallerXml.VisualStudio.WixProjectNode isn't a Microsoft.Tools.WindowsInstallerXml.VisualStudio.WixProjectNode."
I really wasn't kidding about the Snowpocalypse. Aaron snapped this from the Weather channel back a little while back.
Jibran turned in some questionable programming code when he was a student in college. Then again, who didn't? It's a student's sacred right to drive instructors to drink. There are no WTFs in student code; everyone has to learn sometime.
Unfortunately, Dr. Talbot's 100-level Java class focused more on providing barriers to learning. Talbot's voice had a nasal drone that would make bagpipes cringe but was so monotonous it could put an elephant under. Nor did he have any ability to organize a classroom session; he delivered material in a haphazard ramble that only covered half of the the outline. Jibran generally dozed through the session, and if he was lucky, woke up before it ended and caught the day's assignment.
During the requisite dice-roller discussion, Dr. Talbot managed to shake Jibran out of his stupor. Up on the projector glowed this example of how to generate a random number:
Random rand = new Random();
int n = rand.nextInt() % 10 + 0;
"Why is there a 'plus zero' at the end of that?" Jibran asked.
"That's just how Java requires you to do it," Talbot explained, as if this were obvious to anyone with his level of experience. "You need that zero so that the computer actually understands that you want a random number."
During the lab session, Jibran wrote the same program, sans the plus zero. He called Dr. Talbot over to look at it. "Look, it compiles and runs. You don't need the plus zero."
Dr. Talbot looked at the code, with a puzzled expression. "That's amazing," he said, surprised. Jibran smiled, satisfied that his instructor was going to admit his mistake. "There must be a short circuit inside the computer that's causing the Java compiler to accept your version of my random number code!"
To say that the codebase at Andy’s client is sub-optimal would be generous. It’s a kludge on top of a kludge that was cobbled together by countless developers over many years. And as with many large and unwieldy information systems, distilling this beast into an understandable form is a challenge superseded only by the actual maintenance of the code.
As such, a brief snippet — a representative line if you will — offers perhaps our best glimpse into the heart of the system. And what a better place to look than its most tragic part: the database. Following is a portion of a line (a SELECT statement) that illustrates a pattern used over and over within the code.
WHERE co.Id = cu.CompanyId AND cu.Id = cui.CustomerId AND cui.Id = (o.ShipToCustomerId / 1000000)For the database unacquainted, having an identifier in a table that’s the result of another identifier divided by 10,000,000 is just sick.
It’s hard to believe that it’s almost summer. Actually, that’s not true; summer basically comes at the same time every year, and it’s slowly transitioned to through a period known as “spring.” But what is hard to believe is that just three short months ago, we experienced the most brutal winter ever.
Dubbed The Snowpocalypse and Snowmaggedon, the 2010 blizzards dumped an obscene amount of snow on the Washington DC area. So much that even the monstrous machines dedicated to clearing said snow were no match. “Due to blizzard conditions and near-zero visibility on the roadways,” emergency services announced after one storm, “to protect the safety of city employees and residents, all snowplowing operations have been temporarily suspended until weather conditions improve.” Now that’s some serious snow.
Although weather forecasts predicted that there’d be some kind of big storm, they didn’t quite predict that scale. Still, many companies preemptively addressed the “snow day” questions with internal memos. Rick received on such note from his employer.
From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Monday, February 8, 2010 4:40:38 PM Subject: Inclement Weather Just a quick reminder about Redacted Technologies's inclement weather policy and practice since we have another storm in the near term forecast. Should weather conditions ever become severe enough to warrant a full day closure or a late opening, a message will be posted to our inclement weather phone line; 240-555-8525. In most instances of wintery weather, Redacted Technologies will remain open for business and you should plan to arrive at work at your normal time. Please make sure to leave for work earlier as to allot more time for your commute. When weather becomes severe during the business day, Redacted Technologies management will monitor conditions to determine if early closure is appropriate. Please let me know if you have any questions. Thanks so much. Annette Burnham Director, Human Resources Redacted TechnologiesNot quite knowing what to expect the following morning, Rick set his alarm two hours early. When he awoke, he discovered that not only was his power out, but so were nearly a hundred thousand other homes in the area. Worse still, his street – like the rest of the DC area – was blanketed with nearly two feet of snow, which meant he and his compact sedan were not going anywhere. With his cell phone not getting any signal, he decided to sleep in and check back in a few hours.
By the time nine thirty rolled around, the power still hadn’t come on and his street wasn’t plowed, but at least his cell phone had a signal. Though he was certain his employer had called a snow day, he dialed in just to hear it for himself.
Today is Tuesday, February Nine. Redacted Technologies is open for business. Please drive carefully, as the roads may be a mess.Rick was floored. A mess? he wondered, just a mess? The fricken snow plows can’t even get out there!
Moments later, his phone bleeped with the telltale sign of a new email. It was from his daily weather reporting service.
=============================== Severe Watches and Warnings =============================== THE NATIONAL WEATHER SERVICE IN BALTIMORE/WASHINGTON HAS ISSUED A * SEVERE BLIZARD WARNING FOR... DISTRICT OF COLUMBIA-HARFORD-SOUTHERN BALTIMORE-PRINCE GEORGES-ANNE ARUNDEL-CALVERT- INCLUDING THE CITIES OF...WASHINGTON...BALTIMORE... ANNAPOLIS... -- snip -- * TRAVEL CONDITIONS ACROSS THE REGION WILL BE EXTREMELY DANGEROUS AND LIFE THREATENING. HELP YOUR LOCAL AND STATE GOVERNMENT FIRST RESPONDERS AND TRANSPORTATION AGENCIES BY STAYING OFF ROADS. * IF YOU ABSOLUTELY NEED TO TRAVEL IN AN EMERGENCY...DO NOT TRAVEL ALONE. LET SOMEONE KNOW YOUR TIMETABLE AND YOUR PRIMARY AND ALTERNATE ROUTES. CARRY WITH YOU A WINTER STORM SURVIVAL KIT WHICH INCLUDES A MOBILE PHONE...BLANKETS...FLASHLIGHT WITH EXTRA BATTERIES...HIGH CALORIE NON-PERISHABLE FOOD AND WATER...AND A SHOVEL.As Rick read the bulletin, another email came through. This time, it was Annette from HR.
From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 9:38:49 AM Subject: Liberal Leave for Inclement Weather In view of today's weather, Redacted Technologies will be operating on a Liberal Leave policy. That is, if you are unable to come in to work, you may use an unscheduled vacation day. Please be sure to contact your supervisor by phone or email to advise him if you will not be in. Take care and stay safe!Thrilled that he’d be “allowed” to use a vacation day, Rick bundled up, grabbed a shovel, and spent the next few hours clearing his driveway and sidewalks. By the time he made it back inside, his power was back on and he was able to check his email on a real computer.
From: "Ellis Bateman" <ebateman@RedactedTechnologies.com> To: "Annette Burnham" <aburnmah@RedactedTechnologies.com> Cc: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 1:14:11 PM Subject: RE: Liberal Leave for Inclement Weather FYI.... If anyone is thinking about going into work...DONT!! Columbia Gateway is impassible without 4wd and our lot is not plowed! As a matter of fact the Snowplow driver got stuck and is waiting for a tow in our parking lot!!!It certainly wasn’t an exaggeration. In fact, Rick was surprised that someone had braved Snowmageddon. Not only did several of the surrounding states (Maryland included) declare a State of Emergency, but the City of Baltimore (where many DC-area employees commute from) barred all non-emergency vehicles from driving on the roads. But still, the weather wasn’t quite bad enough for Redacted Technologies.
----- Forwarded Message ----- From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 1:22:41 PM Subject: FW: RE: Liberal Leave for Inclement Weather Please note that Ellis’s message does NOT reflect company policy. Redacted Technologies is still open for business. Any information pertaining to full closure or late opening will be posted on our inclement weather hot line (240-555-8525).“Livid” wasn’t strong enough to describe Rick’s sentiment, though it was close. He had a two-week vacation to the Caribbean planned, and he had exactly two weeks of vacation time. Redacted Technologies didn’t exactly allow “unpaid time off” either, which meant that reclaiming his vacation days wasn’t going to be easy.
Fortunately, Rick wasn’t the only one dissatisfied with the Liberal Leave policy. Recognizing that being physically and legally unable to commute to work didn’t meet most employee’s definition of “vacation”, HR generously updated their policy.
----- Forwarded Message ----- From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 3:11:29 PM Subject: Liberal Leave - Wednesday, Feb 10th We are continuing to monitor the weather and road conditions. We recognize driving is extremely hazardous and urge you not to try to commute if it puts you in danger. While tomorrow promises to be a better day, it will take time for many of us to get out and commute safely. We will continue to operate on "Liberal Leave" through tomorrow, Wednesday the 10th. In lieu of using vacation or personsal leave for the days lost since Monday the 8th, we are offering everyone an opportunity to work either Saturday or Sunday, or both, to make up for hours lost since Monday the 8th. We know vacation time is precious and want you to be able to use it for fun and relaxation when you and your family need and want to. If you opt to work one or both weekend days, please be sure to email or call your supervisor to advise them of your decision to do. If I can be of assistance, please email me or call me at (202) 555-8323. Take care and be safe!And with that, Rick settled on how he’d be spending his next two “makeupable” vacation days: enjoying Piña Coladas at home while cruising the job boards for some new digs.
It’s hard to believe that it’s almost summer. Actually, that’s not true; summer basically comes at the same time every year, and it’s slowly transitioned to through a period known as “spring.” But what is hard to believe is that just three short months ago, we experienced the most brutal winter ever.
Dubbed The Snowpocalypse and Snowmaggedon, the 2010 blizzards dumped an obscene amount of snow on the Washington DC area. So much that even the monstrous machines dedicated to clearing said snow were no match. “Due to blizzard conditions and near-zero visibility on the roadways,” emergency services announced after one storm, “to protect the safety of city employees and residents, all snowplowing operations have been temporarily suspended until weather conditions improve.” Now that’s some serious snow.
Although weather forecasts predicted that there’d be some kind of big storm, they didn’t quite predict that scale. Still, many companies preemptively addressed the “snow day” questions with internal memos. Rick received on such note from his employer.
From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Monday, February 8, 2010 4:40:38 PM Subject: Inclement Weather Just a quick reminder about Redacted Technologies's inclement weather policy and practice since we have another storm in the near term forecast. Should weather conditions ever become severe enough to warrant a full day closure or a late opening, a message will be posted to our inclement weather phone line; 240-555-8525. In most instances of wintery weather, Redacted Technologies will remain open for business and you should plan to arrive at work at your normal time. Please make sure to leave for work earlier as to allot more time for your commute. When weather becomes severe during the business day, Redacted Technologies management will monitor conditions to determine if early closure is appropriate. Please let me know if you have any questions. Thanks so much. Annette Burnham Director, Human Resources Redacted TechnologiesNot quite knowing what to expect the following morning, Rick set his alarm two hours early. When he awoke, he discovered that not only was his power out, but so were nearly a hundred thousand other homes in the area. Worse still, his street – like the rest of the DC area – was blanketed with nearly two feet of snow, which meant he and his compact sedan were not going anywhere. With his cell phone not getting any signal, he decided to sleep in and check back in a few hours.
By the time nine thirty rolled around, the power still hadn’t come on and his street wasn’t plowed, but at least his cell phone had a signal. Though he was certain his employer had called a snow day, he dialed in just to hear it for himself.
Today is Tuesday, February Nine. Redacted Technologies is open for business. Please drive carefully, as the roads may be a mess.Rick was floored. A mess? he wondered, just a mess? The fricken snow plows can’t even get out there!
Moments later, his phone bleeped with the telltale sign of a new email. It was from his daily weather reporting service.
=============================== Severe Watches and Warnings =============================== THE NATIONAL WEATHER SERVICE IN BALTIMORE/WASHINGTON HAS ISSUED A * SEVERE BLIZARD WARNING FOR... DISTRICT OF COLUMBIA-HARFORD-SOUTHERN BALTIMORE-PRINCE GEORGES-ANNE ARUNDEL-CALVERT- INCLUDING THE CITIES OF...WASHINGTON...BALTIMORE... ANNAPOLIS... -- snip -- * TRAVEL CONDITIONS ACROSS THE REGION WILL BE EXTREMELY DANGEROUS AND LIFE THREATENING. HELP YOUR LOCAL AND STATE GOVERNMENT FIRST RESPONDERS AND TRANSPORTATION AGENCIES BY STAYING OFF ROADS. * IF YOU ABSOLUTELY NEED TO TRAVEL IN AN EMERGENCY...DO NOT TRAVEL ALONE. LET SOMEONE KNOW YOUR TIMETABLE AND YOUR PRIMARY AND ALTERNATE ROUTES. CARRY WITH YOU A WINTER STORM SURVIVAL KIT WHICH INCLUDES A MOBILE PHONE...BLANKETS...FLASHLIGHT WITH EXTRA BATTERIES...HIGH CALORIE NON-PERISHABLE FOOD AND WATER...AND A SHOVEL.As Rick read the bulletin, another email came through. This time, it was Annette from HR.
From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 9:38:49 AM Subject: Liberal Leave for Inclement Weather In view of today's weather, Redacted Technologies will be operating on a Liberal Leave policy. That is, if you are unable to come in to work, you may use an unscheduled vacation day. Please be sure to contact your supervisor by phone or email to advise him if you will not be in. Take care and stay safe!Thrilled that he’d be “allowed” to use a vacation day, Rick bundled up, grabbed a shovel, and spent the next few hours clearing his driveway and sidewalks. By the time he made it back inside, his power was back on and he was able to check his email on a real computer.
From: "Ellis Bateman" <ebateman@RedactedTechnologies.com> To: "Annette Burnham" <aburnmah@RedactedTechnologies.com> Cc: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 1:14:11 PM Subject: RE: Liberal Leave for Inclement Weather FYI.... If anyone is thinking about going into work...DONT!! Columbia Gateway is impassible without 4wd and our lot is not plowed! As a matter of fact the Snowplow driver got stuck and is waiting for a tow in our parking lot!!!It certainly wasn’t an exaggeration. In fact, Rick was surprised that someone had braved Snowmageddon. Not only did several of the surrounding states (Maryland included) declare a State of Emergency, but the City of Baltimore (where many DC-area employees commute from) barred all non-emergency vehicles from driving on the roads. But still, the weather wasn’t quite bad enough for Redacted Technologies.
----- Forwarded Message ----- From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 1:22:41 PM Subject: FW: RE: Liberal Leave for Inclement Weather Please note that Ellis’s message does NOT reflect company policy. Redacted Technologies is still open for business. Any information pertaining to full closure or late opening will be posted on our inclement weather hot line (240-555-8525).“Livid” wasn’t strong enough to describe Rick’s sentiment, though it was close. He had a two-week vacation to the Caribbean planned, and he had exactly two weeks of vacation time. Redacted Technologies didn’t exactly allow “unpaid time off” either, which meant that reclaiming his vacation days wasn’t going to be easy.
Fortunately, Rick wasn’t the only one dissatisfied with the Liberal Leave policy. Recognizing that being physically and legally unable to commute to work didn’t meet most employee’s definition of “vacation”, HR generously updated their policy.
----- Forwarded Message ----- From: "Annette Burnham" <aburnmah@RedactedTechnologies.com> To: "All HQ" <AllHQ@RedactedTechnologies.com> Sent: Tuesday, February 9, 2010 3:11:29 PM Subject: Liberal Leave - Wednesday, Feb 10th We are continuing to monitor the weather and road conditions. We recognize driving is extremely hazardous and urge you not to try to commute if it puts you in danger. While tomorrow promises to be a better day, it will take time for many of us to get out and commute safely. We will continue to operate on "Liberal Leave" through tomorrow, Wednesday the 10th. In lieu of using vacation or personsal leave for the days lost since Monday the 8th, we are offering everyone an opportunity to work either Saturday or Sunday, or both, to make up for hours lost since Monday the 8th. We know vacation time is precious and want you to be able to use it for fun and relaxation when you and your family need and want to. If you opt to work one or both weekend days, please be sure to email or call your supervisor to advise them of your decision to do. If I can be of assistance, please email me or call me at (202) 555-8323. Take care and be safe!And with that, Rick settled on how he’d be spending his next two “makeupable” vacation days: enjoying Piña Coladas at home while cruising the job boards for some new digs.
"Just my luck," Q.M. writes, "I picked all 32's."
"Bummer," Matt wrote, "I was trying to scan a document, but sadly the twain software was corrupt."
"I saw this on a recent ski trip to Big Bear, CA," Matthew Parsons wrote, "apparently it was going to be a little warm that night."
"I love my Sam Adams as much as the next guy," writes Jason Draper, "but it's just not that good."
"There were no events within 10 miles of my area, so it asked me if I wanted to search 20 miles," wrote Kevin Conroy, "then it asked me to expand to 40 miles; and then 80. You can where it kept going. I finally got it up to 1759218604450000 miles with no results. Either they're having database problems, or there's nothing within 300 lightyears (or so)."
"I got this Really Bad error when I tried to use a certain microfiche scanner," notes Anthony T
"I saw this in the Zimbra Collaboration Suite release notes," wrote Kuba Ober, "obviously David Connely has been dealt with properly. His number came up."
"Just my luck," Q.M. writes, "I picked all 32's."
"Bummer," Matt wrote, "I was trying to scan a document, but sadly the twain software was corrupt."
"I saw this on a recent ski trip to Big Bear, CA," Matthew Parsons wrote, "apparently it was going to be a little warm that night."
"I love my Sam Adams as much as the next guy," writes Jason Draper, "but it's just not that good."
"There were no events within 10 miles of my area, so it asked me if I wanted to search 20 miles," wrote Kevin Conroy, "then it asked me to expand to 40 miles; and then 80. You can where it kept going. I finally got it up to 1759218604450000 miles with no results. Either they're having database problems, or there's nothing within 300 lightyears (or so)."
"I got this Really Bad error when I tried to use a certain microfiche scanner," notes Anthony T
"I saw this in the Zimbra Collaboration Suite release notes," wrote Kuba Ober, "obviously David Connely has been dealt with properly. His number came up."
"Let me guess" started Justin with a wry smile, "Mr. Van Halen is on 'strike' because he found a brown M&M, right?"
With a beleaguered look, Brian glared back over the rim of his glasses "If only - check your email."
Justin's manager had forwarded to him and Brian a very long running email thread involving the product group, his director, the VP of IT, and the new consultant for the E-Business group. Famous for his often insane requests (like refusing to even start work until he was given a window office, personal coffee maker, and unblocked Internet access) he encouraged everybody to call him Eddie, but outside of planning meetings, everybody just referred to him by his more appropriate rock star moniker.
The email thread was a jumbled mess of back-and-forth negotiation, but in a nut shell, all design and development was on hold until a specific Enterprise Source Control Management System was put in place. Clearly, eSCM was "clearly superior" to the SVN server they had in place.
Despite the consultant's hissy fit, upper management had seemingly caved to the consultant's demands, declaring the eSCM software as "business critical" and while there was technically no money budgeted for hardware, nor did anyone even have a project plan, it was to be the newest top priority.
With little recourse, Justin dropped everything and contacted the consultant to get some rough details on what he needed. Resources were cobbled together, servers configured, security enabled, duct tape applied, and while still a bit rough, all in all, to Justin and Brian's satisfaction, they had gotten in place what they felt was a robust solution for cheap.
Next step was to get the users up to speed on the "next great thing" they'd be using. Justin and Brian had a lunch and learn with the product group to get them up to speed. The consultant came in, we turned over the system to him, confirmed all was well, and he did his thing.
With each month that passed, Justin and Brian had not heard one single peep about the system that they had prepared. Justin had called the consultant just to check-in on how things were going, but all calls went straight to voicemail and his executive-style office door was perpetually closed which could only mean that he was not meant to be disturbed.
Several months later a faulty breaker took down the server rack the system was in. Justin and Brian sprang into action and got things back up and running and recovered from the failure in little over an hour. Wanting to confirm that everything was functioning as expected, Justin dropped in on the Project Manager from the product group.
"Oh that." the manager said with a light bulb coming on over his head. "Yeah, we don't use it."
"Well what about Eddie, the consultant?"
"Yeah, 'Mr. Van Halen' moved on to another gig. He's gone, months ago."
Justin sat there dumbfounded. "Are you sure it's not used? It was a pretty big project."
The manager sat back and laughed, "Heh heh. Yeah he wanted to store all our SQL and scripts in the eSCM. He got it all setup, but when we tried to use it was just too difficult so we stopped."
Justin paused, carefully choose his words, and asked "So, what do you currently do?"
"After every change, we put everything into a zip archive and track changes in a spreadsheet. All of it is on our shared drive."
Curious, Justin asked for the name of the share where the files were located only to be told "Sure, hang on, let me find the asset tag on my tower."
Code generation can be an effective tool for strongly-typing your custom domains if the given domain is constrained to a specific set of values. Acceptable examples would include color names, statuses, and U.S. states, among several others.
In some scenarios it is completely redundant to do so, for example, if you are strongly-typing the alphabet:
public class ClassTypeLetters { private const string ClassTypeA = "A"; private const string ClassTypeB = "B"; private const string ClassTypeC = "C"; private const string ClassTypeD = "D"; private const string ClassTypeE = "E"; private const string ClassTypeF = "F"; private const string ClassTypeG = "G"; // H-W... private const string ClassTypeX = "X"; private const string ClassTypeY = "Y"; private const string ClassTypeZ = "Z"; }Jeff was excited by his new project. His company wanted to add an ASP.NET interface to the same database used by one of their Windows Forms applications. For this company, "application integration" meant that two programs looked at the same database. Any change to a database and every application using it had to be updated, individually.
Since Jeff's first day at the company, he had been frustrated by the lack of code reuse, and this was a text-book example of where code reuse should work. He could grab the Windows team's DAL and business layer, slap a web front end, get the project done in a fraction of the time allotted for it, and make sure future maintenance helped both applications. Optimistically, it could be a model for future applications in his company.
"No," Carl, the project lead for the Windows side of development said. Carl glared at him like Jeff had been bitten by a zombie and might turn at any moment. "Your web application is a different application, and I don't see why you want any of our code."
"It's the same application," Jeff protested. "We're accessing the same data, doing the same things with it. The only thing that's changed is how we show it to the user."
"I don't want to have to deal with any confusion," Carl said. "This isn't a simple application. We can't just do what you want. I guess I could give you the DAL framework we used to build our DAL, I suppose."
Over the course of the next week, the battle continued, in meetings, emails and conference calls. Carl, a twenty year veteran with the company, had more knowledge of the political terrain and out maneuvered Jeff. Jeff had to strike his colors and accept the framework objects Carl was offering. A little code re-use was better than none. But Carl came back with some extra rules.
"You can't put your DAL classes in the same project as the Windows ones. And you should prefix all of your DAL classes with the word 'Web' so no one grabs the wrong code."
"Ignoring the fact that is idiotic," Jeff replied, "why would we do that? The UI and the DAL are completely separate. It doesn't matter how we present the data, the DAL is just fetching it."
The meeting didn't end in a fist-fight, but Jeff's manager had to step in and smooth over the roughed up egos. Carl's rules stood, as absurd as they seemed to Jeff. Jeff inspected the code Carl had provided. It had a rather unusual requirement for a DAL: the caller had to pass in a Windows.Forms.Form object, along with a ProgressBar and a StatusBar. Jeff read through the code and found the DAL framework updated the ProgressBar and StatusBar while it waited for results from the database.
Jeff emailed Carl an apology: "I withdraw my comments about the DAL and the UI being separate concerns. I was apparently mistaken." No sanely developed ASP.NET app would have access to Windows Forms objects. For the umpteenth time in his tenure, he re-invented the wheel and wrote his own DAL and business layer. In the end, Jeff was probably better off for it. The first rule of code reuse is that the code needs to be worth re-using.
Jeff was excited by his new project. His company wanted to add an ASP.NET interface to the same database used by one of their Windows Forms applications. For this company, "application integration" meant that two programs looked at the same database. Any change to a database and every application using it had to be updated, individually.
Since Jeff's first day at the company, he had been frustrated by the lack of code reuse, and this was a text-book example of where code reuse should work. He could grab the Windows team's DAL and business layer, slap a web front end, get the project done in a fraction of the time allotted for it, and make sure future maintenance helped both applications. Optimistically, it could be a model for future applications in his company.
"No," Carl, the project lead for the Windows side of development said. Carl glared at him like Jeff had been bitten by a zombie and might turn at any moment. "Your web application is a different application, and I don't see why you want any of our code."
"It's the same application," Jeff protested. "We're accessing the same data, doing the same things with it. The only thing that's changed is how we show it to the user."
"I don't want to have to deal with any confusion," Carl said. "This isn't a simple application. We can't just do what you want. I guess I could give you the DAL framework we used to build our DAL, I suppose."
Over the course of the next week, the battle continued, in meetings, emails and conference calls. Carl, a twenty year veteran with the company, had more knowledge of the political terrain and out maneuvered Jeff. Jeff had to strike his colors and accept the framework objects Carl was offering. A little code re-use was better than none. But Carl came back with some extra rules.
"You can't put your DAL classes in the same project as the Windows ones. And you should prefix all of your DAL classes with the word 'Web' so no one grabs the wrong code."
"Ignoring the fact that is idiotic," Jeff replied, "why would we do that? The UI and the DAL are completely separate. It doesn't matter how we present the data, the DAL is just fetching it."
The meeting didn't end in a fist-fight, but Jeff's manager had to step in and smooth over the roughed up egos. Carl's rules stood, as absurd as they seemed to Jeff. Jeff inspected the code Carl had provided. It had a rather unusual requirement for a DAL: the caller had to pass in a Windows.Forms.Form object, along with a ProgressBar and a StatusBar. Jeff read through the code and found the DAL framework updated the ProgressBar and StatusBar while it waited for results from the database.
Jeff emailed Carl an apology: "I withdraw my comments about the DAL and the UI being separate concerns. I was apparently mistaken." No sanely developed ASP.NET app would have access to Windows Forms objects. For the umpteenth time in his tenure, he re-invented the wheel and wrote his own DAL and business layer. In the end, Jeff was probably better off for it. The first rule of code reuse is that the code needs to be worth re-using.
Several years ago, Mike M’s company decided that they needed to build an in-house Content Management System portal application. Well, actually, the lead developer made the decision… and the recommendation… largely because writing applications are boring. But writing platforms upon which you can write applications… now that’s exciting!
Two years and several failed “proof of concepts” later, and the company had portal driven by a VB6 application with a SQL Server database behind it. If one were to create a list of adjectives to describe this monstrosity, “stable,” “reliable,” and “accurate” would be strikingly absent. However “stillborn” would probably make the top of the list. When Mike took over, the application had 200 forms, one auxiliary code module, and zero classes.
As for the SQL Server database, it had nearly 200 tables (mostly imported from Microsoft Access) and not a single stored procedure. Boolean-type values were represented as a CHAR(5) field, holding possible values of 'true', 'false', or NULL. Let me repeat that, because it bears repeating. Boolean-type values in the database were rendered as a CHAR(5) field holding possible values of 'true', 'false', or NULL.
There were also no indexes. Nor any primary key columns. Or even any auto-incrementing IDENTITY columns for that matter. For inserts, an ID was assigned via in-line SQL by requesting the Max(ID) field of any particular table and adding 1. "Duplications?" you ask. Why yes. Yes, there were.
The code module contained such gems as this function:
Function FileExists(f As String) As Boolean Dim ff As Long On Error GoTo BadFile ff = FreeFile Open f For Input As #ff FileExists = True Close #ff On Error GoTo 0 Exit Function BadFile: FileExists = False On Error GoTo 0 End FunctionThere were also several dozen Crystal Reports, each pointing to a specific table in the database. The database table for any particular report was erased and repopulated via in-line SQL statements each time the report was run. As for how that was actually accomplished, following is the basic report code. It was essentially repeated, line-for-line, on each report in the application.
Function GenerateSomeReport(sdate As String, EDate As String) As Boolean Dim st As String, lt As String Dim fn As String, ln As String Dim counter As Long Dim itmx As ListItem, Started As Boolean Dim dt As New Recordset, dt2 As New Recordset GenerateSomeReport= True Started = False Load frmProcess frmProcess.Caption = "Generate Some Report" frmProcess.Show frmProcess.Imsg = "Deleting old Report..." frmProcess.pMin = 0 frmProcess.cCancel.Enabled = False DoEvents dt.Open "SOME_REPORT_TABLE", cn, adOpenKeyset, adLockOptimistic If Not dt.EOF Then dt.MoveLast frmProcess.pMax = dt.RecordCount dt.MoveFirst Do While Not dt.EOF dt.Delete dt.MoveNext frmProcess.pVal = frmProcess.pVal + 1 DoEvents Loop End If frmProcess.cCancel.Enabled = True frmProcess.Imsg = "Generating..." frmProcess.pMin = 0 DoEvents st = "SELECT * FROM TARGET_TABLE WHERE " st = st & "SOMEDATE >= ('" & sdate & " 00:00:00') AND SOMEDATE <= ('" & EDate & " 23:59:59') " st = st & "ORDER BY ID;" dt2.Open st, cn, adOpenKeyset, adLockOptimistic If dt2.EOF Then msg = "No records match the report criteria!" MsgBox msg, 48, frmProcess.Caption GenerateSomeReport = False GoTo GetOut End If Started = True frmProcess.pMax = dt2.RecordCount ContGen: Do While Not dt2.EOF And frmProcess.tag <> "C" dt.AddNew For X = 0 To dt.Fields.COUNT - 1 dt(X) = dt2(dt(X).Name) Next dt.Update dt2.MoveNext frmProcess.pVal = frmProcess.pVal + 1 DoEvents Loop GetOut: If frmProcess.tag = "C" Then msg = "Are you sure you want to cancel generating the report?" rsp = MsgBox(msg, vbYesNo + vbDefaultButton2 + vbQuestion, frmProcess.Caption) If rsp = vbNo Then frmProcess.tag = "" GoTo ContGen End If GenerateSomeReport = False GoTo CancelGen End If CancelGen: frmProcess.Hide Unload frmProcess dt.Close If Started Then dt2.Close End If End FunctionFew interesting things to note...
Amazingly enough, Mike lasted several years there, rewriting the application as best he could. He added a few classes to the application, pointed the reports to stored procedures (using gasp! "parameters"), deleted in-line SQL where ever he found it, and generally kept the whole thing limping along. All the while, Mike maintained a constant plea for the resources to rewrite the whole thing from scratch. Obviously, his pleas were never granted, and he eventually left the monstrosity to some unfortunate new developer.
"I can't argue with that logic," wrote John Noble.
"I found this on Carnival Cruise's website," Mike T wrote, "you know what they say, Carnival's got the fun!\B\B\B\B\B\B\B\B\B\B\B \B\B\B\B\B\B\B\B\B\B\B\ B\B\B\B\B\B\B\B\B\B\B\B\ B\B\B\B\B\B\B\B\B\B\B\B\B \B\B\B\B\B\B\B\B\B"
"Really?" wondered Joe Newton, "it took a degree in climatology to figure that a drought is caused by no rain?"
"I received this while trying to activate some software," wrote Anthony T., "maybe the valve on my network pipe was not open all the way."
"The only thing better than an 18 year old single malt is an 18 year old single malt on sale," Craig Lamb writes, "hey... wait a sec! Oh well, at least it's still an 18 year old single malt."
Pari Gandhi bought a baby bottle cleaner brush with some rather interesting instructions on the back.
"I got this while trying to login to a website," Ian Breslin, "I'm not used to getting terms of endearment from a website, but it's a nice touch."
"I took this pic at a nightclub in sunny Guildford, Surrey," Keith Judge wrote, "I'm not entirely sure what the error is trying to tell me."
`
"I can't argue with that logic," wrote John Noble.
"I found this on Carnival Cruise's website," Mike T wrote, "you know what they say, Carnival's got the fun!\B\B\B\B\B\B\B\B\B\B\B \B\B\B\B\B\B\B\B\B\B\B\ B\B\B\B\B\B\B\B\B\B\B\B\ B\B\B\B\B\B\B\B\B\B\B\B\B \B\B\B\B\B\B\B\B\B"
"Really?" wondered Joe Newton, "it took a degree in climatology to figure that a drought is caused by no rain?"
"I received this while trying to activate some software," wrote Anthony T., "maybe the valve on my network pipe was not open all the way."
"The only thing better than an 18 year old single malt is an 18 year old single malt on sale," Craig Lamb writes, "hey... wait a sec! Oh well, at least it's still an 18 year old single malt."
Pari Gandhi bought a baby bottle cleaner brush with some rather interesting instructions on the back.
"I got this while trying to login to a website," Ian Breslin, "I'm not used to getting terms of endearment from a website, but it's a nice touch."
"I took this pic at a nightclub in sunny Guildford, Surrey," Keith Judge wrote, "I'm not entirely sure what the error is trying to tell me."
`