{"id":443,"date":"2014-07-21T07:00:01","date_gmt":"2014-07-21T07:00:01","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/oldnewthing\/2014\/07\/21\/the-alternate-story-of-the-time-one-of-my-colleagues-debugged-a-line-of-business-application-for-a-package-delivery-service\/"},"modified":"2014-07-21T07:00:01","modified_gmt":"2014-07-21T07:00:01","slug":"the-alternate-story-of-the-time-one-of-my-colleagues-debugged-a-line-of-business-application-for-a-package-delivery-service","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20140721-01\/?p=443","title":{"rendered":"The alternate story of the time one of my colleagues debugged a line-of-business application for a package delivery service"},"content":{"rendered":"<p>\nSome people objected to\n<a HREF=\"http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2014\/07\/19\/10543324.aspx#10543500\">\nthe length, the structure, the metaphors<\/a>,\n<a HREF=\"http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2014\/07\/19\/10543324.aspx#10543729\">\nthe speculation, and fabrication<\/a>.\nSo let&#8217;s say they were my editors.\nHere&#8217;s what the article might have looked like,\nhad I taken their recommendations.\n(Some recommendations were to text that was also recommended cut.\nI applied the recommendations before cutting;\nthe cuts are in gray.)\nYou tell me whether you like the original or the edited version.\n<\/p>\n<table BORDER=\"0\">\n<tr>\n<td VALIGN=\"top\">\n<p STYLE=\"margin-bottom: 1em\">\nBack in the days of Windows&nbsp;95 development,\none of my colleagues debugged\na line-of-business application for a major delivery service.\n<font COLOR=\"gray\">\nThis was a program that the company gave to its top-tier\nhigh-volume customers,\nso that they could place and track their orders directly.\n<\/font>\n<font COLOR=\"gray\">And by <i>directly<\/i>,\nI mean that the program\ndialed the modem\n(since that was how computers communicated with each other back then)\nto contact\n<strike><font COLOR=\"gray\">the delivery service&#8217;s mainframe\n(it was all mainframes back then)<\/font><\/strike>\n<u>a computer at the delivery service<\/u>\nand upload the new orders\nand download the status of existing orders.&sup1;<\/font>\n<\/p>\n<\/td>\n<td WIDTH=\"25%\">\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Length. The &#8220;top tier customer&#8221; part of the story is irrelevant.]\n<\/div>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Length. The mainframe part of the story is irrelevant.]\n<\/div>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Speculation.\nNo proof that the computer being dialed is a mainframe.\nFor all you know, it was an Apple ][ on the other end of the modem.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td VALIGN=\"top\">\n<p STYLE=\"margin-bottom: 1em;color: gray\">\nVersion 1.0 of the application had a notorious bug:\nNinety days after you installed the program,\nit stopped working.\n<strike><font COLOR=\"gray\">They forgot to remove the beta expiration code.\nI guess that&#8217;s why they have a version 1.01.<\/font><\/strike>\n<u>It told you that the beta period has expired.<\/u>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Length. Version 1.0 is irrelevant.]\n<\/div>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Speculation.\nNo proof that the beta expiration code was left by mistake.\nIt could have been intentional, for whatever reason.\nProbably some nefarious reason.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td VALIGN=\"top\">\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">Anyway, the bug that my colleague investigated\nwas that<\/font>\nIf you entered a particular type of\norder with a particular set of options\nin a particular way,\nthen the application crashed your system.\n<font COLOR=\"gray\">Setting up a copy of the application\nin order to replicate the problem\nwas itself a bit of an ordeal,\nbut that&#8217;s a whole different story.<\/font>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Length. Retransition no longer necessary.\nThe &#8220;setting up&#8221; story is irrelevant.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em;color: gray\">\nOkay, the program is set up, and yup, it crashes exactly\nas described when run on Windows&nbsp;95.\nActually, it also crashes exactly as described when\nrun on Windows&nbsp;3.1.\nThis is just plain an application bug.\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Length. Irrelevant.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<u><b>The initial crash<\/b><\/u>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Structure. Create heading (even though it gives away some of the story).]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<strike>Here&#8217;s why it crashed:<\/strike>\nAfter the program\ndials up\n<strike><font COLOR=\"gray\">the mainframe to submit the order<\/font><\/strike>\n<u>the order system<\/u>,\nit tries to refresh\n<strike><font COLOR=\"gray\">the list of orders that have yet to be delivered<\/font><\/strike>\n<u>a list box control<\/u>.\nThe code that does this assumes that\n<strike><font COLOR=\"gray\">the list of undelivered orders<\/font><\/strike>\n<u>the list box control<\/u>\nis the control with focus.\nBut\n<strike><font COLOR=\"gray\">if you ask for labels to be printed,\nthen the printing code changes focus in order to\ndisplay the &#8220;Please place the label on the package\nexactly like this&#8221; dialog<\/font><\/strike>,\n<u>under the specific circumstances,\nthe control is no longer focus;\nas I recall, it was because a dialog box had appeared and changed focus<\/u>,\nand as a result, the refresh code can&#8217;t find the\n<strike><font COLOR=\"gray\">undelivered order list<\/font><\/strike>\n<u>list box<\/u>\nand crashes on a null pointer.\n<strike><font COLOR=\"gray\">(I&#8217;m totally making this up, by the way.\nThe details of the scenario aren&#8217;t important to the story.)<\/font><\/strike>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Fabrication.\nAll that is known is that there was a list box that lost focus to\na dialog box.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">Okay, well, that&#8217;s no big deal.<\/font>\nA null pointer fault should just put up the\nUnrecoverable Application Error dialog box\nand close the program.\nWhy does this particular null pointer fault crash the entire system?\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<u><b>Recovering from the crash<\/b><\/u>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Structure. Create heading.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<strike><font COLOR=\"gray\">The developers of the program saw that their refresh code\nsometimes crashed on a null pointer,\nand instead of fixing it by actually fixing the code so it\ncould find the list of undelivered orders even if it didn&#8217;t\nhave focus,\nor fixing it by adding a null pointer check,\nthey fixed it by adding a null pointer exception handler.\n(I wish to commend myself for\nresisting the urge to put the word <i>fixed<\/i> in quotation marks\nin that last sentence.)<\/font><\/strike>\n<u>The program installed a null pointer exception handler.<\/u>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Speculation.\nNo way of knowing that this was what the developers were thinking\nwhen they wrote the code.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\nNow, 16-bit Windows didn&#8217;t have structured exception handling.\nThe only type of exception handler was a global exception handler,\nand this wasn&#8217;t just global to the process.\nThis was global to the entire system.\nYour exception handler was called for every exception everywhere.\nIf you screwed it up, you screwed up the entire system.\n<font COLOR=\"gray\">(I think you can see where this is going.)<\/font>\n<\/p>\n<\/td>\n<td>\n<p STYLE=\"border: solid 1px black;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<strike><font COLOR=\"gray\">The developers of the program converted their global exception handler\nto a local one by going\nto every function that had a\n&#8220;We seem to crash on a null pointer and I\ndon&#8217;t know why&#8221; bug and making these changes:\n<\/font><\/strike>\n<u>A few functions in the program took the following form:<\/u>\n<\/p>\n<pre>\nextern jmp_buf caught;\nextern BOOL trapExceptions;\nvoid scaryFunction(...)\n{\n <font COLOR=\"blue\">if (setjmp(&amp;caught)) return;\n trapExceptions = TRUE;<\/font>\n ... body of function ...\n <font COLOR=\"blue\">trapExceptions = FALSE;<\/font>\n}\n<\/pre>\n<p STYLE=\"margin-bottom: 1em\">\nTheir global exception handler checks the <code>trapExceptions<\/code>\nglobal variable,\nand if it is <code>TRUE<\/code>,\nthey set it back to <code>FALSE<\/code> and\ndo a <code>longjmp<\/code> which sends control\nback to the start of the function,\nwhich detects that something bad must have happened and just\nreturns out of the function.\n<\/p>\n<\/td>\n<td VALIGN=\"top\">\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Speculation.\nNo way of knowing that this was what the developers were thinking\nwhen they wrote the code.\nNo proof that the code was first written without a global exception handler,\nand that the handler was added later.\nNo proof that <i>every<\/i> such function set this variable.\nNo proof that the reason for adding the <code>setjmp<\/code> was to\nprotect against null pointer failures.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">Yes, things are kind of messed up as a result of this.\nYes, there is a memory leak.\nBut at least their application didn&#8217;t crash.<\/font>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\nOn the other hand, if the global variable is <code>FALSE<\/code>,\nbecause their application crashed in some other function that\ndidn&#8217;t have this special protection,\nor because some other totally unrelated application crashed,\nthe global exception handler decided to exit the application\nby running around freeing all the DLLs and memory associated with their\napplication.<\/p>\n<p><p>\n<font COLOR=\"gray\">Okay, so far so good, for certain values of <i>good<\/i>.<\/font>\n<\/p>\n<\/td>\n<td VALIGN=\"bottom\">\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<u><b>Failed recovery<\/b><\/u>\n<\/p>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Structure. Add heading here.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\nThese system-wide exception handlers had to be written in assembly\ncode because they were dispatched with a very strange calling\nconvention.\n<strike><font COLOR=\"gray\">But the developers of this application\ndidn&#8217;t write their system-wide exception handler\nin assembly language.\nTheir application was written in MFC,\nso they just went to Visual C++ (as it was then known),\nclicked through some <i>Add a Windows hook<\/i> wizard,\nand got some generic <code>HOOKPROC<\/code>.\n(I don&#8217;t know if Visual C++ actually had an\n<i>Add a Windows hook<\/i> wizard;\nthey could just have copied the code from somewhere.)\nNevermind that these system-wide exception handlers are not\n<code>HOOKPROC<\/code>s, so the function has the wrong prototype.\nWhat&#8217;s more, the code they used marked the hook function\nas <code>__loadds<\/code>.\nThis means that the function<\/font><\/strike>\n<u>For whatever reason, the handler they installed<\/u>\nsaves the previous value of the\n<code>DS<\/code> register on entry,\nthen changes the register to point to the application&#8217;s data,\nand on exit, the function restores the previous value of <code>DS<\/code>.\n<\/font><\/strike>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Speculation.\nNo proof that the program was written with MFC in the\nMicrosoft Visual C++ IDE.\nIt could have been written with Notepad in\nassembly language\nthat just happens to look like the assembly language generated by\nthe Microsoft Visual C++ compiler when it compiles code written in MFC.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<u>The <code>DS<\/code> is a register on the x86 CPU that describes the\ndata currently being operated upon.\nAll that&#8217;s important here is that the value in the <code>DS<\/code>\nregister must always be valid, or the CPU will raise an exception.<\/u>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Need to explain the <code>DS<\/code> register in case the reader cannot\ninfer this from the description that comes later.\nWe have established that neither the author nor the reader\nis allowed to draw inferences.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<strike><font COLOR=\"gray\">Okay, now we&#8217;re about to enter the\n<a HREF=\"http:\/\/gideonsway.wordpress.com\/2011\/04\/06\/what-is-a-movie-set-piece\/\">\nset piece<\/a> at the end of the movie:\nOur hero&#8217;s fear of spiders,\nhis girlfriend&#8217;s bad ankle from an old soccer injury,\nthe executive toy on the villain&#8217;s desk,\nand all the other tiny little clues\ndropped in the previous ninety minutes\ncome together to form an enormous chain reaction.<\/font><\/strike>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\nThe application crashes on a null pointer.\nThe system-wide custom exception handler is called.\nThe crash is not one that is being protected by the global variable,\nso the custom exception handler frees the application from memory.\nThe system-wide custom exception handler now returns,\nbut wait, what is it returning to?\n<\/p>\n<p STYLE=\"margin-bottom: 1em\">\nThe crash was in the application,\nwhich means that the <code>DS<\/code> register\nit saved on entry to the custom exception handler\npoints to the application&#8217;s data.\nThe custom exception handler freed the application&#8217;s data\nand then returned, declaring the exception handled.\nAs the function exited,\nit tried to restore the original <code>DS<\/code> register,\nbut the CPU said,\n&#8220;Nice try,\nbut that is not a valid value for the <code>DS<\/code> register\n(because you freed it).&#8221;\nThe CPU reported this error by\n<font COLOR=\"gray\">\n(dramatic pause)\n<\/font>\nraising an exception.\n<\/p>\n<\/td>\n<td VALIGN=\"bottom\">\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">That&#8217;s right,<\/font>\nThe system-wide custom exception handler\ncrashed with an exception.\n<\/p>\n<\/td>\n<td VALIGN=\"bottom\">\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<u><b>The chain reaction<\/b><\/u>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Structure. Add heading here.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<strike><font COLOR=\"gray\">Okay, things start snowballing.\nThis is the part of the movie where the director uses\nquick cuts between different locations,\n<a HREF=\"http:\/\/www.thelonelyisland.com\/video\/cool-guys-explosions\">\nmaybe with a little slow motion thrown in<\/a>.<\/font><\/strike>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\nSince an exception was raised,\nthe custom exception handler is called recursively.\nEach time through the recursion, the custom exception handler\nfrees all the DLLs and memory associated with the application.\nBut that&#8217;s okay, right?\nBecause the second and subsequent times,\nthe memory was already freed,\nso the attempts to free them again will just fail\nwith an invalid parameter error.\n<\/p>\n<p STYLE=\"margin-bottom: 1em\">\nBut wait, their list of DLLs associated\nwith the application included\n<code>USER<\/code>,\n<code>GDI<\/code>,\nand\n<code>KERNEL<\/code>.\nNow, Windows is perfectly capable of unloading dependent DLLs\nwhen you unload the main DLL,\nso when they unloaded their main program, the kernel already\ndecremented\nthe usage count on\n<code>USER<\/code>,\n<code>GDI<\/code>,\nand\n<code>KERNEL<\/code> automatically.\n<strike><font COLOR=\"gray\">But they apparently didn&#8217;t trust Windows to do this,\nbecause after all,\nit was Windows that was causing their application to crash,\nso they took it upon themselves to free those DLLs manually.<\/font><\/strike>\n<u>For whatever reason, the handler frees the DLLs anyway.<\/u>\n<\/p>\n<\/td>\n<td VALIGN=\"bottom\">\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Speculation.\nNo way of knowing that this was what the developers\nwere thinking when they wrote the code.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\nTherefore, each time through the loop,\nthe usage counts for\n<code>USER<\/code>,\n<code>GDI<\/code>,\nand\n<code>KERNEL<\/code> drop by one.\n<strike><font COLOR=\"gray\"><i>Zoom in on the countdown clock on the ticking time bomb.<\/i><\/font><\/strike>\n<\/p>\n<p STYLE=\"margin-bottom: 1em\">\n<strike><font COLOR=\"gray\"><i>Beep beep beep beep beep<\/i>.<\/font><\/strike>\nThe reference count finally drops to zero.\nThe window manager, the graphics subsystem,\nand the kernel itself have all been unloaded from memory.\nThere&#8217;s nothing left to run the show!\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Embellishment.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\nBoom, bluescreen.\nHot flaming death.\n<\/p>\n<p STYLE=\"margin-bottom: 1em\">\n<strike><font COLOR=\"gray\">The punch line to all this is that whenever you call the company&#8217;s\nproduct\nsupport line and describe a problem you encountered,\ntheir response is always,\n&#8220;Yeah, we&#8217;re really sorry about that one.&#8221;<\/font><\/strike>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Length. Irrelevant.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">\n<b>Bonus chatter<\/b>:\nWhat is that <i>whole different story<\/i>\nmentioned near the top?\n<\/font>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Length. Cut the entire bonus chatter. Irrelevant story.]\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">\nWell, when the delivery service sent the latest version\nof the software to the Windows&nbsp;95 team,\nthey also provided an account number to use.\nMy colleague used that account number to\ntry to reproduce the problem,\nand since the problem occurred only after the order was\nsubmitted,\nshe would have to submit delivery requests,\n<strike><font COLOR=\"gray\">say for a letter to be picked up\nfrom 221B Baker Street\nand delivered to 62 West Wallaby Street,\nor maybe for a 100-pound package of radioactive material\nto be picked up from\n1600 Pennsylvania Avenue\nand delivered to\n10 Downing Street.<\/font><\/strike>\n<u>all of which were fictitious<\/u>.\n<\/font>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Fabrication.\nNo proof that these were the addresses and orders used.\nAll that is known is that fictitious orders were placed.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td VALIGN=\"top\">\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">\nAfter\nabout two weeks of this,\nmy colleague got a phone call from\n<u>people identifying themselves as<\/u>\nMicrosoft&#8217;s\nshipping department.\n<strike><font COLOR=\"gray\">&#8220;What the heck are you doing?&#8221;<\/font><\/strike>\n<\/font>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Speculation.\nNo proof that the call truly came from the shipping department.\nCould have been a lucky prank call.]\n<\/div>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Fabrication.\nNo transcript of this call exists.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">\nIt turns out that the account number my colleague was given\nwas Microsoft&#8217;s own corporate account number.\nAs in a <i>real live account<\/i>.\nShe was inadvertently prank-calling the delivery company\nand sending actual trucks all over the\ncountry to pick up nonexistent letters and packages.\n<u>The people who identified themselves as<\/u>\nMicrosoft&#8217;s shipping department and people\nfrom the delivery service&#8217;s headquarters\n<u>claimed that they<\/u>\nwere frantic trying to trace where all the bogus\norders were coming from.\n<\/font>\n<\/p>\n<\/td>\n<td>\n<div STYLE=\"border: solid 1px black;margin: 1ex 0pt;background-color: pink;padding: 1ex\">\n[Hearsay.]\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p STYLE=\"margin-bottom: 1em\">\n<font COLOR=\"gray\">\n&sup1;\nMind you, this sort of thing is the stuff that average Joe\ncustomers can do while still in their pajamas,\nbut back in those days,\nit was a feature that only top-tier customers had access to,\nbecause, y&#8217;know, mainframe.\n<\/font>\n<\/p>\n<\/td>\n<\/tr>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Some people objected to the length, the structure, the metaphors, the speculation, and fabrication. So let&#8217;s say they were my editors. Here&#8217;s what the article might have looked like, had I taken their recommendations. (Some recommendations were to text that was also recommended cut. I applied the recommendations before cutting; the cuts are in gray.) [&hellip;]<\/p>\n","protected":false},"author":1069,"featured_media":111744,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[2],"class_list":["post-443","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-history"],"acf":[],"blog_post_summary":"<p>Some people objected to the length, the structure, the metaphors, the speculation, and fabrication. So let&#8217;s say they were my editors. Here&#8217;s what the article might have looked like, had I taken their recommendations. (Some recommendations were to text that was also recommended cut. I applied the recommendations before cutting; the cuts are in gray.) [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/users\/1069"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/comments?post=443"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/443\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media\/111744"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media?parent=443"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=443"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}