<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Interoperability Happens - Windows</title>
    <link>http://blogs.tedneward.com/</link>
    <description>Ted's takes on the enterprise Java, .NET and Web services communities and technologies</description>
    <copyright>Ted Neward</copyright>
    <lastBuildDate>Sat, 27 Apr 2013 01:50:05 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7067.0</generator>
    <managingEditor>tneward@tedneward.com</managingEditor>
    <webMaster>tneward@tedneward.com</webMaster>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=a216ca4b-7b59-40c4-8be1-f06d30dc72a3</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,a216ca4b-7b59-40c4-8be1-f06d30dc72a3.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,a216ca4b-7b59-40c4-8be1-f06d30dc72a3.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a216ca4b-7b59-40c4-8be1-f06d30dc72a3</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Are you one of those developers who can’t get his/her boss to let you download/prototype/use
a Really Cool™ software package that happens to be open-source? Here’s a possible
reason why.
</p>
        <p>
For no reason in particular, after installing Cygwin on an old laptop onto which I
just dropped Win7, I decided to also drop MinGW32, Cygwin’s main competitor in the
“UNIX-on-Windows” space. Wander off to the home page, grab an installer, read the <a href="http://www.mingw.org/wiki/Getting_Started">“Getting
Started” instructions</a>, and…. down at the bottom, where (as is pretty hip and common
these days) random visitors can leave comments or questions to be answered by the
project maintainers, we find <a href="http://www.mingw.org/wiki/Getting_Started#comment-239">this
exchange</a>:
</p>
        <blockquote>
          <h5>
            <a href="http://www.mingw.org/wiki/Getting_Started#comment-239">Re: Getting Started</a>
          </h5>
          <p>
On April 7th, 2009 mago says:
</p>
          <p>
Hi guys.
</p>
          <p>
Will mingw work on future versions of windows?
</p>
          <p>
I'm upgrading to Vista in a short time and i want to know how much 'upgrading' will
make me suffer.
</p>
          <p>
My guess is that you guys at Mingw should develop a new version for Vista?
</p>
          <p>
Or is it just the same? What about the Win32 Api? There are surely additions with
newer versions of windows.
</p>
          <p>
Thanks.
</p>
        </blockquote>
        <p>
 
</p>
        <blockquote>
          <h5>
            <a href="http://www.mingw.org/wiki/Getting_Started#comment-240">Re: Getting Started</a>
          </h5>
          <p>
            <img title="keith's picture" alt="keith's picture" src="http://www.mingw.org/sites/www.mingw.org/files/pictures/picture-7.png" />
          </p>
          <p>
On April 7th, 2009 keith says:
</p>
          <p>
I find it <strong>really</strong> insulting, when someone says "you guys should...".
</p>
          <p>
This is an Open Source project, developed by volunteers in their spare time. <strong>You</strong> have <strong>no
right</strong> to tell <strong>me</strong> what I should, or should not do with my
spare time. Why should <strong>I</strong>, rather than <strong>you</strong> do that?
</p>
          <p>
AFAIK, MinGW already <strong>does</strong> work with Vista, but why don't you just
try it, and see; then <strong>contribute</strong> on the basis of your experience,
either in the form of patches, or failing that, bug reports?
</p>
        </blockquote>
        <p>
it’s that middle paragraph that will have your boss—any manager responsible for the
installation of software within his arena of responsibility, in fact—in fits.
</p>
        <p>
Don’t get me wrong: the project maintainer is clearly well within his rights to express
his frustration at the fact that these people keep telling him what he should do,
these people (vultures!) who keep leeching off of his hard work, who take and take
with no giving back, who…
</p>
        <p>
… are called “customers” in other companies, by the way, and who often have perfectly
reasonable requests of the vendors from whom they get their software, because if they
had time to build it themselves, they wouldn’t need to download your stuff.
</p>
        <p>
I’ve been having many of the same kinds of “getting started” frustrations with installing <a href="http://www.opalang.org">Opa</a> onto
this same Win7 laptop box, and when I Tweeted about how the Opa experience is <a href="https://twitter.com/tedneward/status/326586129753202688">clearly
not optimal on the Windows platform</a>:
</p>
        <blockquote>
          <p>
tedneward: <a href="https://twitter.com/opalang"><s>@</s><b>opalang</b></a> looks
like a great idea, but I don't get the feeling they really take Windows (or Win devs)
seriously.
</p>
        </blockquote>
        <p>
And their response was:
</p>
        <blockquote>
          <p>
@henri_opa: <a href="https://twitter.com/tedneward"><s>@</s><b>tedneward</b></a> We
know that Opa on windows is suboptimal and would love new contributors on the windows
port in the community.
</p>
        </blockquote>
        <p>
Which I interpret to mean, “We get that it’s not great, we’re sorry, but it’s not
a priority enough for us to fix, so please, fix it yourself and bring that work back
to the community.” Which may be great community-facing mojo, but it’s <em>horrible</em> vendor
customer service, and it’s a clear turn-off for any attempt I might make to advise
a client or customer about using it. Matter of fact, if I can’t even get the silly
thing to install and run HelloWorld correctly, you’re better off not claiming Windows
as a supported platform in the first place. (Which still goes towards the point that
“they’re not really taking Windows or Windows developers seriously as a target market.)
</p>
        <p>
This is the moral equivalent of Delta Airlines telling me, “We’re sorry we lost your
bag on the flight, but we don’t have the personnel to go looking for it. If you’d
like to come into the back here and rummage around for a while, or make a few phone
calls to other Delta offices in other cities, we’d love the contribution.” If I am
your customer, if I am the consumer of your product, whether you charged me something
for it or not, then you have an implied responsibility to help me when I run into
issues—or else you are not really all that concerned about me as a customer, and I
won’t ever be able to convince people (for whom this kind of support is expected)
to use your stuff. Matter of fact, I won’t even try.
</p>
        <p>
If you’re an open-source project, and you’re trying to gain mindshare, you either
think of your users as customers and treat them the way you want to be treated, or
you’re just fooling yourself about your adoption, and your “community focus”. You
either care about the customer, or you don’t, and if you don’t, then don’t expect
customers to care about you, either.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a216ca4b-7b59-40c4-8be1-f06d30dc72a3" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>On OSS and Adoption</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,a216ca4b-7b59-40c4-8be1-f06d30dc72a3.aspx</guid>
      <link>http://blogs.tedneward.com/2013/04/27/On+OSS+And+Adoption.aspx</link>
      <pubDate>Sat, 27 Apr 2013 01:50:05 GMT</pubDate>
      <description>&lt;p&gt;
Are you one of those developers who can’t get his/her boss to let you download/prototype/use
a Really Cool™ software package that happens to be open-source? Here’s a possible
reason why.
&lt;/p&gt;
&lt;p&gt;
For no reason in particular, after installing Cygwin on an old laptop onto which I
just dropped Win7, I decided to also drop MinGW32, Cygwin’s main competitor in the
“UNIX-on-Windows” space. Wander off to the home page, grab an installer, read the &lt;a href="http://www.mingw.org/wiki/Getting_Started"&gt;“Getting
Started” instructions&lt;/a&gt;, and…. down at the bottom, where (as is pretty hip and common
these days) random visitors can leave comments or questions to be answered by the
project maintainers, we find &lt;a href="http://www.mingw.org/wiki/Getting_Started#comment-239"&gt;this
exchange&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;h5&gt;&lt;a href="http://www.mingw.org/wiki/Getting_Started#comment-239"&gt;Re: Getting Started&lt;/a&gt;
&lt;/h5&gt;
&lt;p&gt;
On April 7th, 2009 mago says:
&lt;/p&gt;
&lt;p&gt;
Hi guys.
&lt;/p&gt;
&lt;p&gt;
Will mingw work on future versions of windows?
&lt;/p&gt;
&lt;p&gt;
I'm upgrading to Vista in a short time and i want to know how much 'upgrading' will
make me suffer.
&lt;/p&gt;
&lt;p&gt;
My guess is that you guys at Mingw should develop a new version for Vista?
&lt;/p&gt;
&lt;p&gt;
Or is it just the same? What about the Win32 Api? There are surely additions with
newer versions of windows.
&lt;/p&gt;
&lt;p&gt;
Thanks.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;h5&gt;&lt;a href="http://www.mingw.org/wiki/Getting_Started#comment-240"&gt;Re: Getting Started&lt;/a&gt;
&lt;/h5&gt;
&lt;p&gt;
&lt;img title="keith&amp;#39;s picture" alt="keith&amp;#39;s picture" src="http://www.mingw.org/sites/www.mingw.org/files/pictures/picture-7.png" /&gt;
&lt;/p&gt;
&lt;p&gt;
On April 7th, 2009 keith says:
&lt;/p&gt;
&lt;p&gt;
I find it &lt;strong&gt;really&lt;/strong&gt; insulting, when someone says &amp;quot;you guys should...&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
This is an Open Source project, developed by volunteers in their spare time. &lt;strong&gt;You&lt;/strong&gt; have &lt;strong&gt;no
right&lt;/strong&gt; to tell &lt;strong&gt;me&lt;/strong&gt; what I should, or should not do with my
spare time. Why should &lt;strong&gt;I&lt;/strong&gt;, rather than &lt;strong&gt;you&lt;/strong&gt; do that?
&lt;/p&gt;
&lt;p&gt;
AFAIK, MinGW already &lt;strong&gt;does&lt;/strong&gt; work with Vista, but why don't you just
try it, and see; then &lt;strong&gt;contribute&lt;/strong&gt; on the basis of your experience,
either in the form of patches, or failing that, bug reports?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
it’s that middle paragraph that will have your boss—any manager responsible for the
installation of software within his arena of responsibility, in fact—in fits.
&lt;/p&gt;
&lt;p&gt;
Don’t get me wrong: the project maintainer is clearly well within his rights to express
his frustration at the fact that these people keep telling him what he should do,
these people (vultures!) who keep leeching off of his hard work, who take and take
with no giving back, who…
&lt;/p&gt;
&lt;p&gt;
… are called “customers” in other companies, by the way, and who often have perfectly
reasonable requests of the vendors from whom they get their software, because if they
had time to build it themselves, they wouldn’t need to download your stuff.
&lt;/p&gt;
&lt;p&gt;
I’ve been having many of the same kinds of “getting started” frustrations with installing &lt;a href="http://www.opalang.org"&gt;Opa&lt;/a&gt; onto
this same Win7 laptop box, and when I Tweeted about how the Opa experience is &lt;a href="https://twitter.com/tedneward/status/326586129753202688"&gt;clearly
not optimal on the Windows platform&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
tedneward: &lt;a href="https://twitter.com/opalang"&gt;&lt;s&gt;@&lt;/s&gt;&lt;b&gt;opalang&lt;/b&gt;&lt;/a&gt; looks
like a great idea, but I don't get the feeling they really take Windows (or Win devs)
seriously.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
And their response was:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
@henri_opa: &lt;a href="https://twitter.com/tedneward"&gt;&lt;s&gt;@&lt;/s&gt;&lt;b&gt;tedneward&lt;/b&gt;&lt;/a&gt; We
know that Opa on windows is suboptimal and would love new contributors on the windows
port in the community.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Which I interpret to mean, “We get that it’s not great, we’re sorry, but it’s not
a priority enough for us to fix, so please, fix it yourself and bring that work back
to the community.” Which may be great community-facing mojo, but it’s &lt;em&gt;horrible&lt;/em&gt; vendor
customer service, and it’s a clear turn-off for any attempt I might make to advise
a client or customer about using it. Matter of fact, if I can’t even get the silly
thing to install and run HelloWorld correctly, you’re better off not claiming Windows
as a supported platform in the first place. (Which still goes towards the point that
“they’re not really taking Windows or Windows developers seriously as a target market.)
&lt;/p&gt;
&lt;p&gt;
This is the moral equivalent of Delta Airlines telling me, “We’re sorry we lost your
bag on the flight, but we don’t have the personnel to go looking for it. If you’d
like to come into the back here and rummage around for a while, or make a few phone
calls to other Delta offices in other cities, we’d love the contribution.” If I am
your customer, if I am the consumer of your product, whether you charged me something
for it or not, then you have an implied responsibility to help me when I run into
issues—or else you are not really all that concerned about me as a customer, and I
won’t ever be able to convince people (for whom this kind of support is expected)
to use your stuff. Matter of fact, I won’t even try.
&lt;/p&gt;
&lt;p&gt;
If you’re an open-source project, and you’re trying to gain mindshare, you either
think of your users as customers and treat them the way you want to be treated, or
you’re just fooling yourself about your adoption, and your “community focus”. You
either care about the customer, or you don’t, and if you don’t, then don’t expect
customers to care about you, either.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a216ca4b-7b59-40c4-8be1-f06d30dc72a3" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,a216ca4b-7b59-40c4-8be1-f06d30dc72a3.aspx</comments>
      <category>Development Processes</category>
      <category>Industry</category>
      <category>Languages</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In incarnations past, I have had debates, public and otherwise, with friends and colleagues
who have asserted that HTML5 (by which we really mean HTML5/JavaScript/CSS3) will
essentially become the platform of choice for all applications going forward—that
essentially, <em>this</em> time, standards will win out, and companies that try to
subvert the open nature of the web by creating their own implementations with their
own extensions and proprietary features that aren’t part of the standards, lose.
</p>
        <p>
Then, I read the Wired news post about <a href="http://www.wired.com/wiredenterprise/2013/04/blink/" target="_blank">Google’s
departure from WebKit</a>, and I’m a little surprised that the Internet (and by “the
Internet”, I mean “the very people who get up in arms about standards and subverting
them and blah blah blah”) hasn’t taken more issues with some of the things cited therein:
</p>
        <blockquote>
          <p>
Google’s decision is in tune with its overall efforts to improve the infrastructure
of the internet. When it comes to browser software and other web technologies that
directly effect the how quickly and effectively your machine grabs and displays webpages,
the company likes to use open source technologies. That way, it can feed their adoption
outside the company — and ultimately improve the delivery of its many online services
(including all important advertisements). But if it believes the rest of the web is
moving too slowly, it has no problem starting up its own project.
</p>
        </blockquote>
        <p>
Just to be clear, Google is happy to use open-source technologies, so it can feed
adoption of those technologies, but if it’s something that Google thinks is being
adopted too slowly—like, say, Google’s extensions to the various standards that aren’t
being picked up by its competitors—then Google feels the need to kick off its own
thing. Interesting.
</p>
        <blockquote>
          <p>
… [T]he trouble with WebKit is that is used different “multi-process architecture”
than its Chrome browser, which basically means it didn’t handle concurrent tasks in
the same way. When Chrome was first released in 2008 WebKit didn’t have a multi-process
architecture, so Google had to build its own. WebKit2, released in 2010, adds multi-process
features, but is quite different from what Google had already built. Apple and Google
don’t see eye to eye on the project, and it became too difficult and too time-consuming
for the company juggle the two architectures. “Supporting multiple architectures over
the years has led to increasing complexity for both [projects],” the post says. “This
has slowed down the collective pace of innovation.”
</p>
        </blockquote>
        <p>
So… Google tried to use some open-source software, but discovered that the project
didn’t work the way they built the rest of their application to work. (I’m certain
that’s the first time that has happened, ever.) When the custodians of the project
did add the feature Google wanted, the feature was implemented in a manner that still
wasn’t in lockstep with the way Google wanted things to work in their application.
This meant that “innovation” is “slowed down”.
</p>
        <p>
(As an aside, I find it fascinating that whenever a company adopts open-source, it’s
to “foster interoperability and open standards”, but when they abandon open-source,
it’s to “foster innovation and faster evolution”. And I’m sure it’s entirely accidental
that most of the time, adopting “open standards” is usually when the company is way
behind on the technology curve for a given thing, and adopting “faster innovation”
is usually when that same company thinks they’ve caught up the distance or surged
ahead of their competitors in that space.)
</p>
        <p>
Of course, a new implementation has its risks of bugs and incompatibilities, but Google
has a plan for that:
</p>
        <blockquote>
          <p>
“Throughout this transition, we’ll collaborate closely with other browser vendors
to move the web forward and preserve the compatibility that made it a successful ecosystem,”
the announcement reads.
</p>
        </blockquote>
        <p>
Ah, there. See? By collaborating closely with their competitors, they will preserve
compatibility. Because when Microsoft did that, everybody was totally OK with that….
uh, and… yeah… it worked pretty well, too, and….
</p>
        <p>
Look, it seems pretty reasonable to assume that even if the tags and the DOM and the
APIs are all 100% unchanged from Chrome v.Past to v.Next, there’s still going to be
places where they optimize differently than WebKit does, which means now that developers
will need to learn (and implement) optimizations in their Web-based applications differently.
And frankly, the assumption that Chrome’s Blink and WebKit will somehow be bug-for-bug
compatible/identical with each other is a pretty steep bar to accept blindly, considering
the history.
</p>
        <p>
Once again, we see the cycle coming around: in the beginning, when a technology is
fleshing out, companies yearn for standards in order to create adoption. After a certain
tipping point of adoption, however, the major players start to seek ways to avoid
becoming a commodity, and start introducing “extensions” and “innovations” that for
some odd reason their competitors in the standards meetings don’t seem all that inclined
to adopt. That’s when they start forking and shying away from staying true to the
standard, and eventually, the standard becomes either a least-common-denominator…
or a joke.
</p>
        <p>
Anybody want to bet on which outcome emerges for HTML5?
</p>
        <p>
(Before you reach for the “Comment” link to flame me all to Hell, yes, even an HTML
5 standard that is 80% consistent across all the browsers is still pretty damn useful—just
as a SQL standard that is 80% consistent across all the databases is useful. But this
is a far cry from the utopia of interconnectedness and interoperability that was promised
to us by the HTMLophiles, and it simply demonstrates that the Circle of TechnoLife
continues, unabated, as it has ever since PC manufacturers—and the rest of us watching
them--discovered what happens to them when they become a commodity.)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Say that part about HTML standards, again?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</guid>
      <link>http://blogs.tedneward.com/2013/04/13/Say+That+Part+About+HTML+Standards+Again.aspx</link>
      <pubDate>Sat, 13 Apr 2013 08:30:45 GMT</pubDate>
      <description>&lt;p&gt;
In incarnations past, I have had debates, public and otherwise, with friends and colleagues
who have asserted that HTML5 (by which we really mean HTML5/JavaScript/CSS3) will
essentially become the platform of choice for all applications going forward—that
essentially, &lt;em&gt;this&lt;/em&gt; time, standards will win out, and companies that try to
subvert the open nature of the web by creating their own implementations with their
own extensions and proprietary features that aren’t part of the standards, lose.
&lt;/p&gt;
&lt;p&gt;
Then, I read the Wired news post about &lt;a href="http://www.wired.com/wiredenterprise/2013/04/blink/" target="_blank"&gt;Google’s
departure from WebKit&lt;/a&gt;, and I’m a little surprised that the Internet (and by “the
Internet”, I mean “the very people who get up in arms about standards and subverting
them and blah blah blah”) hasn’t taken more issues with some of the things cited therein:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Google’s decision is in tune with its overall efforts to improve the infrastructure
of the internet. When it comes to browser software and other web technologies that
directly effect the how quickly and effectively your machine grabs and displays webpages,
the company likes to use open source technologies. That way, it can feed their adoption
outside the company — and ultimately improve the delivery of its many online services
(including all important advertisements). But if it believes the rest of the web is
moving too slowly, it has no problem starting up its own project.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Just to be clear, Google is happy to use open-source technologies, so it can feed
adoption of those technologies, but if it’s something that Google thinks is being
adopted too slowly—like, say, Google’s extensions to the various standards that aren’t
being picked up by its competitors—then Google feels the need to kick off its own
thing. Interesting.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
… [T]he trouble with WebKit is that is used different “multi-process architecture”
than its Chrome browser, which basically means it didn’t handle concurrent tasks in
the same way. When Chrome was first released in 2008 WebKit didn’t have a multi-process
architecture, so Google had to build its own. WebKit2, released in 2010, adds multi-process
features, but is quite different from what Google had already built. Apple and Google
don’t see eye to eye on the project, and it became too difficult and too time-consuming
for the company juggle the two architectures. “Supporting multiple architectures over
the years has led to increasing complexity for both [projects],” the post says. “This
has slowed down the collective pace of innovation.”
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
So… Google tried to use some open-source software, but discovered that the project
didn’t work the way they built the rest of their application to work. (I’m certain
that’s the first time that has happened, ever.) When the custodians of the project
did add the feature Google wanted, the feature was implemented in a manner that still
wasn’t in lockstep with the way Google wanted things to work in their application.
This meant that “innovation” is “slowed down”.
&lt;/p&gt;
&lt;p&gt;
(As an aside, I find it fascinating that whenever a company adopts open-source, it’s
to “foster interoperability and open standards”, but when they abandon open-source,
it’s to “foster innovation and faster evolution”. And I’m sure it’s entirely accidental
that most of the time, adopting “open standards” is usually when the company is way
behind on the technology curve for a given thing, and adopting “faster innovation”
is usually when that same company thinks they’ve caught up the distance or surged
ahead of their competitors in that space.)
&lt;/p&gt;
&lt;p&gt;
Of course, a new implementation has its risks of bugs and incompatibilities, but Google
has a plan for that:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
“Throughout this transition, we’ll collaborate closely with other browser vendors
to move the web forward and preserve the compatibility that made it a successful ecosystem,”
the announcement reads.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ah, there. See? By collaborating closely with their competitors, they will preserve
compatibility. Because when Microsoft did that, everybody was totally OK with that….
uh, and… yeah… it worked pretty well, too, and….
&lt;/p&gt;
&lt;p&gt;
Look, it seems pretty reasonable to assume that even if the tags and the DOM and the
APIs are all 100% unchanged from Chrome v.Past to v.Next, there’s still going to be
places where they optimize differently than WebKit does, which means now that developers
will need to learn (and implement) optimizations in their Web-based applications differently.
And frankly, the assumption that Chrome’s Blink and WebKit will somehow be bug-for-bug
compatible/identical with each other is a pretty steep bar to accept blindly, considering
the history.
&lt;/p&gt;
&lt;p&gt;
Once again, we see the cycle coming around: in the beginning, when a technology is
fleshing out, companies yearn for standards in order to create adoption. After a certain
tipping point of adoption, however, the major players start to seek ways to avoid
becoming a commodity, and start introducing “extensions” and “innovations” that for
some odd reason their competitors in the standards meetings don’t seem all that inclined
to adopt. That’s when they start forking and shying away from staying true to the
standard, and eventually, the standard becomes either a least-common-denominator…
or a joke.
&lt;/p&gt;
&lt;p&gt;
Anybody want to bet on which outcome emerges for HTML5?
&lt;/p&gt;
&lt;p&gt;
(Before you reach for the “Comment” link to flame me all to Hell, yes, even an HTML
5 standard that is 80% consistent across all the browsers is still pretty damn useful—just
as a SQL standard that is 80% consistent across all the databases is useful. But this
is a far cry from the utopia of interconnectedness and interoperability that was promised
to us by the HTMLophiles, and it simply demonstrates that the Circle of TechnoLife
continues, unabated, as it has ever since PC manufacturers—and the rest of us watching
them--discovered what happens to them when they become a commodity.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>F#</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=efc92ce3-60c6-4512-ac78-b6962235f435</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,efc92ce3-60c6-4512-ac78-b6962235f435.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,efc92ce3-60c6-4512-ac78-b6962235f435.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=efc92ce3-60c6-4512-ac78-b6962235f435</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As is pretty typical for that site, Lambda the Ultimate has <a href="http://lambda-the-ultimate.org/node/4698">a
great discussion</a> on some insights that the creators of Mozart and Oz have come
to, regarding the design of programming languages; I repeat the post here for convenience: 
</p>
        <blockquote> Now that we are close to releasing Mozart 2 (a complete redesign
of the Mozart system), I have been thinking about how best to summarize the lessons
we learned about programming paradigms in CTM. Here are five "laws" that summarize
these lessons: 
<ol><li>
A well-designed program uses the right concepts, and the paradigm follows from the
concepts that are used. [Paradigms are epiphenomena]</li><li>
A paradigm with more concepts than another is not better or worse, just different.
[Paradigm paradox]</li><li>
Each problem has a best paradigm in which to program it; a paradigm with less concepts
makes the program more complicated and a paradigm with more concepts makes reasoning
more complicated. [Best paradigm principle]</li><li>
If a program is complicated for reasons unrelated to the problem being solved, then
a new concept should be added to the paradigm. [Creative extension principle]</li><li>
A program's interface should depend only on its externally visible functionality,
not on the paradigm used to implement it. [Model independence principle]</li></ol>
Here a "paradigm" is defined as a formal system that defines how computations are
done and that leads to a set of techniques for programming and reasoning about programs.
Some commonly used paradigms are called functional programming, object-oriented programming,
and logic programming. The term "best paradigm" can have different meanings depending
on the ultimate goal of the programming project; it usually refers to a paradigm that
maximizes some combination of good properties such as clarity, provability, maintainability,
efficiency, and extensibility. I am curious to see what the LtU community thinks of
these laws and their formulation. </blockquote> This just so neatly calls out to me,
based on my own very brief and very informal investigation into multi-paradigm programming
(based on James Coplien's work from C++ from a decade-plus ago). I think they really
have something interesting here. 
<img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=efc92ce3-60c6-4512-ac78-b6962235f435" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Programming language "laws"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,efc92ce3-60c6-4512-ac78-b6962235f435.aspx</guid>
      <link>http://blogs.tedneward.com/2013/03/20/Programming+Language+Laws.aspx</link>
      <pubDate>Wed, 20 Mar 2013 01:32:43 GMT</pubDate>
      <description>&lt;p&gt;
As is pretty typical for that site, Lambda the Ultimate has &lt;a href="http://lambda-the-ultimate.org/node/4698"&gt;a
great discussion&lt;/a&gt; on some insights that the creators of Mozart and Oz have come
to, regarding the design of programming languages; I repeat the post here for convenience: &lt;blockquote&gt; Now
that we are close to releasing Mozart 2 (a complete redesign of the Mozart system),
I have been thinking about how best to summarize the lessons we learned about programming
paradigms in CTM. Here are five "laws" that summarize these lessons: 
&lt;ol&gt;
&lt;li&gt;
A well-designed program uses the right concepts, and the paradigm follows from the
concepts that are used. [Paradigms are epiphenomena]&lt;/li&gt;
&lt;li&gt;
A paradigm with more concepts than another is not better or worse, just different.
[Paradigm paradox]&lt;/li&gt;
&lt;li&gt;
Each problem has a best paradigm in which to program it; a paradigm with less concepts
makes the program more complicated and a paradigm with more concepts makes reasoning
more complicated. [Best paradigm principle]&lt;/li&gt;
&lt;li&gt;
If a program is complicated for reasons unrelated to the problem being solved, then
a new concept should be added to the paradigm. [Creative extension principle]&lt;/li&gt;
&lt;li&gt;
A program's interface should depend only on its externally visible functionality,
not on the paradigm used to implement it. [Model independence principle]&lt;/li&gt;
&lt;/ol&gt;
Here a "paradigm" is defined as a formal system that defines how computations are
done and that leads to a set of techniques for programming and reasoning about programs.
Some commonly used paradigms are called functional programming, object-oriented programming,
and logic programming. The term "best paradigm" can have different meanings depending
on the ultimate goal of the programming project; it usually refers to a paradigm that
maximizes some combination of good properties such as clarity, provability, maintainability,
efficiency, and extensibility. I am curious to see what the LtU community thinks of
these laws and their formulation. &lt;/blockquote&gt; This just so neatly calls out to me,
based on my own very brief and very informal investigation into multi-paradigm programming
(based on James Coplien's work from C++ from a decade-plus ago). I think they really
have something interesting here. &gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=efc92ce3-60c6-4512-ac78-b6962235f435" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,efc92ce3-60c6-4512-ac78-b6962235f435.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Visual Basic</category>
      <category>WCF</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=8255fffa-2a91-4635-ab6d-a1fd7aebc381</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8255fffa-2a91-4635-ab6d-a1fd7aebc381</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Charlie Kindel <a href="http://ceklog.kindel.com/2013/02/21/james-gosling-screwed-us-write-once-is-anti-customer/">blogs
that he thinks James Gosling (and the rest of Sun) screwed us all with Java and it's
"Write Once, Run Anywhere" mantra</a>. It's catchy, but it's wrong.
</p>
        <p>
Like a lot of Charlie's blogs, he nails parts of this one squarely on the head: 
</p>
        <blockquote> WORA was, is, and always will be, a fallacy. ... It is the “Write
once…“ part that’s the most dangerous. We all wish the world was rainbows and unicorns,
and “Write once…” implies that there is a world where you can actually write an app
once and it will run on all devices. But this is precisely the fantasy that the platform
vendors will never allow to become reality. ... </blockquote> And, given his current
focus on building a mobile startup, he of course takes this lesson directly into the
"native mobile app vs HTML 5 app" discussion that I've been a part of on way too many
speaker panels and conference BOFs and keynotes and such: <blockquote> HTML5 is awesome
in many ways. If applied judiciously, it can be a great technology and tool. As a
tool, it can absolutely be used to reduce the amount of platform specific code you
have to write. But it is not a starting place. Starting with HTML5 is the most customer
unfriendly thing a developer can do. ... Like many ‘solutions’ in our industry the
“Hey, write it once in in HTML5 and it will run anywhere” story didn’t actually start
with the end-user customer. It started with idealistic thoughts about technology.
It was then turned into snake oil for developers. Not only is the “build a mobile
app that hosts a web view that contains HTML5″ approach bass-ackwards, it is a recipe
for execution disaster. Yes, there are examples of teams that have built great apps
using this technique, but if you actually look at what they did, they focused on their
experience first and then made the technology work. What happens when the shop starts
with “we gotta use HTML5 running in a UIWebView” is initial euphoria over productivity,
followed by incredible pain doing the final 20%. </blockquote> And he's flat-out right
about this: HTML 5, as an application development technology, takes you about 60 -
80% of the way home, depending on what you want your application to do. 
<p>
In fact, about the only part of Charlie's blog post that I disagree with is the part
where he blames Gosling and Java: 
</p><blockquote> I blame James Gosling. He foisted Java on us and as a result Sun
coined the term Write Once Run Anywhere. ... Developers really want to believe it
is possible to “Write once…”. They also really want to believe that more threads will
help. But we all know they just make the problems worse. Just as we’ve all grown to
accept that starting with “make it multi-threaded” is evil, we need to accept “Write
once…” is evil. </blockquote> It didn't start with Java--it started well before that,
with a set of cross-platform C++ toolkits that promised the same kind of promise:
write your application in platform-standard C++ to our API, and we'll have the libraries
on all the major platforms (back in those days, it was Windows, Mac OS, Solaris OpenView,
OSF/Motif, and a few others) and it will just work. Even Microsoft got into this game
briefly (I worked at Intuit, and helped a consultant who was struggling to port QuickBooks,
I think it was, over to the Mac using Microsoft's short-lived "MFC For Mac OS" release),
And, even before that, we had the discussions of "Standard C" and the #ifdef tricks
we used to play to struggle to get one source file to compile on all the different
platforms that C runs on.
<p>
And that, folks, is the heart of the matter: long before Gosling took his fledgling
failed set-top box Oak-named project and looked around for a space to which to apply
it next, developers... no, let's get that right, "developers and their managers who
hate the idea of violating DRY by having the code in umpteen different codebases"
have been looking for ways to have a single source base that runs across all the platforms.
We've tried it with portable languages (see C, C++, Java, for starters), portable
libraries (in the C++ space see Zinc, zApp, XVT, Tools.h++), portable containers (see
EJB, the web browser), and now portable platforms (see PhoneGap/Cordova, Titanium,
etc), portable cross-compilers (see MonoTouch/MonoDroid, for recent examples), and
I'm sure there will be other efforts along these lines for years and decades to come.
It's a noble goal, but the major players in the space to which we are targeting--whether
that be operating systems, browsers, mobile platforms, console game devices, or whatever
comes next two decades from now--will not allow their systems to be commoditized that
easily. Because at the heart of it, that's exactly what these "cross-platform" tools
and languages and libraries are trying to do: reduce the underlying "thing" to a commodity
that lacks interest or impact.
</p><p>
Interestingly enough, as a side-note, one thing I'm starting to notice is that the
more pervasive mobile devices become and the more mobile applications we see reaching
those devices, the less and less "device-standard" those interfaces are trying to
look even as they try to achieve cross-platform similarities. Consider, for a moment,
the Fly Delta app on iPhone: it doesn't really use any of the standard iOS UI metaphors
(except for some of the basic ones), largely because they've defined their own look-and-feel
across all the platforms they support (iOS and Android, at least so far). Ditto for
the CNN and USA Today apps, as well as the ESPN app, and of course just about every
game ever written for any of those platforms. So even as Charlie argues: 
</p><blockquote> The problem is each major platform has its own UI model, its own
model for how a web view is hosted, its own HTML rendering engine, and its own JavaScript
engine. These inter-platform differences mean that not only is the platform-specific
code unique, but the interactions between that code and the code running within the
web view becomes device specific. And to make matters worse intra-platform fragmentation,
particularly on the platform with the largest number of users, Android, is so bad
that this “Write Once..” approach provides no help. </blockquote> We are starting
to see mobile app developers actually striving to define their own UI model entirely,
with only passing nod to the standards of the device on which they're running. Which
then makes me wonder if we're going to start to see new portable toolkits that define
their own unique UI model on each of these platforms, or will somehow allow developers
to define their own UI model on each of these platforms--a UI model toolkit, so to
speak. Which would be an interesting development, but one that will eventually run
into many of the same problems as the others did.
<img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8255fffa-2a91-4635-ab6d-a1fd7aebc381" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Java was not the first</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</guid>
      <link>http://blogs.tedneward.com/2013/02/22/Java+Was+Not+The+First.aspx</link>
      <pubDate>Fri, 22 Feb 2013 00:08:04 GMT</pubDate>
      <description>&lt;p&gt;
Charlie Kindel &lt;a href="http://ceklog.kindel.com/2013/02/21/james-gosling-screwed-us-write-once-is-anti-customer/"&gt;blogs
that he thinks James Gosling (and the rest of Sun) screwed us all with Java and it's
"Write Once, Run Anywhere" mantra&lt;/a&gt;. It's catchy, but it's wrong.
&lt;/p&gt;
&lt;p&gt;
Like a lot of Charlie's blogs, he nails parts of this one squarely on the head: &lt;blockquote&gt; WORA
was, is, and always will be, a fallacy. ... It is the “Write once…“ part that’s the
most dangerous. We all wish the world was rainbows and unicorns, and “Write once…”
implies that there is a world where you can actually write an app once and it will
run on all devices. But this is precisely the fantasy that the platform vendors will
never allow to become reality. ... &lt;/blockquote&gt; And, given his current focus on building
a mobile startup, he of course takes this lesson directly into the "native mobile
app vs HTML 5 app" discussion that I've been a part of on way too many speaker panels
and conference BOFs and keynotes and such: &lt;blockquote&gt; HTML5 is awesome in many ways.
If applied judiciously, it can be a great technology and tool. As a tool, it can absolutely
be used to reduce the amount of platform specific code you have to write. But it is
not a starting place. Starting with HTML5 is the most customer unfriendly thing a
developer can do. ... Like many ‘solutions’ in our industry the “Hey, write it once
in in HTML5 and it will run anywhere” story didn’t actually start with the end-user
customer. It started with idealistic thoughts about technology. It was then turned
into snake oil for developers. Not only is the “build a mobile app that hosts a web
view that contains HTML5″ approach bass-ackwards, it is a recipe for execution disaster.
Yes, there are examples of teams that have built great apps using this technique,
but if you actually look at what they did, they focused on their experience first
and then made the technology work. What happens when the shop starts with “we gotta
use HTML5 running in a UIWebView” is initial euphoria over productivity, followed
by incredible pain doing the final 20%. &lt;/blockquote&gt; And he's flat-out right about
this: HTML 5, as an application development technology, takes you about 60 - 80% of
the way home, depending on what you want your application to do. &gt;
&lt;p&gt;
In fact, about the only part of Charlie's blog post that I disagree with is the part
where he blames Gosling and Java: &lt;blockquote&gt; I blame James Gosling. He foisted Java
on us and as a result Sun coined the term Write Once Run Anywhere. ... Developers
really want to believe it is possible to “Write once…”. They also really want to believe
that more threads will help. But we all know they just make the problems worse. Just
as we’ve all grown to accept that starting with “make it multi-threaded” is evil,
we need to accept “Write once…” is evil. &lt;/blockquote&gt; It didn't start with Java--it
started well before that, with a set of cross-platform C++ toolkits that promised
the same kind of promise: write your application in platform-standard C++ to our API,
and we'll have the libraries on all the major platforms (back in those days, it was
Windows, Mac OS, Solaris OpenView, OSF/Motif, and a few others) and it will just work.
Even Microsoft got into this game briefly (I worked at Intuit, and helped a consultant
who was struggling to port QuickBooks, I think it was, over to the Mac using Microsoft's
short-lived "MFC For Mac OS" release), And, even before that, we had the discussions
of "Standard C" and the #ifdef tricks we used to play to struggle to get one source
file to compile on all the different platforms that C runs on.&gt;
&lt;p&gt;
And that, folks, is the heart of the matter: long before Gosling took his fledgling
failed set-top box Oak-named project and looked around for a space to which to apply
it next, developers... no, let's get that right, "developers and their managers who
hate the idea of violating DRY by having the code in umpteen different codebases"
have been looking for ways to have a single source base that runs across all the platforms.
We've tried it with portable languages (see C, C++, Java, for starters), portable
libraries (in the C++ space see Zinc, zApp, XVT, Tools.h++), portable containers (see
EJB, the web browser), and now portable platforms (see PhoneGap/Cordova, Titanium,
etc), portable cross-compilers (see MonoTouch/MonoDroid, for recent examples), and
I'm sure there will be other efforts along these lines for years and decades to come.
It's a noble goal, but the major players in the space to which we are targeting--whether
that be operating systems, browsers, mobile platforms, console game devices, or whatever
comes next two decades from now--will not allow their systems to be commoditized that
easily. Because at the heart of it, that's exactly what these "cross-platform" tools
and languages and libraries are trying to do: reduce the underlying "thing" to a commodity
that lacks interest or impact.
&lt;/p&gt;
&lt;p&gt;
Interestingly enough, as a side-note, one thing I'm starting to notice is that the
more pervasive mobile devices become and the more mobile applications we see reaching
those devices, the less and less "device-standard" those interfaces are trying to
look even as they try to achieve cross-platform similarities. Consider, for a moment,
the Fly Delta app on iPhone: it doesn't really use any of the standard iOS UI metaphors
(except for some of the basic ones), largely because they've defined their own look-and-feel
across all the platforms they support (iOS and Android, at least so far). Ditto for
the CNN and USA Today apps, as well as the ESPN app, and of course just about every
game ever written for any of those platforms. So even as Charlie argues: &lt;blockquote&gt; The
problem is each major platform has its own UI model, its own model for how a web view
is hosted, its own HTML rendering engine, and its own JavaScript engine. These inter-platform
differences mean that not only is the platform-specific code unique, but the interactions
between that code and the code running within the web view becomes device specific.
And to make matters worse intra-platform fragmentation, particularly on the platform
with the largest number of users, Android, is so bad that this “Write Once..” approach
provides no help. &lt;/blockquote&gt; We are starting to see mobile app developers actually
striving to define their own UI model entirely, with only passing nod to the standards
of the device on which they're running. Which then makes me wonder if we're going
to start to see new portable toolkits that define their own unique UI model on each
of these platforms, or will somehow allow developers to define their own UI model
on each of these platforms--a UI model toolkit, so to speak. Which would be an interesting
development, but one that will eventually run into many of the same problems as the
others did.&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8255fffa-2a91-4635-ab6d-a1fd7aebc381" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=9fc99f7c-088b-45e9-b52a-3ccd9976c28d</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9fc99f7c-088b-45e9-b52a-3ccd9976c28d</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
While cruising through the Internet a few minute ago, I wandered across <a href="http://meteor.com">Meteor</a>,
which looks like a really cool tool/system/platform/whatever for building modern web
applications. JavaScript on the front, JavaScript on the back, Mongo backing, it's
definitely something worth looking into, IMHO.
</p>
        <p>
Thus emboldened, I decide to look at how to start playing with it, and lo and behold
I discover that the instructions for installation are: 
</p>
        <pre>
curl https://install.meteor.com | sh
</pre>
Um.... Wat?
<p>
Now, I'm sure the Meteor folks are all nice people, and they're making sure (via the
use of the https URL) that whatever is piped into my shell is, in fact, coming from
their servers, but I don't know these people from Adam or Eve, and that's taking an
awfully big risk on my part, just letting them pipe whatever-the-hell-they-want into
a shell Terminal. Hell, you don't even need root access to fill my hard drive with
whatever random bits of goo you wanted.
</p><p>
I looked at the shell script, and it's all OK, mind you--the Meteor people definitely
look trustworthy, I want to reassure anyone of that. But I'm really, really hoping
that this is NOT their preferred mechanism for delivery... nor is it anyone's preferred
mechanism for delivery... because that's got a gaping security hole in it about twelve
miles wide. It's just begging for some random evil hacker to post a website saying,
"Hey, all, I've got his really cool framework y'all should try..." and bury the malware
inside the code somewhere.
</p><p>
Which leads to today's Random Thought Experiment of the Day: How long would it take
the open source community to discover malware buried inside of an open-source package,
particularly one that's in widespread use, a la Apache or Tomcat or JBoss? (Assume
all the core committers were in on it--how many people, aside from the core committers,
actually look at the source of the packages we download and install, sometimes under
root permissions?)
</p><p>
Not saying we should abandon open source; just saying we should be responsible citizens
about who we let in our front door.
</p><p><b>UPDATE</b>: Having done the install, I realize that it's a two-step download...
the shell script just figures out which OS you're on, which tool (curl or wget) to
use, and asks you for root access to download and install the actual distribution.
Which, honestly, I didn't look at. So, here's hoping the Meteor folks are as good
as I'm assuming them to be....
</p><p>
Still highlights that this is a huge security risk.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=9fc99f7c-088b-45e9-b52a-3ccd9976c28d" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Um... Security risk much?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</guid>
      <link>http://blogs.tedneward.com/2013/02/15/Um+Security+Risk+Much.aspx</link>
      <pubDate>Fri, 15 Feb 2013 04:25:38 GMT</pubDate>
      <description>&lt;p&gt;
While cruising through the Internet a few minute ago, I wandered across &lt;a href="http://meteor.com"&gt;Meteor&lt;/a&gt;,
which looks like a really cool tool/system/platform/whatever for building modern web
applications. JavaScript on the front, JavaScript on the back, Mongo backing, it's
definitely something worth looking into, IMHO.
&lt;/p&gt;
&lt;p&gt;
Thus emboldened, I decide to look at how to start playing with it, and lo and behold
I discover that the instructions for installation are: &lt;pre&gt;
curl https://install.meteor.com | sh
&lt;/pre&gt;
Um.... Wat?&gt;
&lt;p&gt;
Now, I'm sure the Meteor folks are all nice people, and they're making sure (via the
use of the https URL) that whatever is piped into my shell is, in fact, coming from
their servers, but I don't know these people from Adam or Eve, and that's taking an
awfully big risk on my part, just letting them pipe whatever-the-hell-they-want into
a shell Terminal. Hell, you don't even need root access to fill my hard drive with
whatever random bits of goo you wanted.
&lt;/p&gt;
&lt;p&gt;
I looked at the shell script, and it's all OK, mind you--the Meteor people definitely
look trustworthy, I want to reassure anyone of that. But I'm really, really hoping
that this is NOT their preferred mechanism for delivery... nor is it anyone's preferred
mechanism for delivery... because that's got a gaping security hole in it about twelve
miles wide. It's just begging for some random evil hacker to post a website saying,
"Hey, all, I've got his really cool framework y'all should try..." and bury the malware
inside the code somewhere.
&lt;/p&gt;
&lt;p&gt;
Which leads to today's Random Thought Experiment of the Day: How long would it take
the open source community to discover malware buried inside of an open-source package,
particularly one that's in widespread use, a la Apache or Tomcat or JBoss? (Assume
all the core committers were in on it--how many people, aside from the core committers,
actually look at the source of the packages we download and install, sometimes under
root permissions?)
&lt;/p&gt;
&lt;p&gt;
Not saying we should abandon open source; just saying we should be responsible citizens
about who we let in our front door.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;UPDATE&lt;/b&gt;: Having done the install, I realize that it's a two-step download...
the shell script just figures out which OS you're on, which tool (curl or wget) to
use, and asks you for root access to download and install the actual distribution.
Which, honestly, I didn't look at. So, here's hoping the Meteor folks are as good
as I'm assuming them to be....
&lt;/p&gt;
&lt;p&gt;
Still highlights that this is a huge security risk.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=9fc99f7c-088b-45e9-b52a-3ccd9976c28d" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
      <category>XNA</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=eb04df70-297d-4c15-b87e-ee628740eb6f</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,eb04df70-297d-4c15-b87e-ee628740eb6f.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,eb04df70-297d-4c15-b87e-ee628740eb6f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=eb04df70-297d-4c15-b87e-ee628740eb6f</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <b>TL;DR</b> Live craftsmanship, don't preach it. The creation of a label serves no
purpose other than to disambiguate and distinguish. If we want to hold people accountable
to some sort of "professionalism", then we have to define what that means. I found
Uncle Bob's treatment of my blog heavy-handed and arrogant. I don't particularly want
to debate this anymore; this is my last take on the subject.
</p>
        <hr />
        <p>
I will freely admit, I didn't want to do this. I really didn't. I had hoped that after
my second posting on the subject, the discussion would kind of fade away, because
I think we'd (or I'd, at least) wrought about the last few drops of discussion and
insight and position on it. The same memes were coming back around, the same reactions,
and I really didn't want to perpetuate the whole thing <i>ad infinitum</i> because
I don't really think that's the best way to reach any kind of result or positive steps
forward. I'd said my piece, I was happy about it.
</p>
        <p>
Alas, such was not to be. <a href="http://blog.8thlight.com/uncle-bob/2013/01/30/The-Craftsman-And-The-Laborer.html">Uncle
Bob posted his thoughts</a>, and quite frankly, I think he did a pretty bad job of
hearing what I had to say, couching it in terms of populism (I stopped counting the
number of times he used that word at six or so) even as he framed in it something
of his own elitist argument.
</p>
        <p>
Bob first points us all at the <a href="http://manifesto.softwarecraftsmanship.org/">Manifesto
for Software Craftsmanship</a>. Because everyone who calls themselves a craftsman
has to obey this manifesto. It's in the rules somewhere. Sort of like the Agile Manifesto--if
you're not a signatory, you're doing it wrong.
</p>
        <p>
(Oh, I know, to suggest that there is even the smallest thing wrong with the Agile
Manifesto borders on heresy. Which, if that's the reaction you have, should be setting
off a few warning bells in your head--something about replacing dogma with dogma.) 
</p>
        <p>
And you know what? I actually agree with most of the principles of the Craftsmanship
Manifesto. It's couched in really positive, uplifting language: who doesn't want "well-crafted"
software, or "steadily-increasing value", or "productive partnerships"? It's a wonderfully-worded
document that unfortunately is way short on details, but hey, it should be intuitively
obvious to anyone who is a craftsman, right?
</p>
        <p>
See, this is part of my problem. Manifestos tend to be long on rhetoric, but very,
very short on details. The Agile Manifesto is another example. It stresses "collaboration"
and "working software" and "interactions" and "responding to change", but then people
started trying to figure out how to apply this, and we got into the knife-fights that
people arguing XP vs. Scrum vs. Kanban vs. your-homebrewed-craptaculous-brand-of-"little-a"-agile
turned into brushfire wars. It's wonderful to say what the end result should be, but
putting that into practice is a whole different ball of wax. So I'm a little skeptical
any time somebody points to a Manifesto and says, "I believe in that, and that should
suffice for you".
</p>
        <p>
Frankly, if we want this to have any weight whatsoever, I think we should model something
off the <a href="http://en.wikipedia.org/wiki/Hippocratic_Oath">Hippcratic Oath</a>,
instead--it at least has prescriptive advice within it, telling doctors what they
can and cannot (or, perhaps worded more accurately, should or should not) do. (I took
something of a stab at this <a href="http://blogs.tedneward.com/2007/01/27/Programming+Promises+Or+The+Professional+Programmers+Hippocratic+Oath.aspx">six
years ago</a>. It could probably use some work and some communal input; it was a first
iteration.)
</p>
        <p>
Besides (beware the accusation coming of my attempt at a false-association argument
here, this is just for snarkiness purposes!), <a href="http://en.wikipedia.org/wiki/The_Communist_Manifesto">other
manifestos</a> haven't always worked out so well. 
</p>
        <p>
So by "proving [that I misinterpreted the event] by going to the Manifesto", you're
kind of creating a circular argument: "What happened can't have been because of Software
Craftsmanship, because look, there, in the Manifesto, it says we don't do that, so
clearly, we can't have done that. It says it, right there! Seriously!"
</p>
        <h3>The Supposed "Segregation"
</h3>
        <p>
Bob then says I'm clearly mistaken about "craftsmen" creating a segregation, because
there's nothing about segregation in the manifesto: 
</p>
        <blockquote> any intimation of those who "get it" vs. those who don't; or any
mention of the "right" tools or the "right" way. Indeed, what I see instead is a desire
to steadily add value by writing well-crafted software while working in a community
of professionals who behave as partners with their customers. That doesn't sound like
"narcissistic, high-handed, high-minded" elitism to me. </blockquote> Hold on to that
thought for a bit.
<p>
Bob then goes on an interesting leap of logical assumption here. He takes my definition
of a "software laborer": 
</p><blockquote> "somebody who comes in at 9, does what they're told, leaves at 5,
and never gives a rat's ass about programming except for what they need to know to
get their job done [...] who [crank] out one crappy app after another in (what else?)
Visual Basic, [that] were [...] sloppy, bloated, ugly [...] cut-and-paste cobbled-together
duct-tape wonders." </blockquote> and interprets it as <blockquote> Now let's look
past the hyperbole, and the populist jargon, and see if we can identify just who Ted
is talking about. Firstly, they work 9-5. Secondly, they get their job done. Thirdly,
they crank out lots of (apparently useful) apps. And finally, they make a mess in
the code. The implication is that they are not late, have no defects, and their projects
never fail. </blockquote> That's weird. I go back and read my definition over and
over again, and nowhere do I see me suggesting that they are never late, no-defect,
and never-fail projects. Is it possible that Bob is trying to set up his next argument
by <a href="http://en.wikipedia.org/wiki/Reductio_ad_absurdum"><i>reductio ad absurdum</i></a>,
basically by saying, "These laborers that Ted sets up, they're all perfect! They walk
on water! They must be the illegitimate offspring of Christ himself! Have you met
them? No? Oh, then they must not exist, and therefore his entire definition of the
'laborer' is whack, as these young-un kids like to say."
<p>
(See what I did there? I make Bob sound old and cantankerous. Not that he would do
the same to himself, trying to use his years of experience as a subtle bludgeon to
anyone who's younger and therefore less experienced--less professional, by implication--in
his argument, right? 
</p><blockquote> Programming is barely 60 years old. I, personally, have been programming
for 43+ of those years. </blockquote> Oh.)
<p>
Having sort of wrested my definition of the laborer away from me, Bob goes on: 
</p><blockquote> I've never met these people. In my experience a mess in the code
equates to lots of overtime, deep schedule overruns, intolerable defect rates, and
frequent project failure -- not to mention eventual redesign. </blockquote> Funny
thing. I've seen "crafted" projects that fell to the same victims. Matter of fact,
I had a ton of people (so it's not just my experience, folks, clearly there's a few
more examples out there) email and comment to me that they saw "craftsmen" come in
and take what could've been a one-week project and turn it into a six-month-or-more
project by introducing a bunch of stuff into the project that didn't really need to
be there, but were added in order to "add value" to the code and make it "well-crafted".
(I could toss off some of the software terms that were cited as the reasons behind
the "adding of value"--decoupled design, dependency injection, reusability, encapsulation,
and others--but since those aren't in the Manifesto either, it's easy to say in the
abstract that the people who did those projects weren't really adding value, even
though these same terms seem to show up on every singe project during architecture
and design, agile or otherwise.)
<p>
Bob goes on to sort of run with this theme: 
</p><blockquote> Ted has created a false dichotomy that appeals to a populist ideology.
There are the elite, condescending, self-proclaimed craftsmen, and then there are
the humble, honorable, laborers. Ted then declares his allegiance to the latter...
. </blockquote> Well, last time I checked, all I have to do to be listed amongst the
craftsmen is sign a web page, so "self-proclaimed" seems pretty accurate as a title.
And "elite"? I dunno, can anyone become a craftsman? If so, then the term as a label
has no meaning; if not, then yes, there's some kind of segregation, and it sure sounds
like you're preaching from on high, particularly when you tell me that I've created
a "false dichotomy" that appeals to a "populist ideology": <blockquote> Generally,
populists tend to claim that they side with "the people" against "the elites". While
for much of the twentieth century, populism was considered to be a political phenomenon
mostly affecting Latin America, since the 1980s populist movements and parties have
enjoyed degrees of success in First World democracies such as the USA, Canada, Italy,
the Netherlands and Scandinavian countries. </blockquote> So apparently I'm trying
to appeal to "the people", even though Bob will later tell us that we're all the same
people. (Funny how there's a lot of programmers who feel like they're being looked
down on by the elites--and this isn't my interpretation, read my blog's comments and
the responses that have mushroomed on Twitter.) Essentially, Bob will argue later
that there is no white-collar/blue-collar divide, even though according to him I'm
clearly forming an ideology to appeal to people in the blue-collar camp.
<p>
So either I'm talking into a vacuum, or there's more of a divide than Bob thinks.
You make the call on that one.
</p><p>
Shall we continue? 
</p><blockquote> He strengthens his identity with, and affinity for, these laborers
by telling a story about a tea master and a samurai (or was it some milk and a cow)
which further extends and confuses the false dichotomy. </blockquote> Nice non-sequitur
there, Bob! By tossing in that "some milk and a cow", you neatly rob my Zen story
of any power whatsoever! You just say it "extends and confuses the false dichotomy",
without any real sort of analysis or discussion (that comes later, if you read through
to the end), and because you're a craftsman, and I'm just appealing to populist ideology,
my story no longer has any meaning! Because <i>reductio ad make-fun-of-em</i> is also
a well-recognized and well-respected logical analysis in debating circles.
<h3>Oh, the Horror! ... of Ted's Psyche
</h3><p>
Not content to analyze the argument, because clearly (he says this so many times,
it must be true) my argument is so weak as to not stand on its own (even though I'm
not sure, looking back at this point, that Bob has really attacked the argument itself
at all, other than to say, "Look at the Manifesto!"), he decides to engage in a little
personal attack: 
</p><blockquote> I'm not a psychoanalyst; and I don't really want to dive deep into
Ted's psyche to unravel the contradictions and false dichotomies in his blog. However,
I will make one observation. In his blog Ted describes his own youthful arrogance
as a C++ programmer... It seems to me that Ted is equating his own youthful bad behavior
with "craftsmanship". He ascribes his own past arrogance and self-superiority with
an entire movement. I find that very odd and very unfortunate. I'm not at all sure
what prompted him to make such a large and disconnected leap in reasoning. While it
is true that the Software Craftsmanship movement is trying to raise awareness about
software quality; it is certainly not doing so by promoting the adolescent behavior
that Ted now disavows. </blockquote> Hmm. One could argue that I'm just throwing out
that I'm not perfect nor do I need to profess to be, but maybe that's not a "craftsman's"
approach. Or that I was trying to show others my mistakes so they could learn from
them. You know, as a way of trying to build a "community of professionals", so that
others don't have to go through the mistakes I made. But that would be psychoanalyzing,
and we don't want to do that. Others didn't seem to have the problem understanding
the "very large and disconnected leap in reasoning", and I would hate to tell someone
with over twice my years of experience programming how to understand a logical argument,
so how about let's frame the discussion this way: I tend to assume that someone behaving
in a way that I used to behave (or still behave) is doing so for the same reasons
that I do. (It's a <a href="http://wisdomalacarte.net/blog/seeing-the-world-as-a-reflection-of-ourselves/2011/03/">philosophy
of life</a> that I've found useful at times.) So I assume that craftsmen take the
path they take because they want to take pride in what they do--it's important to
them that their code sparkle with elegance and beauty, because that's how code adds
value.
<p>
Know what? I think one thing that got lost somewhere in all this debate is that value
is only value if it's of value to the customer. And in a lot of the "craftsmanship"
debates, I don't hear the customer's voice being brought up all that much.
</p><p>
You remember all those crappy VB apps that Bob maligned earlier? Was the customer
happy? Did anybody stop to ask them? Or was the assumption that, since the code was
crappy, the customer implicitly must be unhappy as well? Don't get me wrong, there's
a lot of crappy code out there that doesn't make the customer happy. As a matter of
fact, I'll argue that <i>any</i> code that doesn't make the customer happy is crap,
regardless of what language it's written in or what patterns it uses or how decoupled
or injected or new databases it stores data into. Value isn't value unless it's value
to the person who's paying for the code.
</p><h3>Bob Discusses the Dichotomy
</h3><p>
Eh, I'm getting tired of writing all this, and I'm sure you're getting tired of reading
it, so let's finish up and call it a day. Bob goes on to start dissecting my false
dichotomy, starting with: 
</p><blockquote> Elitism is not encouraged in the Software Craftsmanship community.
Indeed we reject the elitist attitude altogether. Our goal is not to make others feel
bad about their code. Our goal is to teach programmers how to write better code, and
behave better as professionals. We feel that the software industry urgently needs
to raise the bar of professionalism. </blockquote> Funny thing is, Bob, one could
argue that you're taking a pretty elitist stance yourself with your dissection of
my blog post. Nowhere do I get the benefit of the doubt, nor is there an effort to
try and bring yourself around to understand where I'm coming from; instead, I'm just
plain wrong, and that's all there is to it. Perhaps you will take the stance that
"Ted started it, so therefore I have to come back hard", but that doesn't strike me
as humility, that strikes me as preaching from a pulpit in tone. (I'd use a Zen story
here to try and illustrate my point, but I'm afraid you'd characterize it as another
"milk and a cow" story.)
<p>
But "raising the bar of professionalism", again, misses a crucial point, one that
I've tried to raise earlier: Who defines what that "professionalism" looks like? Does
the three-line Perl hack qualify as "professionalism" if it gets the job done for
the customer so they can move on? Or does it need to be rewritten in Ruby, using convention
over configuration, and a whole host of dynamic language/metaprogramming/internal
DSL tricks? What defines professionalism in our world? In medicine, it's defined pretty
simply: is the patient healthier or not after the care? In the legal profession, it's
"did we represent the client to the best of our ability while remaining in compliance
with the rules of ethics laid down by the bar and the laws of the entity in which
we practice?" What defines "professionalism" in software? When you can tell me what
that looks like, in concrete, without using words that allow for high degree of interpretation,
then we can start to make progress towards whether or not my "laborers" are, in actuality,
professionals.
</p><p>
We continue. 
</p><blockquote> There are few "laborers" who fit the mold that Ted describes. While
there are many 9-5 programmers, and many others who write cut-paste code, and still
others who write big, ugly, bloated code, these aren't always the same people. I know
lots of 12-12 programmers who work hellish hours, and write bloated, ugly, cut-paste
code. I also know many 9-5 programmers who write clean and elegant code. I know 9-5ers
who don't give a rat's ass, and I know 9-5ers who care deeply. I know 12-12ers who's
only care is to climb the corporate ladder, and others who work long hours for the
sheer joy of making something beautiful. </blockquote> Of course there aren't, Bob,
you took my description and sort of twisted it. (See above.) And yes, I'll agree with
you, there's lots of 9-5 developers, and lots of 12-12 developers, lots of developers
who write great code, and lots of developers who write crap code and what's even funnier
about this discussion is that sometimes they're all the same person! (They do that
just to defy this kind of stereotyping, I'm sure.) But maybe it's just the companies
I've worked for compared to the companies you've worked for, but I can rattle off
a vastly larger list of names who fit in the "9-5" category than those who fit into
the "12-12" category. All of them wanted to do a good job, I believe, but I believe
that because I believe that every human being innately wants to do things they are
proud of and can point to with a sense of accomplishment. Some will put more energy
into it than others. Some will have more talent for it than others. Just like dancing.
Or farming. Or painting. Or just about any endeavor.
<h3>The Real Problem
</h3><p>
Bob goes on to talk about the youth of our industry, but I think the problem is a
different one. Yes, we're a young industry, but frankly, so is Marketing and Sales
(they've only really existed in their modern forms for about sixty or seventy years,
maybe a hundred if you stretch the definitions a little), and ditto for medicine (remember,
it was only about 150 years ago that surgeons were also barbers). Yes, we have a LOT
to learn yet, and we're making a lot of mistakes, I think, because our youth is causing
us to reach out to other, highly imperfect metaphor/role-model industries for terminology
and inspiration. (Cue the discussion of "software architecture" vs "building architecture"
here.) Personally, I think we've learned a lot, we're continuing to learn more, and
we're reaching a point where looking at other industries for metaphors is reaching
a practical end in terms of utility to us.
</p><p>
The bigger problem? Economics. The supply and demand curve.
</p><p>
Neal Ford pointed out on an NFJS panel a few years back that the demand for software
vastly exceeds the supply of programmers to build it. I don't know where he got that--whether
he read that somewhere or that formed out of his own head--but he's absolutely spot-on
right, and it seriously throws the whole industry out of whack.
</p><p>
If the software labor market were like painting, or car repair, or accounting, then
the finite demand for people in those positions would mean that those who couldn't
meet customer satisfaction would eventually starve and die. Or, more likely, take
up some other career. It's a natural way to take the bottom 20% of the bell curve
(the portion out to the far right) of potential practitioners, and keep them from
ruining some customers' life. If you're a terrible painter, no customers will use
you (at least, not twice), and while I suppose you could pick up and move to a new
market every year or so until you're run out of town on a rail for crappy work, quite
honestly, most people will just give up and go do something else. There are thousands--millions--of
actors and actresses in Southern California that never make it to stage or screen,
and they wait tables until they find a new thing to pursue that adds value to their
customers' lives in such a way that they can make a living.
</p><p>
But software... right now, if you walk out into the middle of the street in San Francisco
wearing a T-shirt that says, "I write Rails code", you will have job offers flying
after you like the paper airplanes in <a href="http://www.wired.com/underwire/2013/01/disney-paperman-online/">Disney's
just-released-to-the-Internet video short</a>. IT departments are throwing huge amounts
of cash into mechanisms, human or otherwise, working or otherwise, to help them find
developers. <a href="http://buildyourcareerblog.computer.org/2012/05/15/why-software-engineering-is-the-best-job-in-the-world/">Software
engineering has been at the top of the list of "best jobs"</a> for several years,
commanding high salaries in a relatively stress-free environment, all in a period
of time that many of equated to be the worst economic cycle since the Great Depression.
Don't believe me? Take a shot yourself, go to a <a href="http://startupweekend.org/">Startup
Weekend</a> and sign up as a developer: there are hundreds of people with new app
ideas (granted, most of them total fantasy) who are just looking for a "technical
co-founder" to help them see their dream to reality. IT departments will take <i>anybody</i> right
now, and I do mean <i>anybody</i>. I'm reasonably convinced that half the reason software
development outsourcing overseas happens is because it's a choice between putting
up with doing the development overseas, even with all of the related problems and
obstacles that come up, or not doing the development at all for lack of being able
to staff the team to do it. (Which would you choose, if you were the CTO--some chance
of success, or no chance at all?)
</p><h3>Wrapping up
</h3><p>
Bob wraps up with this: 
</p><blockquote> The result is that most programmers simply don't know where the quality
bar is. They don't know what disciplines they should adopt. They don't know the difference
between good and bad code. And, most importantly, they have not learned that writing
good clean code in a disciplined manner is the fastest and best way get the job done
well. 
<p>
We, in the Software Craftsmanship movement are trying to teach those lessons. Our
goal is to raise the awareness that software quality matters. That doing a good job
means having pride in workmanship, being careful, deliberate, and disciplined. That
the best way to miss a deadline, and lay the seeds of defeat, is to make a mess.
</p>
We, in the Software Craftsmanship movement are promoting software professionalism. </blockquote> Frankly,
Bob, you sort of reject your own "we're not elitists" argument by making it very clear
here: "most programmers simply don't know where the quality bar is. They don't know
.... They don't know.... They have not learned. ... We, in the Software Craftsmanship
movement are trying to teach those lessons." You could not sound more elitist if you
quoted the colonial powers "bringing enlightenment" to the "uncivilized" world back
in the 1600s and 1700s. They are an ignorant, undisciplined lot, and you have taken
this self-appointed messiah role to bring them into the light.
<p>
Seriously? You can't see how that comes across as elitist? And arrogant?
</p><p>
Look, I really don't mean to perpetuate this whole argument, and I'm reasonably sure
that Uncle Bob is already firing up his blog editor to point out all the ways in which
my "populist ideology" is falsly dichotomous or whatever. I'm tired of this argument,
to be honest, so let me try to sum up my thoughts on this whole mess in what I hope
will be a few, easy-to-digest bullet points: 
</p><ol><li><b>Live craftsmanship, don't preach it.</b> If you hold the craftsman meme as a way
of trying to improve yourself, then you and I have no argument. If you put "software
craftsman" on your business cards, or website, or write Manifestos that you try to
use as a bludgeon in an argument, then it seems to me that you're trying to distinguish
yourself from the rest, and that to me smacks of elitism. You may not think of yourself
as covering yourself in elitism, but to a lot of the rest of the world, that's exactly
how you're coming off. Sorry if that's not how you intended it.</li><li><b>Value is only value if the customer sees it as value.</b> And the customer gets
to define what is valuable to them, not you. You can (and should) certainly try to
work with them to understand what they see as value, and you can (and should) certainly
try to help them see how there may be value in ways they don't see today. But at the
end of the day, they are the customer, they are paying the checks, and even after
advising them against it, if they want to prioritize quick-and-dirty over longer-and-elegant,
then (IMHO) that's what you do. Because they may have reasons for choosing that approach
that they simply don't care to share with you, and it's their choice.</li><li><b>The creation of a label serves no purpose other than to disambiguate and distinguish.</b> If
there really is no blue-collar programming workforce, Bob, then I challenge you to
drop the term "craftsman" from your bio, profile, and self-description anywhere it
appears, and replace it with "programer". Or else refer to all software developers
as "craftsmen" (in which case the term becomes meaningless, and thus useless). Because,
let's face it, how many doctors do you know who put "Hippocratic-sworn" somewhere
on their business cards?</li><li><b>If we want to hold people accountable to some sort of "professionalism", then we
have to define what that means.</b> The definition of the term "professional" is not
really what we want, in practice, for it's usually defined as "somebody who got paid
to do the job". The Craftsmanship Manifesto seems to want some kind of code of ethics
or programmer equivalent to the Hippocratic Oath, so that the third precept isn't
"a community of people who are paid to do what they do", but something deeper and
more meaningful and concrete. (I don't have that definition handy, by the way, so
don't look to me for it. But I will also roundly reject anyone who tries to use the
Potter Stewart-esque "I can't define it but I know it when I see it" approach, because
now we're back to individual interpretation.)</li><li><b>I found Uncle Bob's treatment of my blog heavy-handed and arrogant.</b> In case
that wasn't obvious. And I reacted in similar manner, something for which I will apologize
now. By reacting in that way, I'm sure I perpetuate the blog war, and truthfully,
I have a lot of respect for Bob's technical skills; I was an avid fan of his C++ articles
for years, and there's a lot of good technical ideas and concepts that any programmer
would be well-advised to learn. His technical skill is without question; his compassion
and empathy, however, might be. (As are mine, for stooping to that same level.)</li></ol>
Peace out. 
<img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=eb04df70-297d-4c15-b87e-ee628740eb6f" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Last Thoughts on "Craftsmanship"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,eb04df70-297d-4c15-b87e-ee628740eb6f.aspx</guid>
      <link>http://blogs.tedneward.com/2013/02/02/Last+Thoughts+On+Craftsmanship.aspx</link>
      <pubDate>Sat, 02 Feb 2013 12:33:12 GMT</pubDate>
      <description>&lt;p&gt;
&lt;b&gt;TL;DR&lt;/b&gt; Live craftsmanship, don't preach it. The creation of a label serves no
purpose other than to disambiguate and distinguish. If we want to hold people accountable
to some sort of "professionalism", then we have to define what that means. I found
Uncle Bob's treatment of my blog heavy-handed and arrogant. I don't particularly want
to debate this anymore; this is my last take on the subject.
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
I will freely admit, I didn't want to do this. I really didn't. I had hoped that after
my second posting on the subject, the discussion would kind of fade away, because
I think we'd (or I'd, at least) wrought about the last few drops of discussion and
insight and position on it. The same memes were coming back around, the same reactions,
and I really didn't want to perpetuate the whole thing &lt;i&gt;ad infinitum&lt;/i&gt; because
I don't really think that's the best way to reach any kind of result or positive steps
forward. I'd said my piece, I was happy about it.
&lt;/p&gt;
&lt;p&gt;
Alas, such was not to be. &lt;a href="http://blog.8thlight.com/uncle-bob/2013/01/30/The-Craftsman-And-The-Laborer.html"&gt;Uncle
Bob posted his thoughts&lt;/a&gt;, and quite frankly, I think he did a pretty bad job of
hearing what I had to say, couching it in terms of populism (I stopped counting the
number of times he used that word at six or so) even as he framed in it something
of his own elitist argument.
&lt;/p&gt;
&lt;p&gt;
Bob first points us all at the &lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;Manifesto
for Software Craftsmanship&lt;/a&gt;. Because everyone who calls themselves a craftsman
has to obey this manifesto. It's in the rules somewhere. Sort of like the Agile Manifesto--if
you're not a signatory, you're doing it wrong.
&lt;/p&gt;
&lt;p&gt;
(Oh, I know, to suggest that there is even the smallest thing wrong with the Agile
Manifesto borders on heresy. Which, if that's the reaction you have, should be setting
off a few warning bells in your head--something about replacing dogma with dogma.) 
&lt;p&gt;
And you know what? I actually agree with most of the principles of the Craftsmanship
Manifesto. It's couched in really positive, uplifting language: who doesn't want "well-crafted"
software, or "steadily-increasing value", or "productive partnerships"? It's a wonderfully-worded
document that unfortunately is way short on details, but hey, it should be intuitively
obvious to anyone who is a craftsman, right?
&lt;/p&gt;
&lt;p&gt;
See, this is part of my problem. Manifestos tend to be long on rhetoric, but very,
very short on details. The Agile Manifesto is another example. It stresses "collaboration"
and "working software" and "interactions" and "responding to change", but then people
started trying to figure out how to apply this, and we got into the knife-fights that
people arguing XP vs. Scrum vs. Kanban vs. your-homebrewed-craptaculous-brand-of-"little-a"-agile
turned into brushfire wars. It's wonderful to say what the end result should be, but
putting that into practice is a whole different ball of wax. So I'm a little skeptical
any time somebody points to a Manifesto and says, "I believe in that, and that should
suffice for you".
&lt;/p&gt;
&lt;p&gt;
Frankly, if we want this to have any weight whatsoever, I think we should model something
off the &lt;a href="http://en.wikipedia.org/wiki/Hippocratic_Oath"&gt;Hippcratic Oath&lt;/a&gt;,
instead--it at least has prescriptive advice within it, telling doctors what they
can and cannot (or, perhaps worded more accurately, should or should not) do. (I took
something of a stab at this &lt;a href="http://blogs.tedneward.com/2007/01/27/Programming+Promises+Or+The+Professional+Programmers+Hippocratic+Oath.aspx"&gt;six
years ago&lt;/a&gt;. It could probably use some work and some communal input; it was a first
iteration.)
&lt;/p&gt;
&lt;p&gt;
Besides (beware the accusation coming of my attempt at a false-association argument
here, this is just for snarkiness purposes!), &lt;a href="http://en.wikipedia.org/wiki/The_Communist_Manifesto"&gt;other
manifestos&lt;/a&gt; haven't always worked out so well.&gt; 
&lt;p&gt;
So by "proving [that I misinterpreted the event] by going to the Manifesto", you're
kind of creating a circular argument: "What happened can't have been because of Software
Craftsmanship, because look, there, in the Manifesto, it says we don't do that, so
clearly, we can't have done that. It says it, right there! Seriously!"
&lt;/p&gt;
&lt;h3&gt;The Supposed "Segregation"
&lt;/h3&gt;
&lt;p&gt;
Bob then says I'm clearly mistaken about "craftsmen" creating a segregation, because
there's nothing about segregation in the manifesto: &lt;blockquote&gt; any intimation of
those who "get it" vs. those who don't; or any mention of the "right" tools or the
"right" way. Indeed, what I see instead is a desire to steadily add value by writing
well-crafted software while working in a community of professionals who behave as
partners with their customers. That doesn't sound like "narcissistic, high-handed,
high-minded" elitism to me. &lt;/blockquote&gt; Hold on to that thought for a bit.&gt;
&lt;p&gt;
Bob then goes on an interesting leap of logical assumption here. He takes my definition
of a "software laborer": &lt;blockquote&gt; "somebody who comes in at 9, does what they're
told, leaves at 5, and never gives a rat's ass about programming except for what they
need to know to get their job done [...] who [crank] out one crappy app after another
in (what else?) Visual Basic, [that] were [...] sloppy, bloated, ugly [...] cut-and-paste
cobbled-together duct-tape wonders." &lt;/blockquote&gt; and interprets it as &lt;blockquote&gt; Now
let's look past the hyperbole, and the populist jargon, and see if we can identify
just who Ted is talking about. Firstly, they work 9-5. Secondly, they get their job
done. Thirdly, they crank out lots of (apparently useful) apps. And finally, they
make a mess in the code. The implication is that they are not late, have no defects,
and their projects never fail. &lt;/blockquote&gt; That's weird. I go back and read my definition
over and over again, and nowhere do I see me suggesting that they are never late,
no-defect, and never-fail projects. Is it possible that Bob is trying to set up his
next argument by &lt;a href="http://en.wikipedia.org/wiki/Reductio_ad_absurdum"&gt;&lt;i&gt;reductio
ad absurdum&lt;/i&gt;&lt;/a&gt;, basically by saying, "These laborers that Ted sets up, they're
all perfect! They walk on water! They must be the illegitimate offspring of Christ
himself! Have you met them? No? Oh, then they must not exist, and therefore his entire
definition of the 'laborer' is whack, as these young-un kids like to say."&gt;
&lt;p&gt;
(See what I did there? I make Bob sound old and cantankerous. Not that he would do
the same to himself, trying to use his years of experience as a subtle bludgeon to
anyone who's younger and therefore less experienced--less professional, by implication--in
his argument, right? &lt;blockquote&gt; Programming is barely 60 years old. I, personally,
have been programming for 43+ of those years. &lt;/blockquote&gt; Oh.)&gt;
&lt;p&gt;
Having sort of wrested my definition of the laborer away from me, Bob goes on: &lt;blockquote&gt; I've
never met these people. In my experience a mess in the code equates to lots of overtime,
deep schedule overruns, intolerable defect rates, and frequent project failure --
not to mention eventual redesign. &lt;/blockquote&gt; Funny thing. I've seen "crafted" projects
that fell to the same victims. Matter of fact, I had a ton of people (so it's not
just my experience, folks, clearly there's a few more examples out there) email and
comment to me that they saw "craftsmen" come in and take what could've been a one-week
project and turn it into a six-month-or-more project by introducing a bunch of stuff
into the project that didn't really need to be there, but were added in order to "add
value" to the code and make it "well-crafted". (I could toss off some of the software
terms that were cited as the reasons behind the "adding of value"--decoupled design,
dependency injection, reusability, encapsulation, and others--but since those aren't
in the Manifesto either, it's easy to say in the abstract that the people who did
those projects weren't really adding value, even though these same terms seem to show
up on every singe project during architecture and design, agile or otherwise.)&gt;
&lt;p&gt;
Bob goes on to sort of run with this theme: &lt;blockquote&gt; Ted has created a false dichotomy
that appeals to a populist ideology. There are the elite, condescending, self-proclaimed
craftsmen, and then there are the humble, honorable, laborers. Ted then declares his
allegiance to the latter... . &lt;/blockquote&gt; Well, last time I checked, all I have
to do to be listed amongst the craftsmen is sign a web page, so "self-proclaimed"
seems pretty accurate as a title. And "elite"? I dunno, can anyone become a craftsman?
If so, then the term as a label has no meaning; if not, then yes, there's some kind
of segregation, and it sure sounds like you're preaching from on high, particularly
when you tell me that I've created a "false dichotomy" that appeals to a "populist
ideology": &lt;blockquote&gt; Generally, populists tend to claim that they side with "the
people" against "the elites". While for much of the twentieth century, populism was
considered to be a political phenomenon mostly affecting Latin America, since the
1980s populist movements and parties have enjoyed degrees of success in First World
democracies such as the USA, Canada, Italy, the Netherlands and Scandinavian countries. &lt;/blockquote&gt; So
apparently I'm trying to appeal to "the people", even though Bob will later tell us
that we're all the same people. (Funny how there's a lot of programmers who feel like
they're being looked down on by the elites--and this isn't my interpretation, read
my blog's comments and the responses that have mushroomed on Twitter.) Essentially,
Bob will argue later that there is no white-collar/blue-collar divide, even though
according to him I'm clearly forming an ideology to appeal to people in the blue-collar
camp.&gt;
&lt;p&gt;
So either I'm talking into a vacuum, or there's more of a divide than Bob thinks.
You make the call on that one.
&lt;/p&gt;
&lt;p&gt;
Shall we continue? &lt;blockquote&gt; He strengthens his identity with, and affinity for,
these laborers by telling a story about a tea master and a samurai (or was it some
milk and a cow) which further extends and confuses the false dichotomy. &lt;/blockquote&gt; Nice
non-sequitur there, Bob! By tossing in that "some milk and a cow", you neatly rob
my Zen story of any power whatsoever! You just say it "extends and confuses the false
dichotomy", without any real sort of analysis or discussion (that comes later, if
you read through to the end), and because you're a craftsman, and I'm just appealing
to populist ideology, my story no longer has any meaning! Because &lt;i&gt;reductio ad make-fun-of-em&lt;/i&gt; is
also a well-recognized and well-respected logical analysis in debating circles.&gt;
&lt;h3&gt;Oh, the Horror! ... of Ted's Psyche
&lt;/h3&gt;
&lt;p&gt;
Not content to analyze the argument, because clearly (he says this so many times,
it must be true) my argument is so weak as to not stand on its own (even though I'm
not sure, looking back at this point, that Bob has really attacked the argument itself
at all, other than to say, "Look at the Manifesto!"), he decides to engage in a little
personal attack: &lt;blockquote&gt; I'm not a psychoanalyst; and I don't really want to
dive deep into Ted's psyche to unravel the contradictions and false dichotomies in
his blog. However, I will make one observation. In his blog Ted describes his own
youthful arrogance as a C++ programmer... It seems to me that Ted is equating his
own youthful bad behavior with "craftsmanship". He ascribes his own past arrogance
and self-superiority with an entire movement. I find that very odd and very unfortunate.
I'm not at all sure what prompted him to make such a large and disconnected leap in
reasoning. While it is true that the Software Craftsmanship movement is trying to
raise awareness about software quality; it is certainly not doing so by promoting
the adolescent behavior that Ted now disavows. &lt;/blockquote&gt; Hmm. One could argue
that I'm just throwing out that I'm not perfect nor do I need to profess to be, but
maybe that's not a "craftsman's" approach. Or that I was trying to show others my
mistakes so they could learn from them. You know, as a way of trying to build a "community
of professionals", so that others don't have to go through the mistakes I made. But
that would be psychoanalyzing, and we don't want to do that. Others didn't seem to
have the problem understanding the "very large and disconnected leap in reasoning",
and I would hate to tell someone with over twice my years of experience programming
how to understand a logical argument, so how about let's frame the discussion this
way: I tend to assume that someone behaving in a way that I used to behave (or still
behave) is doing so for the same reasons that I do. (It's a &lt;a href="http://wisdomalacarte.net/blog/seeing-the-world-as-a-reflection-of-ourselves/2011/03/"&gt;philosophy
of life&lt;/a&gt; that I've found useful at times.) So I assume that craftsmen take the
path they take because they want to take pride in what they do--it's important to
them that their code sparkle with elegance and beauty, because that's how code adds
value.&gt;
&lt;p&gt;
Know what? I think one thing that got lost somewhere in all this debate is that value
is only value if it's of value to the customer. And in a lot of the "craftsmanship"
debates, I don't hear the customer's voice being brought up all that much.
&lt;/p&gt;
&lt;p&gt;
You remember all those crappy VB apps that Bob maligned earlier? Was the customer
happy? Did anybody stop to ask them? Or was the assumption that, since the code was
crappy, the customer implicitly must be unhappy as well? Don't get me wrong, there's
a lot of crappy code out there that doesn't make the customer happy. As a matter of
fact, I'll argue that &lt;i&gt;any&lt;/i&gt; code that doesn't make the customer happy is crap,
regardless of what language it's written in or what patterns it uses or how decoupled
or injected or new databases it stores data into. Value isn't value unless it's value
to the person who's paying for the code.
&lt;/p&gt;
&lt;h3&gt;Bob Discusses the Dichotomy
&lt;/h3&gt;
&lt;p&gt;
Eh, I'm getting tired of writing all this, and I'm sure you're getting tired of reading
it, so let's finish up and call it a day. Bob goes on to start dissecting my false
dichotomy, starting with: &lt;blockquote&gt; Elitism is not encouraged in the Software Craftsmanship
community. Indeed we reject the elitist attitude altogether. Our goal is not to make
others feel bad about their code. Our goal is to teach programmers how to write better
code, and behave better as professionals. We feel that the software industry urgently
needs to raise the bar of professionalism. &lt;/blockquote&gt; Funny thing is, Bob, one
could argue that you're taking a pretty elitist stance yourself with your dissection
of my blog post. Nowhere do I get the benefit of the doubt, nor is there an effort
to try and bring yourself around to understand where I'm coming from; instead, I'm
just plain wrong, and that's all there is to it. Perhaps you will take the stance
that "Ted started it, so therefore I have to come back hard", but that doesn't strike
me as humility, that strikes me as preaching from a pulpit in tone. (I'd use a Zen
story here to try and illustrate my point, but I'm afraid you'd characterize it as
another "milk and a cow" story.)&gt;
&lt;p&gt;
But "raising the bar of professionalism", again, misses a crucial point, one that
I've tried to raise earlier: Who defines what that "professionalism" looks like? Does
the three-line Perl hack qualify as "professionalism" if it gets the job done for
the customer so they can move on? Or does it need to be rewritten in Ruby, using convention
over configuration, and a whole host of dynamic language/metaprogramming/internal
DSL tricks? What defines professionalism in our world? In medicine, it's defined pretty
simply: is the patient healthier or not after the care? In the legal profession, it's
"did we represent the client to the best of our ability while remaining in compliance
with the rules of ethics laid down by the bar and the laws of the entity in which
we practice?" What defines "professionalism" in software? When you can tell me what
that looks like, in concrete, without using words that allow for high degree of interpretation,
then we can start to make progress towards whether or not my "laborers" are, in actuality,
professionals.
&lt;/p&gt;
&lt;p&gt;
We continue. &lt;blockquote&gt; There are few "laborers" who fit the mold that Ted describes.
While there are many 9-5 programmers, and many others who write cut-paste code, and
still others who write big, ugly, bloated code, these aren't always the same people.
I know lots of 12-12 programmers who work hellish hours, and write bloated, ugly,
cut-paste code. I also know many 9-5 programmers who write clean and elegant code.
I know 9-5ers who don't give a rat's ass, and I know 9-5ers who care deeply. I know
12-12ers who's only care is to climb the corporate ladder, and others who work long
hours for the sheer joy of making something beautiful. &lt;/blockquote&gt; Of course there
aren't, Bob, you took my description and sort of twisted it. (See above.) And yes,
I'll agree with you, there's lots of 9-5 developers, and lots of 12-12 developers,
lots of developers who write great code, and lots of developers who write crap code
and what's even funnier about this discussion is that sometimes they're all the same
person! (They do that just to defy this kind of stereotyping, I'm sure.) But maybe
it's just the companies I've worked for compared to the companies you've worked for,
but I can rattle off a vastly larger list of names who fit in the "9-5" category than
those who fit into the "12-12" category. All of them wanted to do a good job, I believe,
but I believe that because I believe that every human being innately wants to do things
they are proud of and can point to with a sense of accomplishment. Some will put more
energy into it than others. Some will have more talent for it than others. Just like
dancing. Or farming. Or painting. Or just about any endeavor.&gt;
&lt;h3&gt;The Real Problem
&lt;/h3&gt;
&lt;p&gt;
Bob goes on to talk about the youth of our industry, but I think the problem is a
different one. Yes, we're a young industry, but frankly, so is Marketing and Sales
(they've only really existed in their modern forms for about sixty or seventy years,
maybe a hundred if you stretch the definitions a little), and ditto for medicine (remember,
it was only about 150 years ago that surgeons were also barbers). Yes, we have a LOT
to learn yet, and we're making a lot of mistakes, I think, because our youth is causing
us to reach out to other, highly imperfect metaphor/role-model industries for terminology
and inspiration. (Cue the discussion of "software architecture" vs "building architecture"
here.) Personally, I think we've learned a lot, we're continuing to learn more, and
we're reaching a point where looking at other industries for metaphors is reaching
a practical end in terms of utility to us.
&lt;/p&gt;
&lt;p&gt;
The bigger problem? Economics. The supply and demand curve.
&lt;/p&gt;
&lt;p&gt;
Neal Ford pointed out on an NFJS panel a few years back that the demand for software
vastly exceeds the supply of programmers to build it. I don't know where he got that--whether
he read that somewhere or that formed out of his own head--but he's absolutely spot-on
right, and it seriously throws the whole industry out of whack.
&lt;/p&gt;
&lt;p&gt;
If the software labor market were like painting, or car repair, or accounting, then
the finite demand for people in those positions would mean that those who couldn't
meet customer satisfaction would eventually starve and die. Or, more likely, take
up some other career. It's a natural way to take the bottom 20% of the bell curve
(the portion out to the far right) of potential practitioners, and keep them from
ruining some customers' life. If you're a terrible painter, no customers will use
you (at least, not twice), and while I suppose you could pick up and move to a new
market every year or so until you're run out of town on a rail for crappy work, quite
honestly, most people will just give up and go do something else. There are thousands--millions--of
actors and actresses in Southern California that never make it to stage or screen,
and they wait tables until they find a new thing to pursue that adds value to their
customers' lives in such a way that they can make a living.
&lt;/p&gt;
&lt;p&gt;
But software... right now, if you walk out into the middle of the street in San Francisco
wearing a T-shirt that says, "I write Rails code", you will have job offers flying
after you like the paper airplanes in &lt;a href="http://www.wired.com/underwire/2013/01/disney-paperman-online/"&gt;Disney's
just-released-to-the-Internet video short&lt;/a&gt;. IT departments are throwing huge amounts
of cash into mechanisms, human or otherwise, working or otherwise, to help them find
developers. &lt;a href="http://buildyourcareerblog.computer.org/2012/05/15/why-software-engineering-is-the-best-job-in-the-world/"&gt;Software
engineering has been at the top of the list of "best jobs"&lt;/a&gt; for several years,
commanding high salaries in a relatively stress-free environment, all in a period
of time that many of equated to be the worst economic cycle since the Great Depression.
Don't believe me? Take a shot yourself, go to a &lt;a href="http://startupweekend.org/"&gt;Startup
Weekend&lt;/a&gt; and sign up as a developer: there are hundreds of people with new app
ideas (granted, most of them total fantasy) who are just looking for a "technical
co-founder" to help them see their dream to reality. IT departments will take &lt;i&gt;anybody&lt;/i&gt; right
now, and I do mean &lt;i&gt;anybody&lt;/i&gt;. I'm reasonably convinced that half the reason software
development outsourcing overseas happens is because it's a choice between putting
up with doing the development overseas, even with all of the related problems and
obstacles that come up, or not doing the development at all for lack of being able
to staff the team to do it. (Which would you choose, if you were the CTO--some chance
of success, or no chance at all?)
&lt;/p&gt;
&lt;h3&gt;Wrapping up
&lt;/h3&gt;
&lt;p&gt;
Bob wraps up with this: &lt;blockquote&gt; The result is that most programmers simply don't
know where the quality bar is. They don't know what disciplines they should adopt.
They don't know the difference between good and bad code. And, most importantly, they
have not learned that writing good clean code in a disciplined manner is the fastest
and best way get the job done well. 
&lt;p&gt;
We, in the Software Craftsmanship movement are trying to teach those lessons. Our
goal is to raise the awareness that software quality matters. That doing a good job
means having pride in workmanship, being careful, deliberate, and disciplined. That
the best way to miss a deadline, and lay the seeds of defeat, is to make a mess.
&lt;/p&gt;
We, in the Software Craftsmanship movement are promoting software professionalism. &lt;/blockquote&gt; Frankly,
Bob, you sort of reject your own "we're not elitists" argument by making it very clear
here: "most programmers simply don't know where the quality bar is. They don't know
.... They don't know.... They have not learned. ... We, in the Software Craftsmanship
movement are trying to teach those lessons." You could not sound more elitist if you
quoted the colonial powers "bringing enlightenment" to the "uncivilized" world back
in the 1600s and 1700s. They are an ignorant, undisciplined lot, and you have taken
this self-appointed messiah role to bring them into the light.&gt;
&lt;p&gt;
Seriously? You can't see how that comes across as elitist? And arrogant?
&lt;/p&gt;
&lt;p&gt;
Look, I really don't mean to perpetuate this whole argument, and I'm reasonably sure
that Uncle Bob is already firing up his blog editor to point out all the ways in which
my "populist ideology" is falsly dichotomous or whatever. I'm tired of this argument,
to be honest, so let me try to sum up my thoughts on this whole mess in what I hope
will be a few, easy-to-digest bullet points: 
&lt;ol&gt;
&lt;li&gt;
&lt;b&gt;Live craftsmanship, don't preach it.&lt;/b&gt; If you hold the craftsman meme as a way
of trying to improve yourself, then you and I have no argument. If you put "software
craftsman" on your business cards, or website, or write Manifestos that you try to
use as a bludgeon in an argument, then it seems to me that you're trying to distinguish
yourself from the rest, and that to me smacks of elitism. You may not think of yourself
as covering yourself in elitism, but to a lot of the rest of the world, that's exactly
how you're coming off. Sorry if that's not how you intended it.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Value is only value if the customer sees it as value.&lt;/b&gt; And the customer gets
to define what is valuable to them, not you. You can (and should) certainly try to
work with them to understand what they see as value, and you can (and should) certainly
try to help them see how there may be value in ways they don't see today. But at the
end of the day, they are the customer, they are paying the checks, and even after
advising them against it, if they want to prioritize quick-and-dirty over longer-and-elegant,
then (IMHO) that's what you do. Because they may have reasons for choosing that approach
that they simply don't care to share with you, and it's their choice.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;The creation of a label serves no purpose other than to disambiguate and distinguish.&lt;/b&gt; If
there really is no blue-collar programming workforce, Bob, then I challenge you to
drop the term "craftsman" from your bio, profile, and self-description anywhere it
appears, and replace it with "programer". Or else refer to all software developers
as "craftsmen" (in which case the term becomes meaningless, and thus useless). Because,
let's face it, how many doctors do you know who put "Hippocratic-sworn" somewhere
on their business cards?&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;If we want to hold people accountable to some sort of "professionalism", then we
have to define what that means.&lt;/b&gt; The definition of the term "professional" is not
really what we want, in practice, for it's usually defined as "somebody who got paid
to do the job". The Craftsmanship Manifesto seems to want some kind of code of ethics
or programmer equivalent to the Hippocratic Oath, so that the third precept isn't
"a community of people who are paid to do what they do", but something deeper and
more meaningful and concrete. (I don't have that definition handy, by the way, so
don't look to me for it. But I will also roundly reject anyone who tries to use the
Potter Stewart-esque "I can't define it but I know it when I see it" approach, because
now we're back to individual interpretation.)&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;I found Uncle Bob's treatment of my blog heavy-handed and arrogant.&lt;/b&gt; In case
that wasn't obvious. And I reacted in similar manner, something for which I will apologize
now. By reacting in that way, I'm sure I perpetuate the blog war, and truthfully,
I have a lot of respect for Bob's technical skills; I was an avid fan of his C++ articles
for years, and there's a lot of good technical ideas and concepts that any programmer
would be well-advised to learn. His technical skill is without question; his compassion
and empathy, however, might be. (As are mine, for stooping to that same level.)&lt;/li&gt;
&lt;/ol&gt;
Peace out. &gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=eb04df70-297d-4c15-b87e-ee628740eb6f" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,eb04df70-297d-4c15-b87e-ee628740eb6f.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Social</category>
      <category>Visual Basic</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=07ef7e67-accd-4232-9bb2-99082d1e0200</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,07ef7e67-accd-4232-9bb2-99082d1e0200.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,07ef7e67-accd-4232-9bb2-99082d1e0200.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=07ef7e67-accd-4232-9bb2-99082d1e0200</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <b>TL;DR</b>: To all those who dissented, you're right, but you're wrong. Craftsmanship
is a noble meme, when it's something that somebody holds as a personal goal, but it's
often coming across as a way to beat up and denigrate on others who don't choose to
invest significant time and energy into programming. The Zen Masters didn't walk around
the countryside, proclaiming "I am a Zen Master!"
</p>
        <p>
Wow. Apparently I touched a nerve.
</p>
        <p>
It's been 48 hours since I posted <a href="http://blogs.tedneward.com/2013/01/24/On+The+Dark+Side+Of+Craftsmanship.aspx">On
the Dark Side of 'Craftsmanship'</a>, and it's gotten a ton of interest, as well as
a few syndicated re-posts (DZone and a few others). Comments to the blog included
a response from Dave Thomas, other blog posts have been brought to my attention, and
Twitter was on FIRE with people pinging me with their thoughts, which turn out to
be across the spectrum, approving and dissenting. Not at all what I really expected
to happen, to be honest--I kinda thought it would get lost in the noise of others
commenting around the whole thing.
</p>
        <p>
But for whatever reason, it's gotten a lot of attention, so I feel a certain responsibility
to respond and explain to some of the dissenters who've responded. Not to defend,
per se, but to at least demonstrate some recognition and attempt to clarify my position
where I think it's gotten mis-heard. (To those who approved of the message, thank
you for your support, and I'm happy to have vocalized something you felt unable, unwilling,
unheard, or too busy to vocalize yourself. I hope my explanations here continue to
represent your opinions, but if not, please feel free to let me know.)
</p>
        <p>
A lot of the opinions centered around a few core ideas, it seems, so let me try and
respond to those first.
</p>
        <p>
          <b>You're confusing "craftsmanship" with a few people behaving badly.</b> That may
well be, but those who behaved badly included at least one who holds himself up as
a leader of the craftsman movement and has held his actions up as indications of how
"craftsmen" should behave. When you do this, you invite this kind of criticism and
association. So if the movement is being given a black eye because of the actions
of a single individual, well, now you know how a bunch of moderate Republicans feel
about Paul Ryan.
</p>
        <p>
          <b>Corey is a nice guy, he apologized, don't crucify him.</b> Of course he is. Corey
is a nice guy--and, speaking well to his character, he apologized almost immediately
when it all broke. I learned a long time ago that "true sorry" means you (a) apologize
for your actions, (b) seek to remedy the damage your actions have caused ("make it
right", in other words), and (c) avoid making the same mistake in the future. From
a distance, it seems like he feels contrition, and has publicly apologized for his
actions. I would hope he's reached out to Heather directly to try and make things
right with her, but that's between the two of them. Whether he avoids this kind of
activity in the future remains to be seen. I think he will, but that's because I think
he's learned a harsh lesson about being in the spotlight--it tends to be a harsh place
to be. The rest of this really isn't about Corey and Heather anymore, so as far as
I'm concerned, that thread complete.
</p>
        <p>
          <b>You misunderstand the nature of "craftsmanship".</b> Actually, no, I don't. At
its heart, the original intent of "craftsmanship" was a constant striving to be better
about what you do, and taking pride in the things that you do. It's related to the
Japanese code of the samurai (kaizen) that says, in essence, that we are constantly
striving to get better. The samurai sought to become better swordsmen, constantly
challenging each other to prove the mettle against one another, improving their skills
and, conditioning, but also their honor, by how they treated each other, their lord,
their servants, and those they sought to protect. Kanban is a wonderful code, and
one I have tried to live my entire life, even before I'd discovered it. Please don't
assume that I misunderstand the teachings of your movement just because I don't go
to the meetings.
</p>
        <p>
          <b>Why you pick on "craftsmanship", anyway? If I want to take pride in what I do,
what difference does it make?</b> This is me paraphrasing on much of the dissent,
and my response boils down to two basic thoughts: 
</p>
        <ol>
          <li>
If you think your movement is "just about yourself", why invent a label to differentiate
yourself from the rest?</li>
          <li>
If you invent a label, it becomes almost automatic to draw a line between "us" and
"them", and that in of itself almost automatically leads to "us vs them" behavior
and mentality.</li>
        </ol>
Look, I view this whole thing as kind of like religion: whatever you want to do behind
closed doors, that's your business. But when you start waving it in other peoples'
faces, then I have a problem with it. You want to spend time on the weekends improving
your skills, go for it. You want to spend time at night learning a bunch of programming
languages so you can improve your code and your ability to design systems, go for
it. You want to study psychology and philosophy so you can understand other people
better when it comes time to interact with them, go for it. And hey, you want to put
some code up somewhere so people can point to it and help you get it better, go for
it. But when you start waving all that time and dedication in my face, you're either
doing it because you want recognition, or you want to suggest that I'm somehow not
as good as you. Live the virtuous life, don't brag about it.
<p>
There were some specific blogs and comments that I think deserve discusson, too:
</p><p>
Dave Thomas was kind enough to comment on my blog: 
</p><blockquote> I remember the farmer comment :) I think I said 30%, but I stand
by what I said. And it isn't really an elitist stance. Instead, I feel that programming
is hard work. At the end of a day of coding, I'm tired. And so I believe that if you
are asking someone to do programming, then it is in both your and their interest that
they are doing something they enjoy. Because if they don't enjoy it, then they are
truly just a laborer, working hard at something that has no meaning to them. And as
you spend 8 hours a day, 5 days a week doing it, that seems like an awful waste of
an intelligent person's life. </blockquote> Sure, programming is hard. So is house
painting. They're different kinds of exhaustion, but it's exhaustion all the same.
But, frankly, if somebody has chosen to take up a job that they do just because it's
a job, that's their choice, and not ours to criticize, in my opinion. (And I remember
it as 50%, because I very clearly remember saying the "way to insult half the room"
crack after it, but maybe I misheard you. I do know others also heard it at 50%, because
an attendee or two came up to talk about it after the panel. At least, that's how
I remember it at the time. But the number itself is kinda meaningless, now that I
think about it.) <blockquote> The farming quote was a deliberate attempt at being
shocking to make a point. But I still think it is valid. I'd guess that 30% of the
developers I meet are not happy in their work. And I think those folks would be happier
and more fulfilled doing something else that gave them more satisfaction. </blockquote> Again,
you and I are both in agreement, that people should be doing what they love, but that's
a personal judgment that each person is permitted to make for themselves. There are
aspects of our lives that we don't love, but we do because they make other people
happy (Juliet and Charlotte driving the boys around to their various activities comes
to mind, for example), and it is not our position to judge how others choose for themselves,
IMHO. <blockquote> No one should have to be a laborer. </blockquote> And here, you
and I will disagree quite fundamentally: as I believe it was Martin Luther King, Jr,
who said, "If you are going to be a janitor, be the best janitor you know how to be."
It seems by that statement that you are saying that people who labor with their bodies
rather than your minds (and trust me, you may not be a laborer anymore, big publishing
magnate that you are, but I know I sure still am) are somehow less well-off than those
who have other people working for them. Some people don't want the responsibility
of being the boss, or the owner. See the story of the mexican fisherman at the end
of this blog.
<p>
Nate commented: 
</p><blockquote> You have a logical fallacy by lumping together the people that derided
Heather's code and people that are involved in software craftmanship. It's actually
a huge leap of logic to make that connection, and it really retracts from the article. </blockquote> As
I point out later, the people who derided Heather's code were some of the same folks
who hold up software craftsmanship. That wasn't me making that up. 
<p></p><blockquote> Now you realise that you are planting your flag firmly in the 'craftmanship'
camp while propelling your position upwards by drawing a line in the sand to define
another group of people as 'labourers'. Or in other words attempt to elevate yourself
by patronising others with the position you think you are paying them a compliment.
Maybe you do not realise this? </blockquote> No, I realize it, and it's a fair critique,
which is why I don't label myself as a "craftsman". I have more to say on this below. <blockquote> However,
have you considered that the craft is not how awesome and perfect you and your code
are, but what is applicable for the task at hand. I think most people who you would
put into either camp share the same mix of attributes whether good or bad. The important
thing is if the solution created does what it is designed to do, is delivered on time
for when it is needed and if the environment that the solution has been created for
warrants it, that the code is easily understandable by yourself and others (that matter)
so it can be developed further over time and maintained. </blockquote> And the very
people who call themselves "craftsmen" criticized a piece of code that, as near as
I can tell, met all of those criteria. Hence my reaction that started this whole thing. <blockquote> I
don't wish to judge you, and maybe you are a great, smart guy who does good in the
world, but like you I have not researched anything about you, I have simply read your
assessment above and come to a conclusion, that's being human I guess. </blockquote> Oh,
people judge each other all the time, and it's high time we stopped beating them up
for it. It's human to judge. And while it would be politically correct to say, "You
shouldn't judge me before you know me", fact is, of course you're going to do exactly
that, because you don't have time to get to know me. And the fact that you don't know
me except but through the blog is totally acceptable--you shouldn't have to research
me in order to have an opinion. So we're all square on that point. (As to whether
I'm a great smart guy who does good in the world, well, that's for others to judge
in my opinion, not mine.) <blockquote> The above just sounds like more of the same
'elitism' that has been ripe in this world from playground to the workplace since
the beginning. </blockquote> It does, doesn't it? And hopefully I clarify the position
more clearly later. 
<p>
In <a href="http://rtigger.com/blog/2013/01/25/its-okay-to-love-your-job/">It's OK
to love your job</a>, Chad McCallum says that 
</p><blockquote> The basic premise (or at least the one the author start out with)
is that because there’s a self-declared group of “software craftspeople”, there is
going to be an egotistical divide between those who “get it” and those who don’t. </blockquote> Like
it or not, Chad, that egotistical divide is there. You can "call bullshit" all day
long, but look at the reactions that have popped up over this--people feel that divide,
and frankly, it's one that's been there for a long, long time. This isn't just me
making this up.
<p>
Chad also says, 
</p><blockquote><p>
It’s true the feedback that Heather got was unnecessarily negative. And that it came
from people who are probably considered “software craftspeople”. That said, correlation
doesn’t equal causation. I’m guessing the negative feedback was more because those
original offenders had a bad day and needed to vent. And maybe the comments after
that one just jumped on the bandwagon because someone with lots of followers and/or
respect said it.
</p><p>
These are both things that can and have happened to anyone, regardless of the industry
they work in. It’s extremely unfair to associate “someone who’s passionate about software
development” to “person who’s waiting to jump on you for your mistakes”.
</p></blockquote> Unfortunately, Chad, the excuse that "others do it, too" is not an acceptable
excuse. If everybody jumped off a cliff, would you do it, too? I understand the rationale--it's
extremely hard being the one to go against the herd (I've got the psychological studies
I can cite at you that prove it), but that doesn't make it OK or excuse it. Saying
"it happens in other industries" is just an extension of that. In other industries,
women are still explicitly discriminated against--does that make it OK for us to do
that, too?
<p>
Chad closes his blog with "Stop calling us egotistical jerks just because we love
what we do." To which I respond, "I am happy to do so, as soon as those 'craftsmen'
who are acting like one, stop acting like one." If you're not acting like one, then
there should be no argument here. If you're trying to tell me that your label is somehow
immune to criticism, then I think we just have to agree to disagree.
</p><p>
Paul Pagel (on a site devoted to software craftsmanship, no less) responded as well
with his <a href="http://blog.8thlight.com/paul-pagel/2013/01/24/humble-pursuit-of-mastery.html">Humble
Pursuit of Mastery</a>. He opens with: 
</p><blockquote> I have been reading on blogs and tweets the sentiment that "software
craftsmanship is elitism". This perception is formed around comments of code, process,
or techniques. I understand a craftsman's earned sense of pride in their work can
sometimes be inappropriately communicated. </blockquote> I don't think I commented
on code, process or technique, so I can't be sure if this is directly refuting what
I'm saying, but I note that Paul has already touched on the meme he wants to communicate
in his last phrase: the craftsman's "earned sense of pride". I have no problem with
the work being something that you take pride in; I note, however, that "pride goeth
before a fall", and note that, again, Ozymandias was justifiably proud of his accomplishments,
too.
<p>
Paul then goes through a summation of his career, making sure to smallcaps certain
terms with which I have no argument: "sacrifice", "listen", "practicing", "critique"
and "teaching". And, in all honesty, these are things that I embrace, as well. But
I start getting a little dubious about the sanctity of your terminology, Paul, when
it's being used pretty blatantly as an advertising slogan and theme all over the site--if
you want the term to remain a Zen-like pursuit, then you need to keep the commercialism
out of it, in my opinion, or you invite the kind of criticism that's coming here (explicit
or implicit).
</p><p>
Paul's conclusion wraps up with: 
</p><blockquote> Do sacrificing, listening, practice, critiquing, and teaching sound
like elitist qualities to you? Software craftsmanship starts out as a humble endeavor
moving towards mastery. I won't let 140 or 1000 characters redefine the hours and
years spent working hard to become a craftsman. It gave me humility and the confidence
to be a professional software developer. Sometimes I let confidence get the better
of me, but I know when that happens I am not honoring the spirit of craftsmanship
which I was trained. </blockquote> Humility enough to trademark your phrase "Software
is our craft"? Humility enough to call yourself a "driving force" behind software
craftsmanship? Don't get me wrong, Paul, there is a certain amount of commercialism
that any consultant must adopt in order to survive--but either please don't mix your
life-guiding principles with your commercialism, or else don't be surprised when others
take aim at your "humility" when you do. It's the same when ministers stand in a multi-million
dollar building on a Sunday morning and talk about the parable of the widow giving
away her last two coppers--that smacks of hypocrisy.
<p>
Finally, Matt van Horn wrote in <a href="http://www.mattvanhorn.com/2013/01/24/craftsmanship-a-rebuttal/">Crafsmanship,
a rebuttal</a> that: 
</p><blockquote> there is an allusion to software craftsmen as being an exclusive
group who agre on the “right” tools and techniques. This could not be further from
the truth. Anyone who is serious about their craft knows that for every job there
are some tools that are better and some that are worse. </blockquote> ... but then
he goes right into making that exact mistake: <blockquote> Now, I may not have a good
definition of elegant code, but I definitely know it when I see it – regardless of
who wrote it. If you can’t see that 
<br /><pre>
(1..10).each{|i| puts i}
</pre><br />
is more elegant than 
<br /><pre>
x = 0
while true do
  x = x + 1
  if x &gt; 10
    break
  end
  puts x
end
</pre>
then you must near the beginning of your journey towards mastery. Practicing your
craft develops your ability to recognize these differences, just as a skilled tailor
can more easily spot the difference between a bespoke suit and something from Men’s
Wearhouse. </blockquote> Matt, you kind of make my point for me. What makes it elegant?
You take it as self-evident. I don't. As a matter of fact, I've been asking this question
for some years now, "What makes code 'elegant', as opposed to 'ugly'? Ironically,
Elliott Rusty Harold just blogged about how this style of coding is dangerous in Java,
and got crucified for it, but he has the point that functional style (your first example)
doesn't JIT as well as the more imperative style right now on the JVM (or on the CLR,
from what I can tell). Are you assuming that this will be running on a native Ruby
implementation, on JRuby, IronRuby, ...? You have judged the code in the second example
based on an intrinsic value system that you may have never questioned. To judge, you
have to be able to explain your judgments in terms of the value system. And the fact
that you judge without any context, kind of speaks directly to the point I was trying
to make: "craftsmen", it seems, have this tendency to judge in absence of context,
because they are clearly "further down their journey towards mastery", to use your
own metaphor.
<p>
Or, to put it much more succinctly, "Beauty is in the eye of the beholder".
</p><p>
Matt then tells me I missed the point of the samurai and tea master story: 
</p><blockquote> inally, he closes with a famous zen story, but he entirely misses
the point of it. The story concerns a tea master, and a samurai, who get into a duel.
The tea master prevails by bringing the same concentration to the duel that he brings
to his tea ceremony. The point that Ted seems to miss here is that the tea master
is a craftsman of the highest order. A master of cha-do (the way of tea) is able to
transform the simple act of making and pouring a cup of tea into something transcendant
by bringing to this simple act a clear mind, a good attitude, and years of patient,
humble practice. Arguably he prevails because he has perfected his craft to a higher
degree than the samurai has perfected his own. That is why he has earned the right
to wear the garb of a samurai, and why he is able to face down his opponent. </blockquote> Which,
again, I find funny, because most Zen masters will tell you that the story--any Zen
story, in fact--has no "definitive" meaning, but has meaning based on how you interpret
it. (There are a few Zen parables that reinforce this point, but it gets a little
meta to justify my understanding of a Zen story by quoting another Zen story.) How
Matt chooses to interpret that parable is, of course, up to him. I choose to interpret
the story thusly: the insulted samurai felt that his "earned sense of pride" at his
sword mastery was insulted by the tea master--clearly no swordsman, as it says in
the story--wore robes of a rank and honor that he had not earned. And clearly, the
tea master was no swordsman. But what the tea master learned from his peer was not
how to use his concentration and discipline to improve his own swordsmanship, but
how to demonstrate that he had, in fact, earned a note of mastery through an entirely
different discipline than the insulted samurai's. The tea master still has no mastery
of the sword, but in his own domain, he is an expert. This was all the insulted samurai
needed to see, that the badge of honor had been earned, and not just imposed by a
capricious (and disrespectful) lord. Put a paintbrush and canvas into the hands of
a house painter, and you get pretty much a mess--but put a spray painter in the hands
of Leonardo, and you still get a mess. In fact, to really do the parable justice,
we should see how much "craft" Matt can bring when asked to paint a house, because
that's about how much relevance swordsmanship and house painting have in relationship
to one another. (All analogies fail eventually, by the way, and we're probably reaching
the boundaries of this one.)
<p>
Billy Hollis is a master with VB, far more than I ever will be; I know C++ far better
than he ever will. I respect his abilities, and he, mine. There is no argument here.
But more importantly, there are friends I've worked with in the past who are masters
with neither VB nor C++, nor any other programming language, but chose instead to
sink their time and energy into skiing, pottery, or being a fan of a television show.
They chose to put their energies--energies the "craftsmen" seem to say should be put
towards their programming--towards things that bring them joy, which happen to not
be programming.
</p><p>
Which brings me to another refrain that came up over and over again: <b>You criticize
the craftsman, but then you draw a distinction between "craftsman" and "laborer".
You're confusing (or confused).</b> First of all, I think it important to disambiguate
along two axes: those who are choosing to invest their time into learning to write
better software, and those who are choosing to look at writing code as "just" a job
as one axis, and along a second axis, the degree to which they have mastered programming.
By your own definitions, "craftsmen", can one be early in your mastery of programming
and still be a "craftsman"? Can one be a master bowler who's just picked up programming
and be considered a "craftsman"? Is the nature of "craftsmanship" a measure of your
skill, or is it your dedication to programming, or is it your dedication to something
in your life, period? (Remember, the tea master parable says that a master C++ developer
will see the master bowler and respect his mastery of bowling, even though he can't
code worth a crap. Would you call him a "craftsman"?)
</p><p></p><p>
Frankly, I will say, for the record, that I think there are people programming who
don't want to put a ton of time and energy into learning how to be better programmers.
(I suspect that most of them won't ever read this blog, either.) They see the job
as "just a job", and are willing to be taught how to do things, but aren't willing
to go off and learn how to do them on their own. They want to do the best job they
can, because they, like any human being, want to bring value to the world, but don't
have that passion for programming. They want to come in at 9, do their job, and go
home at 5. These are those whom I call "laborers". They are the "fisherman" in <a href="http://www.lifeprinciples.net/SuccessatLife.html">the
following story</a>: 
</p><blockquote><p>
The businessman was at the pier of a small coastal Mexican village when a small boat
with just one fisherman docked. Inside the small boat were several large yellowfin
tuna. The businessman complimented the Mexican on the quality of his fish and asked
how long it took to catch them. The Mexican replied only a little while.
</p><p>
The businessman then asked why he didn't stay out longer and catch more fish? The
Mexican said he had enough to support his family's immediate needs. The businessman
then asked, but what do you do with the rest of your time? The Mexican fisherman said,
"I sleep late, fish a little, play with my children, take a siesta with my wife, Maria,
stroll into the village each evening where I sip wine and play guitar with my amigos;
I have a full and busy life, señor."
</p><p>
The businessman scoffed, "I am a Harvard MBA and I could help you. You should spend
more time fishing and with the proceeds buy a bigger boat. With the proceeds from
the bigger boat you could buy several boats; eventually you would have a fleet of
fishing boats. Instead of selling your catch to a middleman, you would sell directly
to the processor and eventually open your own cannery. You would control the product,
processing and distribution. You would need to leave this small coastal fishing village
and move to Mexico City, then LA and eventually New York City where you would run
your expanding enterprise."
</p><p>
The Mexican fisherman asked, "But señor, how long will this all take?" To which the
businessman replied, "15-20 years." "But what then, señor?" The businessman laughed
and said, "That's the best part! When the time is right you would announce an IPO
and sell your company stock to the public and become very rich. You would make millions."
"Millions, señor? Then what?" The businessman said, "Then you would retire. Move to
a small coastal fishing village where you would sleep late, fish a little, play with
your kids, take a siesta with your wife, stroll to the village in the evenings where
you could sip wine and play your guitar with your amigos."
</p></blockquote><p>
What makes all of this (this particular subject, craftsmanship) particularly hard
for me is that I <i>like</i> the message that craftsmanship brings, in terms of how
you conduct yourself. I <i>love</i> the book <a href="http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382">Apprenticeship
Patterns</a>, for example, and think that anyone, novice or master, should read this
book. I have taken on speaking apprentices in the past, and will continue to do so
well into the future. The message that underlies the meme of craftsmanship--the constant
striving to improve--is a good one, and I don't want to throw the baby out with the
bathwater. If you have adopted "craftsmanship" as a core value of yours, then please,
by all means, continue to practice it! Myself, I choose to do so, as well. I have
mentored programmers, I have taken speaking apprentices, and I strive to learn more
about my craft by branching my studies out well beyond software--I am reading books
on management, psychology, building architecture, and business, because I think there
is more to software than just the choice of programming language or style.
</p><p>
But be aware that if you start telling people how you're living your life, there is
an implicit criticism or expectation that they should be doing that, as well. And
when you start criticizing other peoples' code as being "unelegant" or "unbeautiful"
or "unclean", you'd better be able to explain your value system and why you judged
it as so. Humility is a hard, hard path to tread, and one that I have only recently
started to see the outlines of; I am guilty of just about every sin imaginable when
it comes to this subject. I have created "elegant" systems that failed their original
intent. I have criticized "ugly" code that, in fact, served the purpose well. I have
bragged of my own accomplishments to those who accomplished a lot more than I did,
or ever will. And I consider it amazing to me that my friends who've been with me
since long before I started to eat my justly-deserved humble pie are still with me.
(And that those friends are some amazing people in their own right.; if a man is judged
by the company he keeps, then by looking around at my friends, I am judged to be a
king.) I will continue to strive to be better than I am now, though, even within this
discussion right now: those of you who took criticism with my post, you have good
points, all of you, and I certainly don't want to stop you from continuing on your
journeys of self-discovery, either.
</p><p>
And if we ever cross paths in person, I will buy you a beer so that we can sit down,
and we can continue this discussion in person.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=07ef7e67-accd-4232-9bb2-99082d1e0200" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>More on "Craftsmanship"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,07ef7e67-accd-4232-9bb2-99082d1e0200.aspx</guid>
      <link>http://blogs.tedneward.com/2013/01/26/More+On+Craftsmanship.aspx</link>
      <pubDate>Sat, 26 Jan 2013 06:24:27 GMT</pubDate>
      <description>&lt;p&gt;
&lt;b&gt;TL;DR&lt;/b&gt;: To all those who dissented, you're right, but you're wrong. Craftsmanship
is a noble meme, when it's something that somebody holds as a personal goal, but it's
often coming across as a way to beat up and denigrate on others who don't choose to
invest significant time and energy into programming. The Zen Masters didn't walk around
the countryside, proclaiming "I am a Zen Master!"
&lt;/p&gt;
&lt;p&gt;
Wow. Apparently I touched a nerve.
&lt;/p&gt;
&lt;p&gt;
It's been 48 hours since I posted &lt;a href="http://blogs.tedneward.com/2013/01/24/On+The+Dark+Side+Of+Craftsmanship.aspx"&gt;On
the Dark Side of 'Craftsmanship'&lt;/a&gt;, and it's gotten a ton of interest, as well as
a few syndicated re-posts (DZone and a few others). Comments to the blog included
a response from Dave Thomas, other blog posts have been brought to my attention, and
Twitter was on FIRE with people pinging me with their thoughts, which turn out to
be across the spectrum, approving and dissenting. Not at all what I really expected
to happen, to be honest--I kinda thought it would get lost in the noise of others
commenting around the whole thing.
&lt;/p&gt;
&lt;p&gt;
But for whatever reason, it's gotten a lot of attention, so I feel a certain responsibility
to respond and explain to some of the dissenters who've responded. Not to defend,
per se, but to at least demonstrate some recognition and attempt to clarify my position
where I think it's gotten mis-heard. (To those who approved of the message, thank
you for your support, and I'm happy to have vocalized something you felt unable, unwilling,
unheard, or too busy to vocalize yourself. I hope my explanations here continue to
represent your opinions, but if not, please feel free to let me know.)
&lt;/p&gt;
&lt;p&gt;
A lot of the opinions centered around a few core ideas, it seems, so let me try and
respond to those first.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;You're confusing "craftsmanship" with a few people behaving badly.&lt;/b&gt; That may
well be, but those who behaved badly included at least one who holds himself up as
a leader of the craftsman movement and has held his actions up as indications of how
"craftsmen" should behave. When you do this, you invite this kind of criticism and
association. So if the movement is being given a black eye because of the actions
of a single individual, well, now you know how a bunch of moderate Republicans feel
about Paul Ryan.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Corey is a nice guy, he apologized, don't crucify him.&lt;/b&gt; Of course he is. Corey
is a nice guy--and, speaking well to his character, he apologized almost immediately
when it all broke. I learned a long time ago that "true sorry" means you (a) apologize
for your actions, (b) seek to remedy the damage your actions have caused ("make it
right", in other words), and (c) avoid making the same mistake in the future. From
a distance, it seems like he feels contrition, and has publicly apologized for his
actions. I would hope he's reached out to Heather directly to try and make things
right with her, but that's between the two of them. Whether he avoids this kind of
activity in the future remains to be seen. I think he will, but that's because I think
he's learned a harsh lesson about being in the spotlight--it tends to be a harsh place
to be. The rest of this really isn't about Corey and Heather anymore, so as far as
I'm concerned, that thread complete.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;You misunderstand the nature of "craftsmanship".&lt;/b&gt; Actually, no, I don't. At
its heart, the original intent of "craftsmanship" was a constant striving to be better
about what you do, and taking pride in the things that you do. It's related to the
Japanese code of the samurai (kaizen) that says, in essence, that we are constantly
striving to get better. The samurai sought to become better swordsmen, constantly
challenging each other to prove the mettle against one another, improving their skills
and, conditioning, but also their honor, by how they treated each other, their lord,
their servants, and those they sought to protect. Kanban is a wonderful code, and
one I have tried to live my entire life, even before I'd discovered it. Please don't
assume that I misunderstand the teachings of your movement just because I don't go
to the meetings.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Why you pick on "craftsmanship", anyway? If I want to take pride in what I do,
what difference does it make?&lt;/b&gt; This is me paraphrasing on much of the dissent,
and my response boils down to two basic thoughts: 
&lt;ol&gt;
&lt;li&gt;
If you think your movement is "just about yourself", why invent a label to differentiate
yourself from the rest?&lt;/li&gt;
&lt;li&gt;
If you invent a label, it becomes almost automatic to draw a line between "us" and
"them", and that in of itself almost automatically leads to "us vs them" behavior
and mentality.&lt;/li&gt;
&lt;/ol&gt;
Look, I view this whole thing as kind of like religion: whatever you want to do behind
closed doors, that's your business. But when you start waving it in other peoples'
faces, then I have a problem with it. You want to spend time on the weekends improving
your skills, go for it. You want to spend time at night learning a bunch of programming
languages so you can improve your code and your ability to design systems, go for
it. You want to study psychology and philosophy so you can understand other people
better when it comes time to interact with them, go for it. And hey, you want to put
some code up somewhere so people can point to it and help you get it better, go for
it. But when you start waving all that time and dedication in my face, you're either
doing it because you want recognition, or you want to suggest that I'm somehow not
as good as you. Live the virtuous life, don't brag about it.&gt;
&lt;p&gt;
There were some specific blogs and comments that I think deserve discusson, too:
&lt;/p&gt;
&lt;p&gt;
Dave Thomas was kind enough to comment on my blog: &lt;blockquote&gt; I remember the farmer
comment :) I think I said 30%, but I stand by what I said. And it isn't really an
elitist stance. Instead, I feel that programming is hard work. At the end of a day
of coding, I'm tired. And so I believe that if you are asking someone to do programming,
then it is in both your and their interest that they are doing something they enjoy.
Because if they don't enjoy it, then they are truly just a laborer, working hard at
something that has no meaning to them. And as you spend 8 hours a day, 5 days a week
doing it, that seems like an awful waste of an intelligent person's life. &lt;/blockquote&gt; Sure,
programming is hard. So is house painting. They're different kinds of exhaustion,
but it's exhaustion all the same. But, frankly, if somebody has chosen to take up
a job that they do just because it's a job, that's their choice, and not ours to criticize,
in my opinion. (And I remember it as 50%, because I very clearly remember saying the
"way to insult half the room" crack after it, but maybe I misheard you. I do know
others also heard it at 50%, because an attendee or two came up to talk about it after
the panel. At least, that's how I remember it at the time. But the number itself is
kinda meaningless, now that I think about it.) &lt;blockquote&gt; The farming quote was
a deliberate attempt at being shocking to make a point. But I still think it is valid.
I'd guess that 30% of the developers I meet are not happy in their work. And I think
those folks would be happier and more fulfilled doing something else that gave them
more satisfaction. &lt;/blockquote&gt; Again, you and I are both in agreement, that people
should be doing what they love, but that's a personal judgment that each person is
permitted to make for themselves. There are aspects of our lives that we don't love,
but we do because they make other people happy (Juliet and Charlotte driving the boys
around to their various activities comes to mind, for example), and it is not our
position to judge how others choose for themselves, IMHO. &lt;blockquote&gt; No one should
have to be a laborer. &lt;/blockquote&gt; And here, you and I will disagree quite fundamentally:
as I believe it was Martin Luther King, Jr, who said, "If you are going to be a janitor,
be the best janitor you know how to be." It seems by that statement that you are saying
that people who labor with their bodies rather than your minds (and trust me, you
may not be a laborer anymore, big publishing magnate that you are, but I know I sure
still am) are somehow less well-off than those who have other people working for them.
Some people don't want the responsibility of being the boss, or the owner. See the
story of the mexican fisherman at the end of this blog.&gt;
&lt;p&gt;
Nate commented: &lt;blockquote&gt; You have a logical fallacy by lumping together the people
that derided Heather's code and people that are involved in software craftmanship.
It's actually a huge leap of logic to make that connection, and it really retracts
from the article. &lt;/blockquote&gt; As I point out later, the people who derided Heather's
code were some of the same folks who hold up software craftsmanship. That wasn't me
making that up. &gt;
&lt;p&gt;
&lt;blockquote&gt; Now you realise that you are planting your flag firmly in the 'craftmanship'
camp while propelling your position upwards by drawing a line in the sand to define
another group of people as 'labourers'. Or in other words attempt to elevate yourself
by patronising others with the position you think you are paying them a compliment.
Maybe you do not realise this? &lt;/blockquote&gt; No, I realize it, and it's a fair critique,
which is why I don't label myself as a "craftsman". I have more to say on this below. &lt;blockquote&gt; However,
have you considered that the craft is not how awesome and perfect you and your code
are, but what is applicable for the task at hand. I think most people who you would
put into either camp share the same mix of attributes whether good or bad. The important
thing is if the solution created does what it is designed to do, is delivered on time
for when it is needed and if the environment that the solution has been created for
warrants it, that the code is easily understandable by yourself and others (that matter)
so it can be developed further over time and maintained. &lt;/blockquote&gt; And the very
people who call themselves "craftsmen" criticized a piece of code that, as near as
I can tell, met all of those criteria. Hence my reaction that started this whole thing. &lt;blockquote&gt; I
don't wish to judge you, and maybe you are a great, smart guy who does good in the
world, but like you I have not researched anything about you, I have simply read your
assessment above and come to a conclusion, that's being human I guess. &lt;/blockquote&gt; Oh,
people judge each other all the time, and it's high time we stopped beating them up
for it. It's human to judge. And while it would be politically correct to say, "You
shouldn't judge me before you know me", fact is, of course you're going to do exactly
that, because you don't have time to get to know me. And the fact that you don't know
me except but through the blog is totally acceptable--you shouldn't have to research
me in order to have an opinion. So we're all square on that point. (As to whether
I'm a great smart guy who does good in the world, well, that's for others to judge
in my opinion, not mine.) &lt;blockquote&gt; The above just sounds like more of the same
'elitism' that has been ripe in this world from playground to the workplace since
the beginning. &lt;/blockquote&gt; It does, doesn't it? And hopefully I clarify the position
more clearly later. &gt;
&lt;p&gt;
In &lt;a href="http://rtigger.com/blog/2013/01/25/its-okay-to-love-your-job/"&gt;It's OK
to love your job&lt;/a&gt;, Chad McCallum says that &lt;blockquote&gt; The basic premise (or at
least the one the author start out with) is that because there’s a self-declared group
of “software craftspeople”, there is going to be an egotistical divide between those
who “get it” and those who don’t. &lt;/blockquote&gt; Like it or not, Chad, that egotistical
divide is there. You can "call bullshit" all day long, but look at the reactions that
have popped up over this--people feel that divide, and frankly, it's one that's been
there for a long, long time. This isn't just me making this up.&gt;
&lt;p&gt;
Chad also says, &lt;blockquote&gt; 
&lt;p&gt;
It’s true the feedback that Heather got was unnecessarily negative. And that it came
from people who are probably considered “software craftspeople”. That said, correlation
doesn’t equal causation. I’m guessing the negative feedback was more because those
original offenders had a bad day and needed to vent. And maybe the comments after
that one just jumped on the bandwagon because someone with lots of followers and/or
respect said it.
&lt;/p&gt;
&lt;p&gt;
These are both things that can and have happened to anyone, regardless of the industry
they work in. It’s extremely unfair to associate “someone who’s passionate about software
development” to “person who’s waiting to jump on you for your mistakes”.
&lt;/p&gt;
&lt;/blockquote&gt; Unfortunately, Chad, the excuse that "others do it, too" is not an acceptable
excuse. If everybody jumped off a cliff, would you do it, too? I understand the rationale--it's
extremely hard being the one to go against the herd (I've got the psychological studies
I can cite at you that prove it), but that doesn't make it OK or excuse it. Saying
"it happens in other industries" is just an extension of that. In other industries,
women are still explicitly discriminated against--does that make it OK for us to do
that, too?&gt;
&lt;p&gt;
Chad closes his blog with "Stop calling us egotistical jerks just because we love
what we do." To which I respond, "I am happy to do so, as soon as those 'craftsmen'
who are acting like one, stop acting like one." If you're not acting like one, then
there should be no argument here. If you're trying to tell me that your label is somehow
immune to criticism, then I think we just have to agree to disagree.
&lt;/p&gt;
&lt;p&gt;
Paul Pagel (on a site devoted to software craftsmanship, no less) responded as well
with his &lt;a href="http://blog.8thlight.com/paul-pagel/2013/01/24/humble-pursuit-of-mastery.html"&gt;Humble
Pursuit of Mastery&lt;/a&gt;. He opens with: &lt;blockquote&gt; I have been reading on blogs and
tweets the sentiment that "software craftsmanship is elitism". This perception is
formed around comments of code, process, or techniques. I understand a craftsman's
earned sense of pride in their work can sometimes be inappropriately communicated. &lt;/blockquote&gt; I
don't think I commented on code, process or technique, so I can't be sure if this
is directly refuting what I'm saying, but I note that Paul has already touched on
the meme he wants to communicate in his last phrase: the craftsman's "earned sense
of pride". I have no problem with the work being something that you take pride in;
I note, however, that "pride goeth before a fall", and note that, again, Ozymandias
was justifiably proud of his accomplishments, too.&gt;
&lt;p&gt;
Paul then goes through a summation of his career, making sure to smallcaps certain
terms with which I have no argument: "sacrifice", "listen", "practicing", "critique"
and "teaching". And, in all honesty, these are things that I embrace, as well. But
I start getting a little dubious about the sanctity of your terminology, Paul, when
it's being used pretty blatantly as an advertising slogan and theme all over the site--if
you want the term to remain a Zen-like pursuit, then you need to keep the commercialism
out of it, in my opinion, or you invite the kind of criticism that's coming here (explicit
or implicit).
&lt;/p&gt;
&lt;p&gt;
Paul's conclusion wraps up with: &lt;blockquote&gt; Do sacrificing, listening, practice,
critiquing, and teaching sound like elitist qualities to you? Software craftsmanship
starts out as a humble endeavor moving towards mastery. I won't let 140 or 1000 characters
redefine the hours and years spent working hard to become a craftsman. It gave me
humility and the confidence to be a professional software developer. Sometimes I let
confidence get the better of me, but I know when that happens I am not honoring the
spirit of craftsmanship which I was trained. &lt;/blockquote&gt; Humility enough to trademark
your phrase "Software is our craft"? Humility enough to call yourself a "driving force"
behind software craftsmanship? Don't get me wrong, Paul, there is a certain amount
of commercialism that any consultant must adopt in order to survive--but either please
don't mix your life-guiding principles with your commercialism, or else don't be surprised
when others take aim at your "humility" when you do. It's the same when ministers
stand in a multi-million dollar building on a Sunday morning and talk about the parable
of the widow giving away her last two coppers--that smacks of hypocrisy.&gt;
&lt;p&gt;
Finally, Matt van Horn wrote in &lt;a href="http://www.mattvanhorn.com/2013/01/24/craftsmanship-a-rebuttal/"&gt;Crafsmanship,
a rebuttal&lt;/a&gt; that: &lt;blockquote&gt; there is an allusion to software craftsmen as being
an exclusive group who agre on the “right” tools and techniques. This could not be
further from the truth. Anyone who is serious about their craft knows that for every
job there are some tools that are better and some that are worse. &lt;/blockquote&gt; ...
but then he goes right into making that exact mistake: &lt;blockquote&gt; Now, I may not
have a good definition of elegant code, but I definitely know it when I see it – regardless
of who wrote it. If you can’t see that 
&lt;br /&gt;
&lt;pre&gt;
(1..10).each{|i| puts i}
&lt;/pre&gt;
&lt;br /&gt;
is more elegant than 
&lt;br /&gt;
&lt;pre&gt;
x = 0
while true do
  x = x + 1
  if x &gt; 10
    break
  end
  puts x
end
&lt;/pre&gt;
then you must near the beginning of your journey towards mastery. Practicing your
craft develops your ability to recognize these differences, just as a skilled tailor
can more easily spot the difference between a bespoke suit and something from Men’s
Wearhouse. &lt;/blockquote&gt; Matt, you kind of make my point for me. What makes it elegant?
You take it as self-evident. I don't. As a matter of fact, I've been asking this question
for some years now, "What makes code 'elegant', as opposed to 'ugly'? Ironically,
Elliott Rusty Harold just blogged about how this style of coding is dangerous in Java,
and got crucified for it, but he has the point that functional style (your first example)
doesn't JIT as well as the more imperative style right now on the JVM (or on the CLR,
from what I can tell). Are you assuming that this will be running on a native Ruby
implementation, on JRuby, IronRuby, ...? You have judged the code in the second example
based on an intrinsic value system that you may have never questioned. To judge, you
have to be able to explain your judgments in terms of the value system. And the fact
that you judge without any context, kind of speaks directly to the point I was trying
to make: "craftsmen", it seems, have this tendency to judge in absence of context,
because they are clearly "further down their journey towards mastery", to use your
own metaphor.&gt;
&lt;p&gt;
Or, to put it much more succinctly, "Beauty is in the eye of the beholder".
&lt;/p&gt;
&lt;p&gt;
Matt then tells me I missed the point of the samurai and tea master story: &lt;blockquote&gt; inally,
he closes with a famous zen story, but he entirely misses the point of it. The story
concerns a tea master, and a samurai, who get into a duel. The tea master prevails
by bringing the same concentration to the duel that he brings to his tea ceremony.
The point that Ted seems to miss here is that the tea master is a craftsman of the
highest order. A master of cha-do (the way of tea) is able to transform the simple
act of making and pouring a cup of tea into something transcendant by bringing to
this simple act a clear mind, a good attitude, and years of patient, humble practice.
Arguably he prevails because he has perfected his craft to a higher degree than the
samurai has perfected his own. That is why he has earned the right to wear the garb
of a samurai, and why he is able to face down his opponent. &lt;/blockquote&gt; Which, again,
I find funny, because most Zen masters will tell you that the story--any Zen story,
in fact--has no "definitive" meaning, but has meaning based on how you interpret it.
(There are a few Zen parables that reinforce this point, but it gets a little meta
to justify my understanding of a Zen story by quoting another Zen story.) How Matt
chooses to interpret that parable is, of course, up to him. I choose to interpret
the story thusly: the insulted samurai felt that his "earned sense of pride" at his
sword mastery was insulted by the tea master--clearly no swordsman, as it says in
the story--wore robes of a rank and honor that he had not earned. And clearly, the
tea master was no swordsman. But what the tea master learned from his peer was not
how to use his concentration and discipline to improve his own swordsmanship, but
how to demonstrate that he had, in fact, earned a note of mastery through an entirely
different discipline than the insulted samurai's. The tea master still has no mastery
of the sword, but in his own domain, he is an expert. This was all the insulted samurai
needed to see, that the badge of honor had been earned, and not just imposed by a
capricious (and disrespectful) lord. Put a paintbrush and canvas into the hands of
a house painter, and you get pretty much a mess--but put a spray painter in the hands
of Leonardo, and you still get a mess. In fact, to really do the parable justice,
we should see how much "craft" Matt can bring when asked to paint a house, because
that's about how much relevance swordsmanship and house painting have in relationship
to one another. (All analogies fail eventually, by the way, and we're probably reaching
the boundaries of this one.)&gt;
&lt;p&gt;
Billy Hollis is a master with VB, far more than I ever will be; I know C++ far better
than he ever will. I respect his abilities, and he, mine. There is no argument here.
But more importantly, there are friends I've worked with in the past who are masters
with neither VB nor C++, nor any other programming language, but chose instead to
sink their time and energy into skiing, pottery, or being a fan of a television show.
They chose to put their energies--energies the "craftsmen" seem to say should be put
towards their programming--towards things that bring them joy, which happen to not
be programming.
&lt;/p&gt;
&lt;p&gt;
Which brings me to another refrain that came up over and over again: &lt;b&gt;You criticize
the craftsman, but then you draw a distinction between "craftsman" and "laborer".
You're confusing (or confused).&lt;/b&gt; First of all, I think it important to disambiguate
along two axes: those who are choosing to invest their time into learning to write
better software, and those who are choosing to look at writing code as "just" a job
as one axis, and along a second axis, the degree to which they have mastered programming.
By your own definitions, "craftsmen", can one be early in your mastery of programming
and still be a "craftsman"? Can one be a master bowler who's just picked up programming
and be considered a "craftsman"? Is the nature of "craftsmanship" a measure of your
skill, or is it your dedication to programming, or is it your dedication to something
in your life, period? (Remember, the tea master parable says that a master C++ developer
will see the master bowler and respect his mastery of bowling, even though he can't
code worth a crap. Would you call him a "craftsman"?)&lt;p&gt;
&lt;p&gt;
Frankly, I will say, for the record, that I think there are people programming who
don't want to put a ton of time and energy into learning how to be better programmers.
(I suspect that most of them won't ever read this blog, either.) They see the job
as "just a job", and are willing to be taught how to do things, but aren't willing
to go off and learn how to do them on their own. They want to do the best job they
can, because they, like any human being, want to bring value to the world, but don't
have that passion for programming. They want to come in at 9, do their job, and go
home at 5. These are those whom I call "laborers". They are the "fisherman" in &lt;a href="http://www.lifeprinciples.net/SuccessatLife.html"&gt;the
following story&lt;/a&gt;: &lt;blockquote&gt; 
&lt;p&gt;
The businessman was at the pier of a small coastal Mexican village when a small boat
with just one fisherman docked. Inside the small boat were several large yellowfin
tuna. The businessman complimented the Mexican on the quality of his fish and asked
how long it took to catch them. The Mexican replied only a little while.
&lt;/p&gt;
&lt;p&gt;
The businessman then asked why he didn't stay out longer and catch more fish? The
Mexican said he had enough to support his family's immediate needs. The businessman
then asked, but what do you do with the rest of your time? The Mexican fisherman said,
"I sleep late, fish a little, play with my children, take a siesta with my wife, Maria,
stroll into the village each evening where I sip wine and play guitar with my amigos;
I have a full and busy life, señor."
&lt;/p&gt;
&lt;p&gt;
The businessman scoffed, "I am a Harvard MBA and I could help you. You should spend
more time fishing and with the proceeds buy a bigger boat. With the proceeds from
the bigger boat you could buy several boats; eventually you would have a fleet of
fishing boats. Instead of selling your catch to a middleman, you would sell directly
to the processor and eventually open your own cannery. You would control the product,
processing and distribution. You would need to leave this small coastal fishing village
and move to Mexico City, then LA and eventually New York City where you would run
your expanding enterprise."
&lt;/p&gt;
&lt;p&gt;
The Mexican fisherman asked, "But señor, how long will this all take?" To which the
businessman replied, "15-20 years." "But what then, señor?" The businessman laughed
and said, "That's the best part! When the time is right you would announce an IPO
and sell your company stock to the public and become very rich. You would make millions."
"Millions, señor? Then what?" The businessman said, "Then you would retire. Move to
a small coastal fishing village where you would sleep late, fish a little, play with
your kids, take a siesta with your wife, stroll to the village in the evenings where
you could sip wine and play your guitar with your amigos."
&lt;/p&gt;
&lt;/blockquote&gt; &gt;
&lt;p&gt;
What makes all of this (this particular subject, craftsmanship) particularly hard
for me is that I &lt;i&gt;like&lt;/i&gt; the message that craftsmanship brings, in terms of how
you conduct yourself. I &lt;i&gt;love&lt;/i&gt; the book &lt;a href="http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382"&gt;Apprenticeship
Patterns&lt;/a&gt;, for example, and think that anyone, novice or master, should read this
book. I have taken on speaking apprentices in the past, and will continue to do so
well into the future. The message that underlies the meme of craftsmanship--the constant
striving to improve--is a good one, and I don't want to throw the baby out with the
bathwater. If you have adopted "craftsmanship" as a core value of yours, then please,
by all means, continue to practice it! Myself, I choose to do so, as well. I have
mentored programmers, I have taken speaking apprentices, and I strive to learn more
about my craft by branching my studies out well beyond software--I am reading books
on management, psychology, building architecture, and business, because I think there
is more to software than just the choice of programming language or style.
&lt;/p&gt;
&lt;p&gt;
But be aware that if you start telling people how you're living your life, there is
an implicit criticism or expectation that they should be doing that, as well. And
when you start criticizing other peoples' code as being "unelegant" or "unbeautiful"
or "unclean", you'd better be able to explain your value system and why you judged
it as so. Humility is a hard, hard path to tread, and one that I have only recently
started to see the outlines of; I am guilty of just about every sin imaginable when
it comes to this subject. I have created "elegant" systems that failed their original
intent. I have criticized "ugly" code that, in fact, served the purpose well. I have
bragged of my own accomplishments to those who accomplished a lot more than I did,
or ever will. And I consider it amazing to me that my friends who've been with me
since long before I started to eat my justly-deserved humble pie are still with me.
(And that those friends are some amazing people in their own right.; if a man is judged
by the company he keeps, then by looking around at my friends, I am judged to be a
king.) I will continue to strive to be better than I am now, though, even within this
discussion right now: those of you who took criticism with my post, you have good
points, all of you, and I certainly don't want to stop you from continuing on your
journeys of self-discovery, either.
&lt;/p&gt;
&lt;p&gt;
And if we ever cross paths in person, I will buy you a beer so that we can sit down,
and we can continue this discussion in person.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=07ef7e67-accd-4232-9bb2-99082d1e0200" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,07ef7e67-accd-4232-9bb2-99082d1e0200.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Social</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=73f28449-07ec-4638-8bf6-24dd3c400c39</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=73f28449-07ec-4638-8bf6-24dd3c400c39</wfw:commentRss>
      <slash:comments>14</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I don't know Heather Arthur from Eve. Never met her, never read an article by her,
seen a video she's in or shot, or seen her code. Matter of fact, I don't even know
that she is a "she"--I'm just guessing from the name.
</p>
        <p>
But apparently she got <a href="http://harthur.wordpress.com/2013/01/24/771/">quite
an ugly reaction</a> from a few folks when she open-sourced some code: 
</p>
        <blockquote> So I went to see what people were saying about this project. I searched
Twitter and several tweets came up. One of them, I guess the original one, was basically
like “hey, this is cool”, but then the rest went like this: 
<br />
"I cannot even make this stuff up." --@steveklabnik 
<br />
"Ever wanted to make sed or grep worse?" --@zeeg 
<br />
"@steveklabnik or just point to the actual code file. eyes bleeding!" --@coreyhaines 
<br />
At this point, all I know is that by creating this project I’ve done something very
wrong. It seemed liked I’d done something fundamentally wrong, so stupid that it flabbergasts
someone. So wrong that it doesn’t even need to be explained. And my code is so bad
it makes people’s eyes bleed. So of course I start sobbing. </blockquote> Now, to
be fair, <a href="http://programmingtour.blogspot.com/2013/01/im-sorry.html">Corey
later apologized</a>. But I'm still going to criticize the response. Not because Heather's
a "she" and we should be more supportive of women in IT. Not because somebody took
something they found interesting and put it up on github for anyone to take a look
at and use if they found it useful. Not even because it's good code when they said
it was bad code or vice versa. (To be honest, I haven't even looked at the code--that's
how immaterial it is to my point.)
<p>
I'm criticizing because this is what "software craftsmanship" gets us: an imposed
segregation of those who "get it" from those who "don't" based on somebody's arbitrary
criteria of what we should or shouldn't be doing. And if somebody doesn't use the
"right" tools or code it in the "right" way, then bam! You clearly aren't a "craftsman"
(or "craftswoman"?) and you clearly don't care about your craft and you clearly aren't
worth the time or energy necessary to support and nourish and grow and....
</p><p>
Frankly, I've not been a fan of this movement since its inception. Dave Thomas (Ruby
Dave) was on a software panel with me at a No Fluff Just Stuff show about five years
ago when we got on to this subject, and Dave said, point blank, "About half of the
programmers in the world should just go take up farming." He paused, and in the moment
that followed, I said, "Wow, Dave, way to insult half the room." He immediately pointed
out that the people in the room were part of the first half, since they were at a
conference, but it just sort of underscored to me how high-handed and high-minded
that kind of talk and position can be.
</p><p>
Not all of us writing code have to be artists. Frankly, in the world of painting,
there are those who will spend hours and days and months, tiny brushes in hand, jars
of pigment just one lumens different from one another, laboring over the finest details,
creating just one piece... and then there are those who paint houses with paint-sprayers,
out of cans of mass-produced "Cream Beige" found at your local Lowes. And you know
what? <i>We need both of them.</i></p><p>
I will now coin a term that I consider to be the opposite of "software craftsman":
the "software laborer". In my younger days, believing myself to be one of those "craftsmen",
a developer who knew C++ in and out, who understood memory management and pointers,
who could create elegant and useful solutions in templates and classes and inheritance,
I turned up my nose at those "laborers" who cranked out one crappy app after another
in (what else?) Visual Basic. My app was tight, lean, and well-tuned; their apps were
sloppy, bloated, and ugly. My app was a paragon of reused code; their apps were cut-and-paste
cobbled-together duct-tape wonders. My app was a shining beacon on a hill for all
the world to admire; their apps were mindless drones, slogging through the mud....
Yeah, OK, so you get the idea.
</p><p>
But the funny thing was, those "laborers" were going home at 5 every day. Me, I was
staying sometimes until 9pm, wallowing in the wonderment of my code. And, I have to
wonder, how much of that was actually not the wonderment of my code, but the wonderment
of "me" over the wonderment of "code".
</p><p>
Speaking of, by the way, there appear to be the makings of another such false segregation,
in the areas of "functional programming". In defense of Elliott Rusty Harold's blog
the other day (which I criticized, and still stand behind, for the reasons I cited
there), there are a lot of programmers that are falling into the trap of thinking
that "all the cool kids are using functional programming, so if I want to be a cool
kid, I have to use functional programming too, even though I'm not sure what I'm doing....".
Not all the cool kids are using FP. Some aren't even using OOP. Some are just happily
humming along using good ol' fashioned C. And producing some really quality stuff
doing so.
</p><p>
See, I have to wonder just how much of the software "craftsmanship" being touted isn't
really a narcissistic "Look at me, world! Look at how much better I am because I care
about what I do! Look upon my works, ye mighty, and despair!" kind of mentality. Too
much of software "craftsmanship" seems to be about the "me" part of "my code". And
when I think about why that is, I come to an interesting assertion: That if we take
the name away from the code, and just look at the code, we can't really tell what's
"elegant" code, what's "hack" code, and what was "elegant hack because there were
all these other surrounding constraints outside the code". Without the context, we
can't tell.
</p><p>
A few years after my high point as a C++ "craftsman", I was asked to do a short, one-week
programming gig/assignment, and the more I looked at it, the more it screamed "VB"
at me. And I discovered that what would've taken me probably a month to do in C++
was easily accomplished in a few days in VB. I remember looking at the code, and feeling
this sickening, sinking sense of despair at how stupid I must've looked, crowing.
VB isn't a bad language--and neither is C++. Or Java. Or C#. Or Groovy, or Scala,
or Python, or, heck, just about any language you choose to name. (Except Perl. I refuse
to cave on that point. Mostly for comedic effect.)
</p><p>
But more importantly, somebody who comes in at 9, does what they're told, leaves at
5, and <i>never gives a rat's ass about programming except for what they need to know
to get their job done</i>, I have respect for them. Yes, some people will want to
hold themselves up as "painters", and others will just show up at your house at 8
in the morning with drop cloths. Both have their place in the world. Neither should
be denigrated for their choices about how they live their lives or manage their careers.
(Yes, there's a question of professional ethics--I want the house painters to make
sure they do a good job, too, but quality can come just as easily from the nozzle
of a spray painter as it does from the tip of a paintbrush.)
</p><p>
I end this with one of my favorite parables from Japanese lore: 
</p><blockquote><p>
Several centuries ago, a tea master worked in the service of Lord Yamanouchi. No-one
else performed the way of the tea to such perfection. The timing and the grace of
his every move, from the unfurling of mat, to the setting out of the cups, and the
sifting of the green leaves, was beauty itself. His master was so pleased with his
servant, that he bestowed upon him the rank and robes of a Samurai warrior.
</p><p>
When Lord Yamanouchi travelled, he always took his tea master with him, so that others
could appreciate the perfection of his art. On one occasion, he went on business to
the great city of Edo, which we now know as Tokyo.
</p><p>
When evening fell, the tea master and his friends set out to explore the pleasure
district, known as the floating world. As they turned the corner of a wooden pavement,
they found themselves face to face with two Samurai warriors.
</p><p>
The tea master bowed, and politely step into the gutter to let the fearsome ones pass.
But although one warrior went by, the other remained rooted to the spot. He stroked
a long black whisker that decorated his face, gnarled by the sun, and scarred by the
sword. His eyes pierced through the tea maker’s heart like an arrow.
</p><p>
He did not quite know what to make of the fellow who dressed like a fellow Samurai,
yet who would willingly step aside into a gutter. What kind of warrior was this? He
looked him up and down. Where were broad shoulders and the thick neck of a man of
force and muscle? Instinct told him that this was no soldier. He was an impostor who
by ignorance or impudence had donned the uniform of a Samurai. He snarled: “Tell me,
oh strange one, where are you from and what is your rank?”
</p><p>
The tea master bowed once more. “It is my honour to serve Lord Yamanouchi and I am
his master of the way of the tea.”
</p><p>
“A tea-sprout who dares to wear the robes of Samurai?” exclaimed the rough warrior.
</p><p>
The tea master’s lip trembled. He pressed his hands together and said: “My lord has
honoured me with the rank of a Samurai and he requires me to wear these robes. “
</p><p>
The warrior stamped the ground like a raging a bull and exclaimed: “He who wears the
robes of a Samurai must fight like a Samurai. I challenge you to a duel. If you die
with dignity, you will bring honour to your ancestors. And if you die like a dog,
at least you will be no longer insult the rank of the Samurai !”
</p><p>
By now, the hairs on the tea master’s neck were standing on end like the feet of a
helpless centipede that has been turned upside down. He imagined he could feel that
edge of the Samurai blade against his skin. He thought that his last second on earth
had come.
</p><p>
But the corner of the street was no place for a duel with honour. Death is a serious
matter, and everything has to be arranged just so. The Samurai’s friend spoke to the
tea master’s friends, and gave them the time and the place for the mortal contest.
</p><p>
When the fierce warriors had departed, the tea master’s friends fanned his face and
treated his faint nerves with smelling salts. They steadied him as they took him into
a nearby place of rest and refreshment. There they assured him that there was no need
to fear for his life. Each one of them would give freely of money from his own purse,
and they would collect a handsome enough sum to buy the warrior off and make him forget
his desire to fight a duel. And if by chance the warrior was not satisfied with the
bribe, then surely Lord Yamanouchi would give generously to save his much prized master
of the way of the tea.
</p><p>
But these generous words brought no cheer to the tea master. He thought of his family,
and his ancestors, and of Lord Yamanouchi himself, and he knew that he must not bring
them any reason to be ashamed of him.
</p><p>
“No,” he said with a firmness that surprised his friends. “I have one day and one
night to learn how to die with honour, and I will do so.”
</p><p>
And so speaking, he got up and returned alone to the court of Lord Yamanouchi. There
he found his equal in rank, the master of fencing, he was skilled as no other in the
art of fighting with a sword.
</p><p>
“Master,” he said, when he had explained his tale, “Teach me to die like a Samurai.”
</p><p>
But the master of fencing was a wise man, and he had a great respect for the master
of the Tea ceremony. And so he said: “I will teach you all you require, but first,
I ask that you perform the way of the Tea for me one last time.”
</p><p>
The tea master could not refuse this request. As he performed the ceremony, all trace
of fear seemed to leave his face. He was serenely concentrated on the simple but beautiful
cups and pots, and the delicate aroma of the leaves. There was no room in his mind
for anxiety. His thoughts were focused on the ritual.
</p><p>
When the ceremony was complete, the fencing master slapped his thigh and exclaimed
with pleasure : “There you have it. No need to learn anything of the way of death.
Your state of mind when you perform the tea ceremony is all that is required. When
you see your challenger tomorrow, imagine that you are about to serve tea for him.
Salute him courteously, express regret that you could not meet him sooner, take of
your coat and fold it as you did just now. Wrap your head in a silken scarf and and
do it with the same serenity as you dress for the tea ritual. Draw your sword, and
hold it high above your head. Then close your eyes and ready yourself for combat.
“
</p><p>
And that is exactly what the tea master did when, the following morning, at the crack
of dawn he met his opponent. The Samurai warrior had been expecting a quivering wreck
and he was amazed by the tea master’s presence of mind as he prepared himself for
combat. The Samurai’s eyes were opened and he saw a different man altogether. He thought
he must have fallen victim to some kind of trick or deception ,and now it was he who
feared for his life. The warrior bowed, asked to be excused for his rude behaviour,
and left the place of combat with as much speed and dignity as he could muster.
</p></blockquote> (excerpted from <a href="http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/">http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/</a>) 
<p>
My name is Ted Neward. And I bow with respect to the "software laborers" of the world,
who churn out quality code without concern for "craftsmanship", because their lives
are more than just their code.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=73f28449-07ec-4638-8bf6-24dd3c400c39" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>On the Dark Side of "Craftsmanship"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</guid>
      <link>http://blogs.tedneward.com/2013/01/24/On+The+Dark+Side+Of+Craftsmanship.aspx</link>
      <pubDate>Thu, 24 Jan 2013 05:06:24 GMT</pubDate>
      <description>&lt;p&gt;
I don't know Heather Arthur from Eve. Never met her, never read an article by her,
seen a video she's in or shot, or seen her code. Matter of fact, I don't even know
that she is a "she"--I'm just guessing from the name.
&lt;/p&gt;
&lt;p&gt;
But apparently she got &lt;a href="http://harthur.wordpress.com/2013/01/24/771/"&gt;quite
an ugly reaction&lt;/a&gt; from a few folks when she open-sourced some code: &lt;blockquote&gt; So
I went to see what people were saying about this project. I searched Twitter and several
tweets came up. One of them, I guess the original one, was basically like “hey, this
is cool”, but then the rest went like this: 
&lt;br /&gt;
"I cannot even make this stuff up." --@steveklabnik 
&lt;br /&gt;
"Ever wanted to make sed or grep worse?" --@zeeg 
&lt;br /&gt;
"@steveklabnik or just point to the actual code file. eyes bleeding!" --@coreyhaines 
&lt;br /&gt;
At this point, all I know is that by creating this project I’ve done something very
wrong. It seemed liked I’d done something fundamentally wrong, so stupid that it flabbergasts
someone. So wrong that it doesn’t even need to be explained. And my code is so bad
it makes people’s eyes bleed. So of course I start sobbing. &lt;/blockquote&gt; Now, to
be fair, &lt;a href="http://programmingtour.blogspot.com/2013/01/im-sorry.html"&gt;Corey
later apologized&lt;/a&gt;. But I'm still going to criticize the response. Not because Heather's
a "she" and we should be more supportive of women in IT. Not because somebody took
something they found interesting and put it up on github for anyone to take a look
at and use if they found it useful. Not even because it's good code when they said
it was bad code or vice versa. (To be honest, I haven't even looked at the code--that's
how immaterial it is to my point.)&gt;
&lt;p&gt;
I'm criticizing because this is what "software craftsmanship" gets us: an imposed
segregation of those who "get it" from those who "don't" based on somebody's arbitrary
criteria of what we should or shouldn't be doing. And if somebody doesn't use the
"right" tools or code it in the "right" way, then bam! You clearly aren't a "craftsman"
(or "craftswoman"?) and you clearly don't care about your craft and you clearly aren't
worth the time or energy necessary to support and nourish and grow and....
&lt;/p&gt;
&lt;p&gt;
Frankly, I've not been a fan of this movement since its inception. Dave Thomas (Ruby
Dave) was on a software panel with me at a No Fluff Just Stuff show about five years
ago when we got on to this subject, and Dave said, point blank, "About half of the
programmers in the world should just go take up farming." He paused, and in the moment
that followed, I said, "Wow, Dave, way to insult half the room." He immediately pointed
out that the people in the room were part of the first half, since they were at a
conference, but it just sort of underscored to me how high-handed and high-minded
that kind of talk and position can be.
&lt;/p&gt;
&lt;p&gt;
Not all of us writing code have to be artists. Frankly, in the world of painting,
there are those who will spend hours and days and months, tiny brushes in hand, jars
of pigment just one lumens different from one another, laboring over the finest details,
creating just one piece... and then there are those who paint houses with paint-sprayers,
out of cans of mass-produced "Cream Beige" found at your local Lowes. And you know
what? &lt;i&gt;We need both of them.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;
I will now coin a term that I consider to be the opposite of "software craftsman":
the "software laborer". In my younger days, believing myself to be one of those "craftsmen",
a developer who knew C++ in and out, who understood memory management and pointers,
who could create elegant and useful solutions in templates and classes and inheritance,
I turned up my nose at those "laborers" who cranked out one crappy app after another
in (what else?) Visual Basic. My app was tight, lean, and well-tuned; their apps were
sloppy, bloated, and ugly. My app was a paragon of reused code; their apps were cut-and-paste
cobbled-together duct-tape wonders. My app was a shining beacon on a hill for all
the world to admire; their apps were mindless drones, slogging through the mud....
Yeah, OK, so you get the idea.
&lt;/p&gt;
&lt;p&gt;
But the funny thing was, those "laborers" were going home at 5 every day. Me, I was
staying sometimes until 9pm, wallowing in the wonderment of my code. And, I have to
wonder, how much of that was actually not the wonderment of my code, but the wonderment
of "me" over the wonderment of "code".
&lt;/p&gt;
&lt;p&gt;
Speaking of, by the way, there appear to be the makings of another such false segregation,
in the areas of "functional programming". In defense of Elliott Rusty Harold's blog
the other day (which I criticized, and still stand behind, for the reasons I cited
there), there are a lot of programmers that are falling into the trap of thinking
that "all the cool kids are using functional programming, so if I want to be a cool
kid, I have to use functional programming too, even though I'm not sure what I'm doing....".
Not all the cool kids are using FP. Some aren't even using OOP. Some are just happily
humming along using good ol' fashioned C. And producing some really quality stuff
doing so.
&lt;/p&gt;
&lt;p&gt;
See, I have to wonder just how much of the software "craftsmanship" being touted isn't
really a narcissistic "Look at me, world! Look at how much better I am because I care
about what I do! Look upon my works, ye mighty, and despair!" kind of mentality. Too
much of software "craftsmanship" seems to be about the "me" part of "my code". And
when I think about why that is, I come to an interesting assertion: That if we take
the name away from the code, and just look at the code, we can't really tell what's
"elegant" code, what's "hack" code, and what was "elegant hack because there were
all these other surrounding constraints outside the code". Without the context, we
can't tell.
&lt;/p&gt;
&lt;p&gt;
A few years after my high point as a C++ "craftsman", I was asked to do a short, one-week
programming gig/assignment, and the more I looked at it, the more it screamed "VB"
at me. And I discovered that what would've taken me probably a month to do in C++
was easily accomplished in a few days in VB. I remember looking at the code, and feeling
this sickening, sinking sense of despair at how stupid I must've looked, crowing.
VB isn't a bad language--and neither is C++. Or Java. Or C#. Or Groovy, or Scala,
or Python, or, heck, just about any language you choose to name. (Except Perl. I refuse
to cave on that point. Mostly for comedic effect.)
&lt;/p&gt;
&lt;p&gt;
But more importantly, somebody who comes in at 9, does what they're told, leaves at
5, and &lt;i&gt;never gives a rat's ass about programming except for what they need to know
to get their job done&lt;/i&gt;, I have respect for them. Yes, some people will want to
hold themselves up as "painters", and others will just show up at your house at 8
in the morning with drop cloths. Both have their place in the world. Neither should
be denigrated for their choices about how they live their lives or manage their careers.
(Yes, there's a question of professional ethics--I want the house painters to make
sure they do a good job, too, but quality can come just as easily from the nozzle
of a spray painter as it does from the tip of a paintbrush.)
&lt;/p&gt;
&lt;p&gt;
I end this with one of my favorite parables from Japanese lore: &lt;blockquote&gt; 
&lt;p&gt;
Several centuries ago, a tea master worked in the service of Lord Yamanouchi. No-one
else performed the way of the tea to such perfection. The timing and the grace of
his every move, from the unfurling of mat, to the setting out of the cups, and the
sifting of the green leaves, was beauty itself. His master was so pleased with his
servant, that he bestowed upon him the rank and robes of a Samurai warrior.
&lt;/p&gt;
&lt;p&gt;
When Lord Yamanouchi travelled, he always took his tea master with him, so that others
could appreciate the perfection of his art. On one occasion, he went on business to
the great city of Edo, which we now know as Tokyo.
&lt;/p&gt;
&lt;p&gt;
When evening fell, the tea master and his friends set out to explore the pleasure
district, known as the floating world. As they turned the corner of a wooden pavement,
they found themselves face to face with two Samurai warriors.
&lt;/p&gt;
&lt;p&gt;
The tea master bowed, and politely step into the gutter to let the fearsome ones pass.
But although one warrior went by, the other remained rooted to the spot. He stroked
a long black whisker that decorated his face, gnarled by the sun, and scarred by the
sword. His eyes pierced through the tea maker’s heart like an arrow.
&lt;/p&gt;
&lt;p&gt;
He did not quite know what to make of the fellow who dressed like a fellow Samurai,
yet who would willingly step aside into a gutter. What kind of warrior was this? He
looked him up and down. Where were broad shoulders and the thick neck of a man of
force and muscle? Instinct told him that this was no soldier. He was an impostor who
by ignorance or impudence had donned the uniform of a Samurai. He snarled: “Tell me,
oh strange one, where are you from and what is your rank?”
&lt;/p&gt;
&lt;p&gt;
The tea master bowed once more. “It is my honour to serve Lord Yamanouchi and I am
his master of the way of the tea.”
&lt;/p&gt;
&lt;p&gt;
“A tea-sprout who dares to wear the robes of Samurai?” exclaimed the rough warrior.
&lt;/p&gt;
&lt;p&gt;
The tea master’s lip trembled. He pressed his hands together and said: “My lord has
honoured me with the rank of a Samurai and he requires me to wear these robes. “
&lt;/p&gt;
&lt;p&gt;
The warrior stamped the ground like a raging a bull and exclaimed: “He who wears the
robes of a Samurai must fight like a Samurai. I challenge you to a duel. If you die
with dignity, you will bring honour to your ancestors. And if you die like a dog,
at least you will be no longer insult the rank of the Samurai !”
&lt;/p&gt;
&lt;p&gt;
By now, the hairs on the tea master’s neck were standing on end like the feet of a
helpless centipede that has been turned upside down. He imagined he could feel that
edge of the Samurai blade against his skin. He thought that his last second on earth
had come.
&lt;/p&gt;
&lt;p&gt;
But the corner of the street was no place for a duel with honour. Death is a serious
matter, and everything has to be arranged just so. The Samurai’s friend spoke to the
tea master’s friends, and gave them the time and the place for the mortal contest.
&lt;/p&gt;
&lt;p&gt;
When the fierce warriors had departed, the tea master’s friends fanned his face and
treated his faint nerves with smelling salts. They steadied him as they took him into
a nearby place of rest and refreshment. There they assured him that there was no need
to fear for his life. Each one of them would give freely of money from his own purse,
and they would collect a handsome enough sum to buy the warrior off and make him forget
his desire to fight a duel. And if by chance the warrior was not satisfied with the
bribe, then surely Lord Yamanouchi would give generously to save his much prized master
of the way of the tea.
&lt;/p&gt;
&lt;p&gt;
But these generous words brought no cheer to the tea master. He thought of his family,
and his ancestors, and of Lord Yamanouchi himself, and he knew that he must not bring
them any reason to be ashamed of him.
&lt;/p&gt;
&lt;p&gt;
“No,” he said with a firmness that surprised his friends. “I have one day and one
night to learn how to die with honour, and I will do so.”
&lt;/p&gt;
&lt;p&gt;
And so speaking, he got up and returned alone to the court of Lord Yamanouchi. There
he found his equal in rank, the master of fencing, he was skilled as no other in the
art of fighting with a sword.
&lt;/p&gt;
&lt;p&gt;
“Master,” he said, when he had explained his tale, “Teach me to die like a Samurai.”
&lt;/p&gt;
&lt;p&gt;
But the master of fencing was a wise man, and he had a great respect for the master
of the Tea ceremony. And so he said: “I will teach you all you require, but first,
I ask that you perform the way of the Tea for me one last time.”
&lt;/p&gt;
&lt;p&gt;
The tea master could not refuse this request. As he performed the ceremony, all trace
of fear seemed to leave his face. He was serenely concentrated on the simple but beautiful
cups and pots, and the delicate aroma of the leaves. There was no room in his mind
for anxiety. His thoughts were focused on the ritual.
&lt;/p&gt;
&lt;p&gt;
When the ceremony was complete, the fencing master slapped his thigh and exclaimed
with pleasure : “There you have it. No need to learn anything of the way of death.
Your state of mind when you perform the tea ceremony is all that is required. When
you see your challenger tomorrow, imagine that you are about to serve tea for him.
Salute him courteously, express regret that you could not meet him sooner, take of
your coat and fold it as you did just now. Wrap your head in a silken scarf and and
do it with the same serenity as you dress for the tea ritual. Draw your sword, and
hold it high above your head. Then close your eyes and ready yourself for combat.
“
&lt;/p&gt;
&lt;p&gt;
And that is exactly what the tea master did when, the following morning, at the crack
of dawn he met his opponent. The Samurai warrior had been expecting a quivering wreck
and he was amazed by the tea master’s presence of mind as he prepared himself for
combat. The Samurai’s eyes were opened and he saw a different man altogether. He thought
he must have fallen victim to some kind of trick or deception ,and now it was he who
feared for his life. The warrior bowed, asked to be excused for his rude behaviour,
and left the place of combat with as much speed and dignity as he could muster.
&lt;/p&gt;
&lt;/blockquote&gt; (excerpted from &lt;a href="http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/"&gt;http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/&lt;/a&gt;) &gt;
&lt;p&gt;
My name is Ted Neward. And I bow with respect to the "software laborers" of the world,
who churn out quality code without concern for "craftsmanship", because their lives
are more than just their code.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=73f28449-07ec-4638-8bf6-24dd3c400c39" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Social</category>
      <category>Visual Basic</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=f41b3b0b-24f5-4762-8009-13304badecc6</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,f41b3b0b-24f5-4762-8009-13304badecc6.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,f41b3b0b-24f5-4762-8009-13304badecc6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f41b3b0b-24f5-4762-8009-13304badecc6</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A year ago today (roughly), I gave the opening keynote at CodeMash 2.0.1.2. For those
of you who were there, I don't think I need to tell you what happened. For those of
you who weren't there, you probably still heard about, thanks to the Twitterstream
of comments and counter-comments that followed. I've more or less tried to keep quiet
about it since that time, trying to just let the furor die down (and it did, pretty
quickly, I thought) out of respect to the conference organizers.
</p>
        <p>
But with the show starting up again this week, and there having been a few people
over the last twelve months who've asked me about "what the f*ck were you thinking"
(whether that was in deliberate pun/jest or not, I can't always tell), and most importantly,
now that I know that Jim and I are square with each other (thanks to a Twitter conversation
a few days ago), I figure it's time to come clean and tell my side of the story.
</p>
        <p>
TL;DR: If I had the chance to do the keynote over again, I'd do it differently.
</p>
        <p>
(By the way, the rest of this post does have a few profanities in it, so if you're
offended by that sort of thing, this is a good place to stop reading. Or, as the movies
would say, this post is rated PG-13 for adult language.)
</p>
        <p>
As a speaker, I have always sought to create a "persona" on stage that allowed me
the maximum freedom of expression and opportunity to get my point across. A long time
ago, when I started teaching at DevelopMentor, I learned from some of the best--one
of those best being, of course, Don Box, but another of those was Ted Pattison. It
was he who taught me that "If you can make 'em laugh, you can do whatever you want
to them" (meaning the audience). He demonstrated this quite graphically by guest-lecturing
in one of my classes once, early in my tenure as a DM instructor, and promptly castrated
one of the students who was constantly irritating the class (and me) with off-topic
questions. It was an eye-opening experience. Later, Don mentioned in passing that
what we did was "equal parts education and entertainment". Education because, yes,
it's what we do, but entertainment, too, because if the room falls asleep, then they're
not getting educated.
</p>
        <p>
And folks, I've sat in those chairs, I know how boring talks can be sometimes. And
that sometimes, despite your best efforts, no matter how interesting the material,
it can just be sooooo easy to pop open the laptop and do some email. Or write some
code. Or even let the ambient warmth of the room in a post-lunch talk just... make...
eyes... so heavy.... I get it, really.
</p>
        <p>
So I decided, quite consciously, to develop a speaking persona that was a little on
the edge, a little outrageous, a little "over the top", because then that persona
gave me the freedom to do some of the crazy things that would keep the crowd awake
and on its toes. I stand people up from the audience and use them in my demos. I write
code on the fly based on their questions, and I try to use examples that allow for
a certain amount of "Wow, that was weird, so I'll remember it better" in the demo
itself. Case in point: when writing code to demonstrate delegates and events in C#,
I would use the idea of a "Rock Band" and its fan club which, of course, must include
groupies.
</p>
        <p>
Is it politically correct to talk about groupies in a professional programming classroom
setting? Probably not. Did anybody complain? Never heard one, directly or indirectly.
Part of that, I believe, was because they got the point of the demo, and that was
the point. Not that I was advocating groupie-ism, or that rock bands were more interesting
than programming, but that the domain was easy enough to grip in their heads, and
that made the result (loose coupling between event generators and consumers, in the
case of delegates and events) more easily understood.
</p>
        <p>
Analogies, for me, are never gratuitous. I choose my analogies quite carefully, and
try to be very clear about where and when they do break down, because all analogies
break down eventually. Even <a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx">my
most famous analogy</a> breaks down, as many people have pointed out: nobody has ever
died from O/R-Ms. Yep. But your wife's eyes were never burning balls of superheated
plasma billions of light years away, either.
</p>
        <p>
Point is, I deliberately seek ways to keep you entertained. And you know what? Entertainment
often comes, in the case, from making the room laugh, and humor most often derives
from the unexpected. And what's more unexpected than a profanity dropped at the most
unexpected moment?
</p>
        <p>
You don't have to agree with that sentiment to realize that it's FUCKING true.
</p>
        <p>
When I got up to speak at CodeMash, I wanted very badly for this to be the best damn
keynote I'd ever done in my life up to that point. I wanted the room to rock. Buzzing.
Yes, I wanted to succeed very, very badly. It was an early-morning keynote, first
one of the show. People were still milling around, there was a lot of background noise.
People were still eating breakfast and waking up. And when Keith Elder, just before
he introduced me to the crowd, whispered (I'm paraphrasing here) "Put some energy
into this crowd, would ya?", I said to myself, "Oh, yeah. I'm on it."
</p>
        <p>
A little TOO on it, as it turns out. I went way overboard. Brian Prince counted 18
f-bombs that day. Others counted, as well; lowest total I heard was 13, highest was
23. Needless to say, it was a carpet bombing to rival anything we ever did to North
Vietnam. Made Dresden look like a weenie roast. (There's probably a Hiroshima joke
in there too somewhere, but you get the point.)
</p>
        <p>
The interesting thing about profanity used like that, however, is that it loses its
efficacy. They have to be spaced out, chosen carefully, or they lose their impact.
Which was, of course, exactly what happened. It's not going to have the 'unexpected'
effect if it's coming every other minute or so. No matter how hard you try.
</p>
        <p>
The result? Kind of predictable. Not my best results. For which I am most heartily
sorry. I so wanted that keynote to go off so well, and it didn't, and I'm sorry.
</p>
        <p>
For three hours after the keynote was over, as the Twitterstream was dissecting me
for all that, I lay on the couch in my hotel room, bordering on tears. Seriously.
</p>
        <p>
Had I the chance to do the keynote over again, you'd better damn well believe that
I'd do it differently. Would I cut out all the profanity entirely? Nope. That's a
part of my speaking persona, and anyone who brings me to a conference that doesn't
know that probably didn't do their homework about me as a speaker beforehand. (It's
not like there aren't ample opportunities to see me speaking in person, or videos
of the same.) But somebody suggested not too long ago that maybe it wouldn't be a
bad idea to warn people ahead of time, and yep, that's a great idea. Because (and
for this, I am really even more sorry) sometimes kids are in the room, such as was
the case for CodeMash, and they shouldn't have to hear it unless their parents are
OK with it, and I didn't give their parents (or any attendees that felt the same way)
an opportunity to "opt out" if they so chose.
</p>
        <p>
I could, I suppose, hide behind the excuse that "We were all adults, we should be
able to handle that kind of language", but in the case of the kids, that wasn't the
case. Even then, in the case of the adults, you still should be given an opportunity
to opt out.
</p>
        <p>
More critically, if the message got lost because of the messenger's choice of words,
then I failed as a speaker. And that, my friends, is where the real frustration for
me lies--not with the words I used in of themselves, but in that the message--that
we as an industry have to break out of our 'box-arrow-box-arrow-cylinder' habits and
modes of thinking--got lost for so many people, That is how I failed most of all,
and it is on those grounds that I say, once again, I am sorry.
</p>
        <p>
To you, Jim, and to the rest of the CodeMash staff, I am particularly sorry. CodeMash
is your baby, and I gave it a black eye.
</p>
        <p>
To the attendees of CodeMash 2.0.1.2, I am sorry if my language offended you and distracted
you from the message I was trying to deliver. I hope that you were able to get past
it and enjoy the rest of the show. I think a lot of you did--many came up to me afterwards,
but it was such a small fraction of the total I don't want to assume anything.
</p>
        <p>
Enjoy CodeMash 2.0.1.3. With any luck, I'll see you there next year: hopefully a little
wiser, but still just as FUCKING outrageous as I have always been, only this time,
with an up-front disclaimer.
</p>
        <p>
Flame away.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f41b3b0b-24f5-4762-8009-13304badecc6" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Thoughts on a CodeMash Gone By</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,f41b3b0b-24f5-4762-8009-13304badecc6.aspx</guid>
      <link>http://blogs.tedneward.com/2013/01/07/Thoughts+On+A+CodeMash+Gone+By.aspx</link>
      <pubDate>Mon, 07 Jan 2013 23:23:42 GMT</pubDate>
      <description>&lt;p&gt;
A year ago today (roughly), I gave the opening keynote at CodeMash 2.0.1.2. For those
of you who were there, I don't think I need to tell you what happened. For those of
you who weren't there, you probably still heard about, thanks to the Twitterstream
of comments and counter-comments that followed. I've more or less tried to keep quiet
about it since that time, trying to just let the furor die down (and it did, pretty
quickly, I thought) out of respect to the conference organizers.
&lt;/p&gt;
&lt;p&gt;
But with the show starting up again this week, and there having been a few people
over the last twelve months who've asked me about "what the f*ck were you thinking"
(whether that was in deliberate pun/jest or not, I can't always tell), and most importantly,
now that I know that Jim and I are square with each other (thanks to a Twitter conversation
a few days ago), I figure it's time to come clean and tell my side of the story.
&lt;/p&gt;
&lt;p&gt;
TL;DR: If I had the chance to do the keynote over again, I'd do it differently.
&lt;/p&gt;
&lt;p&gt;
(By the way, the rest of this post does have a few profanities in it, so if you're
offended by that sort of thing, this is a good place to stop reading. Or, as the movies
would say, this post is rated PG-13 for adult language.)
&lt;/p&gt;
&lt;p&gt;
As a speaker, I have always sought to create a "persona" on stage that allowed me
the maximum freedom of expression and opportunity to get my point across. A long time
ago, when I started teaching at DevelopMentor, I learned from some of the best--one
of those best being, of course, Don Box, but another of those was Ted Pattison. It
was he who taught me that "If you can make 'em laugh, you can do whatever you want
to them" (meaning the audience). He demonstrated this quite graphically by guest-lecturing
in one of my classes once, early in my tenure as a DM instructor, and promptly castrated
one of the students who was constantly irritating the class (and me) with off-topic
questions. It was an eye-opening experience. Later, Don mentioned in passing that
what we did was "equal parts education and entertainment". Education because, yes,
it's what we do, but entertainment, too, because if the room falls asleep, then they're
not getting educated.
&lt;/p&gt;
&lt;p&gt;
And folks, I've sat in those chairs, I know how boring talks can be sometimes. And
that sometimes, despite your best efforts, no matter how interesting the material,
it can just be sooooo easy to pop open the laptop and do some email. Or write some
code. Or even let the ambient warmth of the room in a post-lunch talk just... make...
eyes... so heavy.... I get it, really.
&lt;/p&gt;
&lt;p&gt;
So I decided, quite consciously, to develop a speaking persona that was a little on
the edge, a little outrageous, a little "over the top", because then that persona
gave me the freedom to do some of the crazy things that would keep the crowd awake
and on its toes. I stand people up from the audience and use them in my demos. I write
code on the fly based on their questions, and I try to use examples that allow for
a certain amount of "Wow, that was weird, so I'll remember it better" in the demo
itself. Case in point: when writing code to demonstrate delegates and events in C#,
I would use the idea of a "Rock Band" and its fan club which, of course, must include
groupies.
&lt;/p&gt;
&lt;p&gt;
Is it politically correct to talk about groupies in a professional programming classroom
setting? Probably not. Did anybody complain? Never heard one, directly or indirectly.
Part of that, I believe, was because they got the point of the demo, and that was
the point. Not that I was advocating groupie-ism, or that rock bands were more interesting
than programming, but that the domain was easy enough to grip in their heads, and
that made the result (loose coupling between event generators and consumers, in the
case of delegates and events) more easily understood.
&lt;/p&gt;
&lt;p&gt;
Analogies, for me, are never gratuitous. I choose my analogies quite carefully, and
try to be very clear about where and when they do break down, because all analogies
break down eventually. Even &lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;my
most famous analogy&lt;/a&gt; breaks down, as many people have pointed out: nobody has ever
died from O/R-Ms. Yep. But your wife's eyes were never burning balls of superheated
plasma billions of light years away, either.
&lt;/p&gt;
&lt;p&gt;
Point is, I deliberately seek ways to keep you entertained. And you know what? Entertainment
often comes, in the case, from making the room laugh, and humor most often derives
from the unexpected. And what's more unexpected than a profanity dropped at the most
unexpected moment?
&lt;/p&gt;
&lt;p&gt;
You don't have to agree with that sentiment to realize that it's FUCKING true.
&lt;/p&gt;
&lt;p&gt;
When I got up to speak at CodeMash, I wanted very badly for this to be the best damn
keynote I'd ever done in my life up to that point. I wanted the room to rock. Buzzing.
Yes, I wanted to succeed very, very badly. It was an early-morning keynote, first
one of the show. People were still milling around, there was a lot of background noise.
People were still eating breakfast and waking up. And when Keith Elder, just before
he introduced me to the crowd, whispered (I'm paraphrasing here) "Put some energy
into this crowd, would ya?", I said to myself, "Oh, yeah. I'm on it."
&lt;/p&gt;
&lt;p&gt;
A little TOO on it, as it turns out. I went way overboard. Brian Prince counted 18
f-bombs that day. Others counted, as well; lowest total I heard was 13, highest was
23. Needless to say, it was a carpet bombing to rival anything we ever did to North
Vietnam. Made Dresden look like a weenie roast. (There's probably a Hiroshima joke
in there too somewhere, but you get the point.)
&lt;/p&gt;
&lt;p&gt;
The interesting thing about profanity used like that, however, is that it loses its
efficacy. They have to be spaced out, chosen carefully, or they lose their impact.
Which was, of course, exactly what happened. It's not going to have the 'unexpected'
effect if it's coming every other minute or so. No matter how hard you try.
&lt;/p&gt;
&lt;p&gt;
The result? Kind of predictable. Not my best results. For which I am most heartily
sorry. I so wanted that keynote to go off so well, and it didn't, and I'm sorry.
&lt;/p&gt;
&lt;p&gt;
For three hours after the keynote was over, as the Twitterstream was dissecting me
for all that, I lay on the couch in my hotel room, bordering on tears. Seriously.
&lt;/p&gt;
&lt;p&gt;
Had I the chance to do the keynote over again, you'd better damn well believe that
I'd do it differently. Would I cut out all the profanity entirely? Nope. That's a
part of my speaking persona, and anyone who brings me to a conference that doesn't
know that probably didn't do their homework about me as a speaker beforehand. (It's
not like there aren't ample opportunities to see me speaking in person, or videos
of the same.) But somebody suggested not too long ago that maybe it wouldn't be a
bad idea to warn people ahead of time, and yep, that's a great idea. Because (and
for this, I am really even more sorry) sometimes kids are in the room, such as was
the case for CodeMash, and they shouldn't have to hear it unless their parents are
OK with it, and I didn't give their parents (or any attendees that felt the same way)
an opportunity to "opt out" if they so chose.
&lt;/p&gt;
&lt;p&gt;
I could, I suppose, hide behind the excuse that "We were all adults, we should be
able to handle that kind of language", but in the case of the kids, that wasn't the
case. Even then, in the case of the adults, you still should be given an opportunity
to opt out.
&lt;/p&gt;
&lt;p&gt;
More critically, if the message got lost because of the messenger's choice of words,
then I failed as a speaker. And that, my friends, is where the real frustration for
me lies--not with the words I used in of themselves, but in that the message--that
we as an industry have to break out of our 'box-arrow-box-arrow-cylinder' habits and
modes of thinking--got lost for so many people, That is how I failed most of all,
and it is on those grounds that I say, once again, I am sorry.
&lt;/p&gt;
&lt;p&gt;
To you, Jim, and to the rest of the CodeMash staff, I am particularly sorry. CodeMash
is your baby, and I gave it a black eye.
&lt;/p&gt;
&lt;p&gt;
To the attendees of CodeMash 2.0.1.2, I am sorry if my language offended you and distracted
you from the message I was trying to deliver. I hope that you were able to get past
it and enjoy the rest of the show. I think a lot of you did--many came up to me afterwards,
but it was such a small fraction of the total I don't want to assume anything.
&lt;/p&gt;
&lt;p&gt;
Enjoy CodeMash 2.0.1.3. With any luck, I'll see you there next year: hopefully a little
wiser, but still just as FUCKING outrageous as I have always been, only this time,
with an up-front disclaimer.
&lt;/p&gt;
&lt;p&gt;
Flame away.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f41b3b0b-24f5-4762-8009-13304badecc6" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,f41b3b0b-24f5-4762-8009-13304badecc6.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>Conferences</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Personal</category>
      <category>Review</category>
      <category>Social</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=7f19fdac-abaa-4e41-9bf0-e009f865d0e7</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,7f19fdac-abaa-4e41-9bf0-e009f865d0e7.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,7f19fdac-abaa-4e41-9bf0-e009f865d0e7.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7f19fdac-abaa-4e41-9bf0-e009f865d0e7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://manning.com/petricek2/">F# Deep Dives</a>, by Tomas Petricek and Phillip
Trelford, Manning Publications
</p>
        <p>
As many readers of my writing will already know, I've been kind of "involved" with
F# (and its cousin on the JVM, Scala) for a few years now, to the degree that I and
a couple of really smart guys <a href="http://www.amazon.com/Professional-F-2-0-Ted-Neward/dp/047052801X">wrote
a book on the subject</a>. Now, assuming you're one of the .NET developers who've
heard of F# and functional programming, and took a gander at the syntax, and maybe
even bought a book on it (my publisher and I both thank you if you bought ours), but
weren't quite sure what to <i>do</i> with it, a book has come along to help get you
past that.
</p>
        <p>
As of this writing, the early-access (what Manning calls their MEAP) version had only
Chapters 3 ("Parsing text-based languages") and Chapter 11 ("Creating games using
XNA"), but the other topics ("Integrating external data into the F# language", "Handling
dirty data with machine learning" and "Functional programming in the cloud" are just
three of the other chapters listed) are juicy and meaty, and both Tomas and Philip
are recognized names in the F# space. Neither are strangers to the subject material
nor to writing, and the prose from the MEAP edition is pretty easy to read already,
despite the fact that it's early-access material. In particular, the Markdown parser
they implement in chapter 3 is a great example of a non-trivial language parser, which
is not an easy task to approach but certainly a lot easier to do in a functional language.
(For the record, I built a custom parser of my own for generating slides, and the
blog entries that described the early implementations are <a href="http://blogs.tedneward.com/2011/04/27/Managing+Talks+An+FOffice+Love+Story+Part+1.aspx">here</a>,
and yes, I really should finish that series out, I know. I got more interested in
extending the system, then realized I needed a full-fledged parser, and got distracted
trying to integrate... surprise, surprise... Tomas' Markdown parser that he made available
online.)
</p>
        <p>
This book looks really promising, and I'm really hopeful Manning will send me a copy
when it comes out, so I can level up my F# myself.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7f19fdac-abaa-4e41-9bf0-e009f865d0e7" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Review (in advance): F# Deep Dives</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,7f19fdac-abaa-4e41-9bf0-e009f865d0e7.aspx</guid>
      <link>http://blogs.tedneward.com/2013/01/05/Review+In+Advance+F+Deep+Dives.aspx</link>
      <pubDate>Sat, 05 Jan 2013 10:10:05 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://manning.com/petricek2/"&gt;F# Deep Dives&lt;/a&gt;, by Tomas Petricek and Phillip
Trelford, Manning Publications
&lt;/p&gt;
&lt;p&gt;
As many readers of my writing will already know, I've been kind of "involved" with
F# (and its cousin on the JVM, Scala) for a few years now, to the degree that I and
a couple of really smart guys &lt;a href="http://www.amazon.com/Professional-F-2-0-Ted-Neward/dp/047052801X"&gt;wrote
a book on the subject&lt;/a&gt;. Now, assuming you're one of the .NET developers who've
heard of F# and functional programming, and took a gander at the syntax, and maybe
even bought a book on it (my publisher and I both thank you if you bought ours), but
weren't quite sure what to &lt;i&gt;do&lt;/i&gt; with it, a book has come along to help get you
past that.
&lt;/p&gt;
&lt;p&gt;
As of this writing, the early-access (what Manning calls their MEAP) version had only
Chapters 3 ("Parsing text-based languages") and Chapter 11 ("Creating games using
XNA"), but the other topics ("Integrating external data into the F# language", "Handling
dirty data with machine learning" and "Functional programming in the cloud" are just
three of the other chapters listed) are juicy and meaty, and both Tomas and Philip
are recognized names in the F# space. Neither are strangers to the subject material
nor to writing, and the prose from the MEAP edition is pretty easy to read already,
despite the fact that it's early-access material. In particular, the Markdown parser
they implement in chapter 3 is a great example of a non-trivial language parser, which
is not an easy task to approach but certainly a lot easier to do in a functional language.
(For the record, I built a custom parser of my own for generating slides, and the
blog entries that described the early implementations are &lt;a href="http://blogs.tedneward.com/2011/04/27/Managing+Talks+An+FOffice+Love+Story+Part+1.aspx"&gt;here&lt;/a&gt;,
and yes, I really should finish that series out, I know. I got more interested in
extending the system, then realized I needed a full-fledged parser, and got distracted
trying to integrate... surprise, surprise... Tomas' Markdown parser that he made available
online.)
&lt;/p&gt;
&lt;p&gt;
This book looks really promising, and I'm really hopeful Manning will send me a copy
when it comes out, so I can level up my F# myself.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7f19fdac-abaa-4e41-9bf0-e009f865d0e7" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,7f19fdac-abaa-4e41-9bf0-e009f865d0e7.aspx</comments>
      <category>.NET</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Languages</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Windows</category>
      <category>XNA</category>
    </item>
  </channel>
</rss>