There’s one challenge we rarely think about when writing file-handling code: how do we know where the file actually is? Josh H. inherited some C# code that puts a lot of thought into that. A lot.
You might have noticed some updates to the site, although if we did our job right you won’t notice half of them.What’s New? We are saying goodbye to Discourse, our old forum and comments system. In its place reintroducing an in-house built system, thanks to the hard work of our newest team member Ben Lubar.Now you don’t have to be a member of the forums to leave a comment on the main site. Plus you can login and comment through several third parties, like Facebook, Google and GitHub.What’s New(ish)A few years ago we redesigned our site. We loved the look, but it wasn’t built as efficiently as we would have liked. So we rebuilt a more lightweight version that should work and look almost exactly the same.It’s not exactly the same, and I’m sure there will be some issues here and there, but now it will be much simpler to correct them. Everything is up on GitHub, so if have any problems or ideas for improvements, post an issue, submit a pull request, post something in this article's discussion, or contact us.[Advertisement] Manage IT infrastructure as code across all environments with Puppet. Puppet Enterprise now offers more control and insight, with role-based access control, activity logging and all-new Puppet Apps. Start your free trial today!
It'd been two hours since Mike had gone to bed. Two slow, miserable hours of counting sheep, staring at the barely visible ceiling, and trying to shake off the stress of the last few weeks at work.His company had (finally) moved from bare metal to a modern, virtualized environment. Mike and a few coworkers were in charge of revamping the whole backup system to match the efficiency of the servers. They'd been handed a generous budget and a single task: make daily backups of all the key servers feasible.Hundreds of emails, days of overtime work, and plenty of bickering had resulted in an impressive setup. Massive JBOD arrays, managed by virtual servers in a cabinet full of blades and hooked up to top-of-the-line 10G switches, all hummed along nicely in the server room.The backup solution was ready for its first test. Mike had personally started the backup job late in the afternoon. The whole team had gathered over his monitor to watch the speed slowly crawl up.One, two... six gigabits per second. With 30TB worth of snapshots, the whole process would take under half a day, meeting the original goal with a huge margin. Mike had gone home a few minutes later, hoping to see the backup completed by morning. But during the evening, his initial optimism had slowly faded.What if we misconfigured something? he kept thinking. Or worse, the hardware fails?Every time he felt close to sleep, his mind conjured yet another disastrous scenario, jolting him wide awake again.Finally, Mike's eyes darted towards the laptop resting in a bag by his bedside. He knew he shouldn't be doing work this late at night ... but surely a little peek at the administration panel wouldn't hurt?Mike crawled out of bed and booted up the laptop while rationalizing his surrender to temptation. It'll just take a few minutes. See that everything's fine, then get some sleep.He logged in to the corporate VPN, opened up the dashboard ... and realized he wouldn't be returning to bed that night. The backup was stuck at less than four percent, and the speed had dropped from six gigabits to barely over a megabit per second.Mike clicked around frantically, trying to pinpoint the problem. The only thing he could find was a warning in VMWare's logs saying that one of the logical units had ended up with over a second of latency. He browsed the network configurations, SMART error logs, but everything else seemed to be in perfect order. All he knew was that a few minutes after he'd left work, the latency had spiked and never returned to a reasonable level.Over the next 20 minutes, Mike tried changing almost every single option even vaguely related to the problem. He was ready to give up—until finally, after closing what seemed to be a thousandth dialog window, the backup speed suddenly ramped back up to several gigabytes per second.It took a while for Mike to remember what exactly he'd just changed. All he'd done was switch the load balancing algorithm used to communicate between the servers and the storage.That shouldn't have changed a thing, he thought, puzzled. He decided to watch the process for a while.The problems came back no more than a few minutes later, but by that time, Mike had an idea of what could be causing them. He remotely disabled the currently used port on the network switch.Sure enough, the traffic flew freely through a different port for a few minutes before clogging up again.The next few days, spent mostly on support calls and filing tickets with the switch manufacturer, confirmed Mike's suspicions. The large amount of data being pushed through the port slowly filled more and more space in the port's buffer. When that space ran out, the port crashed, decimating the network speed and slowing the backups down to a crawl.Luckily, just a few firmware updates later the issue was fully resolved, and Mike was able to enjoy not only the blazing-fast backups and the convenience of virtual servers, but also a good night's sleep.[Advertisement] Manage IT infrastructure as code across all environments with Puppet. Puppet Enterprise now offers more control and insight, with role-based access control, activity logging and all-new Puppet Apps. Start your free trial today!
Imagine you’re a Java programmer. You need to iterate across a list of strings. Your natural instinct might be to just use a for loop, and that’s proof that you’re not a true enterprise Java programmer.Diether’s company is home to true enterprise developers, and they know how to get things done.
"Hello, everyone!"Daniel's eyes slowly rose from his desk as his manager entered the room."As you know, we've been looking for a systems administrator for a while. It's a pleasure to announce we've finally found a great candidate. Please welcome Mark, who's joining Initrode starting today."A tall young man emerged from the shadows and glanced over the people in the room. His black suit and tie rested over a perfectly pressed white shirt. Mark's formality stood in stark contrast not only with the team of geeks, but also the rather casually dressed manager."Mark is an MIT graduate with plenty of experience in both Linux and Windows administration," the manager continued, putting emphasis on the MIT part. "I'm sure he'll be a great addition to our team.""Thank you, and hello," Mark spoke up in a silky smooth voice. "I'd just like to add that I'm very happy to be here, and I hope to introduce all the necessary infrastructure changes that will ensure our success."Faint alarm bells rang in Daniel's head. Changes? he thought. I wonder what kind of changes he has in mind?"And finally, the analytics team." Mark and the manager slowly approached Daniel's desk for the traditional round of hand-shaking. "Daniel, Alice, and Robert are our resident SAS experts. Their work is a huge part of what makes Initrode successful.""Welcome to the company," Daniel said, grabbing Mark's hand in a firm grip."So, what do you think of the new guy?" Robert asked once the door closed behind Mark and the manager. "A bit pretentious, isn't he?""At least he can give you some style lessons." Alice shot a dirty look at Robert's worn-out t-shirt. "What do you think, Daniel?""Yeah, they sure do dress 'em nice at MIT," Daniel replied."I mean about Mark," Alice said.Daniel went for the diplomatic answer. "He's a sysadmin. He's there to fix things when they break. Fine with me. The less we see of him, the better."But something told Daniel the MIT graduate wouldn't restrain himself to rebooting a server once in a while.It didn't take long to confirm Daniel's suspicions. Just two weeks later, he entered the office only to find his team staring at their monitors with a hopeless gaze."What's up? Monday blues getting to you?" he asked, trying to lighten the mood."Just read the mail," Alice muttered, more to herself than Daniel.He opened the mail client, curious as to what happened, and found an e-mail that'd been waiting for him since Friday evening.
Last week, US President Obama said something that is usually the sort of line we give the “idiot boss†character in one of our stories. From Ars Technica:
Code changes over time. Most of what developers do is manage changes to code. Dana inherited some pretty awful PHP, and decided to take some time to improve performance and make sure any errors thrown by the PHP were actually displayed nicely for the user.While looking at the file-upload module, Dana found this:
"Chrome translator apparently has issue with the numbers 11 and 30 when translating mail.ru to English," wrote Marc B., "Interestingly, the Russian version of the site displays the numbers properly, so WTF Chrome?"
I consider code cleanup to be important, almost as important as actually writing code, especially since I spend a lot of time doing maintenance and support. During idle time, I enjoy digging through existing code to find overcomplicated algorithms and dead code and see what I can simplify or even delete. While there may not be an immediate benefit, it makes future debugging far easier if you trim out dead code and shorten 3,000 line C files to 500 line ones. And quite often, subtle and difficult-to-diagnose bugs simply go away.While doing this on one of our products, I found a very old public API that appears to have never been completed. At least I hope so, because there’s no way any of it does anything remotely useful.Here are a couple representative functions. No, I don’t know what they’re supposed to do.
Decades ago I had several clients who insisted upon having two PCs on their desk. One would boot up into the word processor and the other would boot up into a spreadsheet program. No amount of instruction could teach these people that a computer can not only run multiple programs, but it can run them at the same time. To this day, these folks are still my clients, and happily paying me to support this arrangement.Some people simply can not be trained.Due to space constraints, John happened to sit near his in-house software development team. The primary business of their company was not software development, and the software folks catered only to the in-house needs of the company.The application in question is a small web query which allows the user to look up a person by some fraction of their first or last name and/or their phone number. Simple enough, really: do a case-insensitive wild card search of whatever they enter on both database fields, and display the results.One day, an Admin guy walked in to discuss the prospects of updating the application. Since people have moved a lot around here, our phone directory database has become outdated. How can we update it?.John suggested that they could provide a link in the same application so that each user could edit their phone number. However this was immediately rejected because everyone there thought it would be futile to ask employees to update their phone numbers.Instead, the manager of the software folks decided to run an internal company-wide survey and mandate that everyone provide their phone number.In the next 10 days, everyone at the company was forced to submit their internal extension number via the survey. It took all of 2 days to discover that this caused another problem. The company had 4 different facilities and all they collected via the survey was the extension numbers and not the facility to which they corresponded.By dumb luck, a week prior to this survey, there had been another survey requesting the facility in which each user was stationed. The software folks assured everyone that it was just a matter of using the other table to get the facility names too.Two days later, John just happened to bump into the same admin guy and asked him about his weekend plans. He said he was going to be in the office as the updates to the phone lookup application needed to happen. John started getting curious as to why the update should warrant weekend work, especially given that they had all the data they needed. He said Yes, the data is available, but it needs to be entered into the system.It later turned out that the software team exported an Excel dump of the two surveys from their SQL-Server database and had asked this poor guy to manually key in one entry after another in the entry form provided by them so that it could be stored in another database table.John told the admin to ask the software manager once again to check if there was a possibility to move the data directly from one table to another, rather than doing manual re-entry. John witnessed the resulting conversation:
We have to be careful about the articles we publish on TDWTF. We have a responsibility to our submitters, to protect their identity and anonymize the details of their stories. We have a responsibility to our readers- mostly to be entertaining.Last week’s JSF–k story failed one of our readers. Poor Blazej didn’t find it entertaining- it gave him upsetting flashbacks to his own experience with a similar event.You see, Blazej was pitching in on a file uploading site, specifically meant to share videos. While he did some backend work, the front-end developers wanted to make sure that it was impossible to ever learn the actual URL of a video, to prevent people from downloading it. They wrote some JavaScript to obfuscate that URL, but that introduced a new problem: somebody could just read their JavaScript!Using the same principles as JSF–k, but coupled with JavaScript’s unicode support, they produced this:
While studying Java in college, Eugene had the great misfortune of being hired by a company that specialized in Java Swing applications. (For those of you who don’t know, Swing is a cross-platform framework for desktop GUI applications.) He was quickly swept aboard a new project: taking a new client’s poorly-implemented, buggy, and unstable PHP website and upgrading it to a new, clean, Java-based version.The team quickly stumbled into a major roadblock. “This has to be a web application?†questioned Rob, the team lead. “You can’t do web with Swing. Why don’t we just write them a Swing application?â€â€œThey want a website, not a desktop application,†was the response from the salesman.And so the team set out on a quest to learn web development…AjaxSwingRob soon found a workaround for their dilemma. “I found something that will make web development easy for us!†he announced to the team. “It’s called AjaxSwing, and it converts Swing programs into web applications! We don’t have to learn web development after all!â€Eugene was a fairly green developer but even he knew this was a terrible idea. But as the newbie student programmer, he had no say in the matter, and soon found himself thrust into the horrid bowels of a wretched new beast. One that abused a tool designed to quickly shove legacy applications onto the web, instead using it as a core framework on a brand-new application. One that launched a separate, headless JVM process for each user. One that did terrible, unspeakable things with Reflection to replace Java’s internal Swing classes with ones that convert them to remote HTML/JavaScript entities in a web browser somewhere else.The new application was a monster. It had complex features and requirements and the team was continuously bumping into limitations of AjaxSwing. Eugene, being a mere student with the lowest pay, often got selected to work long hours dealing with these issues. He spent a fair amount of time handling customer reports, debugging, and forwarding bug reports on to the AjaxSwing team. To their credit, they worked with him to solve these.Finally, the application was completed and delivered to the client.Random CrashesShortly after deployment, the customer began complaining about random crashes in the application. Something occasionally happened that disconnected everyone from the application. They soon figured out that having the hosting company reboot the server would bring the application back, but eventually it would die again, sometimes after a few hours, sometimes after a few days. Meanwhile, Eugene’s team started adding performance logging and tracing to try to narrow down the cause.After a couple weeks of monitoring, Eugene came into one of their emergency customer support meetings slightly late but armed with a new bit of knowledge. “I found something in the server logs. Someone is actually terminating all the JVM processes used by the site.â€Rob frowned. “Why would someone do that? Call the customer and tell them not to do that anymore!â€And he did. The customer claimed they never did anything directly with the server, so maybe it was the hosting provider’s fault? But the hosting company claimed that no, they don’t randomly log into customer servers and kill processes.This continued for months. Everyone got used to the status quo and simply learned to live with it. Eugene continued monitoring and logging, but got no additional details. Someone somewhere was killing the JVM process and refusing to admit to it.The CauseMonths later, he received an enlightening email from the hosting provider.
"This was a screenshot I took of an error message I got many years ago (when Win95 was fairly new) after opening one too many instances of Word," Andrew H. wrote."I don't mind that Google likes to beta test everything, but I think I'll pass on this," Mike S. wrote, "I'd hate to be there if it crashes.""Facebook finally admits watching videos on it has no value," writes Kevin M."It's good to know that Windows will only wait six and a half years before making another attempt to synchronize its clock," wrote Matthew."Maybe I've stumbled on the Rosetta Stone for Business Process Architects? Nah, just another deployment WTF," writes Quentin G."I wanted to find the latest drivers for my MSI laptop, but I just couldn't find what I needed," writes Joe R."I have this feeling that you're trying to upsell me, ycharts.com," Jeff C. wrote.Ado B. writes, "Cards Against Humanity goes a step further by turning against charity as well." [Advertisement] Otter, ProGet, BuildMaster – robust, powerful, scalable, and reliable additions to your existing DevOps toolchain.
Joe took a job as a programmer at a small shop. It was a huge pay cut, but his current employer was locked in a death-spiral of declining revenue, declining collections, and declining sales. It was time to get out, and his local market didn’t have a lot of options.“We’re a small shop, so we’ll need you to help out with general IT stuff,†Joe’s boss, Jimmy, said. By “help outâ€, what Jimmy actually meant was “be the helpdesk tech, server tech, and if you have time, write some codeâ€. On an average day, Joe’d be running from user desktop to user desktop, installing Excel or removing malware, before hustling to the server room to manually reboot a locked up box, then on his way out the door, he’d push some changes to the company’s website and pray nothing was wrong.That server room was a bit of a problem, and you already know the details. It was a repurposed janitor’s closet, complete with the large sink, which constantly dripped just a little bit, water pipes running along the ceiling, and a smelly French drain in the floor. There were no windows. There was no ventilation. There was no air-conditioning.In April, Joe knocked on Jimmy’s door. “Hey, I’m a little worried about the server room. There’s no ventilation in there- it’s already up over 80ºF (27ºC) today. Come summer, it’s going to be brutal in there.â€â€œWhaaat?†Jimmy said. “We just bought a half dozen more efficient computers for in there. It’s gonna be fine.â€â€œI really don’t think it will. Even this is too warm for safety. I had to prop the door open to get it cool enough.â€Jimmy sighed. “Lordy, I’ll put it on the list, and maybe we’ll get something before summer comes ‘round. But I don’t want you proppin’ that door open! That’s expensive equipment, and I don’t want anything taking a walk!â€Summer came around. Jimmy didn’t buy an AC unit. It was a warm summer- one day in August it crested 100ºF (37ªC) outside. Inside the server room, it was literally an oven. Joe kept the door open, despite Jimmy’s concerns, but it wasn’t enough. Their primary application server died. It hosted pretty much everything important at the company, from accounting data to their mail server. It crashed and crashed hard, and whatever was wrong, it was definitely a hardware problem.Joe wasn’t surprised that there was no budget to replace the dead server. He had to spread its functions around to a few other boxes in the closet. “Jimmy,†he said, “I’m pretty sure this was caused by heat. We need to get an AC unit.â€â€œDarnit,†Jimmy said, “for that little tiny closet? A whole AC unit seems like a waste, and we’d have to cut a big hole in the wall, and I just think you’re making something out of nothing. But, here’s what I can do. I’ve got a portable cooler I use when I’m workin’ in my garage. I’ll bring that in from home, and we’ll cut a small hole for the exhaust fan.â€The portable cooler was a tiny thing, and it couldn’t keep up with the furnace of the server room. A week later, another server succumbed to heat-related trauma and died.At this point, Joe was downright angry. “Jimmy! We need to get an air conditioner for the server closet.â€â€œDurnit, the whole building doesn’t even have an AC. We use a swamp cooler. I’m not buying an AC for just one room! We’ll just turn the swamp cooler colder.â€And colder it was. Jimmy cranked it as high as it would go, which meant regardless of the temperature outside, the building was 55ºF (13ºC). Several of the employees brought winter coats from home and left them at their desks to try and keep warm during the day. With the entire building that cold, with the portable cooler, and with a fan, Joe was able to get the server room down to a reasonable temperature.Joe was pretty surprised when another server died. He rushed to the server room, and found that it wasn’t beastly hot- it was actually a reasonable temperature. He was ready to write it off as lingering damage from the heat, until he pulled the server from the rack.Jimmy, as promised, turned the building’s cooling system- its “swamp cooler†up. A swamp cooler is a very efficient cooling system suitable for drier climates. Unlike an air-conditioner, which uses refrigerant and a compressor to create cold temperatures, a swamp cooler simply pulls dry air across water. The water evaporates, removing some of the heat from the air, while simultaneously adding humidity to the air.That cold, moist air was blowing into the server room, which was a disused closet with exposed water pipes cutting across its ceiling. The pipes were much cooler than the server room’s air, so that moisture condensed on the pipes, then dripped.Joe was not pleased to find the server was wet. Fortunately, it was only the power supply that was actually damaged, and through some miracle, the short didn’t damage anything else. He replaced it with one of the overheating victims’ power supplies and got the server back in service- but not before moving the rack away from where the pipes were dripping.Joe didn’t stick around much longer. He left a few weeks later, and despite his warnings, Jimmy never did buy an AC. As far as Joe knows, every employee still wears coats in the summer.[Advertisement] Release!is a light card game about software and the people who make it. Play with 2-5 people, or up to 10 with two copies - only $9.95 shipped!
“Karen, you need to run the monthly report while Ivan is on vacation,†Bruno asked.“Wait, isn’t that just a scheduled job?â€â€œNo. It’s old code, and we don’t trust the scheduling systems, and if anything goes wrong how do we know and…â€â€œWell, I guess I can run it, then,†Karen said.“Great, you’ll need to restore the financials database from backup onto your local instance, then run the reporting tool in local configuration-â€â€œWait… why?â€â€œWhy? It’s too heavy a job for our production server!â€Karen followed the instructions. She spent a few hours waiting for the database to restore to her local developer instance. She fired off the job and waited another few hours while it ground away doing whatever it was doing. Finally, it quit, leaving behind a 40MB CSV file as its monthly report.At this point, Karen wondered- why did that take so long?. Curious, she extracted all the SQL queries and profiled them. They ran in seconds, and unless there was a poorly designed loop she hadn’t noticed, it wasn’t the queries that were making it slow. Her next guess was that it was the file IO that was slow- but how could that be? How hard was it to write a string of text to a file?
Let's talk about Javascript.Like just about every modern language, Javascript is based on C-syntax. That means when you look at a piece of Javascript, it should look pretty familiar: braces to denote block scope, semicolons to terminate lines, square brackets for arrays and dot notation for objects. The usual stuff.Javascript, however, is a scripting language. Like most scripting languages, it's weakly typed. Extremely weakly typed. Thanks to late-night Comedy Central, the Javascript community has come up with two words to replace the usual concept of true and false: truthy and falsy. A non-empty string is truthy, while an empty one is falsey. A defined variable is truthy, while an undefined variable is falsey. Pretty straightforward stuff. You can check for yourself; pressing F12 should provide you with a Console (or, as Rubyists would call it, a REPL) where you can follow along.But that's not all. Not only can you evaluate anything as a boolean, you can evaluate any expression as any type at all with a few handy tricks. Pop quiz: What is the value of [] as an integer?...wat?
Interviews are bidirectional in that you are supposed to be culling as much information about the prospective team, co-workers and management as possible, in the same way that they are trying to size you up.There are all sorts of interviewing styles; the reasonable back-and-forth conversation that actually allows you to learn about each other, the written test to see if you can do a ten line program that you had as a homework assignment back in CS102, the keep-guessing-until-you-come-up-with-the-solution-I'm-thinking-of torture test, and so on. However, this tale centers on an interviewer trying so hard to come up with the perfect question, that not only was unanswerable, but there was no way for the interviewer to judge if any answer given was correct.Adam had an interview for a developer position with a cable and networking company a while back. It was a fairly standard interview; three guys asking various questions ranging from past experience and schooling to technical questions. They did however seem to have a problem with his degree. You see, Adam had a Bachelors of Science with three majors. Yes, three majors; Math, CS, and English. Normally people are either surprised or impressed, but never before nor since has he actually been questioned about it so thoroughly.It seems that none of the three people that interviewed him believed that he had three majors. They seemed to think that he had a major and two minors, or a major with two focuses. They grilled him a little about how many and which classes he had to take to get these "majors". So he was really a math guy that took a few programming and English classes right? Every few questions, the topic circled back to his majors.Although he was able to answer their technical questions, it should have been clear that having a CS major qualified him for the job, but they seemed obsessed to make sure that he had really had three majors.Finally, one of the guys dropped what has come to be known as "the bomb" on him. It was by far the single most ridiculous and impossible question anyone has ever been asked at an interview. They had received his resume a few days before, and apparently liked it. The interviewer told Adam that it took him a few days to come up with a question to really find out if he really did have three majors, and then let fly with his ultimate creation:
Melissa’s co-worker needed to write some Python code to kill an external process. There are some third-party modules, like psutil that can solve that problem, but companies like Initech tend to put lots of obstacles along the path of bringing third-party code into your applications.Without third-party tools, you’re stuck “shelling outâ€. Using built-in Python functions like os.system or the subprocess module. This lets you run commands like ps and kill from inside of your Python program. It’s inelegant, but it works just fine. There’s certainly nothing wrong with it.Melissa’s co-worker saw the inelegant solution, and said to themselves, “Can I make that more ineleganter?â€This code searches for every process that’s a “server†for their application, and then kills them.
Today, we bring you another hastily-drawn, stick-figure video that recounts a true tale of requirements gathering and software development. Remember: gathering requirements is hard.
Peri, the new intern, was proving her worth as a programmer rapidly. She was great with finding clever solutions to problems, and she didn't bother the more senior devs too often while doing it: a boon, as they were trying to get their own work done.So when Steven assigned her a simple task—generate some unique IDs for repeated dynamic elements so the automated test team could keep track of which ones were which—he figured she didn't need any hand-holding."Good news!" she reported a few days later. "I completed that task you assigned me easily, ahead of schedule, and in only a single line of code." She preened, clearly proud of her work.Steven, who had long since moved on to other things, smiled at her. "That's great, Peri! I'll get you another ticket in a few minutes, after I approve your pull request."Peri skipped away happily.Steven finished the line he was on, pulled up Stash to skim over the PR—and stopped short.You see, the thing about Ruby is that you can do a lot in a single line of code. It's very compact and expressive that way. So when Peri said she'd written only a single line, well ...
“Hey, since Jack quit, you could add Jane to the investigation users?â€William M supported one piece of a large, complicated intranet application used by auditors as part of investigations into “events†within the organization. The overall audience is small, and the purpose of the application is mostly to document the process of the investigation. Since it’s so niche, it doesn’t even have a screen for managing user accounts- the users raise a ticket and rope in developers to manage it.The developer in charge of the secure portion of the application- Rick- was busy, so William caught the ticket. He wasn’t sure what to do, so he shot an IM over to Rick.“Oh, it’s easy,†Rick replied. “Just update Jack’s record with Jane’s user info. That’s the easiest way, since Jack quit.â€That didn’t seem like a smart process, but William was in a rush and this was Rick’s baby, so he just followed instructions and closed the ticket. Jane re-opened the ticket- she couldn’t access the audit compliance tracker. Jack had never used that page, but Jane planned to.Rick was still busy, so William decided to take a look at the authorization process. He found this code in the main-menu screen of the application.
An investment bank had just completed development on a new digital retailing platform. Daniel was assigned to a cross-functional automated test team, gearing up to test the platform's web application—or at least trying to. Charlie, a veteran manual tester from QA, had been vocal in his opposition."Automated tests need to be tested themselves, which means the testers need to test the tests, so automation doesn't save anything. If anything, it creates more work! Besides, we should always be striving to recreate the user experience as closely as possible!"Daniel and the other developers insisted that manual testing was valuable, but automation needed to happen too. The conflict marched up the org chart, culminating in a meeting with Charlie's boss, Daniel's boss, their bosses, their bosses' bosses, all the way up the org-chart to where these branches of the organization finally joined.The verdict was handed down. Charlie was appointed the leader on testing the web application, running through the same test cases in a manual fashion to catch any problems that fell through the cracks.The team—developers, QA, and a tech lead—all abandoned their cubes to huddle together in a large conference room. Everything went smoothly until one afternoon, when Charlie piped up with the nervousness of one staring down a cobra poised to lash out."Fellas? I don't know how I did it, but I hacked into the website somehow. I see all of the code."The people seated closest to him glanced up from their work to trade frowns."What do you mean?" Daniel asked, glancing across the table at Charlie."I'm in the browser, and I can see all of the code!" Charlie explained. "I've hacked into the website. I see stuff like, 'div class equal sign—'"In other words, the HTML source. Those who were listening in burst into relieved laughter, prompting everyone else in the room to quit their work and pay attention to the faux emergency.The far more patient tech lead bit her bottom lip to hide her grin. "Charlie, it sounds like you opened the developer tools in Chrome by accident. Press F12, it'll go away."Charlie hunted down the key and pecked it with a single loud stroke. "OK, it's gone," he said as though he’d just diverted a nuclear strike. His gaze swept over the room with a mix of urgency and confusion. "I'm still really concerned. That shouldn't happen!""It's supposed to do that," Daniel explained. "Go to any website you want, you can do that on any of them.""What?!" Charlie flipped to a different browser tab, then pressed F12 again. "What?! No!"Another burst of laughter drowned out his concern."Check out the leet haxxor here," one of the developers cracked."Step away from the computer, Charlie, before you hack the whole Internet!" another developer commanded, pointing a finger-gun at the hapless tester."Charlie, it's just—" Daniel tried to say."We can't keep using this browser!" Charlie declared. "I'm raising a defect for this!""All browsers have something like that for debugging purposes," Daniel explained. "It's not just Chrome."But as the giggles continued around him, Daniel's plea seemed to fall on deaf ears. Charlie tabbed over to their bug tracker and took to some furious hunting and pecking.Daniel shook his head. Let Charlie log his defect if it made him feel better. Surely no one would take it seriously.Unfortunately, QA heads and project leads took "security threats" very seriously. The conflict escalated up through bosses, bosses' bosses, and eventually, the verdict was handed down. To avoid exposing code to users, further web development and testing involving Chrome was suspended company-wide.[Advertisement] Manage IT infrastructure as code across all environments with Puppet. Puppet Enterprise now offers more control and insight, with role-based access control, activity logging and all-new Puppet Apps. Start your free trial today!
Configuration files are, well… files. File operations are “riskyâ€- there’s a lot of reasons why they might fail, and we have to be prepared to handle those execptions.For example, maybe you’ve written an application that reads a configuration file at launch. If, for some reason, it failed to load that config, you’d need to deal with that. If the configuration were just some minor settings, you might choose to fallback to some reasonable defaults. If, on the other hand, the configuration contained important security settings, you would probably want to quit the application, or maybe fallback into some “safety†mode.Patrick U. assumed that was how the NodeJS application he was working on behaved. Then, one of his fellow developers pushed their latest release into production. He went to log into his admin account, and found his password didn’t work- because it had been mysteriously changed to the incredibly insecure “adminâ€. After a little poking, he found someone had left off a closing-quote in their JavaScript configuration file, and that solved the problem. But why did his password get changed when the config file was broken? Well, this code was responsible for loading the file:
Ben was half of the two-man IT department at Bob’s Family Fun Center. It was a popular local place for kids and adults alike to come get wild in go-carts, blast each other in laser tag, and spend copious amounts of tokens to win cheap plastic crap with tickets from arcade games. Bob the owner employed his nephew Ted as the “head of ITâ€. All it took to qualify Ted for the job was helping Bob out with a home computer problem once.Ted didn’t actually do a whole lot around the Fun Center, but he complained to his uncle enough to hire some help. Ben was fresh out of college with a networking degree, Ben figured he’d get some real-world IT experience at the Fun Center while maybe getting some free go-karting out of it.Upon starting, Ben was intrigued by the network setup Ted had. While strange, it worked. The network had to support the handful of office computers, point-of-sale terminals, a printer, the free customer wi-fi, and a system known as “Impale†that handled all the debit card transactions on the games.At the heart of everything was an excessive-overkill Dell enterprise server in a wooden rack Ted proudly built himself. “Pretty cool, huh?†Ted asked as he showed off his handiwork to Ben. “I spent so much of the budget on this beast of a server, I didn’t have enough left over for a proper rack. So I took matters in to my own hands!†The rack was clearly constructed out of leftovers and scraps from the plywood obstacles installed in the Laser Tag arena, and it wobbled worryingly when anyone walked past.“Sure, Ted, that’s great…†Ben lied as he deduced that even a 1000 person laser tag match with 50 categories of stat tracking couldn’t tax this server. As for the rest of the network topology, that was apparently a budget afterthought as well. The ISP line came in to a small, aging 10/100 router that in turn ran to an equally old switch. A cable in the switch ran to one of the server’s NICs. Everything but Impale depended on this router and switch for network connectivity. The other NIC on the server ran to the dedicated Impale server, which had all the games and registers talking to it. It was certainly not an ideal setup, but it sufficed.One Monday, Ted came in to tell Ben that his uncle was complaining about the Fun Center’s phone service at a family gathering over the weekend. Looking to be helpful, Ted came up with a solution, “You see, Ben, I devised a way to cut the phone company out of the equation completely! I heard about this thing called Voicing on IP, or VOIP. We can cut our phone lines, and do all the calls over the internet!â€â€œUhh, yeah. It’s actually Voice over IP,†Ben corrected him. “I’m familiar with that. If you want to utilize that I can help get it set up.†Ben gave their ISP a call that afternoon and scheduled a tech visit for the next week.The tech predictably arrived towards the latter part of his estimated 4 hour window. Ben and Ted escorted him to their “network closetâ€, which was really just a small closet that housed their IT equipment as well as a helium tank for blowing up balloons. The tech started running a line for the phone service when he came across the router it was to be hooked in to. “Well now, that won’t do,†he observed. “That router’s older’n dirt. So’s that switch. Won’t support them blazin’ speeds we got. You gon’ have to git a new’un.â€Ted began to get upset at the thought of old Uncle Bob taking the “fun†out of Fun Center if they didn’t get the phones upgraded that day, like he’d promised. “There HAS to be something we can do! What if we run out and get a new router right now??â€â€œNow son, I gots more appointments to get to,†the tech said, eager to leave. “Tell ya what. Since y’all seem like smart guys, I’ll leave this here cable for ya,†he handed the loose end to Ted.“ Go’n get yer new equipment and plug this sucker in along with the rest of them devices and you’ll be good to go!â€â€œI got this!†Ted shouted, before he ran away to the front counter. The tech saw himself out before Ted came back with a wad of cash he took out of one of the front registers. “Ben! Run to Best Buy quick and get the finest router you can afford with this. Bring it back and I’ll get us hooked up and my uncle will be pleased when we have our phones on the internet!â€â€œUm, Ted. You do realize we need new phones that support VoIP too? We can’t just use these old analog ones,†Ben informed him.“Crap! I’ll be right back!†Ted exited again, and returned with another wad of cash. “Get some phones too! Now go!â€Two hours later, Ben returned with the gear. “Good, you’re back!†Ted greeted him in the parking lot. “You go get the phones set up, I’ll take care of the router!â€Ben did as ordered. He went around and disconnected the old phones 1 by 1 and got the new ones ready to connect to the WiFi. As he was installing the last one at the front counter, he noticed the touchscreen register was frozen. He tried using it to no avail, so he did a hard reboot. It came back up but froze again. The other registers exhibited the same behavior. A mother suddenly came from the game room with her crying kid in tow. “This place is terrible! None of these games work right! They don’t do anything when I swipe my card! You’ve ruined my son’s birthday!â€The lady stormed off just as Ben realized that all these problems had to be related to what Ted was doing. He ran to the back room to find Ted sitting there admiring the new gadgets he hooked up. “All set, Benny! Are the phones ready?â€Ben ignored Ted as he saw the network/helium closet lit up like Christmas with constantly blinking lights on every port. The Impale server, normally almost silent, kicked its fans into full gear. The PC they used to administer Impale was frozen solid like the registers. “Ted! What did you do???†Ben questioned, starting to panic.“What? I did like the guy said. Plug the cable in to the new router, then plug in all the other cables.†Ben quickly inspected his work. He started tracing each cable to where it ran, when he made a gruesome discovery. Somewhere in the shuffle, Ted ran not one, but two cables from the router to the switch. This caused a massive broadcast storm that crippled anything connected to the network. Ben quickly removed one of the cables and everything started getting back to normal.Ben tried explaining to Ted what happened but it went in one ear and out the other. “Whatever, Ben. It’s working now. Let’s go play some laser tag!†Ted didn’t seem to care that he temporarily turned Bob’s Family Fun Center in to Ted’s House of Horrors.[Advertisement] Manage IT infrastructure as code across all environments with Puppet. Puppet Enterprise now offers more control and insight, with role-based access control, activity logging and all-new Puppet Apps. Start your free trial today!
In the movie Man of the Year, Robin Williams plays a Jon Stewart-esque comedian who runs for President of the United States. He wins the general election due to a programming glitch in some e-ballot machines deployed nationwide.In Belgium, as Adrien F. can attest, this very nearly happened.The city of Brussels has used electronic voting since 1994. Delacroy Europe implemented the first electronic ballots for the city; the firm developed their e-ballot program in C, which ran on floppy disks and stored votes on plastic cards using magnetic strips. Every year the firm would introduce little tweaks to make their system easier to use, but it was showing its age.On May 25th, 2014, Belgium held elections for many EU and national parliament seats, as well as some local contests. The next day, election officials noticed some irregularities with votes cast in Brussels using Delacroy Europe’s program.About 2000 votes had to be voided, as they contained multiple votes for the same office from different parties (called ‘lists’ in Belgium). It wasn’t enough to sway any one election, but the media had already caught wind of the potential voter fraud. Adrien’s company was hired for an independent code review of Delacroy Europe’s voting program to determine if anything criminal had transpired.First, Adrien ruled out users manually rewriting data to the magnetic strip on the ballot card. It would require a credit card reader, which would have been difficult to smuggle into a polling place, and unlikely to happen on the scale of 2000 ballots or so. He suspected the problem was in the code.He noticed something strange in the UI selection functions, triggered when the user selects a candidate on the viewscreen. Parliamentary ballots were organized by lists that a user picked from. Cand_Check_Selection() determines if a candidate was checked, and if so, whether to select or unselect them (either Cand_Select() or Cand_Unselect()).
Mike had a different perspective on wiring and cable management- because he worked at a factory which made wires and cables. It was the early–90s, and he was in charge of babysitting a couple of VAXes and their massive, 85lb hard drives. It was an easy job: the users knew the system and needed very little support, the VAXes were practically unstoppable, and the backup battery system could keep the entire thing running for over an hour.The computers supported HR and accounting, which meant as the year ticked towards its end, Mike had to prep the system for its heaviest period of use- the year end closing processes. Through the last weeks of December, his users would be rushing to get their reports done and filed so they could take off early and enjoy the holidays.Mike had been through this rodeo before, but Reginald, the plant manager, called him up to his office. There was going to be a wrench in the works this year. Mike sat down in Reginald’s cramped and stuffy office next to Barry, the chief electrician for the plant.“Our factory draws enough power from the main grid that the power company has a substation that’s essentially dedicated to us,†Reginald explained. “But they’ve got a problem with some transformers loaded with PCBs that they want to replace, so they need to shut down that substation for a week while they do the work.â€The factory portion was easy to deal with- mid-December was a period when the assembly line was usually quiet anyway, so the company could just shift production to another facility that had some capacity. But there was no way their front-office could delay their year-end closing processes.“So, to keep the office running, we’ll be bringing in a generator truck,†Reginald said. “And that means we’re going to need to set up a cut-over from the main grid to the generator.â€From the computer-room side, the process was easy, but that didn’t stop Mike from writing up a checklist, taping it to the wall beside his desk and sharing a copy with Barry. Before the generator truck arrived, he’d already tested the process several times, ensuring that he could go from mains power to battery and back to mains power without any problem.The generator truck arrived a week before the changeover. The electricians ignored it for a few days. Just as Mike was starting to get worried about deadlines, he looked out a window and saw a trio of electricians, lead by Barry, starting to connect cables to it. Later that day, when Mike left to go to lunch, he walked past the generator truck, and noticed something odd about the cables- they were clearly single phase power cables.Typical residential power systems are single-phase alternating current- one peak, one trough. This creates “dead†moments in the cycle, where no work is being done. That’s fine for residential use- but industrial systems need three-phase power- three offset AC cycles that, when added together, guarantee current is always flowing.“Hey,†Mike said to one of the electricians loitering near the truck, “you’re planning to run some three-phase cabling, right?â€â€œNope. The factory’s shut down- this thing is just gonna run lights and heating.â€â€œAnd computers,†Mike said. “The hard drives need three-phase power.â€â€œWe’ll have to order some parts,†the electrician said.A few more days ticked by with no three-phase connections, and Mike checked in with the electricians again.“The parts are coming.â€At this point, Reginald came down from his office to the computer room. “Mike, Barry’s telling me you’re being a disruption.â€â€œWhat?â€â€œLook, there’s a chain of command,†Reginald said. “And you can’t tell the electricians how to do their job.â€â€œI’m no-â€â€œFrom now on, if you have any concerns, bring them to me.â€The day of the cut-over, the three-phase cabling finally arrived. Barry and his electricians quickly strung those cables from the generator. Mike wasn’t exactly watching them like a hawk, but he was worried- there was no way they could test the configuration while they were working so hastily. Unlike single-phase power, three-phase power could be out-of-sync, which would wreak havoc on the hard drives. He thought about bringing this up to the electricians, but recalled Reginald’s comments on the chain of command. He went to Reginald instead.“Mike,†Reginald said, shaking his head. “I know you computer guys think you know everything, but you’re not an electrician. This is a factory, Mike, and you’ve got to learn a little about what it’s like to work for a living.â€Now, the electricians and Mike needed to coordinate their efforts, but Reginald strictly enforced the idea of the chain of command. One electrician would power on the generator and announce it, “Generator’s running.†Another electrician would relay this to Barry: “Generator’s running.†Barry would relay that to Reginald. “Generator’s on.†Reginald, finally, would tell Mike.
Regular expressions can create new problems. Like an industrial drill, they’re extremely powerful- and potentially destructive. They’re expensive, they’re cryptic, but can be extremely concise.For example, Jessica is reimplementing some C# code written by another developer. This developer was never interested in being concise, and instead favored being “cleverâ€. For example, this developer had an array of strings, and needed to remove any non-word-characters from each string.A regex-based solution might include something like “[^\w]†which is obviously incomprehensible nonsense that no one could be expected to understand without piles and piles of documentation.Jessica’s co-worker wrote something far more… elegant.
As the last deployment script ran to completion, Michael sat back in his chair and let out a small sigh of relief.He knew nothing could go wrong. After all, he'd rehearsed every step of the process hundreds of times during the last six months. But deploying his projects to production always made him as nervous as a highschooler before a drama club premiere.However, the rollout was nearly complete, and Initech's Hyderabad branch was all set up and ready to enjoy their new, polished and improved inventory management system. All that was left was to log into the application for the last sanity check and celebrate the success with his team.Michael opened the browser, typed in the server address and hit Enter, expecting to see the familiar portal.Instead, a standard, white-and-red ASP.NET error page stared back at him.A few minutes of digging around the Hyderabad servers exposed the problem. While all the local applications were configured to use Windows logins to connect to the database, the overseas branch used simple SQL Server authentication with a constant login and password. After a bit of back and forth, Michael was armed with contact information to Hyderabad's database administrator, and set off to resolve the issue.Hi, it's Michael from Initech Seattle, he typed into his Lync window. Can I get a database username and password for the inventory management application?A few minutes later, the reply arrived. Expecting just the username and password, Michael was ready to say thanks and get back to fixing his problem ... but the DBA had a different idea.Sure, just check the Notepad on the server.You mean a text file? Michael responded, somewhat confused.Yes, it's open now, just check your screen.Michael went through all his open Remote Desktop sessions, but none of them had a single text file open. The only programs running were the ones he'd started himself.I don't see it, can you tell me the filename and the directory? He decided to play along. After all, maybe there was some security-related reason why the DBA couldn't send the credentials over IM.It's in the Notepad, the DBA responded. Just check it.No, it's not! Michael was growing a bit irritated. He took the screenshots of both the database and application servers' desktops and attached them to the message, hoping that would finally convince the DBA he wasn't going crazy.After a long while, the DBA finally wrote back. You're on Remote Desktop. That's different. Can you just use TeamViewer?"Are you serious?" Michael asked out loud, but the will to resolve the issue as soon as possible overcame the urge to chew out the clueless administrator. He downloaded the software, sat through the installation process, then typed in the TeamViewer ID.A connection could not be established."Of course," Michael muttered.A quick call to system administrators confirmed Michael's fears: the company firewall blocked all TeamViewer connections. Gaining access meant submitting an exemption request and letting the bureaucracy take its time to process it. The process usually required several days, and the rollout couldn't wait that long.Facing a dead end, he tried to explain the situation to the DBA.I can't get on TeamViewer. Can you please just tell me the username and password for the SQL Server? It would really save us a lot of time!!He sat back in his chair and waited, eyes glued to the IM window. His hopes weren't high, but maybe he'd at least get an excuse to present to his boss.Instead, the reply came:Username: dba, password: rosebud. Let me know if I can be of any further help.It was all Michael could do not to slam his head against his desk. After careful consideration, he decided to pass on the DBA's kind offer.[Advertisement] BuildMaster is more than just an automation tool: it brings together the people, process, and practices that allow teams to deliver software rapidly, reliably, and responsibly. And it's incredibly easy to get started; download now and use the built-in tutorials and wizards to get your builds and/or deploys automated!
"Hilarity ensued when, during a recent political debate, the subtitles used by the Swedish state television came, not from authorized subtitlers of the debate, but rather the neighboring children's channel," Jonas writes.
The English language contains words with multiple and often contradictory meanings. A dress, for example, is only one of many items you could put on while dressing yourself. Meanwhile, if you want to wear pants instead, you should avoid pantsing yourself, as that would be counter-productive.These shades of meaning come into play frequently in programming. Writing a .NET application to manage school schedules requires some contortions to avoid using the reserved word class, and writing one to hold Dungeons and Dragons character sheets requires you to spell out the attribute Intelligence instead of using the far more common abbreviation int.Dimitris, however, wasn't thinking about the many interesting tidbits to be found in the English language as he went about tracing an error message through the stack his formula engine application had unraveled. Instead, he was thinking about logging. Not the act of felling trees and preparing their corpses for use by humans, but the act of writing messages to a central location so that debugging an application would be easier.Logging has a fascinating etymology, by the way. It originally had to do with a bit of wood that was designed to float upward when a ship sank, making it easier for someone to discover what had befallen the ship by reading its log. In the same manner, Dimitris wanted to discover what had happened to the application—but he got distracted along the way.
Back when we were setting up The Daily WTF: Live, I gave a shout-out to the Pittsburgh tech community group, Code & Supply. They’ve been a great way to network with local developers, dev-opsers, designers, and more, ranging from the seasoned vets to those just cutting their teeth on IT. I’m a huge fan of their events, and I only wish I could make it to more of them.But there’s one event I’m not going to miss, and if you can get to Pittsburgh, you shouldn’t miss it either. Code & Supply is launching their new conference, Abstractions. Abstractions, like Code & Supply, is a cross-techology, multi-skillset event, dedicated to bringing some of the best speakers in a variety of technologies together for one of the best conference lineups I’ve seen.
Being a freelancer is hard. Being a freelancer during the downturn after the Dot-Com bust was even harder. Jorge was in that position, scrambling from small job to small job, fighting to make ends meet, when one of his freelance clients offered him a full-time gig.Carol, the customer, said “Jorge, we’re really short-handed and need help. We’d like you to start on Monday. You know PHP, right?â€Jorge didn’t know PHP, but he knew plenty of other languages. He said yes, crash-coursed over the weekend, and was confident he could learn the rest on the job. When he showed up on Monday, Carol introduced him to Luke- “who will mentor you on our application.â€â€œHey!†Luke grabbed Jorge’s hand, started shaking, and kept at it for far longer than comfortable. “It’s great to have you here, really great, you’re really going to like our code, it’s really really great. We’ve got a lot of great customers, and they’re really really happy with our great software. Do you like encryption? I built our encryption layer. It’s really really great. And I hope you like getting things done, because we’ve got a really really great environment with no obstacles.â€Jorge recovered his hand, wiped it on his pants, and tried to smile to cover the internal panic that was taking over his thought processes. That internal panic got louder and louder as Luke showed him the ropes.They had a few dozen tiny applications, and the code for those applications lived in one place: the production server. Server, singular. There was no dev environment, there was no source control server. Their issue tracking was, “When there’s an issue, a customer will call you, and you’ll fix it.†Luke explained, “I like to work on it while I’m on the phone with them, so I can just edit the code and have them refresh the page right there.â€Jorge nearly quit, but Carol had been a great customer in the past, and he really wanted a steady gig. He ignored his gut, and instead tried to convince himself, “This is an opportunity. I can help them get really up to speed.â€He found an ancient Cobalt RaQ in a closet, with a 366MHz processor (with MMX!) and 64MB of RAM. Jorge hammered on that whenever he had a spare moment, setting it up as a dev environment, a CVS server and Bugzilla. This took weeks, because Jorge didn’t have a lot of spare moments. Luke kept him busy on a “deep dive†into the code.Jorge was largely ignorant of PHP’s details and nuances, but Luke was massively ignorant. Luke’s indentation was so chaotic it could double as a cryptographically secure random number generator. Wherever possible, Luke reinvented wheels. Instead of using a server-side redirect, he instead injected a <script> block into the page to send the browser to a different page. When PHP changed their register_globals behavior for security reasons, Luke didn’t think about why that happened or what that meant. He didn’t even bother to flip the PHP.ini flag which would revert to the old behavior. Instead, he just pasted this block into every PHP file:
Jamie has a co-worker who subscribes to the “malloc is slow†school of thought. Now, for most programs, it’s fine, but Jamie works on a high-performance computing system operating in a massively parallel configuration, so there are portions of their application where that philosophy is completely valid.In this case, however, the code Jamie’s co-worker wrote is in their message handling layer. There’s really no reason to pool buffers there, as the performance gain is practically non-existent based on the frequency of buffer allocation. That doesn’t change Jamie’s co-worker’s opinion though- malloc is slow.
What, again? Michael stared at the Explorer window in disbelief. The free disk space bar was glowing red, and the text underneath reported that his half-terabyte system partition had a measly few gigs left before filling up.When it had first happened, he hadn't thought twice about it. In fact, he'd been rather glad; at least he'd had the motivation to finally discard all the games and software he would never use again. But when the disk space ran out again the next month, and again the month after, he started getting more and more worried. Was he really using that much space, or was something else going on?Curious, he decided to finally investigate the issue. A cursory look at his hard drive with WinDirStat confirmed his suspicions. With over 80 percent of his hard drive space labelled as "unknown", something was definitely amiss. He kept searching, manually scouring through his folders and files, until finally he managed to pinpoint the culprit: an innocuously named "C:\Windows\System32\Config" folder filled with hundreds of thousands of files, taking up 420 gigabytes in size.A quick trip to Google and a bit of playing with Process Monitor revealed the answer to the mystery. As it turned out, every modification to Windows Registry—the oft-derided database of all the Windows and Windows application settings—generated a transaction log file to ensure the data integrity, prevent corruption, and allow rollback of changes. Usually those small 512KB files weren't much of an issue. They got deleted after a clean reboot, and most software only modified the registry during installation or after a configuration change.However, some applications and drivers—among them, Nvidia's 3D service—didn't play nice with the registry, shuffling the values around every few seconds or minutes. That, together with Michael's habit of not turning the computer off too often, resulted in cluttering the disk with more and more files until it filled up completely.The solution, luckily, was rather simple. Michael purged the folder of all but the most recent log files, then uninstalled all the unnecessary bloatware from Nvidia, hoping it was the last thing he'd be deleting for a long while.[Advertisement] Use NuGet or npm? Check out ProGet, the easy-to-use package repository that lets you host and manage your own personal or enterprise-wide NuGet feeds and npm repositories. It's got an impressively-featured free edition, too!
"We spent a good deal of time developing our customer information display software, to make it easy for our users to update the daily menu screen outside our restaurant," Steve M. wrote, "Someone, however, noticed that the price of the Fish Steak Crunch was wrong, and decided to take a more hardware-based approach to doing the update."
Today, we're breaking out something a little different. I put this together more for fun than anything else, and we piloted it around in the Side Bar, along with a few other shares.After some feedback, we're happy to bring this to the front page, and we plan to produce more of videos in this vein as a recurring periodic feature.Sometimes, it feels like getting our work done is an epic struggle, suitable for retelling by the greatest of bards. And you know what? You're absolutely right. IT is an epic quest- and that's why I can't stand the Lord of the Rings. It's too much like work.[Advertisement] Release!is a light card game about software and the people who make it. Play with 2-5 people, or up to 10 with two copies - only $9.95 shipped!
Terrell inherited some database stored procedures. Like all good, Enterprisey stored procedures, it was written in PL/SQL. Unlike most Enterprisey procedures, it had a clear purpose: to clean your dirty inputs.The actual problem: based on user input, the PL/SQL code needed to write a temporary file to the filesystem. Since user input is full of filthy, illicit characters, this procedure needs to clean them up.
Jane took a job at a big financials company. The pay and the benefits were the first draw, but she was really sucked in by the visions of building analytics and juggling billions of dollars with cutting edge data mangling techniques. “Big data†came up in the interview many times, along with “cloudâ€.The first cold blast of reality was when she was given her developer desktop: a Windows XP box with 4GB of RAM and a CPU that could get lapped by the processor in a BlackBerry. “Oh, is this just a dumb terminal I use to connect to your cloud?†Jane asked.“No,†her boss said. “This is your work computer.†As it turned out, Jane had misunderstood the interview- they had asked about “big data†and “cloud†because those were buzzwords that they might be interested in, someday. Today, there were only two applications Jane needed to worry about.Corporate policy dictated that her computer must be shutdown every night. Each day, when Jane came into work, she would start it up. After a few cups of coffee, it would eventually chug to life, at which point she could fire up the two required applications: Outlook and SameTime.Jane wasn’t officially considered “at work†unless her boss saw her logged into SameTime. In fact, as Jane quickly discovered, the rapid path to promotion was to leave yourself logged into SameTime for twelve hours a day. Even if you never committed a single line of code, that was enough to make you a “productivity leaderâ€, like Chad.Chad was the “productivity leader†on their team. He had committed just one, one-line-bug-fix in his entire time at the company, but he was always online. Once or twice a week, Jane’s boss would swing by, “Hey, you should really talk to Chad,†he’d say, “I’ve told him to mentor you, and he’s got exactly what it takes to succeed here.â€Jane didn’t, because sometimes, Jane would try and write software. The emphasis was on try. The first step was to launch Eclipse. The only version she was allowed to use was so ancient that it predated the Jovian naming convention. Waiting for this to start was enough time for Jane to exhaust her phone’s data plan streaming Netflix.Finally, Jane could actually look at some Java code. Running it was a bit more of a challenge- it meant launching a local WebLogic server, connecting with Firefox, and then trying to replicate and fix bugs. Between the ancient hardware, the ancient OS, the ancient Eclipse, a version of WebLogic that was so old that it could be featured on Antiques Roadshow, and code that was intimately tied to the database server, it could take hours to make it through a single edit-compile-debug cycle.It was an uphill battle against processes and attitudes that were frozen in 1983, but each Day, Jane went home, confident that she had made the code better. In a small way. A very small way.One day, Jane’s boss transferred to a different team and vaulted up a pay-grade in the process. Their “productivity leaderâ€, Chad, was sucked into the vacancy in his wake. On his first day, Chad called a meeting.“Now, I know we’re a little behind the times here,†Chad said.Jane nodded like a bobblehead.“And I know that we spend more time sitting and waiting than doing any real work,†he continued. “But I’ve been talking to management, and they’re really enthusiastic about modernization. So be ready for some big changes in the near future, and not to spoil anything- but the word ‘cloud’ is going to feature big in our plans.†After the announcement, Chad asked Jane to stay behind. Once they were alone, he said, “I’ve been meaning to talk to you about the amount of time you’re logged into SameTime…â€That was the last Jane heard about the modernization project until Chad sent out a memo announcing the new “Dev Cloud Machineâ€. “Now,†his memo explained, “pretty much all cloud provider options require us to put our software into their infrastructure, which we don’t want to do. Instead, we’ve built our own ‘private cloud’.â€This so-called “private cloud†was an old desktop machine that was pressed into service as a WebLogic server. Gone was the painful struggle that was their edit-compile-debug cycle, and in its place was a “cloud†process. Jane edited the code locally, didn’t run it locally, and instead checked it into CVS. An automated job (running once every fifteen minutes) pulled the code from CVS, built it, and deployed the resulting WARs onto the “Dev Cloud Machineâ€. Now Jane could connect to the WebLogic server and check her work.The Dev Cloud Server also used the QA database as its backend, an environment which QA, shockingly, used for their own tests. This frequently caused schema mismatches and added to the overall churn.Even if she wanted to, Jane wasn’t allowed to go back to the old process- since the developers no longer “needed†WebLogic, corporate policy was that it was now forbidden. This rule was enforced by a script that deleted WebLogic installs with every bootup. “For consistency,†Chad explained, “we want all of the developers to use the same process, and that process is the Dev Cloud Machine.â€Some time after this policy change, Jane’s SameTime client stopped working. Maybe the WebLogic policy broke a DLL somewhere, maybe a file or the registry got corrupted somehow. Jane had no power to reinstall, so she raised a ticket. It vanished into wherever tickets go to get ignored by the Help Desk, and Jane did her best to focus on getting work done.Every few days, Jane would repeat the same conversation with Chad. He’d call her into his office, and say, “We have a problem with your SameTime logins…â€â€œYes,†Jane said. “I’ve raised a ticket. I can try and get it escalated.â€After a few rounds of this, though, the conversation changed.“I have tried to stress the importance of our company policies,†Chad said, “specifically regarding SameTime. And I have to say, your lack of compliance on this front has become a serious problem. We’re going to have to ask you to clean out your desk…â€Jane didn’t bother to mount a defense, and walked out happier than she’d been since she started.
Steam. AT&T. Marks and Spencer. Bebo. What do they all have in common? One morning, as customer support tickets rolled in at her online retail firm, it became Belle's job to find out.Belle had inherited the codebase, which had originally been made overseas in India. It seemed as solid as any offshored website could be—which is to say, it had a million different quirks and the source code made her want to vomit, but it had been tested until the BA got tired of filing bugs and just decided to put it in prod.So Belle expected it to get basic functionality like ordering a product right. Alas, that assumption was unfounded. While the BA's testing had been, for all intents and purposes, single-threaded, no sooner had the doors been opened to the public than reports came in of users being greeted by the wrong name, and with the wrong list of stored credit cards. Once the Ops guys rolled it back, Belle girded her loins and dove into the code head-first.The first thing she found while tracing the retrieval of user credentials was this gem:
Sven built a PHP-based website on contract then handed it off to his customer, Bob.“You won’t be getting a lot of support calls from me,†Bob said, “because I actually know a thing or two about PHP. I’ll be maintaining this myself.â€Sven smiled, nodded, and moved on to the next contract. Months later, Bob sent him an email. “Hey, sometimes, the submit button isn’t available, and I’d like the submit button to appear all the time, but I can’t figure it out.â€Sven was busy, didn’t reply right away, and wasn’t terribly surprised when his customer pinged him back: “Nevermind, I got it.â€Eventually, though, Bob did find a problem he wasn’t confident enough to solve himself. When Sven had handed it off, the logic to show the submit button looked like this:
It was the mid-nineties and the Iron Curtain in urban Kerblekistan had come crashing down. Everything was in turmoil, and people were trying to make up for all of the years lost behind the locked borders by trying everything with enthusiasm. The WWW was still in its infancy, but that didn't stop the budding entrepreneurs.Enter a young whippersnapper, still in high school. Daddy hooked him up with a buddy of his at a certain state institution. Now don't go imagining secret agencies or ministries-of-defense; we're talking more like parks-and-recreation. Therein was a department that still had a nice chunk of unspent budget. In the sweet tradition of bureaucrats everywhere, they were looking to spend it and hopefully wind up with something to show for it.The kid went to meet the head of the department. He took the bus to a narrow street near the center of the city. The building guards checked him out and let him in. The interior was the expected pre-iron-curtain Kerbleki decor;the ancient elevator, the carpeted dark corridors, the musty offices and portraits of stoic leaders overseeing all.The department head was a nice enough older gentleman. He explained "Look kid, we have to manage a lot of people and resources. We keep it all in these notebooks and ledgers, with hand and pen." He opened up the big iron closet and the kid saw row upon row of paper files. He continued: "We got this spare PC around. Do you think you can do something to put it all in there?"The young boy was sure he could, so the head promised a nice chunk of change for the work.The kid hooked up the 286-PC running MS-DOS and decided to go with Fox Pro. He drew up some menus and UIs. He planned some database files. He spent his summer vacation entering all the data from the files into the computer. He ironed out the bugs and made it work.And work it did. It had search. It had all kinds of nifty tools for stuff they used to have to do by hand. It printed reports to the printer. It did backups on floppy disk. For its day, it was pretty slick.Everyone was ecstatic and the kid got his money. The department showed off the program to everybody.Sure, they still had to keep manually entering the data into paper files (that was the official way after all). But once they also entered it into the PC they could do all kinds of neat stuff with it, in mere seconds.Apparently, Kerblekistan hadn't yet learned how real IT projects turn out...A couple of years later, the kid was now a young man at college. One day Daddy called again, to arrange a meeting with the old department head. He said that there was some more money to be made. In dire need of cash, the kid took a break from girls, booze and pool halls and went back to work.The scenery had changed. The old institution was no longer drab and under the watchful eyes of Kerbleki leaders. It had been westernised and was much nicer.The department head was happy to see the kid. They still used his program every day. The old PC was, amazingly, still running perfectly, in its corner, if under several sedimentary layers of dust.The department head mentioned that they now all had these nicer, faster PC's. They needed to be able to use the program from each of their own PCs, and perhaps add some stuff, like getting reports out as PDF, and sending them over email. He then offered a bit of cash up front, and there would be some nice money in it for success.Now, you're probably smirking and settling down in your armchair to better enjoy this part. You're saying to yourself, I smell a classical Fox Pro "multi-client" monstrosity, built with single-lock files in Novell network shares.But you're not giving the young guy enough credit. Between all the girls and boozing the guy managed to do some reading. He looked over the PC's and the head guys' box was the best and by far the most powerful. He told the boss "We're going need one PC to be the 'master'; it will have to be on for the others to work." Since the boss was the first one into the office in the morning anyway, he agreed.So the young guy got to work. They had Windows 98 on the PC. He slapped installations of Apache and MySQL on there (because adding web servers and the internet always speeds things up). He started designing web pages and relational databases. He wrote some scripts to port data from the Fox Pro files over to MySQL. Sadly, he couldn't find the original sources for the program anywhere, but it would be OK; it's not like Fox Pro translates well to PHP anyway. Besides, the old guy probably knew the procedures by heart.So one day it was finally done, sort of. He felt that it wasn't exactly his best work ever. Any search at all took ages. Maybe he hadn't quite grasped those "index" things yet. He poked at it for a few more days but time was running short.He didn't know if the problem was his inability to make things efficient in MySQL, that the web-stuff was more expensive (chronologically) than he thought, both, or something else. After all, PHP had been around for a few years, so it must be stable and fast, right? Maybe MySQL was too new and there were unknown issues? What performance problem could possibly be caused by web servers?Finally, he got into a bit of a panic. This stuff was cutting into his chicks and booze time and it wasn't getting any better. He went in one morning, slapped it on the boss's PC, showed him around and then excused himself for a rapid exit. He disappeared, didn't return the advance money and left daddy to deal with his old buddy.So they wound up still using the original system on the 286 until the old guy retired a couple of years later. And you'll be happy to know that they managed to spend the budget that year anyway.By a show of hands, who thinks the kid would go on to have a bright future in software management?[Advertisement] Release!is a light card game about software and the people who make it. Play with 2-5 people, or up to 10 with two copies - only $9.95 shipped!
William Heimbinger joins the ranks of developers who come to us to confess their sins. This particular sin was committed when he was but a young child of fifteen years old, which raises more questions than it answers.Young William was writing Perl and building an anti-spam bot for IRC channels. As he wrote code, he wanted to quickly reload the module to test it, but actually learning how to reload modules looked like too much work. William decided to reinvent that wheel, using a hammer he already knew.With a trivial block of Perl code:
Dick was the main man in charge of his homegrown facilities-management system known as Q-Max. His brainchild was utilized across a large office complex to enter and track building maintenance tasks. Whenever a sink was broken, toilet clogged, or a foul-smelling science experiment had to be exterminated from a fridge, Q-Max was there to track and route the incident.While that was its original intent, Dick wound up selling the office managers on expanding its role to include reporting that would help them make budgetary decisions. It helped them determine which maintenance guys deserved a raise and which buildings needed renovations the most. So despite the maintenance department despising Q-Max because it made them do stuff, management loved every bit of it. Little did they know how precarious the system was on the backend.Dick focused on keeping this amazing application running, and let the company's "Disaster Recovery Team"- one guy named Pete- worry about the worst case scenarios. They kept a regular offsite backup of its data so that in case of something catastrophic like a meteor strike, Q-Max would not go the way of the dinosaurs. Their backup system was quite simple, yet had a necessary workaround step - Every night around midnight an Oracle backup was created on the database server. From there, they copied to an offsite tape backup. Due to infrastructure limitations- bandwidth and reliability, mostly- this mirroring process had to run to get the backup to a location the tape robot could get its iron clutches on.Eventually Dick and Q-Max grew even bigger and got a larger budget to spend on infrastructure. Some network upgrades allowed Pete to have a backup system which could copy a backup directly to the tape library, thus eliminating the need for that silly mirroring job. The new system was implemented and taking nightly backups was a breeze.A few years passed as Q-Max continued to have its automated backups taken every single night. One cold winter's eve, an old pipe that happened to run over the office's server room froze and burst. One of the many casualties of the unplanned cold shower was the database server that housed Q-Max. Pete called Dick frantically one night while he was home sipping hot cocoa."DICK, I NEED YOUR HELP! There's water everywhere!" Pete shouted to him. "It's raining in the server room!"Thinking Pete was delusional, Dick calmed him down to get the full story. The loss of the database server and several others was troubling, but at least they still had their trusty offsite backup tapes! "Man, that sucks. I'll come in to help clean up and salvage what we can. In the meantime, put in an urgent request to have the last backup tape delivered first thing in the morning!"Since Q-Max was down and there were no maintenance people to be found, Dick and Pete spent the night with mops and buckets cleaning up the pipe's mess. Around 7 AM, Dick was paged down to the lobby for a delivery. "The tape is here!" he exclaimed with joy, eager to get Q-Max back online.Dick brought the tape back to the now-dry server room and prepared to restore from it on an alternate database server. The tape directory stared back at him blank. "That's odd, there's nothing in here. They must have sent the wrong tape!" Dick put in an angry call to the company that housed their tapes. They checked other tapes that had been used for Q-Max backups only to find all of them were blank.Furious, Dick could think about nothing but lawsuits against the company that screwed up their entire backup system. In the meantime, he dispatched Pete to prove the backup job on their side was working. Pete ducked out for an hour or so. When he returned, he looked like he'd just been diagnosed with some horrible disease."I checked out the backup job and, well, you're not going to like this..." Pete muttered nervously."Ok... what exactly happened?" Dick asked, unsure if he actually wanted the answer."Well, the good news is our backup job is working fine. However... Do you remember long ago when we had that stupid mirror job to copy the local backup to the external tape drive? I kinda, sorta, forgot to disable that. So after our new backup job runs, the old one copies an empty directory over top of it, and the legitimate backup is lost. It's been like that. For years."If there was any remaining water from the pipe bursting, it would have turned to steam as Dick became red hot with anger towards Pete. Dick would have to strangle him later, though. First he had to figure out how to rebuild Q-Max's data from the ground up.[Advertisement] BuildMaster is more than just an automation tool: it brings together the people, process, and practices that allow teams to deliver software rapidly, reliably, and responsibly. And it's incredibly easy to get started; download now and use the built-in tutorials and wizards to get your builds and/or deploys automated!