<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Adam Zachary Wasserman on Medium]]></title>
        <description><![CDATA[Stories by Adam Zachary Wasserman on Medium]]></description>
        <link>https://medium.com/@adam.wasserman?source=rss-6ca2e74d71f5------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dYTiGvPmjjyOqYEwRulxog.png</url>
            <title>Stories by Adam Zachary Wasserman on Medium</title>
            <link>https://medium.com/@adam.wasserman?source=rss-6ca2e74d71f5------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 19:39:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@adam.wasserman/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[On the practicality of regex for email address processing]]></title>
            <link>https://medium.com/better-programming/on-the-practicality-of-regex-for-email-address-processing-78280ab006c3?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/78280ab006c3</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[regex]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Fri, 31 Mar 2023 19:54:43 GMT</pubDate>
            <atom:updated>2023-08-17T14:41:07.131Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*lSv-GlTXBT-6YnLXVeLMFA.png" /></figure><p>A colleague recently pointed me to a blog post: <a href="https://jackfoxy.github.io/FsRegEx/emailregex.html#On-the-Futility-of-Email-Regex-Validation">On the Futility of Email Regex Validation</a>. For the sake of brevity, I will refer to it as <em>Futility</em> in this article.</p><p>Although I admit that the challenge of writing a regex that can successfully identify whether a string conforms to the RFC 5322 definition of an Internet Message header is entertaining, I feel bound to point out that <em>Futility</em> is not a useful guide for the practical programmer.</p><p>This is primarily because it conflates RFC 5322 message headers with RFC 5321 address literals, which, in simple language, means that a valid SMTP email address is different from a valid message header in general. It is also because it incites the reader to become preoccupied with edge cases that are theoretically possible from a standard point of view but which—as I will demonstrate—have an infinitesimal probability of occurring “in the wild.”</p><p>This article will expand upon both assertions, discuss a few possible use cases for email regex, and conclude with annotated “cookbook” examples of practical email regex.</p><h4>RFC 5321 supersedes 5322</h4><p>The universality of SMTP for email transmission means that, as a practical matter, no examination of email address formatting is complete without a close reading of the relevant IETF RFC, which is 5321. <em>Futility</em> depends entirely upon the Internet message header RFC: 5322.</p><p>What do I mean by that? As just one example: 5322 allows strings enclosed in parenthesis, even in a domain name. However, this is superseded in RFC 5321, which explicitly states that the domain name portions of email addresses “<em>are restricted for SMTP purposes to consist of a sequence of letters, digits, and hyphens drawn from the ASCII character set</em>.”</p><p>In constructing a regular expression, it is hard to overstate the degree to which this constraint simplifies matters, especially regarding determining excessive string length. Further below, the annotated examples will highlight this. It also implies other practical considerations in the validation context that we will explore further.</p><p>Please note that the <a href="http://github.com/jackfoxy/FsRegEx/blob/master/tests/Email.Tests/RFC822.fs">test suite</a> referenced in <em>Futility</em> includes ten tests that contain comments or diacritical or Unicode characters and incorrectly asserts that 8 of them represent valid email addresses.</p><h4>Mailbox names in the wild</h4><p>As per both RFCs, the technical name for the email address portion to the left of the “@“ symbol is “mailbox.” Both RFCs allow considerable latitude in what characters are allowable in the mailbox portion. The only significant practical constraint is that quotes or parenthesis must be balanced, which is a real challenge to verify in vanilla regex.</p><p>However, real-world mailbox implementations are the measure that the practical programmer should employ. As a rule, the people who pay us frown upon 90% of our billable hours being directed to resolving the 10% of theoretical edge cases that might possibly not even exist at all in real life. I will now demonstrate that in the case of email addresses actually in use, edge cases do not even amount to 1%. To do that, we will consider the dominant email mailbox providers, consumers, and businesses and consider what types of email addresses they permit.</p><p>For consumer email, I did some primary research using a list of 5,280,739 email addresses leaked from Twitter accounts. At the time of writing, there were 115 million Twitter accounts, giving us a 99% confidence level with a 0.055% margin of error over the entire population of Twitter, which is sufficiently representative of the general population of all Internet email addresses. Here is what I learned:</p><ul><li>82% of addresses contained only ASCII alphanumeric characters</li><li>15% contained ASCII alphanumeric and dots (ASCII periods)</li><li>3% contained ASCII alphanumeric, dots, and dashes</li></ul><p>This adds up to 100% of email addresses. However, this is a rounded 100%. For the trivia lovers out there, I also found:</p><ul><li>38 addresses with underscores for 0.00072% of the total</li><li>27 with plus signs for 0.00051%</li><li>1 address with Unicode characters representing 0.00002% of the total</li></ul><p>Conclusion 1: Assuming that email address mailboxes contain only ASCII alphanumeric, dots, and dashes will give you better than 5 9’s accuracy for consumer emails.</p><p>For business emails, Datanyze <a href="https://www.datanyze.com/market-share/email-hosting--23">reports</a> that 6,771,269 companies use 91 different email hosting solutions. Fortunately for us, it is a Pareto distribution, and 95.19% of those mailboxes are hosted by just ten service providers.</p><h4>Gmail for business (34.35% market share)</h4><p>When creating a mailbox, Google allows only ASCII letters, numbers, and dots. It will, however, accept the plus sign <a href="https://gmail.googleblog.com/2008/03/2-hidden-ways-to-get-more-from-your.html">when receiving email</a>.</p><h4>Microsoft Exchange Online (33.60%)</h4><p>Allows only ASCII letters, numbers, and dots.</p><h4>GoDaddy Email Hosting (14.71%)</h4><p>Uses Microsoft 365 and allows only ASCII letters, numbers, and dots.</p><h4>Seven additional providers (12.53%)</h4><p>Not documented.</p><p>Unfortunately, this only allows us to be certain of 82% of businesses, and we need to know how many mailboxes that represents. I wanted to find an alternative methodology that would allow us to calculate a confidence level.</p><p>The Twitter email addresses included 173,467 domains. Only 400 domains had more than 100 individual email mailboxes represented, and these 400 domains collectively host 96% of Twitter subscribers.</p><p>Conclusion 2: The remaining 173,067 domains and 237,592 email addresses represent business email addresses. It is reasonable to take these 237,592 email addresses as representing a population of 1 billion business email addresses. These population and sample sizes come to a 99% confidence level with a 0.25% margin of error, giving us close to 3 9’s when assuming that an email address mailbox contains only ASCII alphanumeric, dots, and dashes.</p><h3>Use Cases</h3><p>With practicality foremost in our minds, let us now consider under what circumstances we might need to identify a valid email address programmatically.</p><h4>New account creation/user signups</h4><p>A prospective new customer is trying to create an account in this use case. There are two high-level strategies. In the first case, we attempt to verify that the new user&#39;s email address is valid and proceed with account creation synchronously.</p><p>There are two reasons why you might not want to take this approach. The first is that although you might be able to validate that the email address has a valid form, it might not exist. The other reason is that synchronous is a red flag word at any scale. This should cause the pragmatic programmer to consider instead a fire-and-forget model where a stateless web frontend passes form information to a microservice or API that will asynchronously validate the email by sending a “magic” link. After the user clicks on this link, it will trigger the completion of the account creation process.</p><h4>Contact forms</h4><p>In the case of a simple contact form, of the sort often used to download white papers, the potential downside to accepting strings that look like a valid email but are not is that you are lowering the quality of your marketing database by failing to validate if the email address really exists. So once again, the fire-and-forget model is a better option than programmatic validation of the string entered in a form.</p><h4>Parsing of referrer logs and other large volumes of data.</h4><p>This is the real use case for programmatic email address identification in general and regex in particular: anonymizing or mining large chunks of unstructured text.</p><p>I first encountered this use case assisting a security researcher who needed to upload referrer logs to a fraud detection database. The referrer logs contained email addresses that needed to be anonymized before leaving the company’s walled garden.</p><p>These were files with hundreds of millions of lines, and there were hundreds of files a day. “Lines” could be close to a thousand characters long. Iterating through the characters in a line, applying complex tests (e.g., is this the first occurrence of @ in the line, and is it part of a file name such as imagefile@2x.png?) Using loops and standard string functions would have created an impossibly large time complexity. In fact, the in-house development team of this (very large) company had declared it an impossible task, and so my friend turned to me for help.</p><p>I wrote the following compiled regex:</p><p>search_pattern = re.compile(&quot;[a-zA-Z0-9\!\#\$\%\&#39;\*\+\-\^\_\`\{\|\}\~\.]+@|\%40(?!(\w+\.)**(jpg|png))(([\w\-]+\.)+([\w\-]+)))&quot;)</p><p>and dropped it into the following Python list comprehension:</p><p>results = [(re.sub(search_pattern, &quot;redacted@example.com&quot;, line)) for line in file]</p><p>I cannot remember just how fast it was, but it was fast. My friend could run it on a laptop and be done in minutes. It was accurate. We clocked it at 5 9’s, looking at false negatives and false positives.</p><p>My job was made somewhat easy by the fact as referrer logs, they could only contain URL “legal” characters, so I was able to map out any collisions, which I documented in the repo <a href="https://github.com/adamzwasserman/firewheel">readme</a>. Also, I could have made it even simpler (and faster) if I had performed the email address analysis and learned with the assurance that all that was needed to get to the 5 9’s target was ascii alphanumeric, dots, and dashes. Nonetheless, this is a good example of practicality and scoping the solution to fit the problem. One of the greatest quotes in all of programming lore and history is the great Ward Cunningham’s <a href="https://www.artima.com/articles/the-simplest-thing-that-could-possibly-work">admonition</a> to take a second to remember exactly what you are trying to accomplish and then ask yourself, “What is the simplest thing that could work?”</p><p>In the use case of parsing out (and optionally transforming) an email address from a large amount of unstructured text, this solution was definitely the simplest thing I could think of.</p><h4>Annotated cookbook</h4><p>Like I said at the beginning, I do find the idea of building an RFC 5322-compliant regex amusing, so I took it on as a non-practical challenge for my own amusement.</p><p>Below I will show you composable chunks of regex to deal with various parts of the RFC 5321 standard and explain how that chunk of regex works. At the end, I will show you what it looks like, all assembled.</p><p>The structure of an email address is as follows:</p><h4>The mailbox</h4><ol><li>Legal characters</li><li>Single dots (double dots are not legal)</li><li>Folded White Space (RFC 5322 craziness)</li><li><em>(A complete regex solution would also include balanced parenthesis and/or quotes, but I do not have that yet. And very possibly never will.)</em></li></ol><h4>The delimiter (@)</h4><h4>The domain name</h4><ol><li>Standard dns parsable domains</li><li>IPv4 address literals</li><li>IPv6 address literals</li><li>IPv6-full</li><li>IPv6-comp (for compressed)</li><li>1st form (2+ 16-bit groups of zero in the middle)</li><li>2nd form (2+ 16-bit groups of zero in the beginning)</li><li>3rd form (2 16-bit groups of zero at the end)</li><li>4th form (8 16-bit groups of zero)</li><li>IPv6v4-full</li><li>IPv6v4-comp (compressed)</li><li>1st form</li><li>2nd form</li><li>3rd form</li><li>4th form</li></ol><p>Now for the regex.</p><h4>Mailbox</h4><pre>(?&lt;fullAddress&gt;(?&lt;mailbox&gt;([a-zA-Z0-9\+\!\#\$\%\&amp;\&#39;\*\-\/\=\?\+\-\=\^\_\{\}\|\~\`\’]|(?&lt;singleDot&gt;(?&lt;!\.)(?&lt;!^)\.(?!\.))|(?&lt;foldedWhiteSpace&gt;\s?\&amp;\#13\;\&amp;\#10\;.)){1,64})\s?(?&lt;singleAt&gt;(?&lt;!\@)(?&lt;!\-)(?&lt;!\.)\@(?!\@))</pre><p>First we have (?&lt;mailbox&gt;. This names the capture group for convenience. Inside the capture group are the three regex chunks separated by the alternate match symbol | which means that a character can match any one of the three expressions. Part of writing good (performant and predictable) regex is ensuring the three expressions are mutually exclusive. That is to say that a substring that matches one, will definitely not match either of the other two. To do this, we use specific character classes instead of .</p><p>We also use the “explicit” quantifier {1,64} instead of the the “greedy” quantifier * . This is functionally useful because it enforces the specific mailbox length defined in the RFC. It is also good practice in general because careless use of greedy quantifiers can lead to unexpected results.</p><p>To the untrained eye, the regex &quot;.+&quot; appears to search for any character (except a quote) that appears between two quotes. However, apply it to the string this &quot;word&quot; is a &quot;quote&quot;, and it will return &quot;word&quot; is a &quot;quote&quot; and not &quot;word&quot; and &quot;quote&quot; .</p><p>Finally, it is also important to evaluate the use of quantifiers from a performance perspective. When combined with generic tokens such as . instead of specific characters, such as [a-zA-Z], you can create a “<a href="https://www.regular-expressions.info/catastrophic.html">runaway</a>” regular expression because of how “backtracking” works. The regex I wrote for my friend all those years ago would have been ten times as fast if I had known this at the time, and with the volumes of data he had to work with, it would have made a significant difference.</p><h4>Chunk #1: Unconditionally legal characters</h4><pre>[a-zA-Z0–9\+\!\#\$\%\&amp;\&#39;\*\-\/\=\?\+\-\=\^\_\{\}\|\~\`\&#39;]</pre><p>The first alternate match is a character class enclosed in square brackets, which captures all ASCII characters that are legal in an email mailbox except the dot, “folded white space,” the double quote, and the parenthesis. We excluded them because they are only conditionally legal, which is to say that there are rules about how you can use them that have to be validated. We will handle them in the next two alternate matches.</p><h4>Chunk #2: singleDot</h4><p>(?&lt;singleDot&gt;(?&lt;!\.)(?&lt;!^)\.(?!\.))</p><p>The first such rule concerns the dot (period). In a mailbox, the dot is only allowed as a separator between two strings of legal characters, so two consecutive dots is not legal. To prevent a match if there are two consecutive dots, we use the regex negative lookbehind (?&lt;!\.), which specifies that the next character (a dot) will not match if there is a dot preceding it. Regex look arounds can be chained. There is another negative lookbehind before we get to the dot (?!^), which enforces the rule that the dot cannot be the first character of the mailbox. After the dot, there is a negative lookahead (?!\.), this prevents a dot being matched if it is immediately followed by a dot.</p><h4>Chunk #3: foldedWhiteSpace</h4><p>(?&lt;foldedWhiteSpace&gt;\s?\&amp;\#13\;\&amp;\#10\;.)</p><p>This is some RFC 5322 nonsense about allowing multi-line headers in messages. I am ready to bet that in the history of email addresses, there has never been anyone who seriously created an address with a multiline mailbox (they might have done it as a joke). But I am playing the 5322 game, so here it is, the string of Unicode characters that creates the <em>Folded White Space</em> as an alternate match.</p><h4><em>No chunk provided: Balanced double quotes and parentheses</em></h4><p>Both RFCs allow for the use of double quotes as a way of enclosing (or escaping) characters that would normally be illegal. They also allow for enclosing comments in parenthesis so that they will be human-readable but not considered by the mail transfer agent (MTA) when interpreting the address. In both cases, the characters are only legal if balanced. This means there must be a pair of characters, one that opens and one that closes.</p><p>I am tempted to write that I have discovered a demonstrationem mirabilem. However, this probably only works posthumously. The truth is that this is non-trivial in vanilla regex. I have an intuition that the recursive nature of “greedy” regex might be exploited to advantage. However, I am unlikely to devote the time necessary to attack this problem for the next few years, and so in the very best tradition, I leave it as an exercise for the reader.</p><h4>atSign</h4><p>\s?(?&lt;atSign&gt;(?&lt;!\-)(?&lt;!\.)\@(?!\@))</p><p>This delimiter chunk starts off with the <a href="http://catb.org/jargon/html/S/special-case.html">special case</a> \s? because according to <em>Futility</em> test cases, a space is legal just before the delimiter, and I am just taking their word for it. The rest of the capture group follows a similar pattern as <em>singleDot</em>, it will not match if preceded by a dot or a dash or if followed immediately by another @.</p><h4>Domain name</h4><p>Here, as in the mailbox, we have three alternate matches. And the last of these has nested in it another four alternate matches.</p><h4>Standard dns parsable</h4><p>(?&lt;dns&gt;[[:alnum:]]([[:alnum:]\-]{0,63}\.){1,24}[[:alnum:]\-]{1,63}[[:alnum:]])</p><p>This will not pass several of the tests in <em>Futility,</em> but as mentioned earlier, it complies strictly with RFC 5321, which has the final word. Note the explicit quantifiers that enforce the character length limits from the RFC.</p><h4>IPv4</h4><p>(?&lt;IPv4&gt;\[((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])</p><p>There is not too much to say about this. This is a well-known and easily available regex for IPv4 addresses.</p><h4>IPv6</h4><p>(?&lt;IPv6&gt;(?&lt;IPv6Full&gt;(\[IPv6(\:[0-9a-fA-F]{1,4}){8}\]))|(?&lt;IPv6Comp1&gt;\[IPv6\:((([0-9a-fA-F]{1,4})\:){1,3}(\:([0-9a-fA-F]{1,4})){1,5}?\])|\[IPv6\:((([0-9a-fA-F]{1,4})\:){1,5}(\:([0-9a-fA-F]{1,4})){1,3}?\]))|(?&lt;IPv6Comp2&gt;(\[IPv6\:\:(\:[0-9a-fA-F]{1,4}){1,6}\]))|(?&lt;IPv6Comp3&gt;(\[IPv6\:([0-9a-fA-F]{1,4}\:){1,6}\:\]))|(?&lt;IPv6Comp4&gt;(\[IPv6\:\:\:)\])|(?&lt;IPv6v4Full&gt;(\[IPv6(\:[0-9a-fA-F]{1,4}){6}\:((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3})(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])|(?&lt;IPv6v4Comp1&gt;\[IPv6\:((([0-9a-fA-F]{1,4})\:){1,3}(\:([0-9a-fA-F]{1,4})){1,5}?(\:((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\])|\[IPv6\:((([0-9a-fA-F]{1,4})\:){1,5}(\:([0-9a-fA-F]{1,4})){1,3}?(\:((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\]))|(?&lt;IPv6v4Comp2&gt;(\[IPv6\:\:(\:[0-9a-fA-F]{1,4}){1,5}(\:((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\]))|(?&lt;IPv6v4Comp3&gt;(\[IPv6\:([0-9a-fA-F]{1,4}\:){1,5}\:(((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\]))|(?&lt;IPv6v4Comp4&gt;(\[IPv6\:\:\:((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3})(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\]))</p><p>I could not find a good regular expression for IPv6 (and IPv6v4) addresses, so I wrote my own, carefully following the Backus/Naur notated rules from RFC 5321. I will not annotate every subgroup of the IPv6 regex, but I have named every subgroup to make it easy to pick apart and see what is going on. Nothing too interesting, really, except maybe the way I combined greedy matching on the “left” side and non-greedy on the “right” in the IUPv6Comp1 capture group.</p><h4>The full monty</h4><p>I have saved the final regex, along with the test data from Futility, and enhanced by some IPv6 test cases of my own, to <a href="https://regex101.com/r/o3sOt2/1">Regex101</a>. I hope you have enjoyed this article and that it is useful and a time saver for many of you.</p><p>AZW</p><p><em>Edited August 17, 2023</em>: Reading <a href="https://elliotchance.medium.com/its-impossible-to-validate-an-email-address-ae606ad711b4">https://elliotchance.medium.com/its-impossible-to-validate-an-email-address-ae606ad711b4</a> made me realize my first mailbox group was missing characters (`’-=^) and so I edited my article (and my regex101 testbed) to correct.</p><pre>Read my book <a href="https://www.chaosfactprythebook.com/"><strong>The Chaos Factory</strong></a> to learn how to improve the success rate <br>of enterprise development projects!</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=78280ab006c3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/on-the-practicality-of-regex-for-email-address-processing-78280ab006c3">On the practicality of regex for email address processing</a> was originally published in <a href="https://betterprogramming.pub/">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[No-Code can be so much more than you think]]></title>
            <link>https://medium.com/@adam.wasserman/no-code-more-than-you-think-a21e63acd057?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/a21e63acd057</guid>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[no-code]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[project-management]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Mon, 29 Aug 2022 15:20:16 GMT</pubDate>
            <atom:updated>2022-08-29T16:52:02.200Z</atom:updated>
            <content:encoded><![CDATA[<p>Turn your IT department into an enabler of citizen development</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NFiY_a8R27esjcuxL17LUw.jpeg" /><figcaption>zu Besuch um Opel Designzentrum, Rüsselsheim, <a href="https://www.flickr.com/people/51035688547@N01">Robert Basic</a>, from <a href="https://www.flickr.com/photos/robgreen/14541643013/">Opel 50 Jahre Design</a> on 27 June 2014</figcaption></figure><p>I recently read Bryan Bates’ well-researched and balanced <a href="https://www.toptal.com/project-managers/software-development/citizen-developer">article</a> on Citizen Development in the context of Agile practices.</p><p>He definitely has the right idea about low-code platforms being the path to relieving the pent-up demand for business applications that talent shortages create and that competitive pressures aggravate. He does a good job tracing the history of no-code, and of describing some of the benefits and constraints.</p><p>However the no-code space is vast, and there are options that he does not know of. These options dramatically change some of the assumptions his article is based on.</p><h4>But first: why is there a picture of a clay model of a car in this article?</h4><p>I believe it is important to explicitly understand the market dynamics that are playing out in corporate IT and to address the underlying causes more proactively than simply using no-code as described in the article and waiting for someone to build a better no-code system one day.</p><p>What are the market dynamics and underlying causes? <strong>The almost complete failure to apply industrial production techniques to application development.</strong></p><p>Very few people would disagree with the assertion that one cannot possibly hope for a successful application development project if the development team consists entirely of new and/or relatively unskilled developers. Everyone accepts as a given that without at least a few master craftspeople guiding the project, there is no hope of succeeding in creating robust and scalable code.</p><p>Compare this to automobiles. If you traveled in a car today, you just trusted your life to an exceedingly complex piece of machinery, that could easily kill you if anything went wrong, but was assembled by someone without an engineering degree, and who might not even understand how most of the machinery in the car works. Yet every day a few hundred thousand motor vehicles are completed, 80 million per year, all due to the magic of <em>industrialization</em>.</p><p>There are many competing ideas of what industrialization really means, but I will give you a definition that think is better than any other.</p><blockquote>Industrialization is the ability to mass produce products while maintaining very high quality, preferably better quality than would be achievable by hand crafted production.</blockquote><p>The way industrialization is achieved is not by mere multiplication of brute force, but by embedding human <em>skill</em> into machinery so that <em>unskilled</em> humans can produce some <em>as if</em> they had the necessary skill.</p><p>The thing to note about automobile production is that no one tries to automate the skill in the creative process. Car manufacturers still use clay models. They still hire top-notch engineers to create prototypes and calculate the performance parameters. The part that is highly automated is the <em>assembly </em>of mass-produced <em>components</em> manufactured to very high tolerances so that they fit together the right way every time, no matter how unskilled the person doing the assembly is.</p><h4>The difference between skill and force</h4><p>Let’s take a very simple example from your kitchen, the difference between a food processor and a rice cooker.</p><p>Food processors multiply brute force. In the time it takes you to dice 1 onion, it can dice 10. It can whip egg whites in a 10th of the time and with almost no physical effort on your part. No doubt, they are fun things to have around. But would a top chef ever use one to cut vegetables for their signature dish? Can a food processor help you make 100 radish roses in the time it would take you to cut 10? No.</p><p>Now consider the humble rice cooker. Do you need to watch over it? Does it ever burn the rice? Or undercook it? No. Can someone who has never made rice before in their lives make a perfect bowl of rice just by following simple instructions? Yes. Even top sushi chefs — people notorious for their attention to every detail — use rice cookers. This is because the rice cooker has <em>skill</em> embedded into it. Skill as good as the very best human chefs alive. And a completely <em>unskilled </em>person can use one to create rice <em>as good as if </em>it was made by the best chef alive, which means that there is no longer any practical limit to <em>how much</em> rice can be cooked. It is simply a question of buying more rice cookers and hiring the first person that walks in the door.</p><h4>Isn’t coding different?</h4><p>If you believe that this does not apply, or impossible to achieve, in the case of software, then you need to take a closer look at compilers. Once upon a time, top-notch programmers would refuse to use compilers because they could write better code by hand. Today only a lunatic would suggest that all machine code should be written by hand. A compiler will do a much better job, every time.</p><p>And compilers are used much more than you think. The web page you are reading now is the result of dozens of intermediary compilation steps. C code was compiled to make the Apache web server this is probably running on. Then there is your web browser. Perhaps you are using Google Chrome, it was written in C++, and compiled to assembly language. Chrome includes the V8 JavaScript engine because this webpage has JavaScript in it. V8 <em>interprets</em> the code at first, then compiles it using <em>JIT </em>(Just In Time) compilation to convert the JavaScript into <em>byte code</em> (very similar to assembly language) for a performance advantage. The JavaScript itself was more than likely originally written in <em>TypeScript</em> and then transpiled into JavaScript. Chrome also does similar interpretation/compiling for the <em>HTML</em> and <em>CSS</em> on the webpage. Again, the CSS was almost certainly first written in another language such as <em>LESS</em>, and then transpiled to CSS.</p><p>So programming already uses industrialization in a very limited sense. Every day, billions of lines of machine code are mass-produced by compilers that do the job with higher quality, reliability and safety than if the same code was being written by hand.</p><p>But this is only the beginning. There is so much oppotunity to apply industrialization to the rest of application development.</p><h4>What are these new options?</h4><p>What IT needs to industrialize is to adopt a similar approach. Currently, we take our best engineers, and we tie them up by putting them on our most important projects. What we should do instead is put them on creating <em>components</em> that can be easily (and safely) assembled by less skilled developers.</p><p>Large IT departments should be building their own proprietary no-code platforms, dedicating their top talent to maintaining these platforms, which can then be used by junior programmers, business analysts, and tech-savvy business people to <em>assemble </em>apps out of pre-built, pre-tested and debugged, drag and drop components.</p><p>Frameworks already exist to accelerate this process so IT departments do not need to reinvent the wheel. Some of them offer pixel-perfect UI controls, the ability to change the way code is generated, and total source code visibility with no “black boxes” or proprietary libraries to worry about.</p><p>These tools do away with the restrictions or concerns Bryan Bates lists: licensing, specialized capabilities, performance tweaking, and top-notch UI/UX because the IT department has the ability to build all of this into a no-code platform that <em>they totally control</em>.</p><h4>Why should IT want to do this?</h4><p>The benefits to business are clear, but there are also many benefits for the IT department. A few of the most important are:</p><ul><li><strong>Fewer bugs.</strong> Once a component is debugged all future uses of it are safe.</li><li><strong>Truly Agile.</strong> With an average dev time of 2–3 days for a new component, who needs project management?</li><li><strong>Lower governance costs. </strong>With components being for reuse <em>by definition</em>, all dev work is automatically capitalizable, who needs stage/gate?</li><li><strong>More satisfying work.</strong> What senior engineer enjoys moving a button two pixels to the left? Designing for reuse is inherently more interesting than pushing out “compromise code” to “just get it done” by some deadline.</li></ul><h4>In summary</h4><p>The real new face of Agility <em>is</em> <em>not</em> bypassing the IT department. Businesses tried that in the 90s and it didn&#39;t work. The real new face of Agility is fundamentally changing the way the IT department works: getting it out of the business of <em>projects</em> and into the business of <em>platforms</em>, <em>no-code platforms</em> for internal use.</p><p>Adam Zachary Wasserman is the author of <em>The Chaos Factory: The inside story of IT failure, </em>available at <a href="https://www.chaosfactorythebook.com/"><em>www.chaosfactorythebook.com</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a21e63acd057" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI and the Consciousness Gap]]></title>
            <link>https://medium.datadriveninvestor.com/ai-and-the-consciousness-gap-62727862dce8?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/62727862dce8</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[philosophy]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Mon, 24 Feb 2020 20:34:53 GMT</pubDate>
            <atom:updated>2022-06-13T18:44:40.300Z</atom:updated>
            <content:encoded><![CDATA[<h4>The difference between knowing and thinking</h4><p>AI means a lot of things to a lot of people. Usually what it means is not very well thought out. It is felt, it is intuited. It is either adored, worshipped or deemed blasphemous, profane, to be feared.</p><p>In this article, I explore what society at large really means by artificial intelligence as opposed to what researchers or computer scientists mean. I want to clarify for the non-technical audience what can realistically be expected from AI, and more importantly, what is just unrealistic pie-in-the-sky speculation.</p><p><a href="https://www.datadriveninvestor.com/2019/02/28/4-books-on-ai/">4 Books that Challenge Your View on Artificial Intelligence and Society | Data Driven Investor</a></p><p>I am worried that blind fear — or in some cases worship — of AI is being used to manipulate society. Politicians, business people, and media personalities craft narratives around AI that stir up deep emotions that they use to their advantage. Meanwhile truth is only to be found in dense technical literature that is out of reach for the ordinary person.</p><h3>What do we mean by intelligence?</h3><p>Is intelligence a purely human characteristic? Most people will consider some dogs to be more intelligent than others. Or dogs to be more intelligent than Guinea pigs, so clearly intelligence is something that an animal can have.</p><p>If a dog can have intelligence, can a bird? How about an earthworm, or a plant? Where do we draw the line? There are many definitions of intelligence, but one that I like (<a href="https://en.wikipedia.org/wiki/Intelligence">from Wikipedia</a>) is:</p><p>“the ability to perceive or infer information, and to retain it as knowledge to be applied towards adaptive behaviors within an environment or context“.”</p><p>Seems reasonable? Some people argue that by this definition even <a href="https://en.wikipedia.org/wiki/Intelligence#In_plants">plants can be intelligent</a> So why not computers?</p><p>This is the intelligence to which AI researchers generally refer. Yet the reality is that when average people speak of or think about AI, they are not thinking about plants or animals. Most people would not get too excited one way or another about the idea that a computer might be able to operate at the level of a plant, a guinea pig, or even a dog.</p><p>Equally, people do not really care if a machine can do what its creator intends it to do; what it is programmed to do. Handguns are created to kill people, and they do, yet no one worries that handguns will develop consciousness and kill all the humans — as they are “programmed” to do.</p><p>If we are going to be honest, we must admit that what the average person means by “artificial intelligence” is really “artificially like a human”, and what they worry about (or celebrate) is the possibility that AIs could spontaneously come up with motivations of their own.</p><h3>The human factor</h3><p>Motivation is key; human motivation has a different quality than that of all other animals, and this difference is arguably what makes humans unique.</p><p>The great mathematician and computer pioneer Alan Turing had suggested that instead of asking what it is to be human — which he considered a practical impossibility — we could simply say: “if it walks like a duck and quacks like a duck.” .</p><p>Turing’s proposal was that if a computer program could pass a written interview without the interviewer realizing that they were interacting with a computer, then the computer could be said to be for all practical purposes an artificial intelligence that was human in character. However this does not really answer the question of whether a computer program could make the same kind of complex decisions in real time that a human does, whether it can have motivations that were not preprogrammed into it.</p><p>Above all, a written interview encompasses only a very small part of human experience. We live in a world of action, and many actions have very real and immediate consequences. The decision of whether or not to walk down a dark alley is a complex one, and many of the factors that influence our decision are unknown. Every day we make decisions without knowing all the data, and the fact that the human race survives and thrives is indisputable proof that on the whole we are amazingly successful at doing this — if one defines success as survival.</p><h3>Value making machines</h3><p>How we pull this trick off is a matter of debate. But most serious scholars would agree that it is almost unavoidably the case that the human propensity for assigning value is at the heart of things.</p><p>Humans are “value making machines” and we do it at a speed that no computer network could hope to match. If you hear an unexpected sound, you will have a reflex action in 170 milliseconds. To put this in perspective: it is 30 milliseconds faster than Google’s recommended time for the first byte of data to hit your browser after you click on a link, and Google recommends a 500 millisecond time for the page to finish loading after the first byte.</p><p>Loading a web page is a trivial action for a computer, and still it takes more than twice as long for the computer to do this as it does for your brain to figure out whether an unexpected noise is threatening (a snapping twig or a metallic sound) or delightful (ice cream truck bells or a child’s laughter) — which by the way: it does instantly and with virtually no data at all.</p><p>Identifying something as threatening or delightful is what we mean by assigning value, and it is something that we do instinctively, automatically, “without thinking”. Yet without doing it, we would be unable to “think” as we know it.</p><p>Say you are thirsty; you must solve the problem of what to drink, then you must solve the problem of getting it.</p><p>Suppose your choice of what to drink is between pond water and fresh sparkling well-water. You are thinking right now that obviously we want the well-water. But what if you are an escaped prisoner, and the pond water is safely out of site in the forest, and the well is in a town square where you might be seen? Now you are thinking pond water. You are motived by thirst, but you are more highly motivated to remain free. This is because the value you place on staying free is much higher than the value you place on the freshness of your water.</p><p>Human motivation is completely dependent upon values. A thirsty dog will simply drink from the first available water it finds, because its motivation is survival, unaffected by values.</p><p>Let’s consider an example unrelated to survival: would you push a button that would definitely kill one person, or would you refuse to push it even if it meant that 10 people might die. Your thinking about this question is not in any related to your own physical survival, yet it has a moral urgency that few people could deny. Your thinking will be entirely directed by the values that you assign while evaluating your options.</p><h3>Where do these values come from?</h3><p>The truth is that we don’t know.</p><p>For some it is a question faith. Sincerely religious people belive that our values are a reflection of God’s will.The few people who truly believe in evolutionary theory and all of its implications would say that our values are that/those which allow(s) us to survive and which consequently perpetuate itself/themselves.</p><p>Almost everyone else holds the view that values are a self-evident truth. That we have these values because we all have them, that it is just obviously so. As Sam Harris <a href="http://www.edge.org/discourse/vote_morality.html#harriss">puts it</a>:</p><p>“When we really believe that something is factually true or morally good, we also believe that another person, similarly placed, should share our conviction”.</p><p>As far as a claim to understanding goes, this is weak tea. It provides no useful grounding for explaining why some values are culturally dependant, while others seem to be universal or nearly so. It does not explain the origin of values, and so for the most part, the religious and the evolutionists notwithstanding, we have no useful explanation of how values work.</p><p>It is in values that we find the <em>consciousness gap</em>. In the above example you are motivated by thirst, a biological factor. An AI, equipped with the appropriate sensors, could also have that sort of motivation, for example the need to charge a battery that is running low.</p><p>But what motivates you to take a picture of something beautiful to share with your loved ones, or to argue politics with your friends? What motivates you to watch a scary movie or to learn a sport? What about the button pushing example: on what basis could a computer make a decision like that without a human first providing values such as one life is worth less than ten, or that killing is wrong no matter what the circumstances. Our morality, our ability to assign value in the blink of an eye, has evolved over millions of years. How would a computer — in a single generation mind you, because they have no natural reproductive mechanism — arrive at a moral grounding on its own, without a blueprint first being provided by a human?</p><p>Would we even want it to? Human history suggests that tens of thousands of generations were required before we arrived at what we now consider civilized behaviour. Would we really want a race of AIs to make the same slow and painful march towards civilization?</p><p>Sure we could give them a “jump-start” but then we are back to the consciousness gap: if we program in the jump start, basically programming in the values of some human, can the AI be said to truly have human-like consciousness, capable of spontaneous motivations? As you may have guessed; I believe the answer is probably not.</p><h3>Wherein the danger</h3><p>This is not to say that AI is totally and completely uninvolved with anything dangerous or any area for concern. The use of AI is no more and no less subject to the law of unintended consequences than any other field of human endeavour. We can be absolutely certain that the use of AI for things such as curating the content of your social media feed will lead directly to unforeseen results that many people do not like.</p><p>This is not due to to any inherent quality of AI. It is the nature of the world in which we live. It is inherent to human decision making, and whether that decision is to import Cane Toads into Australia (to control pests), or to use AI to make automated stock purchases, the overwhelming probability is that catastrophe will ensue.</p><h3>Party tricks</h3><p>We cannot imagine trying to present the “button problem” to a dog. We have no reason to believe that a dog would have any moral framework within which to make the problem relevant, no reason to believe that dog would care one way or another.</p><p>We have no more reason to believe that we could present this problem to an AI than to a dog. We have no evidence at all that any AI anywhere has a moral framework guided or informed by the sort of spontaneous value-making that marks humans. It is irrelevant that computers can calculate faster than a human or can predict certain classes of problems faster or better. Winning a chess game against a human is a landmark in programming and computer science, but it is of little consequence in the real world. The ability to calculate a very large number of permutations within a very strict, and very limited, set of rules is in no way indicative of general intelligence or the ability for a computer to develop consciousness.</p><p>Computers being able to triage and diagnose medical conditions as well as — or possibly better than — human doctors is also not quite as impressive as it sounds. To be sure it is very helpful to automate checklists and decision trees; in a medical emergency a computer is faster than cracking a book. And it is true that without these checklists, humans are prone to all sorts of perceptual and cognitive biases, but you would be very wrong if you assumed that the AI that can do triage can also decide if the shadow in front of your car is a cardboard box or a child on a tricycle.</p><p>Sensationalism sells. The sky is always falling, and the failure of last week’s prophecies of Armageddon (the “Y2K bug” or New York City’s West Side Highway <a href="https://www.salon.com/2001/10/23/weather/">under water by 2019</a>) never seem to slake people’s thirst for this week’s prediction of impending doom. The same can be said for sensationalist idealism. The repeated failure of utopian ideologies to actually produce the predicted earthly paradise seems in no way to hinder the convictions of the true believers that this time. ..</p><p>AI is nowhere near as exciting, or mysterious, or dangerous, or magnificent, as it promoters and detractors would have you think. It has become for the most part a branch of the mathematics of probability, glorified actuarial work. It has all the sex appeal of an otaku or anorak lecturing on their favorite subject. It is a one trick pony.</p><p>In short: it is nothing to worry about or get excited about. We return you to our regularly scheduled program.</p><p>Read <a href="https://chaosfactorythebook.com/">my book</a> about fixing IT</p><p>Hi! This is Ankita, community manager of DDI (<a href="https://medium.com/datadriveninvestor">https://medium.com/datadriveninvestor</a>), one of Medium’s fastest-growing publications. We are a community of over 25,000 industry experts in Tech, Finance and Entrepreneurship. Are you interested in publishing with us? here’s how you can submit an article for review:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fupscri.be%2Fb2a0d6%3Fas_embed%3Dtrue&amp;dntp=1&amp;display_name=Upscribe&amp;url=https%3A%2F%2Fupscri.be%2Fb2a0d6%2F&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=upscri" width="800" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/0707f5c806284d01a4a13c7b13a91ce3/href">https://medium.com/media/0707f5c806284d01a4a13c7b13a91ce3/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=62727862dce8" width="1" height="1" alt=""><hr><p><a href="https://medium.datadriveninvestor.com/ai-and-the-consciousness-gap-62727862dce8">AI and the Consciousness Gap</a> was originally published in <a href="https://medium.datadriveninvestor.com/">DataDrivenInvestor</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Is Automation Going to Eat Your Job?]]></title>
            <link>https://medium.com/swlh/is-automation-going-to-eat-your-job-2ab021d05c2?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/2ab021d05c2</guid>
            <category><![CDATA[work]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[business]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Wed, 30 Oct 2019 22:01:25 GMT</pubDate>
            <atom:updated>2023-10-11T17:20:15.886Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/942/1*Y_qQuPv4a31UEeGO2O9aHA.png" /></figure><h4>Some data suggests not…</h4><p>Current common wisdom has it that everyone will be losing their job to automation real soon now. AI is going to eat the world, and the US needs universal basic income because all the truck drivers are all going to lose all the jobs this week, or next week at the latest.</p><p>I have my doubts.</p><p>I suspect that many readers will be difficult to convince, so before I get to my argument I’ll just put forward a few facts.</p><h4>A Few Facts About Employment</h4><p>In its 2017 executive summary, the International Federation of Robotics informs us that 35% of the world’s industrial robots are purchased by the automotive industry putting it ahead of even the semiconductor and electronics industries. Auto manufacturers’ use of robots has been steadily increasing since 2010. Let’s take a look at what the US Department of Labor <a href="https://data.bls.gov/timeseries/CEU3133600101?amp%253bdata_tool=XGtable&amp;output_view=data&amp;include_graphs=true">has to say</a> about employment in that industry since 2010…</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*jKfBqa4tg0qdeFEn" /><figcaption><a href="https://data.bls.gov/timeseries/CEU3133600101?amp%253bdata_tool=XGtable&amp;output_view=data&amp;include_graphs=true">https://data.bls.gov/timeseries/CEU3133600101?amp%253bdata_tool=XGtable&amp;output_view=data&amp;include_graphs=true</a></figcaption></figure><p>Note that these numbers are for jobs in <em>motor vehicles and parts manufacturing,</em> the jobs that would be most affected by automation. It does not include the jobs that would not be affected by automation: wholesale, retail, or repair and maintenance jobs. In fact, the <a href="https://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=5&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwi1nqTpnK7lAhVuHjQIHcqPAE4QFjAEegQIBxAG&amp;url=https%3A%2F%2Fissuu.com%2Fdetroitregionalchamber%2Fdocs%2F2017-18_state_of_the_region&amp;usg=AOvVaw0Wsyq1fBnaAVzj6Npk4Y51">2017–2018 State of the Region report by the Detroit Regional Chamber</a> notes that “<em>mechanical and industrial engineers saw the largest growth</em>”.</p><p>On the flip side, In the Chinese factory city of Kunshan, Foxconn<a href="https://www.scmp.com/news/china/economy/article/1949918/rise-robots-60000-workers-culled-just-one-factory-chinas"> claims</a> it has reduced its workforce by 60% through automation.</p><h4>A Few Facts About Wages</h4><p>Now let’s turn to South Korea. In its Executive Summary World Robotics, the International Federation of Robotics observes that:</p><blockquote><em>“The countries with the highest robot densities by far are the Republic of Korea (710 robots per 10,000 employees) and Singapore (658 robots). The Republic of Korea has had by far the highest robot density in the manufacturing industry since 2010.</em>”</blockquote><p>What impact is all this automation having on wages? Has it turned South Korea into a worker’s dystopia with starvation-level wages? It turns out that South Korea’s minimum wage <a href="https://en.wikipedia.org/wiki/Minimum_wage_in_South_Korea">is 8,350 won</a> ($ 7.37 USD) per hour, 12¢ higher than in the USA.</p><p>In Singapore, the <a href="https://stats.mom.gov.sg/Pages/Income-Summary-Table.aspx">year over year growth in median income</a> has outstripped western countries (showing <a href="https://stats.oecd.org/Index.aspx?DataSetCode=AV_AN_WAGE#">US, UK, Germany and Canada</a> for comparison) by a considerable margin since 2010.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/814/0*IJr_eQJDnZ29QR3N.png" /></figure><h4>Some Old(er) Facts</h4><p>Peter Lindert and Jeffrey Williamson produced a <a href="https://www.jstor.org/stable/2598895?read-now=1&amp;refreqid=excelsior%3Aa22c51947da04d929a390f05aafc8ecd&amp;seq=12#page_scan_tab_contents">rigorous analysis</a> of Earnings and Cost of Living indices in the United Kingdom pre and post Industrial revolution. Their conclusion is that both wages <em>and</em> standard of living increased dramatically post Industrial Revolution. People made more money, and the essentials of life cost less.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/596/0*GWGA49vAXqTGzA-d.png" /></figure><p>Even their harshest critics, such as Charles Feinstein, do not dispute the increase, but merely the size or rate of the increase.</p><p>Clark Nardinelli, author of Child Labor and the Industrial Revolution, and professor at Clemson University writes:</p><blockquote>“The standard-of-living debate today is not about whether the industrial revolution made people better off, but about when”</blockquote><h4>Interpreting the Facts</h4><p>The numbers from the US auto industry are unambiguous. Increased automation simply has not resulted in fewer jobs. With the data I have, it is impossible to claim with certainty that automation has <em>increased</em> jobs (I cannot establish a causal link), but since jobs have increased, it is clear that nothing, not automation or anything else, has resulted in job losses.</p><p>As for the Foxconn claim, I would remind the reader that this is a PR release by a commercial entity, not statistics from a government agency. What the government stats <em>do</em> show (in the same article from South China Morning Post) is that the number of laptops produced in Kunshan is down to 51 million from a high of 120 million due to declining sales. It is a reasonable possibility that Foxconn may have simply reduced its workforce as a result of lower sales volumes. Of course, framing it as the result of modernization makes for the better press, so I remain skeptical that a 60% labour force reduction is due to automation when a 60% decrease in demand is a much more likely explanation.</p><p>I tend to favor the analysis that attributes increased wages and standard of living in Industrial Revolution Era, England to a virtuous circle of automation leading to affordable products of a standard quality leading to increased production, leading to higher wages and increased labor force which in turn leads to greater disposable income and higher demand for the aforementioned affordable quality products.</p><p>This latter fact is undeniable. From the first truly automated production — the manufacturing of naval block and tackle in the Portsmouth Naval Yard using machines designed by Samuel Bentham, Henry Maudslay, and Marc Isambard Brunel — automated manufacturing has led directly to lower prices, fewer defects, and better quality-to-price ratios.</p><p>I am not trying prove conclusively that automation will always increase employment and improve the standard of living using only two examples.</p><p>I am making the point that there reasons to question the current narrative and view it critically. These examples, and many others, are proof that automation does not <em>always</em> create job loss. As to whether it <em>sometimes</em> does, that is too extensive a question to handle in one small article.</p><h4>Enough About Manufacturing</h4><p>So far I have focused on manufacturing. So what about service jobs? Wait staff and drivers?</p><p>It is instructive to note that since the introduction of the Airbus 320, modern aeroplanes are entirely capable of automated take-off and landing, and preventing certain types of accidents due to pilot error. Yet the presence of a human pilot is considered essential. And in certain documented cases, the automation causes accidents instead of preventing them.</p><p>A commercial airliner takes off and lands in a highly controlled environment. The runways are restricted, only one aeroplane at a time uses them, there are no children, dogs, or other drivers to worry about. Nevertheless “<a href="https://www.flightdeckfriend.com/can-a-plane-land-automatically">Automatic landings probably account for </a>less than<a href="https://www.flightdeckfriend.com/can-a-plane-land-automatically"> 1% of all landings on commercial flights</a>” according to FlightDeckFriend.com (a website built by Pilots for Pilots). This is the best that can be achieved for machines that cost billions of dollars to design and certify, and that sell for hundreds of millions of dollars.</p><p>There are roughly 3.5 million commercial truck drivers in the US. They drive in heavy traffic surrounded by unpredictable drivers, and innocent pedestrians. Not only that, but a tractor-trailer cab sells for only $100,000, not $200,000,000. How are we to imagine millions of robotic trucks safely navigating infinitely more complex traffic situations than a runway, using robotic systems that will have to cost a thousand times less than the ones on a commercial jet? I hope the reader will understand my skepticism.</p><p>Fred LeFranc, the founder and CEO of Results Thru Strategy, which advises hospitality firms <a href="https://gizmodo.com/this-was-the-year-the-robot-takeover-of-service-jobs-be-1831233632">says</a>:</p><blockquote>“We are at the place where the most repetitive tasks can be performed by a robot, and they don’t call in sick, they don’t talk back.”</blockquote><p>As they used to put it rather quaintly in my hometown of New York: It is to laugh.</p><p>Robots = mechanics + computer + programming. How could that possibly go wrong? My computer doesn’t call in sick. Instead it crashes when I am on the last paragraph of a 1000 word essay, and then when I reboot it, my file is corrupt and unusable. My washing machine does not talk back. Instead it just stops working until I call a service tech — who takes two weeks to show up and then does not have the necessary part with him when he does. Yeah, robot employees would be just delightful. At least when human calls in sick you can guess when they will be better, and even if they talk back, at least they on the job… which is more than I can say for my washing machine.</p><p>The McKinsey Global Institute claims that fewer than 5% of occupations could be completely automated (<a href="https://www.mckinsey.com/featured-insights/digital-disruption/harnessing-automation-for-a-future-that-works"><em>A Future That Works: Automation, Employment, and Productivity</em></a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*ErGm8JYMfIbuDMLc" /></figure><p>Obviously I am inclined to believe them, and I think you should too. Politicians are attempting to manipulate the public through fear, and that is not a good thing. Social engineering experiments produce unintended consequences far more frequently than they work out exactly as planned.</p><p>I encourage the reader to take heart in the fact that despite the non-stop predictions of the end of the world, civilization, and humankind, the world keeps turning and the overall condition of humanity is increasingly better over time. Some individuals will definitely lose their jobs to automation, and it will be difficult for them, but civilization is not coming to end — not for this reason in any case — and we should not overreact. When someone tries to convince you that it is, I believe you should demand the same kinds of facts and analysis that I have provided here instead of just taking them on faith.</p><p>I suggest that the most likely reaction of society and the job market in the face of this latest round of automation will be the same as it has been for millennia: better goods, more affordability, increased overall employment, and a higher standard of living. If you do not believe me; ask yourself if you would rather be living in pre-industrial England with a life expectancy of 40 years and one out ten children dying before they turned one year old.</p><p>My book <em>The Chaos Factory: The inside story of corporate IT failure</em> is available <a href="https://amzn.to/36iNUt1">here</a> at Amazon.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ab021d05c2" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swlh/is-automation-going-to-eat-your-job-2ab021d05c2">Is Automation Going to Eat Your Job?</a> was originally published in <a href="https://medium.com/swlh">The Startup</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Interpreted, compiled. what. ever.]]></title>
            <link>https://medium.com/@adam.wasserman/interpreted-compiled-what-ever-7edebf774ed1?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/7edebf774ed1</guid>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[coding]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Tue, 27 Nov 2018 16:36:02 GMT</pubDate>
            <atom:updated>2019-10-31T12:17:17.866Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/891/1*-dqwHWsrX_uSpvr3Cl4VGQ.png" /></figure><h4>CPUs speak only one language; they don’t care what language you write in</h4><p>Programmers tend to make a big deal over the supposed difference between compiled languages and interpreted ones. Or dynamic languages vs. statically typed languages.</p><p>The conventional wisdom goes like this: A compiled language is stored in machine code and is executed by the CPU with no delay, an interpreted language is converted to machine language one instruction at a time, which makes it run slowly. Dynamic languages are slower because of the overhead of figuring out type at runtime.</p><h4>The reality is nothing like this</h4><p>A long long time ago, when programmers wrote to the bare metal and compilers were unsophisticated, this simplistic view may have been somewhat true. But there are two things that make this this patently false today.</p><p>The first thing is that all popular programming languages these days — Java, JavaScript, Python, Scala, Kotlin, .NET, Ruby — all run on virtual machines. The virtual machines themselves are written in a variety of languages*.</p><p>The second thing is that VMs make it easier to easier to observe the program’s execution, which in turn makes JIT (Just in Time) compilation possible.</p><p>So how about a real example that illustrates why this matters: Java.</p><p>Java is compiled. Or is it? Well… sort of not really. Yes there is a compiler that takes your source and creates Java bytecode, but do you know what the JVM does with that bytecode as soon as it gets it?</p><p>First it build a tree. It <em>disassembles </em>the Java bytecode and builds a semantic tree so that it can figure out what the source code was trying to do. In order to accomplish this it must undo all of the snazzy optimizations that the compiler has so carefully figured out. It throws away the compiled code.</p><p>That sounds crazy! So why does it do this? The answer to that question is the key to understanding the title of this article.</p><h4>The best way to understand code is to watch it running</h4><p>This applies to humans, but it applies just as well to compilers. The reason why the modern JVM undoes the compilation and the optimizations is that <em>“conventionally” compiled Java bytecode runs too slowly on the JVM</em>. To attain the speed of execution for which Java is known these days, the JIT has to throw away the code that was statically compiled (and statically optimized) and “watch” the code running in JVM, and make optimizations based on the code’s actual behaviour at run time**.</p><p>Don’t go around saying things like “[<em>insert language name here</em>]is too slow because it is interpreted” because that is simply not true. Languages are just syntax and can have many implementations (for example there are several implementations of Java). You could say “[<em>insert language name here</em>] is slow because the interpreter/VM doesn’t have JIT” and that might be true.</p><h4>Languages are not fast or slow</h4><p>C++ is not a faster <em>language. </em>C++ runs fast simply because more hours have been spent on the compiler optimizations than for any other language, so of course they are better. It is worth noting that programs compiled using PGC++ and Clang are regularly 2 or 3 times faster than the same source code compiled using the AOCC compiler. This is proof that it is the compiler and its optimizations — not the language itself — that dramatically affect execution performance.</p><p>Java is generally considered next fastest, and that is because it has had more hours invested in its JIT compiler than anything except C/C++.</p><h4>Framework or Language redux</h4><p>But it is not <em>all </em>down to the compiler. I have <a href="https://hackernoon.com/framework-or-language-get-off-my-lawn-9935e1c72019">already written</a> about the dangers of unexamined libraries and frameworks. The article could also have been titled <em>Syntax or Library: Do you know which one you are using? </em>I asked a <a href="https://medium.com/@pauli">trusted friend</a> to review this article, and brought up the very good point that memory access patterns are the big performance culprit overall. He made the point that C programs benefit from the fact that…</p><p><strong><em>“</em></strong><em>C only has primitive arrays and structs (but it’s very liberal with pointers so you can pretty much wrangle anything into these primitive structures with enough patience). Working with hashmaps or trees can be very painful, so you avoid those. This has the advantage of nudging you towards data layouts that make effective use of memory and caches. There’s also no closures and dynamically created functions, so your code and data mostly stay in predictable places in memory.</em></p><p><em>Then look at something like Ruby, where the language design encourages maximum dynamism. Everything tends to be behind a hashmap lookup, even calling a fixed unchanging method on an object (because someone might have replaced that method with another since you last called it). Anything can get moved or wrapped in yet another anonymous closure. This creates memory access patterns with a scattered “mosaic” of little objects scattered all over the place, and the code spends its time hunting each piece of the puzzle from memory which then points to the next one.</em></p><p><em>In short, C encourages very predictable memory layouts, while Ruby encourages very unpredictable memory layouts. An optimizing compiler can’t do much to fix this.</em><strong><em>”</em></strong></p><p>I had to agree. Which led me to articulate my point thusly: Programmers who do not understand where syntax stops and libraries begin are doomed to write programs whose execution they do not really understand.</p><p>My belief is that it is more difficult to write a truly awful C program because (if it runs at all) it would be too much work to manually reproduce the memory chaos that Ruby so casually produces.</p><p>We then had an interesting chat about how a certain large tech company created a “cleaned-up PHP++”. He has some interesting things to say, maybe he will write an article about that.</p><p>Thank you for your help <a href="https://medium.com/@pauli">Pauli</a>.</p><p>So an implicit part of my contention is that modern programming languages lower the bar so that many programmers do not think about about basic computer science (memory structures and computational complexity), and therefore have no basis upon which to understand how their programs will execute.</p><p>The other part of my contention is that any Turing complete language could run about as quickly as any other when considered from a pure syntax perspective. For example I believe that it would absolutely possible to create a high performance implementation of Ruby on let’s say the JVM. I readily acknowledge that most current Ruby code would break on that system, but that is as a result of the programming choices made in the standard libraries, not as a fundamental constraint of the language (syntax) itself.</p><p>I have say, (as a self-admitted cargo cult programmer) that it is definitely possible that I just don’t understand Ruby syntax and/or the <a href="https://en.wikipedia.org/wiki/Church%E2%80%93Turing_thesis">Church–Turing thesis</a>.</p><h4>CPUs (or VMs) speak only one language</h4><p>Ruby and its shotgun approach to memory management notwithstanding; any programming language that would have as many hours invested in optimizing its compilation as Java or C, would run just as fast as Java or C and this is because CPUs (and VMs) speak only one language: <em>machine language</em>. No matter what language you write in, <em>sooner or later it gets compiled to machine language </em>and the things that affect performance are how fundamental computer science principles are implemented in the standard libraries, and how <strong>effective</strong> the compilation is, <strong>not</strong> when it happens.</p><p>The moral of the story is that programmers should spend less time crushing out on languages and more time understanding how they work under the hood.</p><p>I will finish with a quote from the great Sussmann:</p><blockquote>“…computers are never large enough or fast enough. Each breakthrough in hardware technology leads to more massive programming enterprises, new organizational principles, and an enrichment of abstract models. Every reader should ask himself periodically ‘‘Toward what end, toward what end?’’ — but do not ask it too often lest you pass up the fun of programming for the constipation of bittersweet philosophy.”</blockquote><p><em>* The original Sun JVM was written in C. The original IBM JVM was written in SmallTalk. Other JVMs have been written in C++. <br>The Java API (class libraries without which most Java programmers would unable to make even a simple application) are written in Java itself for the most part.</em></p><p>** <em>It is worth noting that this happens again when the machine language of the VM “hits” the hardware CPU, which immediately takes a group of instructions, breaks them apart, looks for patterns it can optimize, and then rebuilds it all so it can pipeline microcode.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7edebf774ed1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sic mundus creatus est]]></title>
            <link>https://medium.com/hackernoon/sic-mundus-creatus-est-8528084ce87c?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/8528084ce87c</guid>
            <category><![CDATA[art]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[sic-mundus-creatus-est]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Tue, 20 Nov 2018 14:06:14 GMT</pubDate>
            <atom:updated>2018-11-24T22:24:09.807Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tBrVDvqBHM_ZpX0AHfnzxQ.jpeg" /><figcaption>Willmann: Creation of the world (1668)</figcaption></figure><h3>The invisible art of programming</h3><h4>No art form is less visible than that of the programmer for whom “humble labour and profound obscurity” are preconditions of the medium.</h4><p>But first a word on art: Programming is is like writing music. There is no one true way to write a melody, but there are plenty of wrong ones. There are many combinations of notes that will be absolutely displeasing to all who listen to them, but amongst the many combinations are a few that will please almost anyone.</p><p>Similarly, there is not one true way to write a program.</p><p>A programmer’s coding style is unique and identifiable. Programmers are able to recognize the author of a piece of code once they know their style.</p><p>Code can be funny. I have spotted more than one joke in reading other people’s code, and I have left a few of my own when writing my code. But I will never know if anyone saw them and laughed.</p><p>Authors of poetry and prose can hope that once published they will be treated to some kind of feedback. They might even achieve fame and recognition. When I write these articles, I get comments (and thank you for that). Yet code by its nature is invisible. Code running on a server is inaccessible by design. Complied code even more so. Open source code is available for all to see, but disconnected from an operating environment, detached, intangible, inscrutable to most people, even other programmers.</p><p>No programmer has ever been awarded a medal or interviewed on television because of the elegance and expressiveness of their code, but this does not mean that code cannot be elegant or expressive.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*60fY8H12mK6UY-KS.png" /></figure><p>Code is so expressive that it creates whole worlds, whole universes. Self-contained universes, <em>Hermetic</em> universes, whose <a href="https://en.wikipedia.org/wiki/Prisca_theologia"><em>prisca theologia</em></a><em> </em>is the <a href="https://en.wikipedia.org/wiki/Physical_Church-Turing_thesis">Church-Turing thesis</a>. <br>Code is <em>Logos</em>, the <em>Word</em> that brings order out of chaos.</p><p>It is precisely this world-creating power that makes programming an art that is so difficult to master.</p><p>Lesser programmers might create a portion of the world, but the master programmer must first bring the world into being with its own rules, logic, physics, and all other manner of internal consistency. These days we tend to call these worlds <em>frameworks</em>, but languages, compilers, and even some programs (here’s looking at you Stallman) are all examples of universes created by master programmers.</p><p>Heavy is the head that wears the crown. It is hard work being the demiurge, making the rules.</p><p>Stacked one inside of the other, these worlds are like Russian dolls, each layer revealing an ever deep level. Peel away the framework, and you find the platform class libraries. Step through the class library inheritances and eventually you arrive at the language. Underneath the language you find the language, in all its glory, which covers up the machine instructions. And the machine instructions depend upon the particular micro-processor instructions, which are millions of tiny transistors with connections to each other just a few atoms wide.</p><p>We even have computers which glean information from the spin of a quark.</p><p>No medium is so pliable, so infinite in its possibilities as that of the programmer. Stone cracks and cannot be made whole. Paint is limited by its physical properties too, water-colours are unforgiving, oil darkens with age. Photography limits what can be put in frame and how much dynamic range can be captured. No such limits with code.</p><blockquote>“<em>The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds his castles in the air, from air, creating by exertion of the imagination. Few media of creation are so flexible, so easy to polish and rework, so readily capable of realizing grand conceptual structures” — </em>Frederick P . Brooks Jr.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8528084ce87c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/sic-mundus-creatus-est-8528084ce87c">Sic mundus creatus est</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Agile: the greatest struggle that never existed]]></title>
            <link>https://medium.com/hackernoon/not-your-grand-dads-waterfall-c15f60b98de8?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/c15f60b98de8</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[granddad-waterfall]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[scrum]]></category>
            <category><![CDATA[it-management]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Wed, 14 Nov 2018 16:17:33 GMT</pubDate>
            <atom:updated>2019-09-17T01:10:53.188Z</atom:updated>
            <content:encoded><![CDATA[<h4>Not your granddad’s waterfall</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WAu9DhcuRwOHHqKEGuN7xQ.jpeg" /><figcaption>Original art may be purchased from: <a href="https://www.etsy.com/shop/sharpwriter">https://www.etsy.com/shop/sharpwriter</a></figcaption></figure><p>I have been working with an Agile development shop of late, and there is something about it that I definitely do not like. I do not enjoy being “educated” by well-meaning but nonetheless smug Scrum Masters and Product Owners who assume that anyone in corporate IT has not the slightest clue. These are not <em>ad hoc</em> lectures, they are formal presentations; Powerpoint decks approved by the development shop’s executives. The implication is that the company assumes we have never even heard of Agile.</p><p>The reality is that many people in corporate IT are as familiar with Scrum (because that is the only kind of Agility anyone seems aware of these days) as they are. And some, like myself, have significantly more experience, having worked with other Agile practices such as XP, CRC cards, Crystal, <em>et al</em>. I started Agile practices (XP in 1996) before they were officially “Agile”, and for that matter before some of these Scrum Masters were born.</p><p>This attitude of smugness is nothing new, I have been more or less continually confronted by it since late 2004 when Ken Schwaber published his paper on the <a href="http://www.jeffsutherland.org/oopsla/schwapub.pdf">“SCRUM Development Process”</a> which triggered a new round of <a href="http://www.catb.org/jargon/html/H/holy-wars.html">holy wars</a> in the field of software development.</p><h3>Or did it…?</h3><p>This holy war was very one one-sided. I haven’t seen any significant opposition to the basic ideas of Scrum. What I <em>have seen </em>is two things:</p><ol><li>Annoyance with the holy fervor and maddeningly preachy attitude of the Scrum faithful, and</li><li>The requirement that anyone coding this way still conform to <a href="https://en.wikipedia.org/wiki/Project_portfolio_management">PPM</a> and <a href="https://www.stage-gate.com/wp-content/uploads/2018/06/wp10english.pdf">Stage-Gate</a> governance.</li></ol><p>It is this last point that seems to be radically misunderstood by the Scrum contingent. They seem to believe that CFOs, Business Sponsors, and Project Managers actually give a rat’s ass about how they write code.</p><p>Believe me: nothing could be farther from the truth. I can easily name a dozen common practices that would immediately cease if corporate IT management knew the least thing about (or truly cared about) how the sausage gets made.</p><h3>But what is Agile, really?</h3><p>I consider the concerns of Agile to be orthogonal to the concerns of governance strategies such as PPM and Stage-Gate, not in direct conflict to it.</p><p>I have been careful to use the word “practices” rather than “methodology”. As several of the original signatories of the Manifesto for Agile Software Development (<a href="https://www.youtube.com/watch?v=a-BOSpxYJ9M">Dave Thomas</a>, or <a href="https://blog.cleancoder.com/uncle-bob/2018/08/28/CraftsmanshipMovement.html">Bob Martin</a> or <a href="https://www.martinfowler.com/bliki/CraftmanshipAndTheCrevasse.html">Martin Fowler</a> or <a href="https://ronjeffries.com/articles/018-01ff/abandon-1/">Ron Jeffries</a>) are at great pains to point out: the original impetus for Agile practices were concerns about the craftsmanship or practice of software development, not the <em>process</em> of software development. The manifesto itself says: “<strong><em>Individuals and interactions </em></strong><em>over processes and tools</em>”.</p><p>Yet most people “doing Agile” today have this idea that they are the sworn enemies of the oh-so-evil waterfall process. It stands to reason that they also believe that Agile is a process.</p><h3>And what does Waterfall really mean?</h3><p>What most Agile developers think of as “waterfall” is actually a combination of two very widely adopted models of governance, the first being Project Portfolio Management and the second being the Stage-Gate Model.</p><p>The first and most important thing to understand about these two models is their reason for existing. They exist to protect corporate executives. They do this by demonstrating good-faith best-efforts to comply with two important Securities and Exchange Commission (SEC) regulatory requirements.</p><p>The first of these is the American Institute of CPA’s <em>Statement of Position (SOP) 98-1, </em>which was passed as a result of CFOs seeking SEC approval to account for software development costs as capital expense (CapEx) because that would allow them to report higher earnings and higher company valuations.</p><p>The second is the <em>Sarbanes–Oxley Act of 2002 (SOX)</em>, which had been passed in reaction to a number of major corporate and accounting scandals, notably Enron and WorldCom (who manipulated earnings, underreporting line costs by <em>capitalizing </em>rather than <em>expensing</em>).</p><p>To make a long story short, corporations are allowed to count software development as CapEx, but the officers of the company will be criminally liable if audits discover that this has been done improperly.</p><p>PPM and Stage-Gate were promoted by Gartner and the Project Management Institute respectively, <em>as governance that would protect corporate officers from criminal liability as regards the capitalization of software development costs</em>.</p><h3>So what?</h3><p>So… the concerns of Agile and the concerns of “waterfall” are quite separate, there is no reason why they would not co-exist peacefully. All that is required for a Scrum team to comply with almost any modern IP project governance (PPM and Stage-Gate) are six artifacts:</p><ol><li>a <strong>Project Charter</strong> which is basically just a scope document and is roughly equal to the Product Backlog.</li><li>a <strong>WBS</strong> (work breakdown structure) which can usually be satisfied with the results of Epic-level Planning Poker combined with a rough Sprint Planning</li><li>weekly <strong>Status/Progress Report</strong> is the weekly burndown report or any other form of progress report</li><li>weekly <strong>Open Risks</strong> which may not be a standard Scrum artifact but there certainly is nothing about this that is problematic in Scrum</li><li>weekly <strong>Open Issues</strong> which are a direct result of Sprint retros and therefore standard in Scrum</li><li><strong>Lessons Learned</strong> which are also a direct result of Sprint retros and therefore standard in Scrum</li></ol><p>There is nothing here that is particularly antithetical to Scrum.</p><p>Traditional Stage-Gate separates “detailed design” from “development” but it really is no big deal from the perspective of the main concern: both are admissible as CapEx, so it is materially* inconsequential whether or not they are performed sequentially, concurrently or iteratively.</p><p>* I use the the word “material” in its <a href="https://www.business-case-analysis.com/materiality-concept.html">accounting sense</a></p><h3>Conclusion</h3><p>I would urge Agilites to stop positioning yourselves as the “sworn enemy” of waterfall, you will not win. Corporate executives do not want to go to jail, and there is nothing in Agile or Scrum to protect them from that. PPM and Stage-Gate are not going away, learn to live with them.</p><p>Consider dialling back on the pre-project Scrum evangelization and focus on making things as easy and as transparent as possible for your enterprise customers, particularly the Project Management Office (PMO).</p><p>The most evangelical thing you could possibly do is simply deliver a functioning software product on-time and under-budget without creating any waves in the PMO. Just do that, and your customer will gladly be all Agile, all the time.</p><p>Actions speak louder than words.</p><p>To read more of me, get my book <a href="https://www.amazon.com/dp/B07XXM1B23"><em>The Chaos Factory</em></a><em> </em>which tells the inside story of corporate IT failure, and provides the <em>real</em> recipe to fix it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c15f60b98de8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/not-your-grand-dads-waterfall-c15f60b98de8">Agile: the greatest struggle that never existed</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hidden Figurers]]></title>
            <link>https://medium.com/hackernoon/hidden-figurers-bcd272275075?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/bcd272275075</guid>
            <category><![CDATA[hidden-figurers]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[the-first-programmers]]></category>
            <category><![CDATA[art]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Sun, 12 Aug 2018 01:10:18 GMT</pubDate>
            <atom:updated>2018-08-30T12:35:02.634Z</atom:updated>
            <content:encoded><![CDATA[<h4>The story of the first programmers will remain forever untold</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/466/1*4H6csRxIle3qzEUu80inig.png" /></figure><p>The man in the back without a jacket is Mel Kaye, about whom Ed Nather wrote his timeless classic of programmer lore, <em>TheStory of Mel.</em></p><p>The year is 1960 and although a wealth of information exists about the hardware he programmed on, nothing remains of his programming other than Ed Nather’s delightful tale.</p><h4>Hackers and hobbyists</h4><p>For the first twenty years of programming history, most programmers in the field, the ones writing the programs that got used in real life, were self-taught. There were no schools for programmers, no formal practices, nobody of knowledge, no discipline to speak of. Programmers either learned from a mentor or pursued their own individual instincts and intuitions.</p><p>The profession of electrical engineering was well organized, well documented, and acknowledged as being very significant. Computer hardware design was a recognized science and a respectable career for electrical engineers.</p><p>Meanwhile programming was a sideline that people with real careers (such as math or physics) engaged in out of personal interest. This eventually changed with the emergence of the discipline of computer science, which was focused on programming and software as the engine of innovation. Software would eventually become more important than hardware, but during these first critical years of computing history, only hardware engineering was respected, and history reflects this.</p><p>Lest the reader think that I am overstating the case of how little people thought of pro­gram­ming in those days, allow me to provide the following anecdote¹: when Edsger Dijkstra married Maria C. Debets in 1957, he was required as a part of the marriage rites to state his profession. His declaration that he was a programmer was not accepted by the authorities, because there was no such profession at that time in The Netherlands.</p><p>The typical programmer was self-taught and highly internally motivated. Apart from a small number of young prodigies, a programmer was more likely than not already highly educated, often with a Masters or PhD which was how they came to be anywhere near a computer to begin with. They tended to be a <em>very</em>smart bunch.</p><p>There were no schools or courses for programmers, and when computers cost millions of dollars there were no casual programmers. They were some of the brightest lights of humanity simply by virtue of how difficult it was to become a programmer at that time.</p><p>Yet the fruit of those minds is gone forever, they labored in obscurity.</p><p>For every Hopper or Dijkstra or Knuth or Wirth that we know a little about, there were a thousand Mel Kayes, creating works of pure genius, of elegance and rare beauty. All these works have been lost forever as the magnetic tapes and punch cards that preserved the deepest thoughts of this hidden generation became obsolete and were binned, unceremoniously and out of sight.</p><p><a href="/service/applewebdata://D1C1CA0D-C354-4EE5-941F-6D06A93E745F#_ftnref1">[1]</a><a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD03xx/EWD340.html">E. W. Dijkstra Archive</a>. &amp; James, Mike (1 May 2013). <a href="http://www.i-programmer.info/history/people/144-dijkstra.html">“<em>Edsger Dijkstra — The Poetry of Programming</em>”</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bcd272275075" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/hidden-figurers-bcd272275075">Hidden Figurers</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Is programming art…]]></title>
            <link>https://medium.com/hackernoon/is-programming-art-1429e50c21fc?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/1429e50c21fc</guid>
            <category><![CDATA[business]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[art]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Sun, 12 Aug 2018 00:16:35 GMT</pubDate>
            <atom:updated>2018-08-31T19:59:57.987Z</atom:updated>
            <content:encoded><![CDATA[<h4>…and can we really teach every child to program?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kWzexVrUHZO7jawf9yJ0Cg.png" /></figure><p>If you want 3 or 4 very different opinions on this, just ask 1 or 2 programmers. On this particular subject, some of my colleagues feel so strongly that they might even be able to flame themselves.</p><p>And the meanings of words….</p><h4>The dictionary</h4><p>If we were to stick to dictionary definitions there is no question. Art is defined by the OED as “<em>The expression or application of human creative skill and imagination…</em>”, and Webster’s has this to say: “<em>skill acquired by experience, study, or observation</em>”.</p><p>Programming is clearly a human creative skill acquired by experience, so that is that.<em> Bam!</em></p><p>But lets take a more nuanced approach.</p><h4>Programming vs. software application development or production</h4><p>The two are <em>not</em> the same thing. All software applications involve <em>some</em> programming (surprisingly little usually), but not all programming is for the production of a software applications.</p><p>Definitions of what a “software application” is vary a little, but generally agree that is a special kind of program; a program that is designed for the end user. This means that it has certain defining characteristics: a user interface, it usually allows the user to enter data, it often has logic, and it almost always provides the user some way to interact and trigger the execution of functions.</p><p>Not all programs look like this. There are about a million lines of code in a car that do not do any of these things. And more code that makes the traffic lights in your neighbourhood work, and some more in your flat panel TV set that does quite a bit of image processing — without any interaction from you.</p><h4>Application development…</h4><p>…involves very little actual programming.</p><p>Alexander Stepanov, the primary designer and implementer of the C++ Standard Template Library, relays to us that Scott Byer, the architect of Adobe Photoshop, estimates that 90% of developer efforts are dedicated to “glue” and housekeeping tasks such as memory management, scripting, UI management, file I/O, and color management. 10% is spent on “substance”. He provides the following estimates of how much time is spent on what he deems “substance” for a variety of application types:</p><p>• Word processing — 3%<br> • Presentation App — 1%<br> • Databases — 10%<br>• Technical/CAD — 30%<br>• Operating System — 1%<br>• Enterprise Application Software — 1%</p><p>From <a href="https://hackernoon.com/the-story-of-me-a-real-programmer-ba37a720395b">personal experience</a>, these numbers sound just about right to me.</p><h4>Now about programming</h4><p>Programming is like writing music; there is no one true way to write a melody, but there are plenty of wrong ones. There are many combinations of notes that will be absolutely displeasing to almost all who listen to them.</p><p>Similarly, there is not one true way to write a program.</p><p>Programming is like literature; nobody would confuse even a single paragraph of Umberto Eco with a paragraph of Richard Brautigan.</p><p>Similarly, a programmer’s coding style is as unique and identifiable as the styles of any author in any medium. Programmers can easily recognize each other’s work once they know a particular programmer’s style.</p><p>Programming is like painting; what you <em>don’t</em> paint is as important as what you do. Negative space defines form, adds depth.</p><p>Similarly, more lines of code is <em>not</em> better. Top notch programmers measure the success of refactoring by how many lines of code are <em>removed, </em>not by how many lines were<em> added.</em></p><p>Programming is like dance; anyone can dance, but only a <em>very few </em>people can dance well enough to be paid for it.</p><p>To write <em>good</em> code a person has to have a certain kind of mind, a mind that can analyze messy human processes and practices, and then boil it down to formal logic.</p><p>A good programmer needs abundant patience. Far more patience than the average person has, because :</p><blockquote><strong>“Computers are like Old Testament gods; lots of rules and no mercy.”</strong></blockquote><blockquote><strong>~ Joseph Campbell</strong></blockquote><p>A good programmer has to be able to mentally process things that are quite simply impossible for most people, such as <em>recursion</em>, or <em>concurrency</em>, or <em>callbacks</em> or <em>closures</em>.</p><p>…and that brings us to the second question</p><h4>Can we <em>really</em> teach every child to program?</h4><p>I cannot even fathom that anyone takes this question seriously.</p><p>We might as well ask if we could teach every child to perform appendectomies. Doctors are in short supply, it would make a lot of sense to increase the supply of doctors and surgeons by teaching all children to become medically literate, no?</p><p>Or maybe we could teach every child to become a teacher, then we wouldn’t need schools because when this children grew up,<em> all adults</em> would be teachers for the following generation.</p><p>I suppose we could teach every child to program, in the same way that anyone can dance. But it is no more possible to teach every child to program <em>well </em>than it woud be to teach every child to dance <em>en pointe</em>, or <em>entrechat</em>.</p><h4>In conclusion</h4><p>Programming is art by anyone’s definition, but we should not confuse the art of programming with the repetitive integration and fitting together of code libraries that most of the “developers” working in enterprise IT departments are doing. The same way we should not confuse the engineer who designs the car with the assembly line worker that assembles the car.</p><p>“Application development” is not programming and will inevitably become more and more automated and accessible to more and more people with less and less skill.</p><p>Meanwhile “<a href="https://hackernoon.com/the-second-decade-of-programming-all-about-real-programmers-2556758b5e51">real programmers</a>” will continue to practice their art, the same way that cars are still modeled in clay.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*81FKGGmRJ0NQQzsy18Xnhw.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1429e50c21fc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/is-programming-art-1429e50c21fc">Is programming art…</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The over-eager programmer]]></title>
            <link>https://medium.com/@adam.wasserman/the-over-eager-programmer-9a7b3bb5a289?source=rss-6ca2e74d71f5------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a7b3bb5a289</guid>
            <category><![CDATA[business]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Adam Zachary Wasserman]]></dc:creator>
            <pubDate>Mon, 16 Jul 2018 15:16:01 GMT</pubDate>
            <atom:updated>2019-09-17T01:10:05.730Z</atom:updated>
            <content:encoded><![CDATA[<h4>How gratitude quickly turns into resentment</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/610/1*akewPov5FZ4ds8tfTECFng.jpeg" /></figure><p>I am an over-eager programmer. I always have been.</p><p>When a friend or colleague comes to me in distress and asks me if I can help by writing a “quick” program, in spite of myself I always say yes.</p><p>What happens next follows three very predictable stages:</p><h4>Stage 1: Gratitude</h4><p>At first I am a hero. So unlike all those other stick-in-the mud prgrammers that hem and haw, the hedge and dodge and evade. So what if there are rough edges? I had warned them there would be, and speed trumps perfection.</p><h4>Stage 2: Presumption</h4><p>After the initial delight has worn off, we quickly move to a phase of rapid-fire change requests. Can you do this? Can you do that? Can you make this a little different. Can you make that completely different?</p><p>Forgotten are my warnings that each change brings us closer to the day when the only way to get a stable bug-free application will be to re-write it. Of course each change request is more urgent than the last, so “just do it” is the order of the day. No time and no money to take a step back and learn from what was essentially a working prototype.</p><h4>Stage 3: Resentment</h4><p>In the last stage, the rough edges, that were there from the beginning now become unbearable, unacceptable bugs. I am a loser, a hack. All this time, all this money, and what we have to show for it is a Big. Pile. Of. Crap.</p><p>I have been doing this a long time. I have been through this with programming I have done myself, and with programming done by teams working for me. I know how the story plays out, and yet I can never bring myself to play the game that so many of my colleagues do: “oh, that’s very complicated, I am not even sure it’s possible, it could take a lot of time. Give me two weeks to estimate it.”</p><p>So ultimately I am to blame. I should know better.</p><p>Most of my colleagues are hyper-defensive, refusing to give estimates (that will automatically become deadlines), refusing to commit to anything. So Business owners and project managers, and enterprise architects all dream up arbitrary estimates for them, and these become budgets and deadline that are almost never, ever, met.</p><p>This is how the salt mines of IT work these days. Driven by the worst of human behaviour on all sides. I guess I am a dreamer, I just refuse to accept it.</p><p>To read more of me, get my book <a href="https://www.amazon.com/dp/B07XXM1B23"><em>The Chaos Factory</em></a><em> </em>which tells the inside story of corporate IT failure, and provides the <em>real</em> recipe to fix it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a7b3bb5a289" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>