"The date is in the past and there is no time zone specification," writes Hugo K. "But apart from that, everything in this invitation is clear as...verterem mediocritatem?
Port-au-Prince, I wanna catch a glimpse ...Summer's winding down, and we're inexorably approaching the fall. Did you take a vacation this year, reader? Maybe you went to the beach; or maybe you live on the beach and you went to the mountains instead, as I did as a girl. Wherever you may have gone, odds are it was a tourist destination. Do you ever wonder what they get up to the rest of the year?Alexi grew up in just such a tourist town, a little oceanic getaway that was a sleepy ghost town for most of the year, propped up by the brief yet intense tourist season. Her last year of high school, she tried desperately to find a co-op position, but her options were bleak and limited. Finally, she landed the only job she could: the IT guru for the local community college.At first, it wasn't so bad. She spent much of her time reading books in the office, waiting for the hapless student with wifi troubles or the clueless teacher who needed a password reset. The highlight of her career was the day her senior tech, Aaron, turned off Spanning Tree protocol on a router and then flipped it all back on at once, causing a small fire in the broom closet they were using as a server room.But for the most part, her days were quiet. Almost ... too quiet.Jack was a department head, one who was well known by the IT staff. When he stopped by, Aaron immediately ducked into the broom closet. Alexi frowned briefly, but by the time she turned around, she was ready with a polite expression and her asshole-handling kill-'em-with-kindness tone. Her time in retail had prepared her for such a customer."Can I help you, sir?""Yes, I'm having some trouble with this newfangled Internet classroom," Jack said. "Can you help me?"No cursing, sputtering, or calling her useless? Then why was Aaron hiding?"Of course," Alexi replied. "What seems to be the trouble?""Well, I set up the microphone and camera just like your instructions said, but my students say they can barely hear me. I even turned up the volume, and nothing."Now suspecting this to be the oddest prank ever, Alexi launched into the standard bevy of questions. "What kind of microphone are you using?""I have a broadcast microphone from the telecommunications department, plugged into about 300 feet of cable."That was weird, but not unheard of; there was plenty of old equipment floating around. "All right, and where does the cable plug into?" she asked, expecting an audio interface of some type to be involved."What do you mean?" Jack asked, a polite yet puzzled expression adorning his face."Well, you said there was 300 feet of cable, right? It has to be plugged into something.""I thought it was wireless."Wireless? With that long of a cord? "No. That's why it has 300 feet of cable ..."Sensing that they were both confusing each other more than before, Alexi closed her laptop and asked the gentleman to show her the setup.The classroom Jack was using was a large lecture hall, complete with a chalkboard and podium. There was a desktop machine sitting under the podium, but Jack had elected to use his own laptop on top of the podium instead, with the camera clipped to the hinge. He demonstrated for her that he was speaking loudly enough as he dragged the microphone, entirely untethered, around the stage area.A 300-foot tail of black cable dutifully followed him to and fro, but surely was not capable of conveying sound to his laptop. The crappy built-in microphone on the laptop itself, however, was more successful in picking up his voice. [Advertisement] Infrastructure as Code built from the start with first-class Windows functionality and an intuitive, visual user interface. Download Otter today!
Good intentions are never enough. If they aren't coupled with the wisdom to follow through properly, they can result in a horrible mess. Today’s Anonymous submitter has learned this the hard way:
Old Peter’s company has a legend. It has been passed down through generations of programmers and staff through an oral tradition. Oh, from time to time, someone would be inspired to record the tale for posterity, but inevitably, the hard copy was recycled, the digital copy was lost.It was 1982, and the German tech industry was booming. Old Peter’s company manufactured a line of 8-bit computers that were targeted towards businesses. Their targets were generally larger companies and government organizations- like Frequenzhof Busgesellschaft.Frequenzhof Busgesellschaft - the bus company of Frequenzhof - served a bustling metropolis in the heart of Germany. They had a growing ridership and a growing need to automate their accounting processes. They bought one cabinet-sized 8-bit microcomputer and if they liked it, planned to buy another. With the addition of tape drives and other accessories, the Busgesellschaft was going to be a very valuable client.So when the director of the bus company called support, people jumped to solve their problem. Unfortunately, it was easier said than done:“When we use your computer to run our weekly batch process, all of our radios stop working. We cannot communicate with our drivers! This is unacceptable!â€The technician tried to clarify the problem. “I’m sorry, but… if you run an accounting job, the radios stop working? Our computer doesn’t have anything to do with your radios!â€â€œAnd yet, when we turn on your computer, the radios stop working! We think it must be interference.â€â€œThat… that really can’t be.†A computer, of course, does throw off some electromagnetic fields- anything using electrical current did. But to kill a voice radio network? That seemed implausible.The technician gathered more details, and then escalated. Management didn’t want to lose future sales, and got defensive about their system. It relatively well shielded, and the frequencies it generated- all harmonics of the 1MHz chip running in the system, or of the 50Hz mains power- were nowhere near common voice frequencies.Over the next few months, a series of radio and electronics technicians examined the situation. They tested a computer right as it came off the assembly line, proving that it didn’t radiate any significant EM noise, especially not at the bands the radios used (≈ 26MHz - 27MHz). The company, eager to keep their customer happy, replaced the “defective†computer with a fresh one, confident that this would solve the problem.It didn’t.Frequenzhof Busgesellschaft grew increasingly concerned. This computer was an expensive capital asset, and they couldn’t use it without cutting communications with their drivers- what if there were an accident or an emergency? Fingers were pointed, blame was doled out, and the Busgesellschaft threatened to take their business elsewhere.The computer company begged for one last opportunity to send in a technician, because obviously there was something extremely unusual going on. “This shouldn’t be happening,†they agreed, “but work with us to fix it.†So they sent Fritz out to the customer site.Fritz was an expert in radio systems. Rumor had it that, before he entered the private sector, he had been working in signals intelligence, spying on the Russians. Whether or not there was any truth to the rumor, he was considered one of the best in his field. If he couldn’t solve the problem, no one could solve the problem.When Fritz’s car pulled up to the bus company’s building, he had a suspicion as to what might be wrong. When he entered the computer room, and saw the computer was positioned against an exterior wall, he knew what was wrong. This was, after all, 1982. In Germany. Frequenzhof Busgesellschaft was housed in a late 1960s slab of brutalist concrete. Hidden inside of that concrete was structural rebar. The computer’s tiny EMF resonated with the rebar grid, creating a chain of harmonics that laid static over the radio system, killing communication.Fritz’s solution was as elegant as his diagnosis: relocate the computer to the middle of the room, far enough away from the rebar that it couldn’t couple with it. They followed his instructions, and it worked perfectly- even when they did get around to adding that second computer.[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!
Paulo F was doing a little online banking with one of the largest banks in Brazil. He wanted to buy a pre-paid debit-card. He chose a value from the drop-down, for example R$50,00- fifty Reals. The site promised him a card loaded with R$200,00. It didn’t matter what he chose, the site offered him a completely different value.Curious, he pulled up the element in the inspector.
Comments are rough. I always take the stance that code should always be clear enough to explain what it does, but you’ll may need a comment to explain why it does that. I recently attended a talk by Sean Griffin (maintainer of Rails) who argued that commit messages should accomplish that goal, since they can contain far more content than a code comment, and while code comments and code can drift apart and cease to be accurate, commit messages are always linked to the point-in-time when they were made. Donald Knuth, on the other hand, might argue that code should annotate comments instead of the opposite.Regardless of the method we use, I think most of us would agree that code needs some documentation in the same way it needs tests: it should exist, but we don’t want to have to create it.Stephania found herself in the situation where she was creating the documentation. In this case, I don’t think we have to worry about the comment ceasing to be an accurate description of the code. This comment doesn’t need to be linked to a specific point in time- it tells us everything we need to know about the entire codebase.
Let’s talk about maintainability.Those of you that know me know that in my civillian identity, I work as a SQA professional. QA gets a bum rap sometimes; manual functional testing can be one of the most boring parts of software engineering, but while there’s plenty of button-pushers who will be happy to poke at an application for minimum wage, there’s a lot more to quality than simply functionality. One of the commonly overlooked aspects is maintainability: the ease with which changes can be made to the software system.Now, maintainability can be measured. You can track how long it takes to discover the root cause of an issue, or how long it takes to work a simple enhancement request. You can track the number of groans or “WTFs†per minute in code review. You can track the cylcomatic complexity of the codebase or, if you’re a masochist, the Halstead complexity. But there’s a number of informal, “gut feel†warning signs you can use to tell if your application is maintainable. Here’s a sampling I’ve collected from various programmers in the industry. I like to call it Your code might be unmaintainable if…Your code might be unmaintainable if the programmers give it nicknames like “the monster†or “the barge†or utter the words “there be dragonsâ€Your code might be unmaintainable if you can tell how old a file is by what revision of the coding standards it follows – within 3 seconds of opening the fileYour code might be unmaintainable if requesting a dependency map from the database server chugs for 30 minutes then crashes with an “out of memory†exceptionYour code might be unmaintainable if you’re the most senior dev on the team… six months out of uniYour code might be unmaintainable if you can’t localize the text of dropdowns for a new locale because that would break the existing 400-line if-else chain that lists out every localized string and keys functionality based on itYour code might be unmaintainable if management dictates the design of the codebase – down to the nitty-gritty tactical level. Bonus points if the manager is a non-technical VP who responds to criticism by firing the developer on the spot.Your code might be unmaintainable if half the variable names are in a different language and nobody’s quite sure whichYour code might be unmaintainable if you’re serving 20MB of CSS files on every requestYour code might be unmaintainable if your dependency graph is unreadable when printed on a single sheet of 8.5“ x 11†paper. Or a single sheet of A4. Or a single sheet of A3.Your code might be unmaintainable if your variable naming “convention†is u734, u1234–2, u623, etc… and variables all change names between filesYour code might be unmaintainable if you have a single function webservice with 17 layers of abstraction between the entry point and where the business logic lies. Apparently the developer had never heard of YAGNIYour code might be unmaintainable if you re-order the properties of an object and the code breaksYour code might be unmaintainable if Microsoft Access forms a critical part of your business workflow. Or Microsoft Excel. Bonus points for unreadable Excel macros that fall victim to other traps in this article Your code might be unmaintainable if it includes the line #defined ONE_HUNDRED 100 unironicallyYour code might be unmaintainable if you find the source code! …in a folder marked DEV_BACKUP_2013Your code might be unmaintainable if you can’t find the malfunctioning bit of code because it’s monkeypatched onto a class you control from god knows whereYour code might be unmaintainable if you go to debug a production issue and not only can you not reproduce, the entire functionality isn’t present in the codebase on the development servers.Your code might be unmaintainable if you go to debug a production issue and not only can you not reproduce in dev, you can’t find the functionality even in production. Bonus points if you finally chase down a series of redirects and end up on some server somewhere, named after a flower, that was meant to have been decomissioned years ago. Double bonus points if you’re pretty sure it shells out to a Minecraft server in the process.Your code might be unmaintainable if it’s full of comments that simply read //BUGBUG. Or //TODO (with no further explanation)Your code might be unmaintainable ifthere’s a header at the top of every page served up in production that reads
Let’s talk a little bit about front-end development. Even at its best, it’s terrible- decades of kruft mixed with standards and topped off with a pile of frameworks that do their best to turn this mess into a cohesive whole.Jameson is suffering through this, and his suffering is the special level of front-end suffering known as “Angularâ€. Angular bolts Model-View-Controller semantics on top of HTML/JS/CSS, and its big selling point is that it makes two-way data-binding trivially easy.Under the hood, that two-way data-binding is implemented using a concept of “watchersâ€. Essentially, these abstract out the event handling and allow Angular- or your own custom code- easily detect changes in the various UI widgets. These watchers also implement nice features, like automatically detecting if a form field is “$pristine†or if the form (or any given field) happens to be “$validâ€.So, for example, if you wanted to have a submit button automatically disable itself if the form were untouched or invalid, you might do something like this:
As web developers, we spend a fair amount of time protecting our valuable server resources from the grasping tentacles of Internet ruffians and malfeasants. Occasionally, we're tasked with exposing data endpoints to the public Internet. This is generally a carefully crafted solution of whitelists, authentication, authorization, escaping input, limiting access and other protective measures.But we are not, and cannot be, the domain experts for the system. There is always an inherit tension between our area of expertise, namely software development, and the needs of our business users for their own purposes. Never is this more true than when the problem domain is something that borders on our own area of expertise.Kit was a quantitative analyst; he knew enough Ruby to be dangerous, but nothing of software engineering as a discipline. Nevertheless, his understanding of the problem domain was deep and thorough. He knew what he needed to accomplish, and enough of how to do so that all he required from Karla’s company was server maintenance for his analysis and the accompanying “big data†SQL database. He was spending more time than he wanted to be administrating the machine sitting in his closet. Since his group had an existing relationship with Karla’s company, it made sense to delegate to her team.Karla was tasked with examining the code to ensure it would pose no threat to their other existing clients. The code was typical of new programmers who understand the problem better than the solution: inconsistently spaced, with a coding style that matched no known format, and weak in places—but it would work, and it wasn’t just a rootkit disguised as an app. Karla was about to advise accepting the code when something caught her eye: it was designed to take in POST requests and execute them as dynamic SQL queries.
Let’s say you have a collection of objects which contain geographic points. You want to find a specific item in that collection, and then extract the lat/lon of that item. You might write code like:
If you get the rare luxury to start a new project from scratch, there's something deep down inside you that makes you want to do it right. You pick the right people, equipment and tools so that you have the best chance of success. Unfortunately, sometimes incorrect decisions are innocently made and a technical time bomb is placed in the code.About 20 years ago at Big Money Inc., such a project was started and such a mistake was made. In this case, the mistake revolved around choosing a messaging platform that failed miserably when asked to pump more messages than was intended. The original developers knew not of this otherwise widely-known limitation.Compounding things was the choice of implementation. Usually, when you build a transport layer, you do something like this:
I did a brief contract with Hershey, the candy manufacturer, once. The biggest thing I recall from the experience was that they had bowls full of candy all over the place. You could just grab them by the handful.I bring this up, because Brenda worked for a pharmaceutical company, and I can only assume that there are bowls full of random drugs scattered around, and someone has been chowing down on them by the handful. That’s the most logical explanation for the following code:
Imagine you’re a financial institution. You’ve built an application that processes financial transactions, and there are a number of flags that need to be set as constants to determine application behavior.You might choose to write code like this:
It was Brian’s first day at AutoDetective, a website for comparing listed car prices vs. blue book values. His work inbox was overflowing with style guides, best practices, and notes from the dozen or so other developers he would be working with. His interviewer, Douglas, had mentioned that the site ran on a substantial chunk of legacy code, but Brian had experience with plenty of old code.He spent most of the day digging through the source, getting a feel for the in-house development style. It didn’t take long before he noticed how … off the code was.It wasn’t just legacy code. It was obtuse legacy code.Just Don’t Touch ItDouglas came to debrief Brian at the end of the day. Brian explained how he spent the afternoon going through the codebase, looking for a project to get his hands wet. “There’s a lot of inefficient code,†he said. “I figured I’d fix something small.†He pointed to a bit of code:
I took my first official programming class circa 1997, and that year was notable, only because it was the last years that class was taught using Turbo Pascal. In future years, it was taught in C++. For the teacher, this was quite the transition. To help her make the transition, at the end of the course, she spent a few days teaching us basic C++, so she’d be more ready for the following class, and we got a little bonus education.As far as I know, future runs of the class went just fine. I bring this up, because Frank had some co-workers who needed to make the exact same transition, from Turbo Pascal to C++. They may have done it a bit less gracefully. When reviewing some of the C++ they wrote, Frank spotted lots of code like:
In this world, there are those with common sense, and there are managers. In the world of high finance, there are only those with power and those without it. Those who have power make decisions - regardless of their familiarity with the relevant subject matter, or their ability to prioritize things involved in the decision. Those who don't have power (aka: us) live with the aftermath.James T. joined a major financial company. Because they have over $1B in revenue a year, he was under the impression that these folks knew what they were doing. They paid very lucrative salaries. They all seemed intelligent. They talked a good game about best practices and doing things right. They hit all the right buzzwords during the interview.What James didn't realize is that they were power brokers who used words without understanding what they actually meant.We do Modular Development. Translation, each person works in a vacuum to build their own little modular piece of the system. There is no need to talk of interfaces because management doesn't know there's a need for different pieces of the application to communicate with each other. It just has to work. (Magic happens here).We design our programs so that they lend themselves to code reuse. Translation, find some piece of code that is close to what you need, make whatever changes are necessary and cut-n-paste it into the new program.We discuss different approaches and the Best Idea Wins. Translation, the boss has the best idea because he has the most experience, so we do it his way.We build Frameworks. Translation, a framework is just an application to perform a certain task. It does not need to be generic because it only needs to do one or two things, so we just hard-wire everything.OK, so programming application-specific code might not be the antithesis of framework development, but it's close enough. When trying explain the value and difference of framework code to application code his boss literally asked Why would anyone ever need that?As it turned out, most of their "developers" were really engineers and traders. Like most businesses they're ingrained into their current paradigms. Like some engineers, they're very resistant to doing things differently.So James is building his little single-purpose reusable module and has some questions about the specifics of what it's supposed to do. In response, his management advises him that the details are unknown at that point, but that he should forge ahead, and they'll figure out what it's supposed to do after he delivers it and they see if it's useful to the end users in production!Forget measure twice, cut once; these folks threw away the tape measure and grabbed a power saw, leaving mountains of scrap lumber all over the place. Then they wonder why it takes so long to get anything useful delivered. [Advertisement] Incrementally adopt DevOps best practices with BuildMaster, ProGet and Otter, creating a robust, secure, scalable, and reliable DevOps toolchain.
Today, programmers, let us celebrate all the varied and wonderful facets of code commenting: an art that too few of our brethren bother with, and even fewer master. Those who do stand to leave their mark on untold generations to come!There are the comments that make us laugh out loud, as Hopsas illustrates:
In lieu of a traditional WTF, I want to use today’s post to talk about the real WTF, or at least the source of all the WTFs we get to write about: our readers.We’ve got great writers here, and every time I hit “publish†on one of their articles, I’m happy with what’s about to go out to the world. They do a great job building funny, entertaining narratives that highlight some of the unique challenges of working in IT. We get great support from our sponsors, who fund the site and keep it running.None of that would matter, though, without the raw materials: the submissions that we get from our readers. This site wouldn’t be possible without you. We love reading all of the submissions we get; even if we can’t turn them into a story, we read them all.No matter how creative or inventive our writers are, we could never create a character like Paula Bean, or come up with a solution like the ITAPPMONROBOT. We love our readers, and we’re happy with the years of support and each of submissions that we get.And we want more of your submissions. There’s a lovely little Submit Your WTF button on the side of the page. If you’ve been in this industry for more than five minutes, I know you’ve got a story that deserves to be told, and we here at TheDailyWTF want to hear about it. Submit early, submit often. You can submit completely anonymously, and we’re always happy to change details to help keep your anonymity (there are a few stories in our archives that I submitted anonymously, not that you’d ever know). Or, slap your name on there and gain whatever degree of Internet fame- or infamy- you’re looking for.So, thank you. Without our readers, without their submissions, we wouldn’t have much to do here. And don’t worry, we still have a WTF for you today. This comes from Molly, who’s inherited some filtering code.
Modern object-oriented languages tend to support the concept of “reflectionâ€. Reflection lets you inspect an object and find out its methods and invoke them dynamically. If you’re building extensible frameworks where you’re handling objects where their type might not be known until runtime, it can be very useful. On the other hand, if you’re using a strongly typed language and find yourself in this situation frequently… you’re probably doing something wrong.For that reason, when Adam encounters calls to method.invoke() in Java programs, he gets suspicious. So, when he saw this:
SuperFast Performance Monitoring Systems was an ordinary, average production monitoring company, promising to keep an eye on web traffic and alert customers if they needed to scale up their cloud hardware to match incoming demand. Their core product was simple, straightforward, and solid, doing what it claimed to do without incident ... but it wasn't sexy. Enter Wile E. Coyote, Supergenius Programmer, hereafter called Will for short.Will didn't seem to be a bad programmer, at first. He was a little slower than he promised, but his task was a complex one: he was to generate multi-variable graphs of the performance of the apps, something your ordinary front-end programmer wasn't necessarily versed in. With a little help, he got the visualizations running. They were sleek, sexy, and downright spectacular, and they wowed the pants off the Marketing folks.The feature shipped, Will was given a certificate and a hat to reward him for going above and beyond, and sales went through the roof. Everyone was happy.Except ...It didn't start out terrible, not really. Of course, they dogfooded their own software, so they kept a close eye on the performance of the graph feature, but it was above and beyond the specs, so people gradually began ignoring that corner of the monitor.A month or so later, however, it wasn't spectacular anymore. And another month after that, it was looking sub-optimal. Sluggish, even. Nothing too bad, nothing that would piss off users—quite—but something to be concerned about."Not to worry, not to worry. It's probably just the disk I/O. I'll just optimize the caching algorithm a bit, we'll be back in tip-top shape." Will's excuse sounded plausble enough, and he dove right into it. And sure enough, the speed bounced back ... a little.Two weeks later, the performance gains were gone. There was obviously a problem, and it was only getting worse.Will didn't look quite as confident this time, but he dove into the project with only a little less gusto than before. He drove out to the datacenter to test network connections, he switched to a more highly optimized image generation library, he added more RAM to the database. Each change added just a bit more performance ... which was lost again the next week, or the week after that.Will wasn't getting any shiny certificates now. He was getting phone calls from department heads and emergency strategy meetings. He took to hiding in the breakroom with his laptop so people couldn't find him to ask for status updates. He lost weight. His hair went frequently unbrushed. All he did now was seek out this performance issue as the meter crept further and further into the "red zone". There was no getting around it: the feature was slow.Marketing started drafting up new sexy features to sell product, and gave them to someone other than Will. He was a pariah, accursed, unable to escape the burden of his past.Still, he perservered. It was SQL, he argued. The overhead from relational tables was eating up their performance, they needed to move to Mongo yesterday.Nobody was having it. Their other report visualization tools were working fine on SQL Server. What made his fancy graphic so different?Will became a shadow of his former self, always sulking in the corner during status meetings while mumbling about Cassandra. Finally, he cracked, and left the company for greener pastures. Nobody threw him a going-away party.A couple weeks after his departure, a coworker named Brad decided to take a look into the code himself. He was working on Marketing's newest idea, and wanted to learn from the "supergenius" who'd built the previous toy.There was a ton of filtering logic in the code. Concerned, Brad took a look at the DAO's query to get the user's information, the very first query in the series of operations that led from historic data to dynamic image:
"So, do I enter a number 0 to 65,535 or −32,768 to 32,767? What if my experience wasn't an integer? This is a really technical question for applying at a restaurant," writes Brennan.
Objects left in the garage or the attic tend to multiply. If you don’t clean them regularly, you find mysterious and inexplicable things have bred like rabbits. “Why is there a bag of marbles in this box, and when did I ever buy an ugly Christmas sweater?â€Without regular refactoring, the same thing can happen to your code-base. Michal is finally taking a look at a bit of code that hasn’t been touched since 2001. The original developer has left the company, there’s no documentation, and the SVN history has long since been discarded.This leaves Michal with many questions. For example- why did the original developer pepper the code with dozens of calls to System.exit(0)? While that’s one way to end a Java program, it’s not the sort of thing you tend to scatter through the code-base like rice at a wedding. Even worse, though, the calls looked like this:
Jake eagerly stepped into his new job, grateful for more experience and new challenges, craving to learn new software stacks and see what his new company had to teach him about the world of software.They told him he’d be working on some websites, dealing with JavaScript, Node.js, JSON, and the like. It sounded pretty reasonable for web development, except for the non-technical interviewer’s comment that it was all “built on top of Subversion†which he assumed was a simple misunderstanding.Then he was thrust into a project using the company’s custom “JSON-based Domain Specific Languageâ€, or JDSL. His boss told him to check out a copy of the project he’d be assigned to, and spend a week or two getting familiar with it. “Just ask anyone for help if you have questions, but you shouldn’t have any trouble judging from your experience.â€So Jake began an SVN checkout…and long story short it took two days to complete. When he asked about it, his coworker Scott told him, “Oh that’s normal. Just play Solitaire or something until it finishes.â€Two days later he started poking around. He started with a seemingly-innocuous file called “customers.json†and stared in confusion at its contents:
Reader Bernie submits for our approval this wonderful C# log base 2 implementation. He says: “We can distinguish two halves in that code. It looks like it was originally written for an unsigned 16-bit int, and later on extended for signed 32-bit integers.â€This code reminds me of the change-sorting machine I have in my closet, which sorts change based on weight. That thing has no error handling if you try to sort, say, a huge boulder through it; it'd just fall apart. At least here, we have the assurance that the universe's biggest numbers all have a log base 2 of 31.
The year was 2006. Nelly Furtado was getting promiscuous, the Winter Olympics were in Italy, and Domino was an application developer for Rocketware, a company that produced multimedia applications. Back then, applications were still commonly distributed on CD-ROMs: small round disks of plastic that contained grooves that could be read by a specialized laser and interpreted as data. This was handy in a period when only 30% of Americans had broadband Internet.Rocketware had done some software for a government agency, which of course had been bundled with a support contract for updates, paid in advance. Maintenance for this application fell into Domino's lap, and he was soon asked to do a small update.Unfortunately, the software had been written by an infamous pair of numbskulls. Jessie and James had both been fired over a year previously for sheer incompetence, but they'd worked on this project together, meaning it was a ball of spaghetti held together by twine. Or at least, it probably was. Problem number one on Domino's plate: finding the source code.The application wasn't in any of the source code repositories; Jessie and James hadn't "believed in" version control. They would've been forced to use it during their tenure, but James had also done network support, and therefore had had access to the bare repositories when he'd been fired. Domino suspected that, in retaliation for being forced to use source control, James had deleted his projects before being escorted from the building.Thankfully, the pair had lacked access to the backup facility. Domino took the latest backup, added a new database, and implemented the fix: 5 hours of work, after about 3 hours of combing through backups to find the right version. Done and dusted. Right?Wrong. The agency quickly complained of features missing, of old bugs re-introduced. Clearly that wasn't the version that'd been burned onto the CD and mailed to them, but the source code for that version was nowhere to be found.Domino's boss, Giovanni, asked him to just go ahead and re-implement the missing features, see if he couldn't get things working to the agency's liking.Now, this application wasn't any old application. The source code consisted of about 10k lines of Lingo code, entirely undocumented of course, and another 10k lines of ActionScript 1.0. There were 20 files, hundreds of frames and clips, a handful of data conversion tools written in Pascal, an Access database, a V12 database, and even some Excel spreadsheets. It was the Wild West: a little of everything, held together with duct tape and prayers. Still, Giovanni insisted that Domino clean up this mess as best he could:
When you want to store data in Amazon’s S3 cloud-based storage, you have to assign that data a key. In practice, this looks and behaves like a filename, but the underlying APIs treat it like a key/value store, where the value can be a large data object.S3 is flexible and cost-effective enough that Melinda’s company decided to use it for logging HTTP requests to their application. These requests often contained large data files for upload, and those files might need to be referenced in the future, so a persistent and reliable storage was important.Each of these incoming HTTP requests had a request_id field, so a naive implementation of logging would be to write the body of the request to an S3 key following a pattern like requests/c418b58b-164d-4e1f-970b-ed00dea855b6. For a number of reasons, however, clients might send multiple requests using the same request_id. Since a logging system that overwrites old logs would be pretty terrible, they decided that each log file also needed an ID, so they could write them out with keys like requests/c418b58b-164d-4e1f-970b-ed00dea855b6/${x}, where ${x} was the ID of the log file.The developer responsible for implementing this decided that ${x} should be an auto-incremented number. This presented a problem, though: how on earth could they keep that index in sync across all of their API nodes?
Larry worked in the IT department of a medium-sized financial company. Bright and early on what should have been a promising day, the phone rang. Larry cursed the caller ID for informing him that Graham was on the line. The resident old man of the office and bane of IT, he frequently disregarded sound advice and policy to satisfy his own whims.Powering past the foreboding that'd settled over him, Larry picked up the phone and forced out a greeting through teeth that were already set on edge. "Good morning, IT services. How may I help you?""Yeah. I need help with my computer." Graham skipped decorum to get to the heart of the matter. "It won't turn on."The computers the accountants used were old, but still in good shape. Larry hoped he'd be able to deal with this over the phone. "OK. Let's walk through some basic troubleshooting—""No!" Graham cut him off. "Someone's gotta come over here! I can't afford to be dead in the water with month-end coming up!"Larry stifled a groan. "Let me log the ticket in our system, and I'll be right over."He hung up, sparing himself another useless rant, and filed the ticket. That done, he left his cube to head for the accountants' corner. The heat from their ancient boxes ratcheted the temperature several degrees higher. Half a dozen whirring fans worked overtime, but only pushed hot air around in a futile exercise."Where the hell were you?" Graham reclined in his swivel-chair, greeting Larry with a scowl. "It doesn't take that long to walk over here."Larry tugged at his collar, ignoring the cheerful welcome. "Let's go through some basic troubleshooting, OK? I'm sure you already did a lot of this before you called—" Yeah, right, he thought to himself "—but I just wanna be thorough here. First, let's make sure it's plugged in."Graham didn't budge an inch in his chair, his expression unimpressed.Larry verified the computer was plugged in. The monitor powered on obediently, but the box remained dormant. Switching outlets didn't help."When did this happen?" Larry asked next. "Did it just shut down while you were in the middle of something, or did you shut it off yesterday and can't start it up now?""It was fine yesterday," Graham replied. "It won't start up today."Larry dug into more specific details, none of which helped with the matter at hand. "My guess is that it's some kind of hardware problem," he concluded with a sigh. "I'll probably have to take your machine to look into it further."Graham bolted upright in his chair. "Unacceptable! I need this fixed now!"In his peripherals, Larry noticed that Graham had taken to twirling something through his fingers. He glanced over for a better look, then gaped. Was that ... a screwdriver?Larry's viscera clenched up. Dreading the answer, he asked, "What'd you need that screwdriver for?"Graham glanced at the tool in his hand, then shrugged. "The sound the computer was making was bothering me, so I took out the source.""Oh, for ..." Larry stifled himself, then grabbed the screwdriver. Upon opening the box, he confirmed the fan was missing; a quick search determined its new home to be the trash can in the corner of Graham's cube. In the process of the fanectomy, Graham had also managed to unplug several wires and destroy the motherboard.Aware that it probably wouldn't stick, Larry nonetheless delivered a remarkably polite, profanity-free explanation about the risks of opening computers, and why one should never remove fans. Before returning to his own desk, he asked all of Graham's cube-neighbors to kindly warn him if they ever noticed a tool in their coworker's hands again. [Advertisement] Infrastructure as Code built from the start with first-class Windows functionality and an intuitive, visual user interface. Download Otter today!
How about those NoSQL databases, huh? There’s nothing more trendy than a NoSQL database, and while they lack many of the features that make a traditional RDBMS desirable (like, um… guaranteeing writes?) , they compensate by being more scalable and easier to integrate into an application.Chuck D’s company made a big deal out of migrating their data to a more “modernâ€, “JSON-based†solution. Chuck wasn’t involved in that project, but after the result went live, he got roped in to diagnose a problem: the migration of data from the old to the new database created duplicate records. Many duplicates. So he took a look at the migration script, and found piles of code that looked like this:
Leslie, head of IT at BlueBox, knew there was trouble when one of her underlings called her at 3AM. “The shared server’s down,†she said. “Disk failure. Accounting can’t issue invoices, design can’t get to its prototypes, and the CEO just lost his PowerPoint for next week’s conference speech.â€BlueBox, like many companies, kept many important documents on a shared server. It also held personal directories for every employee, and many (like the CEO) used it to store personal files. That data, totaling 100 GB, was backed up to a remote server every 24 hours. “Okay, swap out the disk and restore it.â€â€œI can’t find the backup,†the underling replied.Leslie groaned, then rolled out of bed, booted her laptop, and RDPed into the remote server. The blood drained from her face: while there were backups of every other server that BlueBox need to operate, the shared server’s was missing.Bracing for the headache she would face at the office, Leslie made a call to a data recovery specialist. Later that morning, while the shared docs were being salvaged from the failed disk, Leslie prepped for the postmortem.The ConsultantThe remote server held 8 1TB HDDs in RAID 1+0, formatted with ZFS. With that robust configuration, it probably wasn’t be a hardware issue that caused the backup to disappear. It clearly had to be something wrong with the file system.Naturally, a ZFS consultant was hired.“I just don’t see how it’s possible for a 100GB file to ‘disappear.’†The consultant addressed Leslie and the rest of IT sat in the conference room. He gestured the air quotes. “ZFS uses copy-on-write transactions. While a file is getting rewritten, the old file data remains on-disk until the operation is completed. If there were a hardware failure during that time, the file-system would fall back to the old file data. It wouldn’t ‘disappear.’â€â€œWe’re paying you a lot of money,†Leslie said. “Why don’t you see for yourself.â€A laptop was brought with an open connection to the server. The consultant grimaced as he opened the DOS command prompt, muttering something about Bash, then ran several commands to check the integrity of the file-system. As he worked, his mouth went agape, cheeks twitching. “No, it’s not possible… This is a fresh file. Are you sure the file wasn’t, well … deleted?â€Leslie sighed. “Thank you for your time. Security will show you out.â€Just Saving SpaceAfter spending thousands on a dead-end, Leslie decided to start with the basics, interviewing every member of IT about the day in question. After grilling several employees on her team, she called in Heather, who oversaw their backup solution.“There’s a scheduled task to perform the backup on the shared server,†Heather began. “I have it timed for 3AM.â€â€œThat’s close to when the backup failed. Does the scheduled task run a batch script?â€â€œYeah.†Heather opened the script on her laptop and showed her.Leslie’s stomach dropped. “Line 12 … you delete the old backup before creating a new one?â€â€œI always delete the last backup before I do the next backup,†Heather said. “It helps save space and keeps the hardware optimized. All the other servers are set up that way.â€It was all Leslie could do to keep herself from firing Heather on the spot.The SolutionLeslie watched as Heather rewrote every backup batch script line-by-line. 7 previous backups would be kept, with new ones written every 24 hours, and old backups would be deleted only after the most recent backup was written. The consultant was still paid, despite offering little help. His invoice led to upper management reconsidering ZFS for their remote backup solution.A few days afterwards, Leslie got an unexpected visitor. The CEO of BlueBox, effuse with praise, thanked her for finding his PowerPoint before the conference began. He offered a substantial bonus.Leslie handed the CEO a business card. It had the contact info for the data recovery specialist who salvaged the PowerPoint file from the failed disk. “You ought to give him one, too,†Leslie said, “since he saved your presentation.†[Advertisement] Onsite, remote, bare-metal or cloud – create, configure and orchestrate 1,000s of servers, all from the same dashboard while continually monitoring for drift and allowing for instantaneous remediation. Download Otter today!
Consulting. It's as much art as science. You apply for a job to create/change some system, and need to bid an amount that not only covers your time, but leaves a little something extra in your pocket. Of course, we all know that requirements are never absolute, or even well thought out. As such, you need to build some extra cost into your bid to take this into account. Build in too much and you will be overpriced and not get the job. Build in too little and you will be under-priced and get the job at what will inevitably become a loss.Writing a contract that restricts the work to a specific list of features is nearly impossible because nobody ever thinks through what they want in advance (think about your last outsourced project). Given that, you need to be skilled at letting the client know that you will be nice and implement tiny things that are not in the spec for free, but anything that is outside the contract spec and takes any real time will be at an added cost (the art of saying no: why yes, we can add that feature, but it will take x weeks at a cost of y).During the start of January 2016, Sean was contracted by a local news organization to modify their news website for them. Their website was built using WordPress. Believing that it was just a simple addition of pages, footers, headers, and theme, he took the job, and agreed upon a deadline of January 31 with a very small fixed fee of $30 (yes, t-h-i-r-t-y dollars for several weeks of work). Sean felt relieved that he was not going to have to build a full-blown news website because he already had another project in his start-up on queue.My lawn-guy gets more than that for ten minutes of mowing.Sean was given the credentials to the web host they were using and started to work. Upon opening the website, it took more than 10 seconds for it to fully load. He felt sad but endured the pain because he believed the task was just "easy." In the first two weeks, doing the job felt good. He optimized the WordPress website a bit, added the necessary pages and footers, and added SEO. Everything was fine and Sean was ready to show them the website.A week later, the client called Sean and completely changed the requirements. They asked him to add a custom look on two of the pages, change the font, and add an interactive news map. That was not in the originally agreed-upon site design! Sean vigorously protested, but the client just said (non-verbatim), "Aww. Sean, you're a very good programmer! You can do it right? It can't be that hard."When people tell you how easy your job is, the best thing to do is to make them do it for themselves.Sean was not in a position to increase the cost of the job to cover the extra work, and could not do anything about it at that time. A week passed and he finished the custom look. He even had to pull in the source code from the website to his laptop because the loading was so slow that he could no longer bear it. What was left to be done was the interactive news map.Now I don't know anything about web design but that sounds like something that's significantly more complicated than you can do for $30, let alone on top of the other work.The interactive news map they requested was such that when the user clicked on a given province on a map, news for that province would be displayed on the bottom of the map. Sean did not know how he would implement that feature. It was certainly not in the cards given the original fee.Sean thought that they should receive service that was comparable to the fee they paid. He told to them that the interactive news map couldn't be done because of "technical stuff." They bought the excuse.What he gave them was a website that looked done but actually had a lot of visual bugs. What they asked him to do was to modify their website by just adding a couple of pages, a theme, and add the necessary information, and that's what he gave them.Before and during the start of work, Sean learned that he was the second programmer they contracted to develop their website. The first programmer they contracted was a friend of his who was also asked to modify the site and add an interactive news map. He bailed out immediately because of the discrepancy between the pay and the amount of work.To this day, their news website is still up and running, albeit really slowly. However, it seems that they haven't added their articles yet.It's like when you see job postings where they want an expert with ten years of experience in each of web design, Java, C++, C# and .NET, system administration and as a DBA in each of Sybase, Oracle, DB2 and SQL-Server, and their pay range goes up to $60/hour. And they wonder why they can't fill the job. [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!
One day, James’s boss asked him to take a look at a ticket regarding the “Cash Card Lookup†package, which had an issue. James had no idea what that was, so he asked.“I don’t know,†his boss replied. “I just know the call center uses it. You’ll need to talk to them.â€James picked up the ticket and called the customer.“Oh, yes,†the customer replied. “We need this to get customer details based on their cash-card number. I think Timmy made it.â€â€œTimmy? Who’s Timmy?â€â€œHe’s our tech guy. He sets up our computers, helps us when we have issues, that stuff. Let me transfer you to him…â€Timmy had indeed made it, because he “did a little programmingâ€. There was also the issue of internal billing- like many large companies, each business unit needed to charge other business units for their time. The software development team billed at $95/hr, but Timmy was already on salary to the customer service department.He had grabbed a spare box, slapped Linux and MySQL on it, then whipped up a simple Perl script that served up a web page for doing the lookup.Data entry, on the other hand, was a different problem all together. Knowing Remy’s Law of Requirements Gathering, Timmy gave them an Excel spreadsheet with a VBA macro that could connect to the MySQL database to do bulk uploads of data. "When James pulled up the code, he saw every horror he expected from Perl and VBA. When he saw the database, it got even worse. The data itself had a number of problems, the first one being that Timmy never set up a test environment, and instead, tested in production. And didn’t clean up the test records. Even worse, though, the VBA macro tried to sanitize the inputs, and handle escaping characters like the single quote, but it did it wrong, leading to records like:last_namefirst_nameOReilly KevinAs you might imagine, the database only had one table, and it was this code that really got James’s attention.
Emily didn't expect much excitement at her day job. She worked for a health insurance company, so most of her projects were pretty routine enterprise-level things: hooking up the accounting software to the billing software, managing mailing lists, the usual stuff. When she was given a minor role on a large project, she never dreamed it would be any different than the usual fare. She was unprepared for what she received: Project Aegon.Insurance companies reach out to people a lot: direct mail advertisements, mail to their subscribers, telemarketing phone calls, and the like. Before Project Aegon, each of the contact lists was housed in a different little kingdom. Subscriber information in the North, direct-marketing addresses in the Riverlands, and so on. Project Aegon was meant to unify these all into a single central repository, and that meant conquering several different application datastores and mastering them all in one location, establishing a new primary source of intel in King's Landing.Emily's part in this large debacle was Dorne, the email provider: think Mailchimp, but more enterprise. Dorne was an important target for the migration, as it controlled most of the company's outgoing email. However, it was a difficult target to attack strategically, as it used guerilla warfare in the form of a terrible API to protect its information. The API used XML, but it wasn't SOAP, preventing Emily from using a simple library to interface with it. It was far from REST as well; there was no rhyme or reason to the endpoint design, as it had grown "organically" over the years.For a time, Emily thought she was making headway when she discovered the existence of an API for querying the SQL directly. Surely that would be an easier method of obtaining up-to-date subscriber information? Then she saw the example query. She didn't make it any further than the following before bailing:
We all know that truth is a flexible thing, that strict binaries of true and false are not enough.Dana’s co-worker knew this, and so that co-worker didn’t use any pidling boolean values, no enums. They could do one better.Now, we’re missing a lot of the code, but the pieces Dana shared with us are enough to get the picture…
"Doctor, it hurts whenever I do this!" This classic ran back in 2013 -- RemyDuring Ulrich’s days as an undergraduate, he landed a part-time gig at a nuclear power plant. It was an anxious time to be on board at the nuke plant- the late 1990s. The dreaded Y2K loomed over all of their aging systems. One decimal point in the wrong spot at midnight on January 1st, 2000 and… well, nothing good would come of it.Ulrich’s job for the big conversion was more benign though. He needed to update the simple graphics on the monitoring program the nuclear technicians used to keep tabs on the reactor. The very basic macro language generated Commodore 64-quality graphics; it displayed the position of the control rods, neutron flux, water temperatures & pressure, turbine and generator stats, and how many three-eyed fish were caught in the neighboring lake. All of this was then shown on 10 massive CRT monitors mounted around the main control room.Ulrich worked diligently to get his screens prepared, and the day came for him to roll out the changes. They didn’t have a “test control roomâ€, so the demo needed to be run live. He invited the engineers to gather ’round the monitors to see his spectacular new designs. When the program booted and Ulrich went to pull up the control rod screen, all 10 monitors went as black as the cloak on a member of the Night’s Watch. As the engineers chuckled, Ulrich turned bright red and ran back to the server room to see what happened. It didn’t take him long to realize that whatever he screwed up caused the entire mainframe to go down.Thus began a two-week battle to troubleshoot the mainframe issue, during which time the computer monitoring was completely unavailable. This caused the nuclear technicians to have to leave their air conditioned control room so they could use primitive analog monitoring tools from the 1970’s to check on the reactor. Every time Ulrich walked past one of them, he could sense them glaring and thinking “There’s that little pipsqueak that killed the monitors!â€The tools Ulrich had to debug the program weren’t merely useless to him. They went beyond uselessness into outright opposition. The custom macro-language had no debugger or real documentation. The mainframe was purchased from the Czech Republic and one would have to know Czech in order to read the error logs. He was able to locate a sticker on top of the server with the phone number of the vendor. He was able to reach one of their ‘experts’ named Miklos, who asked him for the serial number of the product. Ulrich provided it but the expert retorted “That is not full number! This is too short. What you need help with? Toaster? Coffee maker?â€Confused, Ulrich replied, “Ummm, a mainframe?†Had the nuclear plant bought their server from some sort of Czech Coffee, Toaster, and Mainframe Corp.? Miklos said “Oh no, Miklos can not help you. I give you number for Blazej. He does help with mainframe.†Blazej was an engineer at another nuclear power plant in the Czech Republic, who also had the same mainframe. Ulrich called there, not expecting much.Through a series of conversations with Blazej, Ulrich was able to finally narrow down the problem to the presence of circles in the screen outputs. Apparently drawing fancy circles was far too much for the monitoring program to handle. He removed all the circles from his screens, uploaded the changes to the mainframe and finally the engineers could see the reactor statistics on the bright, beautiful monitors; without any circles. The result was ugly, boxy, and barely readable, but it worked. Ulrich breathed a sigh of relief then decided to call Czech Coffee, Toaster, and Mainframe Corp. back to notify them of the horrible bug in their program.Ulrich once again got connected to his buddy Miklos. “Hi Miklos, this is Ulrich. I called a while back concerning our power plant monitoring program crashing the mainframe. You’ll be glad to know that Blazej and I were able to determine the problem. It all had to do with circles being drawn on the screen. I know it sounds silly, but that causes the whole mainframe to come down.â€Miklos seemed to be offended by such an accusation. “You do a circle and server come down? You want Miklos to fix this? You stupid? If you know circle cause trouble, then DO NOT USE CIRCLE!†Miklos abruptly hung up. Ulrich shrugged it off since his job was done. He eventually finished his undergrad program before Y2K and moved on from the nuclear power plant. When New Years 2000 rolled around, he made sure he was far, far away at a ski resort just in case anyone else slipped a circle into the graphics and the plant melted down as a result.Nuclear Reactor image from the public domain [Advertisement] Otter, ProGet, BuildMaster – robust, powerful, scalable, and reliable additions to your existing DevOps toolchain.
This particularly bad example of regular expressions and client side validation was originally published in 2009. I thought Australia was supposed to be upside down, not bass ackwards. - Remy"The company I work for sells vacation packages for Australia," writes Nathan, "and for whatever reason, they're marketed under different two different brands — redacted-travel.com.au and redacted-travel.com — depending on whether you live Down Under or somewhere else in the world."Nathan continues, "one of the requirements for the international website (redacted-travel.com) is to disallow people from within Australia and New Zealand to make bookings. But the way this is done from the front end... well, it's a real gem."
This article originally ran in 2014, and it's the rare case of a happy ending. They DO exist! -- RemyAikh was the new hire on the local bank’s data warehousing/business intelligence team. His manager threw him right into the hurricane: a project with the neediest, whiniest and most demanding business unit. Said business hated their unreliable batch process for archiving reports, and the manual slog of connect > find/create directory > upload > pray. They hoped the DW team would code to the rescue.Eager to impress, Aikh sketched out a simple, automated client/server solution. The business quickly approved his design and estimates. To mentor and keep the project on-track, Aikh’s manager assigned Dean, a more senior developer, to help out.
Today is the 4th of July, which is a holiday with historical significance in the US. Twenty years ago, Jeff Goldblum and the Fresh Prince defeated an alien invasion using a PowerBook and a hastily written computer virus. It’s such a big holiday, they’ve just released a mediocre and forgettable film about it.This scene has spawned many a flamewar. Anyone with a vague idea of how computers work may note that hardware architectures are complicated, and even with access to alien hardware and software, designing a virus capable of disabling all of the alien spacecraft in one fell swoop strains credulity. Some people point to a deleted scene which explains that computers are based on alien technology captured in Roswell, and thus, our computers are already compatible. Others mutter something about, “It’s just a movie, what the hell is wrong with you?†while rolling their eyes.Here at TDWTF, we know that no competently run IT organization is going to let its entire shielding system across an entire battlefleet be vulnerable to a single virus delivered to a single node on the network. We know the real story must be quite the WTF.Lisa graduated from the Aldebaran Institute of Technology in 1996, expecting the “rising tide†of the late 90s tech boom to carry her to wealth and riches. She went to a college job fair shortly before graduating, handed out some resumes, and tried to resist senioritis long enough to make it to the end of the semester.This is LisaA week later, she got a comm from a recruiter. “Hey, Lisa, I just saw your resume, and have I got an opportunity for you! An established invasion fleet with a proven track record of subjugating alien planets needs some junior engineers to provide tier–1 technical support. This is a great entry-level job, with 100% travel, which is such an amazing opportunity for a young Sectoid such as yourself- you really get to experience the whole galaxy. Now, the salary might not look like much, but you’ll also receive equity in the invasion, and you are absolutely going to make out extremely well- they’ve identified a planetary sector that’s completely unexploited.â€Lisa was young, inexperienced, and the recruiter was very good at his job. She went in for an interview, chatted with Al (the head of IT), met a few of the other techs, and even got to meet one of the fighter pilots, who cut quite the dashing figure. Star struck and seduced by the promises of fantastic wealth (once they handle that minor, piddling problem of conquering the Earth and blowing up a few easily recognizable landmarks), Lisa signed on and boarded the mothership just a few days after graduation.Spoilers: that dashing pilot doesn’t look as dashing by the end of the movieOn her first day, Lisa was invited into Al’s office for some orientation. The office was little more than a closet, just off the main hangar bay. It was made even more cramped by Al’s insistence on covering the walls with the various certifications he’d earned in his career- A+, Net+, and in the fanciest frame, MCSE.“Now, I know you’re a college-educated wunderkind,†Al said, “but I got here through old-fashioned knowhow. The first and most important thing you need to understand is that we deliver IT services, and we’re not happy unless our users are happy.â€A few days into the voyage to Earth, one of their users wasn’t happy- the Hangar Operations Officer was having issues with spacemail. Lisa went to his workstation to try and help.“My broodmate sent me pictures of our newly hatched clutch, but Outlook won’t let me open the attachement!â€It was instantly obvious to Lisa what was going on, since the file was “familyphotos.jpeg.zip.exeâ€. “This is almost certainly not pictures of your clutch, but is probably a virus.â€â€œThat’s absurd,†the hangar operations officer said, his tentacles waving angrily. “My mate wouldn’t send me a virus!â€â€œWell, it might not have come from your mate,†Lisa explained. “See, spacemail lets you claim the email comes from any-â€â€œLook, are you going to let me get these photos or not?â€â€œI can’t,†Lisa said. “They’re not photos.â€â€œWe’ll see about that!†the officer said. He commed Al directly. “I want you to know that your new tech is refusing to let me see my pictures.â€â€œThey’re quarantined as a virus,†Lisa said.“Oh, well,†Al said, “we can fix that. Let me just disable the quarantine.â€â€œWhat?†Lisa cried.“Remember,†Al warned her over the comm, “we’re not happy unless our users are happy.â€Cringing, Lisa watched the hangar operations officer open the virus. Fortunately, or perhaps unfortunately, it did open a window with a picture in it- a lewd picture of a Muton’s posterior- and flashed a message that “you have been pranked!â€. For a finale, it inverted the mouse pointer.“I told you,†Lisa said, “that probably wasn’t from your mate. You’re just lucky it was a piece of joke software and not a dangerous virus.†A quick reboot set the mouse back to normal, and Lisa made sure the dangerous email was deleted before she handed the mouse back to the Ops Officer. “Please don’t open strange attachments in the future,†she warned.The next few weeks were mostly routine support, until that dashing pilot- Lieutenant Bradford- submitted a ticket about his fighter craft. It was stuck in a reboot loop- the main computer would turn on, print out an error message, and then reboot. Obviously, this needed to be fixed before the invasion started. Lisa fired up Gopher to try and find out what was going on.As it turned out, this was a bug in the v8.0.2 firmware running on the entire fleet of fighters. When the system clock’s battery started running low and the clock started to drift, the firmware had a bug that would trap it in this reboot cycle. This particular bug had been fixed in v8.0.5, which was released six years prior. The manufacturer had actually cut support for the entire v8.x.x series and was up to v11.x.x.You could fix it by replacing the battery and resetting the BIOS, which Lisa did, but she approached Al about these dangerously out of date software versions. “There’s been a LOT of bugfixes that our ships don’t have.â€Al shook his head and laughed at Lisa. “See, you don’t get it. These software vendors, they just want to sell you new things. Trust me, the last time we tried to do an upgrade to the latest patches, they sent a tech onsite who kept trying to get us to buy new versions of all of their software. It’s a scam, Lisa, just a scam. Our users are happy, so why should we spend money with the vendor when we can just keep using firmware that works perfectly fine?â€Two days before they arrived at Earth, a new ticket came in, this time from the invasion fleet’s Supreme Commander. It was a bit of a cluttered mess of a ticket, in that it didn’t represent one single issue, but instead the Supreme Commander wanted to vent about all of the problems she had with IT. Lisa interpreted the ticket as a series of bullet points:
Regular expressions are a powerful tool for validating inputs, but what if your input is itself a regular expression? Is there a regular expression that can validate regular expressions?Well, yes, if your regular expression engine supports recursion: /^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$/.Today’s Representative Line (which is more than a single line) comes from Ryan S, who found an implementation of isValidRegex which is perhaps a bit more elegant:
When asked to choose among several possible tools to do a job, qualified technical people look at the manual and test to see if the tool actually does what they need it to do. Is it reasonably configurable? Must it have root privilege to launch, or can it be installed as your application login id? Smarter folks will do a load test to see if it will scale beyond a handful of records and work with the expected volumes of data. And all of this will be combined to form an informed opinion as to whether the tool is appropriate for the task at hand.High Level Managers have a different approach. They are too busy to deal with mere technical details.After numerous outages at a large multi-national bank, a high level manager decided that they needed to do something to stabilize things, so he put together numerous charts to compare the various software packages that were available to automate solving their problems. There were slide shows, spreadsheets and myriad documents detailing how one tool was better than the others and that it would solve all of their problems.The only problem with his analysis was that it was not based upon actual features or testing, but on the sales brochures and promises made by the salesman.Not to let the facts get in the way of managing a problem, several suitcases of money were provisioned and turned over to the salesman in exchange for a full all-bells-and-whistles site license for the new tool. The new tool was brought in house and ran through a few simple test cases. Then it went live in production. Then it hit the fan.Bob was brought in to see why their applications were crashing in spite of their shiny new be-all end-all tool.Queries that should have completed in milliseconds took several minutes to complete. The tool was sucking up 80GB of memory just to launch in basic mode. And we're not even going to go into how the tool mistook email addresses for websites it had to crawl.The manager, realizing that the salesman had lied to him, had to deal with the spilled milk, and opted to forge ahead at all costs.Bob created a web app that alleviated the worst problems by pre-massaging input and query results. He could not push away a gnawing suspicion that he was merely repairing damage rather than adding actual value to the company.After about a year of this, the manager committed to drastic changes in the work processes. When Bob learned about this, he asked them if they'd even done rough, back-of-napkin estimations of the expected manual workload in the changed process; after all, they already had a wealth of data from the past year and estimations surely could be done given the new process was specified in substantial detail. After all, they had gotten burned on their 'analysis' of the product they bought to solve all the instability. He was met with blank stares.The new process was put in place and the amount of manual work tripled overnight.Bob put in a lot of overtime trying to fight all manner of fires. Still, he was only partially successful, as the task of developing an app to totally fix the situation for a huge and complex package on top of a pretty complex work process was out of the question for a single developer.After many, many months of this ongoing failure, the manager who started all of this had analysed the cause of the all of problems. The entire team was called in by the manager to a meeting. As could be expected, it was announced that the productivity was deemed too low while the risk and cost were too high, and so the entire team; analysts, lower level managers and Bob were laid off.The manager was promoted for recognizing the cause of the failures and was given more responsibility to oversee other projects in addition to his own. [Advertisement] Scale your release pipelines, creating secure, reliable, reusable deployments with one click. Download and learn more today!
Let’s say you needed to find the maximum and minimum values for a field in a SQL database. If you’re like most people, you might write a query like SELECT MAX(someval), MIN(someval) FROM table.That’s the least you could do. That’s the bare minimum. And do you want to be the kind of person who does the bare minimum? Kevin L’s co-worker doesn’t. He’s a Brian.
In every company, there is a tendency to value code that was invented in-house over code that was, to put it bluntly, Not Invented Here. There is an eternal struggle to find balance between the convenience of pre-packaged code that is not fully vetted and the trustworthiness of code they themselves have written. As is typical in these tales, Jon's company got it wrong.When Jon was asked what logging solution he was planning to implement in his company's .NET-based application, he gave the right answer: log4net.No sooner had he spoken, however, than the room grew quiet. The locusts could be heard clearly from outside the window, screaming their disgust at the idea. Not-here! Not-here! Not-here!"Or ... maybe I could throw something together?" he suggested timidly."Splendid!" replied Jon's boss, Ned, heartily. "You can use my logger as a head start. Rolled it by hand back in my university days. It's much better than that log4net crap. Did you realize that piece of dung uses reflection? Reflection! Something as simple as a logger doesn't need anything as expensive as that."And Ned was right, in a way. His logger didn't use reflection; it hardcoded the method name into each log call made. But that's not all. In a bid to save on "expensive" new features Ned barely understood, the logger was held to a strict 2.0 code level, despite the project using the 4.5 framework. And in a flash of coursework-inspired brillance, he had implemented his own custom stack to store incoming logs—a move that entirely undid any cost savings achieved by avoiding reflection three times over.But Jon tried. He rewrote the stack structure, desperate to reclaim some of the cycles. He documented methods that confused him, hoping to leave the codebase better than he found it. And he tried and tried to make it work consistently.The days turned into weeks, and the project deadlines began to slip. Ned grew sterner and sterner with every depressing status meeting. "That logger can't possibly be responsible for all this! It was fine when I wrote it!""But sir, if we just pull it and use Log4Net—" Jon began."I don't want to hear another word about Log4net! Just get the project done!"And so it was done—weeks behind schedule, and with a tendency to drop log files in the event of a crash, just when you'd want them the most. Jon privately swore he'd never touch the logger again; come hell or high water, he'd use log4net next time and be done with it.It was three months later before he had another chance. Another desktop app needed to be built where logs would be mission-critical in the event of a disaster."Sir, about the logging—" Jon piped up."I know what you're going to say, and I won't hear of it," Ned cut him off."But sir, if you'll just listen a moment—""I said no and that's final: there's no way you'll be using that POS logger you put into production last time! No, you're going to have to write something custom from scratch, no getting around it!"Jon put in his custom, from scratch, two weeks' notice that very day. [Advertisement] Onsite, remote, bare-metal or cloud – create, configure and orchestrate 1,000s of servers, all from the same dashboard while continually monitoring for drift and allowing for instantaneous remediation. Download Otter today!