📜 ⬆️ ⬇️

Curious perversions from the IT world - 2

The Daily WTF website has been collecting funny, wild and / or sad stories from the IT world for 14 years. I translated several stories that seemed interesting to me. All company names have been changed. The first part is here .

The first story. Spite grandmother ...


[ Original ]

Clive compared the contents of his bank account with the daily rate offered to him, as many freelancers do, and decided that in such conditions any work would suit him. One vacancy seemed almost bearable: the insurance company needed a new software package that would allow it to comply with some legal requirements. In addition, the management needed someone to teach developers modern tools and techniques ... for example, version control code.

Clive brilliantly passed the interview and a week later went to work. In the mailbox he was already waiting for a letter from someone named Brandon. It read: "We must meet."

Brandon was sitting in his office, stuck to the ergonomic chair of the mid-90s and seemed to be one with him. He looked up from the monitor and looked at Clive. "You work for me."

In short phrases of monosyllabic words, Brandon explained that no one who made the decision on hiring would meet with Clive. Clive is responsible only to him.

“Well, okay ... So, when I was hired, they said that you need to configure Subversion. Should I start with this? ”Asked Clive.

"Not".

“You can find out why? Do you prefer something else? Want to discuss options? ”

"Not".

Clive waited. Brandon was in no hurry to unwrap his mind. He just looked at Clive. He continued to look and look.

Clive slowly returned to his cubicle and began by studying the codebase. It was on a shared network share, and version control was of the form “file.pl.old”, “file.pl.old.old”. It turned out that the code is written in Perl, and that it is not readable even by Perl standards. He grew up in a culture “if it is parsed, it means it will start”, did not contain comments and absolutely had no tests. Clive's only ally was Lee, another hired specialist, who also reported to Brandon, but he had a fortnight in analyzing the code. When Clive got stuck somewhere, he looked out from behind the wall of his cubicle and asked Lee.

Like a glacier descending a mountain, Clive slowly made her way through the code. Week after week, he gradually developed an understanding. And then a letter came from Brandon: "We must meet."

“You are hindering the development team,” he said.

"What?"

“You and Lee are too noisy. This is an office, not a club of interests. ”

"This is madness. I just asked him questions about work! Do you want us to arrange a meeting in the conference room just to ask questions? ”

"Yes".

Brandon paused and started staring at Clive again. He watched and watched ... Clive took the hint and ran to his cubicle.

The requirements were confusing and constantly changing, which was not surprising. The only user who knew them exactly was Carol, which was also not surprising. Clive sent her a letter with questions, and tried to do his job. He waited a few days for her answer, then he had new questions, and he sent new letters.

In a week he sent about a dozen letters, but did not receive a single answer. He sent new to learn new information. During this time, more questions have accumulated. Clive tried to call her, but ran across a full voicemail. He tried to schedule a meeting, but Carol never accepted his invitations.

And then a letter came from Brandon: "We must meet."

“Carol says you're pushing her,” Brandon said.

"What?"

“You send letters to her, even after she answers questions. She said that you called a meeting, but he did not appear at him. It needs to stop.

"This is madness. She never answered, I can show my inbox and prove it. ”

"Carol does not use e-mail," Brandon explained. “Internet prints her emails, and she is responsible for the internal mail office. She is very busy. You have a technical task. Do it, and stop bothering her. ”

"What? Do you want me to implement the solution without even talking to a user who knows all the requirements? ”

Brandon looked at him. He kept looking and ...

With the help of Lee over the next few months, Clive managed to make serious progress. He learned to cope with the absurd date format (dates were counted as the number of days from April 3, 1974, and also as the number of months from the previous Monday, and also as the number of weeks from the next Sunday). They coped with the fact that no one can update Firefox to versions above 3, and with the fact that it was impossible to work overtime, because all servers were shut down at exactly 18.00. Carol did not keep in touch, Brandon just looked at them, and the rest of the staff treated them like lepers.

A few weeks before the completion of their six-month contract, Clive studied the contents of the company's network drive in search of a spreadsheet with sample data. He found a table with the name of the recruitment company that hired him and hoped that it was something useful. In a sense, it was so.

The spreadsheet was a report telling how much the recruiting company gets for Clive and Lee. The sums were so shameless that they would make even a used car dealer blush. The document included change tracking and co-editing, so Clive could read the comments made by different users.

From the level of senior management received comments in the spirit of "It does not matter how much you have to spend." Accountants warned: “If we go for it, we will have no money left for bonuses at the end of the year!”

Brandon left his own note: “Our business is too specific. They will not cope. Waste of money. They will not cope .

Everything fell into place. Brandon did not predict, but made a promise . And he will perform it - over the next few weeks, Clive and Lee will not be able to do what was originally promised.

Soon he received a letter from his recruiter. “This company still needs additional staff. Do you want to extend the contract for another six months? ”

Taught by Brandon, Clive replied shortly: “No.”

The second story. Drop all the impossible ...


[ Original ]

Drop all the impossible ...
... and what remains will be XML, no matter how incredible.


William Hogarth, "Absurd Perspective"

Developers have many weaknesses, and one of them is this: they do not like to say that something cannot be done. That is why when Glenn M's client, TelCo, asked if her task would be truly impossible, instead of apologizing and shook his head decisively, he answered: “Well, theoretically ...”

As a result, Glenn wrote this:

 <value> <mult> <op> <mult> <op> <add> <op> <div> <op> <bitwise_and> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>8388607</op> </bitwise_and> </op> <op>8388608</op> </div> </op> <op>1</op> </add> </op> <op> <left_shift> <op>1</op> <op> <sub> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>23</op> </right_shift> </op> <op>255</op> </bitwise_and> </op> <op>127</op> </sub> </op> </left_shift> </op> </mult> </op> <op> <if> <op> <eq> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>31</op> </right_shift> </op> <op>1</op> </bitwise_and> </op> <op>1</op> </eq> </op> <op>-1</op> <op>1</op> </if> </op> </mult> </value> 

This is an XML DDF, Data-Definition File for a system monitoring application that was supported by Glenn. You see, the system can read data from any device that supports Modbus / TCP or SNMP protocols, if it has a DDF file that specifies data points and how to display them. The DDF contains the arithmetic, boolean, regular, and conditional operators shown above, so that the system knows how to clear the data.

XML logic? Yes, that is WTF itself. But the real WTF is that the code shown above does . The company monitored a device that displayed temperature values ​​(this is fairly easy to solve), but it represented them as a string of eight characters indicating the hexadecimal value of the 32-bit floating point number in IEEE – 754 format. The task, which Glenn should have recognized immediately as impossible, was to transform this insane value into a numerical form. In DDF, despite all its expressive power, there was no type conversion operator.

Therefore, Glenn wrote the above DDF, which did the following:


The next time Glenn decided to stick with the same tactic, he recently heard that TelCo was modifying the device so that it would display the temperature in integer.

The third story. Team A (nti)


[ Original ]

In the 1980s, a television series titled "Team A" was filmed. It was a misman, able to deceive anyone. In order to get what he needed, he gave as if true promises (it seems like marketing?) There was also a tough guy on the team who could intimidate anyone to get his way. He knew how to reach the goal, but deep down he was a good guy. The team had a leader who could always come up with a plan and save the situation. And there was one little insane (but in a good way) guy who you can always rely on in battle. From time to time an assistant who was involved in intervention and reconnaissance appeared in the team. This group of guys worked as a well-oiled mechanism. They could not fail! They were a team!


Team “A” never wrote documentation on project management methodology. It is not surprising that all of them are wanted criminals.

Alex got a job in a new project to replace an outdated and unsupported system. Naturally, it was stated that the company “seeks to do everything right!” The project is fully funded. The team will have the necessary equipment and personnel necessary to perform the work. There is full support for six levels of leadership plus all users. Alex was optimistic.

The first thing the company did was spend several months reconciling between all of these innumerable levels of management, end users, support people, veterans who supported the project (so they explained the problems that had plagued the old system) and the three architects of the new system. The new architecture was thoroughly documented, approved and signed by all of the above. A critical review was even conducted by an independent third-party regulatory audit agency, so that the controlling state bodies were sure that the correct approach was chosen.

The eight-page document described in detail the recommendations for code development (such as: code formatting parameters, naming conventions, unit tests, code coverage, and other similar aspects important to the team). The document has been reviewed and everyone who works on the project should follow it.

The beginning of the project was good.

The first task was to hire developers for the team. For this, the company was looking for (very far) offshore specialists in order to find the cheapest talent available. After all, everyone can be taught, right? A team of 11 developers had a total of 13 years of experience, and a lead with five years of experience was hired to manage them.

The next important decision was the choice of the database used. The company actively used three. Since all the databases were stored on centralized servers, one of them was immediately excluded: the database server equipment was too powerful to handle the expected load within a reasonable period of time. Of the remaining two, one was actively used by all team members. They knew its syntax, strangeness and limitations. The third was set up incorrectly, and therefore had a reputation as unreliable. However, it was also a corporate standard. Despite objections from the team, a third one was chosen.

The project management decided that the QA department could be brought in later.

Finally, it is time to implement the detailed structure. The lead of the offshore team decided that it was possible to save a lot of time by creating designs on the fly, in accordance with the requests. Of course, the architects were against it, but the project manager agreed.

The architects began to build the controller engine and other fundamental principles of the project. The junior team, which was supposed to create a queue of multiple remote systems for data entry, merging, filtering and preprocessing, decided that it would do better than what is written in the architectural documentation, and began to develop its own way of performing operations. Without telling either the architects or the management.

It is time to check the first sprint, and during the review of the code a lot of various “red flags” were discovered. Lead Junior said that the architectural documentation was just a recommendation, which he ignored in order to please the desires of the developers. Naturally, this caused a reaction like "what are you, really there ...?" And a bunch of letters up the guide chain. But the project manager and management above seemed not interested: they said that the juniors should not have done this, but they trusted them.

Work continued. The architects continued to point out flaws and implementation defects incompatible with the requirements. All proposals were ignored, because the lead of the offshore team said: “Google is cultivating an atmosphere of innovation and creativity; we also need to do that! ”He was reminded that Google is (mostly) a“ think tank ”, and the leader works with a strictly standardized project in a strictly regulated industry. That architecture, which was approved by more than forty managers, is not an option or recommendation, but a requirement. That this is not a kindergarten, where creativity is encouraged - you need to adhere to an approved plan! We are not talking about how to correctly write a subroutine or encapsulate an object, but about that threading is used incorrectly and not in those places, but database access and interprocess communication will not be scalable. What you need not to create multiple processes, but simply to use threads. That it is not necessary to use files as semaphores simply because they did this at school. And the list will still be long.

But none of this was noticed. Juna developers complained that when creating the architecture they did not take into account their opinions, so they will continue to ignore it (with the blessing of their lead). The project manager continued to say that he was aware of the problems, but did not do anything with them. Problems were reported up the chain, but no one did anything. After all, everyone in the team has an equal right to vote.

In the real world, if a student thinks that the teacher is mistaken, they do not change his grade. The intern cuts where the surgeon shows him, and not the other way round. The general does not discuss strategy with privates. If you are joining a union, and as a novice you demand the same powers as the union leaders, then you will rest next to Jimmy Hoff [the American trade union leader who suddenly disappeared under mysterious circumstances] . Experience speaks with exclamation marks. Inexperience speaks with question marks.

But not in this "team".

Juniors continued to do what seemed the best to them, ignoring all requests from the architects. Most of their code was written and copied several times, because the junas could not take everything into account from the first time. More experienced developers would know what to count on. After 8 months, the project suffered such damage that the most complex requirements simply could not be achieved, and in the development project that started from scratch, it was necessary to roll back a month ago.

Around this time, management gave in to requests and asked several commercial users to write commercial level tests (for example, a spreadsheet that can be sent to JBehave for JUnit testing). The developers provided code and some simple examples in spreadsheets. The architects said they need to hire QA employees because users rarely know how to work with borderline cases, accuracy problems, etc. But the money could not be spent. After six months of work, commercial users stated that all tests for the entire application (i.e., all the technical tasks) are ready. Just by looking at it, it was possible to understand that they did not take into account boundary cases, empty examples, problems of accuracy, and most other aspects that usually require tests. In fact, they put all the records that could theoretically (from their point of view) exist in one huge pass-fail test. Of course, when something changes and inevitably fails, there is no way of knowing where it happened.

Finally, it went so far that architects built a physical wall between parts of an application with a setup code (written by an offshore team) and with a main engine (created by architects). Immediately after the main engine began to grind data, each variable in the system was reset to a state table in the database, so that in case of unavoidable problems, input data was displayed and offshore developers could send a request for correction. At least this way they could isolate the main engine from the garbage.

The ministry saved a lot of money through the use of cheap labor, the lack of a QA department and the use of a “politically expedient” database. Of course, all the code in the setup section written by the offshore team was terrible. Most of it was difficult to learn, support, debug and improve.

The product has not yet been launched, and users already complain about diagnosing and fixing problems for too long (this was one of the main reasons for rewriting the old project). And if rewriting did not solve the main task of rewriting, then probably something went wrong ...

The fourth story. Pass through null pointer


[ Original ]

Maxine had problems with displaying a website in a browser with the addition of NoScript. This is not surprising - some browsers cannot work correctly with NoScript, but it was surprising that the browser threw Java exceptions. When you enable JavaScript, the page with the error disappears, but how is that? Lack of javascript leads to java exceptions !?

She opened the page code and found that the server is expecting the “innerCHK” parameter; probably some kind of session or security token that should be passed in the URL request string. If not, then the server returns a page with an error displaying java.lang.NullPointerException. Fortunately, the front-end developers came up with the following great JavaScript snippet to solve the problem:

  // Error check
 if (document.body.innerHTML.indexOf ('java.lang' + '. NullPointerException')! = -1) {   
    if (document.location.href.indexOf ('innerCHK =') == -1) {    
         document.location.href = document.location.href + "& innerCHK =" + Math.random () * 10000;
    }
 }
 // End of check 

But this is only the tip of the iceberg; the page was overloaded with antipatterns, reinvented wheels, spare wheels and lowered wheels. All this was kept on the tape . To feel the style of some strange string transformations and the developers' favorite anti-pattern — closing the scripts just to open a new one in the next line, let's take a look at how Dojo is imported. Please note that the Dojo cookie library is being imported.

  <script type = "text / javascript">
     if (typeof dojo == "undefined") {        
         document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dojo/dojo.js' + '"> </ scr' + 'ipt>');
     }
     if (typeof dijit == "undefined") {      
         document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dijit/dijit.js' + '"> </ scr' + 'ipt>');
     }      
  </ script>     
  <script type = "text / javascript">     
  dojo.require ("dijit.form.Button");
  dojo.require ("dojo.cookie");
  //dojo.require("dijit.form.DropDownButton ");
  dojo.require ("dijit.Dialog");
  dojo.require ("dijit.form.TextBox");
  dojo.require ("dijit.form.CheckBox");
  dojo.require ("dijit.form.ComboBox");
  </ script>

Some, if not all, references to CSS are handled in this way. I found in the source at least three (identical) entries. I repeat Dojo.cookie is imported.

  <script name = "DojoEnable_script" language = "JavaScript"> if (typeof dojo == "undefined") {
     dojo.require ("dojo.cookie");
     dojo.require ("dojo.parser");
     djConfig = {parseOnLoad: false, isDebug: false};
     document.write ("<script src = 'http: //www.*****************.com: 80 / ps / PA_WPF / factory / dojo / dojo / dojo.js '> </ "+" script> ");
     document.write ("<link rel = 'stylesheet' type = 'text / css' href =' http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dojo/resources/dojo.css' /> ");
     document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra.css "/> ');
     document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra_rtl.css "/> ');
     dojo.addOnLoad (function () {if (! document.body.className) document.body.className = 'tundra'});
 }


One day someone said that if you want to solve a problem with regular expressions, then you have two problems. I think, saying “two”, he underestimated the situation.

  var locale = 'en'.replace (/ _ /,' - '). replace (/ iw /,' he '). toLowerCase ();

Children, remember, always use thoughtful names for the constants! Magic numbers are bad. Except 2008, he is fine.

  if (typeof (MONTHS_IN_YEAR) == 'undefined')
 {
     MONTHS_IN_YEAR = 12;
 }

 if (typeof (isDisableDate) == 'undefined') {
     var isDisableDate = function (date, year, month, iday)
     {
         if (date.getFullYear () == 2008)
         {
             return true;
         }
         return false;
     }
 };

No poorly implemented application will be complete without its poorly implemented DateTime library. There must be some scientific law about this.

  var month = new Array (12);
 month [0] = "1";
 month [1] = "2";
 month [2] = "3";
 month [3] = "4";
 month [4] = "5";
 month [5] = "6";
 month [6] = "7";
 month [7] = "8";
 month [8] = "9";
 month [9] = "10";
 month [10] = "11";
 month [11] = "12"; 

 if (typeof (MONVALUE) == 'undefined')
 {
     MONVALUE = new Array
     ("Jan",
      "Feb",
      "Mar",
      "Apr",
      "May"
      "Jun",
      "Jul",
      "Aug",
      "Sep",
      "Oct",
      "Nov",
      "Dec");
 }

 // function converts date from str to num
 function Month2Num (month)
 {
     if (month == "JAN") return "01"; if (month == "FEB") return "02"; if (month == "MAR") return "03"; if (month == "APR" ) return "04"; if (month == "MAY") return "05";
     if (month == "JUN") return "06"; if (month == "JUL") return "07"; if (month == "AUG") return "08"; if (month == "SEP" ) return "09"; if (month == "OCT") return "10";
     if (month == "NOV") return "11"; if (month == "DEC") return "12";
 }

The code contains many (often duplicated) CSS styles, for example, this is not a very blue style.

  div.wpfThemeBlueBackgroundPanelTable  
 { 
     background: # F6F9FC; 
     padding: 10px; 
 } 
 / * ---- Blue Panel ---- * / 
 table.wpfThemeBlueBackgroundPanelTable  
 { 
     background: # F6F9FC; 
     padding: 10px; 
 } 

Next come two identical arrays, of which only one is used.

  var arr_location_001 = new Array ();
 var arr_location_002 = new Array ();

 arr_location_001 ['AU'] = {value: 'AU', title: 'australia', text: 'Australia'};
 arr_location_002 ['0'] = {value: 'AU', title: 'australia', text: 'Australia'};

 arr_location_001 ['CA'] = {value: 'CA', title: 'canada', text: 'Canada'};
 arr_location_002 ['1'] = {value: 'CA', title: 'canada', text: 'Canada'};

 arr_location_001 ['CN'] = {value: 'CN', title: 'china', text: 'China'};
 arr_location_002 ['2'] = {value: 'CN', title: 'china', text: 'China'};

 arr_location_001 ['FR'] = {value: 'FR', title: 'france', text: 'France'};
 arr_location_002 ['3'] = {value: 'FR', title: 'france', text: 'France'};

 arr_location_001 ['HK'] = {value: 'HK', title: 'hong_kong', text: 'Hong Kong'};
 arr_location_002 ['4'] = {value: 'HK', title: 'hong_kong', text: 'Hong Kong'};

 / * fragment of multiple lines of similar code * /

Here is another beautiful little script that managed to avoid a lot, including the own tag of the script! The developer receives bonus points if he wrote it in a straight-jacket, pinned up in a coffin filled with scorpions, hanging from a helicopter over Hudson. (In fact, this may be the most logical explanation for most of the code.)
  <SPAN name = "onloadScript"> <input type = "hidden"> function onSelectInfo (calendar, date, elem_date) { 
     elem_date = document.getElementById (& quot; Day_NArr & quot;);       
     elem_mon_year = document.getElementById (& quot; Month_NArr & quot;); 
     hidden_elem = document.getElementById (& quot; temp_date_NArr & quot;); 
     doOnSelect (calendar, date, elem_date, elem_mon_year, hidden_elem); 
 } 

 Calendar.setup ( 
     { 
         inputField: & quot; temp_date_NArr & quot; // id of the input field 
         ifFormat: & quot;% b,% e,% Y & quot ;, 
         onSelect: onSelectInfo, 
         range: [currentYear, nextYear], 
         dateStatusFunc: dateStatusHandler, 
         button: & quot; cal_dep & quot;  // ID of the button 

     } 
 ); 

 var _InfoVerAccurateFunc = clone (accurateDate); 
 initializeDate (new Array ('Month_NArr', 'Day_NArr'), _InfoVerAccurateFunc); ">
 <script type = "text / javascript">

Remember all the dojo.cookie imported above? Someone added a library function to read cookies.Nevertheless, someone else considered it necessary to write a function Get_Cookie from the Internet, but not once, but four times!

 function Get_Cookie (check_name) {
    // first we split this cookie up into name / value pairs
    // note: document.cookie only returns name = value, not the other components
    var a_all_cookies = document.cookie.split (';');
    var a_temp_cookie = '';
    var cookie_name = '';
    var cookie_value = "";
    var b_cookie_found = false;

    for (i = 0; i <a_all_cookies.length; i ++) {
        // now we'll split apart each name = value pair
        a_temp_cookie = a_all_cookies [i] .split ('=');


        // and trim left / right whitespace while we at
        cookie_name = a_temp_cookie [0] .replace (/ ^ \ s + | \ s + $ / g, '');

        // if the extracted name matches passed check_name
        if (cookie_name == check_name) {
            b_cookie_found = true;
            // but there is no value, but it exists (no = sign, that is):
            if (a_temp_cookie.length> 1) {
                cookie_value = unescape (a_temp_cookie [1] .replace (/ ^ \ s + | \ s + $ / g, ''));
             }
            // note
            return cookie_value;
             break;
         }
        a_temp_cookie = null;
        cookie_name = '';
     }
    if (! b_cookie_found) {
         return null;
     }
 }

I think that the software development method used by this command is a new system called “Dolby on the keys CTRL-C and CTRL-V keys !!!!!! 11 !!!! 11! 11”. I am sure that in the near future it will replace Agile.

The fifth story. Robots people


[ Original ]

During the years of formation of SuperbServices, Inc., its business flourished. It was a blessing and a curse; as in any startup, there was more work than hands. The sales department couldn’t give up on its success, so techies had to adapt.

CEO of SuperbServices, Inc. gave Roland a serious task that could save the company, or at least the mental health of employees. “We need to automate all the processing so that we can focus on providing services,” said the CEO. “The most valuable with us is our services, and everything else is unnecessary fuss. It is necessary to automate it, and you will be engaged in it. You will collaborate with human robots to automate everything: confirmation of transactions, purchases, money transactions, customer emails - everything! ”

“ With ... robots people? ”

Roland had a new phobia. The company's server department was unusually eccentric, even by industry standards. Only a few saw his employees, and only strange rumors reached Roland.

When Roland knocked on the server's door, the surveillance camera above his head came to life and the impassive voice of the robot asked him: “WHAT ARE YOU LOOKING FOR?”

“Uh, hey ... I'm Roland, the project manager. Like we, guys, or who are you there, should automate the tasks? ”

“ WHAT DO YOU OFFER TO US? ”, The sinister metallic voice answered.

"Well, oh ... Robots like donuts?" I have with me. That's all there is. ”

"PASS". An electronic lock on the door with a click opened. Roland pulled the door toward him, and icy air escaped from her. Thousands of lights and pillars flickered inside; a small table was nearby. A light above the table was flashing. “POSITION THE SUPPORT OF HERE,” the machine gun said from the shadows.

Roland put the box of donuts on the table and slowly walked away. From behind his back there was a cry "THANK YOU!". Roland jumped up. The frail man with the voice modulator chuckled and picked up a donut.

“Hi, Roland, I'm Roy,” he said, putting the modulator aside. “We don’t have so many visitors, so we love to make fun of them. Well, what, do you need to automate something? ”

Roland was surprised at how ordinary Roy turned out to be, and not because he was really human. “And, yes, the CEO said that you work a lot with robots and that we can use them to automate everything we can,” Roland outlined requirements and specifications.

Roy sighed. “It’s a pity to disappoint you, but we really have nothing to do with robots, whatever Gendir thinks. He insists that Ruby is the name of the robot, although it is just a programming language. But we can automate most of these processes. Give us two weeks, as many donuts and energy drinks as we can consume, and we can handle it. ”

Over the next two weeks, Roland brought the requested offerings and received in exchange information on the progress of work and demo functions. Roy and other people-robots wrote the code, and soon the mountain of paperwork, which everyone did at the top, moved to the servers in the basement. Roland explained that most of the work was done by “human-robots”, but the CEO praised his efforts.

“Roland, the workshop has been done, now these machines are pulling the levers that set our business in motion,” the general director patted him on the back. “Your reward will be a new project - another project with the highest priority. Our financial department does not cope with the volume of transactions. I talked to the CFO and she wants you to automate the new product we bought, MoneyWorx, with human robots. Don't let me down! ”

Roland returned to the server room. If the previous automation project was so simple, then everything will be the same, right? He showed Roy the demands.

The skin of Roy, sunburnt in the light of monitors, became even paler. “This is bad, very bad! Danger! ”Roy shouted. He was waving his arms in horror. “This is not MoneyWorx, but MoneyDoesntWorx. Even when services are running, they require RSA-SecurID tokens. Someone must manually enter the code. ”

"Manually? That is, in order for the system to work, should someone be on the line? "

" Yes. We use three SecurID tokens, so usually when MoneyWorx asks for a new code, there must be “three people on the line”.

“So it won't work. If people have to take night calls to conduct transactions, the CEO will be furious. And he has already signed a contract - we must make sure that the system works without calling people. ”

Roy opened the energetic and shuddered. “Give me the weekend, I'll think about it. And I will need more of this, ”he shook the jar. “And this one,” he pointed to the box of donuts.

Roland appeared by the weekend and put down his offerings. Roy accepted them, but said nothing. The robots were too busy to chat. When Monday came, Roland returned with new donuts and energy drinks. “Eureka!” Roy exclaimed when Roland entered. “Let me show you my masterpiece!”

The “masterpiece” was an empty donut box set to the side. RSA-SecurID tokens were glued to the box. The whole system was installed in front of a cheap webcam. “When MoneyJerks demands a new two-factor token, someone can remotely access this machine, check the tokens and enter the correct code.”

“Do you think that this box should be password protected?” Roland suggested.

“Do you think that users will remember how to log in?” Roy objected.

It was probably the dumbest idea Roland had heard about, but he reported it upstairs and showed a demo solution in the office of the general director. After he disconnected from the machine with a webcam, he shivered, waiting for a tantrum.

"This is amazing! They put their robot eyes on these things, and now no one in the company needs to tell MoneyWorx what to do! Great job, Roland. Congratulate the robots from me. Their robot is a miracle. ”

Roland was happy that the work was completed, but he could not shake off the feeling that he had made a terrible mistake. The company's financial security was in the hands of a cheap webcam without any protection, except for the absence of a public IP address.

image

When the disaster finally broke out, it did not take the form of a fraudulent transaction. Late Wednesday night, the donut box dropped. Roland had to call Roy, who went to the office and put the box in place. After analyzing the reasons for the failure, Roy stuck the box to the server rack with electrical tape, thus ensuring constant uptime.

Source: https://habr.com/ru/post/437376/