<?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 - Languages</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>Wed, 01 May 2013 09:54:21 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=beb66c9a-aa45-42b2-8305-636ce104f8c3</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,beb66c9a-aa45-42b2-8305-636ce104f8c3.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,beb66c9a-aa45-42b2-8305-636ce104f8c3.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=beb66c9a-aa45-42b2-8305-636ce104f8c3</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
With my most recent blog post, some of you were a little less than impressed with
the idea of using types, One reader, in particular, suggested that:
</p>
        <blockquote>
          <p>
Your encapsulating type aliases don't... encapsulate :|
</p>
        </blockquote>
        <p>
Actually, it kinda does. But not in the way you described.
</p>
        <blockquote>
          <p>
using X = qualified.type;
</p>
          <p>
merely introduces an alias, and will consequently (a) not prevent assignment of 
<br />
a FirstName to a LastName (b) not even be detectible as such from CLI metadata 
<br />
(i.e. using reflection).
</p>
        </blockquote>
        <p>
This is true—the using statement only introduces an alias, in much the same way that
C++’s “typedef” does. It’s not perfect, by any real means.
</p>
        <blockquote>
          <p>
Also, the alias is lexically scoped, and doesn't actually _declare a public name_
(so, it would need to be redeclared in all 'client' compilation units.
</p>
          <p>
(This won't be done, of course, because the clients would have no clue about 
<br />
this and happily be passing `System.String` as ever).
</p>
          <p>
The same goes for C++ typedefs, or, indeed C++11 template aliases:
</p>
          <p>
using FirstName = std::string; 
<br />
using LastName = std::string;
</p>
          <p>
You'd be better off using BOOST_STRONG_TYPEDEF (or a roll-your-own version of this
thing that is basically a CRTP pattern with some inherited constructors. When your
compiler has the latter feature, you could probably do without an evil MACRO).
</p>
        </blockquote>
        <p>
All of which is also true. Frankly, the “using” statement is a temporary stopgap,
simply a placeholder designed to say, “In time, this will be replaced with a full-fledged
type.”
</p>
        <p>
And even more to the point, he fails to point out that my “Age” class from my example
doesn’t really encapsulate the fact that Age is, fundamentally, an “int” under the
covers—because Age possesses type conversion operators to convert it into an int on
demand (hence the “implicit” in that operator declaration), it’s pretty easy to get
it back to straight “int”-land. Were I not so concerned with brevity, I’d have created
a type that allowed for addition on it, though frankly I probably would forbid subtraction,
and most certainly multiplication and division. (What does multiplying an Age mean,
really?)
</p>
        <p>
See, in truth, I cheated, because I know that the first reaction most O-O developers
will have is, “Are you crazy? That’s tons more work—just use the int!” Which, is both
fair, and an old argument—the C guys said the same thing about these “object” things,
and how much work it was compared to just declaring a data structure and writing a
few procedures to manipulate them. Creating a full-fledged type for each domain—or
each fraction of a domain—seems… heavy.
</p>
        <p>
Truthfully, this is <strong>much</strong> easier to do in F#. And in Scala. And in
a number of different languages. Unfortunately, in C#, Java, and even C++ (and frankly,
I don’t think the use of an “evil MACRO” is unwarranted, if it doesn’t promote bad
things). The fact that “doing it right” in those languages means “doing a ton of work
to get it right” is exactly why nobody does it—and suffers the commensurate loss of
encapsulation and integrity in their domain model.
</p>
        <p>
Another poster pointed out that there is a <em>much</em> better series on this at <a href="http://www.fsharpforfunandprofit.com">http://www.fsharpforfunandprofit.com</a>.
In particular, check out the series on <a href="http://fsharpforfunandprofit.com/series/designing-with-types.html">"Designing
with Types"</a>—it expresses everything I wanted to say, albeit in F# (where
I was trying, somewhat unsuccessfully, to example-code it in C#). By the way, I suspect
that almost every linguistic feature he uses would translate pretty easily/smoothly
over to Scala (or possibly Clojure) as well.
</p>
        <p>
Another poster pointed out that doing this type-driven design (TDD, anyone?) would
create some serious havoc with your persistence. Cry me a river, and then go use a
persistence model that fits an object-oriented and type-oriented paradigm. Like, I
dunno, an <a href="http://www.db4o.com">object database</a>. Particularly considering
that you shouldn’t want to expose your database schema to anyone outside the project
anyway, if you’re concerned about code being tightly coupled. (As in, any other code
outside this project—like a reporting engine or an ETL process—that accesses your
database directly now is tied to that schema, and is therefore a tight-coupling restriction
on evolving your schema.)
</p>
        <p>
Achieving good encapsulation isn’t a matter of trying to hide the methods being used—it’s
(partly) a matter of allowing the type system to carry a significant percentage of
the cognitive load, so that you don’t have to. Which, when you think on it, is kinda
what objects and strongly-typed type systems are supposed to do, isn’t it?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=beb66c9a-aa45-42b2-8305-636ce104f8c3" />
        <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 Types</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,beb66c9a-aa45-42b2-8305-636ce104f8c3.aspx</guid>
      <link>http://blogs.tedneward.com/2013/05/01/More+On+Types.aspx</link>
      <pubDate>Wed, 01 May 2013 09:54:21 GMT</pubDate>
      <description>&lt;p&gt;
With my most recent blog post, some of you were a little less than impressed with
the idea of using types, One reader, in particular, suggested that:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Your encapsulating type aliases don't... encapsulate :|
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Actually, it kinda does. But not in the way you described.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
using X = qualified.type;
&lt;/p&gt;
&lt;p&gt;
merely introduces an alias, and will consequently (a) not prevent assignment of 
&lt;br /&gt;
a FirstName to a LastName (b) not even be detectible as such from CLI metadata 
&lt;br /&gt;
(i.e. using reflection).
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is true—the using statement only introduces an alias, in much the same way that
C++’s “typedef” does. It’s not perfect, by any real means.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Also, the alias is lexically scoped, and doesn't actually _declare a public name_
(so, it would need to be redeclared in all 'client' compilation units.
&lt;/p&gt;
&lt;p&gt;
(This won't be done, of course, because the clients would have no clue about 
&lt;br /&gt;
this and happily be passing `System.String` as ever).
&lt;/p&gt;
&lt;p&gt;
The same goes for C++ typedefs, or, indeed C++11 template aliases:
&lt;/p&gt;
&lt;p&gt;
using FirstName = std::string; 
&lt;br /&gt;
using LastName = std::string;
&lt;/p&gt;
&lt;p&gt;
You'd be better off using BOOST_STRONG_TYPEDEF (or a roll-your-own version of this
thing that is basically a CRTP pattern with some inherited constructors. When your
compiler has the latter feature, you could probably do without an evil MACRO).
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
All of which is also true. Frankly, the “using” statement is a temporary stopgap,
simply a placeholder designed to say, “In time, this will be replaced with a full-fledged
type.”
&lt;/p&gt;
&lt;p&gt;
And even more to the point, he fails to point out that my “Age” class from my example
doesn’t really encapsulate the fact that Age is, fundamentally, an “int” under the
covers—because Age possesses type conversion operators to convert it into an int on
demand (hence the “implicit” in that operator declaration), it’s pretty easy to get
it back to straight “int”-land. Were I not so concerned with brevity, I’d have created
a type that allowed for addition on it, though frankly I probably would forbid subtraction,
and most certainly multiplication and division. (What does multiplying an Age mean,
really?)
&lt;/p&gt;
&lt;p&gt;
See, in truth, I cheated, because I know that the first reaction most O-O developers
will have is, “Are you crazy? That’s tons more work—just use the int!” Which, is both
fair, and an old argument—the C guys said the same thing about these “object” things,
and how much work it was compared to just declaring a data structure and writing a
few procedures to manipulate them. Creating a full-fledged type for each domain—or
each fraction of a domain—seems… heavy.
&lt;/p&gt;
&lt;p&gt;
Truthfully, this is &lt;strong&gt;much&lt;/strong&gt; easier to do in F#. And in Scala. And in
a number of different languages. Unfortunately, in C#, Java, and even C++ (and frankly,
I don’t think the use of an “evil MACRO” is unwarranted, if it doesn’t promote bad
things). The fact that “doing it right” in those languages means “doing a ton of work
to get it right” is exactly why nobody does it—and suffers the commensurate loss of
encapsulation and integrity in their domain model.
&lt;/p&gt;
&lt;p&gt;
Another poster pointed out that there is a &lt;em&gt;much&lt;/em&gt; better series on this at &lt;a href="http://www.fsharpforfunandprofit.com"&gt;http://www.fsharpforfunandprofit.com&lt;/a&gt;.
In particular, check out the series on &lt;a href="http://fsharpforfunandprofit.com/series/designing-with-types.html"&gt;&amp;quot;Designing
with Types&amp;quot;&lt;/a&gt;—it expresses everything I wanted to say, albeit in F# (where
I was trying, somewhat unsuccessfully, to example-code it in C#). By the way, I suspect
that almost every linguistic feature he uses would translate pretty easily/smoothly
over to Scala (or possibly Clojure) as well.
&lt;/p&gt;
&lt;p&gt;
Another poster pointed out that doing this type-driven design (TDD, anyone?) would
create some serious havoc with your persistence. Cry me a river, and then go use a
persistence model that fits an object-oriented and type-oriented paradigm. Like, I
dunno, an &lt;a href="http://www.db4o.com"&gt;object database&lt;/a&gt;. Particularly considering
that you shouldn’t want to expose your database schema to anyone outside the project
anyway, if you’re concerned about code being tightly coupled. (As in, any other code
outside this project—like a reporting engine or an ETL process—that accesses your
database directly now is tied to that schema, and is therefore a tight-coupling restriction
on evolving your schema.)
&lt;/p&gt;
&lt;p&gt;
Achieving good encapsulation isn’t a matter of trying to hide the methods being used—it’s
(partly) a matter of allowing the type system to carry a significant percentage of
the cognitive load, so that you don’t have to. Which, when you think on it, is kinda
what objects and strongly-typed type systems are supposed to do, isn’t it?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=beb66c9a-aa45-42b2-8305-636ce104f8c3" /&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,beb66c9a-aa45-42b2-8305-636ce104f8c3.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</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>Ruby</category>
      <category>Scala</category>
      <category>Visual Basic</category>
    </item>
    <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=1a5622b2-d891-43ad-af4b-785ba018e862</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,1a5622b2-d891-43ad-af4b-785ba018e862.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,1a5622b2-d891-43ad-af4b-785ba018e862.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1a5622b2-d891-43ad-af4b-785ba018e862</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently, having been teaching C# for a bit at Bellevue College, I’ve been thinking
more and more about the way in which we approach building object-oriented programs,
and particularly the debates around types and type systems. I think, not surprisingly,
that the way in which the vast majority of the O-O developers in the world approach
types and when/how they use them is flat wrong—both in terms of the times when they
create classes when they shouldn’t (or shouldn’t have to, anyway, though obviously
this is partly a measure of their language), and the times when they should create
classes and don’t.
</p>
        <p>
The latter point is the one I feel like exploring here; the former one is certainly
interesting on its own, but I’ll save that for a later date. For now, I want to think
about (and write about) how we often don’t create types in an O-O program, and should,
because doing so can often create clearer, more expressive programs.
</p>
        <h3>A Person
</h3>
        <p>
Common object-oriented parlance suggests that when we have a taxonomical entity that
we want to represent in code (i.e., a concept of some form), we use a class to do
so; for example, if we want to model a “person” in the world by capturing some of
their critical attributes, we do so using a class (in this case, C#):
</p>
        <p>
          <font face="Consolas">class Person 
<br />
{ 
<br />
    public string FirstName { get; set; } 
<br />
    public string LastName { get; set; } 
<br />
    public int Age { get; set; } 
<br />
    public bool Gender { get; set; } 
<br />
}</font>
        </p>
        <p>
Granted, this is a pretty simplified case; O-O enthusiasts will find lots of things
wrong with this code, most of which have to do with dealing with the complexities
that can arise.
</p>
        <p>
From here, there’s a lot of ways in which this conversation can get a lot more complicated—how,
where and when should inheritance factor into the discussion, for example, and how
exactly do we represent the relationship between parents and children (after all,
some children will be adopted, some will be natural birth, some will be disowned)
and the relationship between various members who wish to engage in some form of marital
status (putting aside the political hot-button of same-sex marriage, we find that
some states respect “civil unions” even where no formal ceremony has taken place,
many cultures still recognize polygamy—one man, many wives—as Utah did up until the
mid-1800s, and a growing movement around polyamory—one or more men, one or more women—looks
like it may be the next political hot-button around marriage) definitely depends on
the business issues in question…
</p>
        <p>
… but that’s the whole point of encapsulation, right? That if the business needs change,
we can adapt as necessary to the changed requirements without having to go back and
rewrite everything.
</p>
        <h4>Genders
</h4>
        <p>
Consider, for example, the rather horrible decision to represent “gender” as a boolean:
while, yes, at birth, there are essentially two genders at the biological level, there
are some interesting birth defects/disorders/conditions in which a person’s gender
is, for lack of a better term, screwed up—men born with female plumbing and vice versa.
The system might need to track that. Or, there are those who consider themselves to
have been born into the wrong gender, and choose to live a lifestyle that is markedly
different from what societal norms suggest (the transgender crowd). Or, in some cases,
the gender may not have even been determined yet: fetuses don’t develop gender until
about halfway through the pregnancy.
</p>
        <p>
Which suggests, offhand, that the use of a boolean here is clearly a Bad Idea. But
what suggests as its replacement? Certainly we could maintain an internal state string
or something similar, using the get/set properties to verify that the strings being
set are correct and valid, but the .NET type system has a better answer: Given that
there is a finite number of choices to gender—whether that’s two or four or a dozen—it
seems that an enumeration is a good replacement:
</p>
        <p>
          <font face="Consolas">enum Gender 
<br />
{ 
<br />
    Male, Female, 
<br />
    Indeterminate, 
<br />
    Transgender 
<br />
}</font>
        </p>
        <p>
          <font face="Consolas">class Person 
<br />
{ 
<br />
    public string FirstName { get; set; } 
<br />
    public string LastName { get; set; } 
<br />
    public int Age { get; set; } 
<br />
    public Gender Gender { get; set; } 
<br />
}</font>
        </p>
        <p>
Don’t let the fact that the property and the type have the same name be too confusing—not
only does it compile cleanly, but it actually provides some clear description of what’s
being stored. (Although, I’ll admit, it’s confusing the first time you look at it.)
More importantly, there’s no additional code that needs to be written to enforce only
the four acceptable values—or, extend it as necessary when that becomes necessary.
</p>
        <h3>
        </h3>
        <h4>Ages
</h4>
        <p>
Similarly, the age of a person is not an integer value—people cannot be negative age,
nor do they usually age beyond a hundred or so. Again, we could put code around the
get/set blocks of the Age property to ensure the proper values, but it would again
be easier to let the type system do all the work:
</p>
        <p>
          <font face="Consolas">struct Age 
<br />
{ 
<br />
    int data; 
<br />
    public Age(int d) 
<br />
    { 
<br />
        Validate(d); 
<br />
        data = d; 
<br />
    }</font>
        </p>
        <p>
          <font face="Consolas">    public static void Validate(int d) 
<br />
    { 
<br />
        if (d &lt; 0) 
<br />
            throw new ArgumentException("Age
cannot be negative"); 
<br />
        if (d &gt; 120) 
<br />
            throw new ArgumentException("Age
cannot be over 120"); 
<br />
    }</font>
        </p>
        <p>
          <font face="Consolas">    // explicit int to Age conversion operator 
<br />
    public static implicit operator Age(int a) 
<br />
    { return new Age(a); }</font>
        </p>
        <p>
          <font face="Consolas">    // explicit Age to int conversion operator 
<br />
    public static implicit operator int(Age a) 
<br />
    { return a.data; } 
<br />
}</font>
        </p>
        <p>
          <font face="Consolas">class Person 
<br />
{ 
<br />
    public string FirstName { get; set; } 
<br />
    public string LastName { get; set; } 
<br />
    public Age Age { get; set; } 
<br />
    public Gender Gender { get; set; } 
<br />
}</font>
        </p>
        <p>
Notice that we’re still having to write the same code, but now the code is embodied
in a type, which is itself intrinsically reusable—we can reuse the Age type in other
classes, which is more than we can say if that code lives in the Person.Age property
getter/setter. Again, too, now the Person class really has nothing to do in terms
of ensuring that age is maintained properly (and by that, I mean greater than zero
and less than 120). (The “implicit” in the conversion operators means that the code
doesn’t need to explicitly cast the int to an Age or vice versa.)
</p>
        <p>
Technically, what I’ve done with Age is create a restriction around the integer (System.Int32
in .NET terms) type; were this XSD Schema types, I could do a derivation-by-restriction
to restrict an xsd:int to the values I care about (0 – 120, inclusive). Unfortunately,
no O-O language I know of permits derivation-by-restriction, so it requires work to
create a type that “wraps” another, in this case, an Int32.
</p>
        <h4>
        </h4>
        <h4>
        </h4>
        <h4>Names
</h4>
        <p>
Names are another point of problem, in that there’s all kinds of crazy cases that
(as much as we’d like to pretend otherwise) turn out to be far more common than we’d
like—not only do most people have middle names, but sometimes women will take their
husband’s last name and hyphenate it with their own, making it sort of a middle name
but not really, or sometimes people will give their children to multiple middle names,
Japanese names put family names first, sometimes people choose to take a single name,
and so on. This is again a case where we can either choose to bake that logic into
property getters/setters, or bake it into a single type (a “Name” type) that has the
necessary code and properties to provide all the functionality that a person’s name
represents.
</p>
        <p>
So, without getting into the actual implementation, then, if we want to represent
names in the system, then we should have a full-fledged “Name” class that captures
the various permutations that arise:
</p>
        <p>
          <font face="Consolas">class Name 
<br />
{   
<br />
    public Title Honorific { get { ... } } 
<br />
    public string Individual { get { ... } } 
<br />
    public string Nickname { get { ... } } 
<br />
    public string Family { get { ... } } 
<br />
    public string Full { get { ... } } 
<br />
    public static Name Parse(string incoming) { ... }  
<br />
}</font>
        </p>
        <p>
          <font face="Consolas">
          </font>
        </p>
        <p>
See, ultimately, everything will have to boil back to the core primitives within the
language, but we need to build stronger primitives for the system—Name, Title, Age,
and don’t even get me started on relationships.
</p>
        <h4>
        </h4>
        <h4>
        </h4>
        <h4>Relationships
</h4>
        <p>
Parent-child relationships are also a case where things are vastly more complicated
than just the one-to-many or one-to-one (or two-to-one) that direct object references
encourage; in the case of families, given how complex the modern American family can
get (and frankly, it’s not any easier if we go back and look at medieval families,
either—go have a look at any royal European genealogical line and think about how
you’d model that, particularly Henry VIII), it becomes pretty quickly apparent that
modeling the relationships themselves often presents itself as the only reasonable
solution.
</p>
        <p>
I won’t even begin to get into that example, by the way, simply because this blog
post is too long as it is. I might try it for a later blog post to explore the idea
further, but I think the point is made at this point.
</p>
        <h3>
        </h3>
        <h3>Summary
</h3>
        <p>
The object-oriented paradigm often finds itself wading in tens of thousands of types,
so it seems counterintuitive to suggest that we need more of them to make programs
more clear. I agree, many O-O programs are too type-heavy, but part of the problem
there is that we’re spending too much time creating classes that we shouldn’t need
to create (DTOs and the like) and not enough time thinking about the actual entities
in the system.
</p>
        <p>
I’ll be the first to admit, too, that not all systems will need to treat names the
way that I’ve done—sometimes an age is just an integer, and we’re OK with that. Truthfully,
though, it seems more often than not that we’re later adding the necessary code to
ensure that ages can never be negative, have to fall within a certain range, and so
on.
</p>
        <p>
As a suggestion, then, I throw out this idea: <strong><em>Ensure that all of your
domain classes never expose primitive types to the user of the system.</em></strong> In
other words, Name never exposes an “int” for Age, but only an “Age” type. C# makes
this easy via “using” declarations, like so:
</p>
        <p>
          <font face="Consolas">using FirstName = System.String; 
<br />
using LastName = System.String;</font>
        </p>
        <p>
which can then, if you’re thorough and disciplined about using the FirstName and LastName
types instead of “string”, evolve into fully-formed types later in their own right
if they need to. C++ provides “typedef” for this purpose—unfortunately, Java lacks
any such facility, making this a much harder prospect. (This is something I’d stick
at the top of my TODO list were I nominated to take Brian Goetz’s place at the head
of Java9 development.)
</p>
        <p>
In essence, encapsulate the primitive types away so that when they don’t need to be
primitives, or when they need to be more complex than just simple holders of data,
they don’t have to be, and clients will never know the difference. That, folks, is
what encapsulation is trying to be about.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=1a5622b2-d891-43ad-af4b-785ba018e862" />
        <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 Types</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,1a5622b2-d891-43ad-af4b-785ba018e862.aspx</guid>
      <link>http://blogs.tedneward.com/2013/04/27/On+Types.aspx</link>
      <pubDate>Sat, 27 Apr 2013 00:59:12 GMT</pubDate>
      <description>&lt;p&gt;
Recently, having been teaching C# for a bit at Bellevue College, I’ve been thinking
more and more about the way in which we approach building object-oriented programs,
and particularly the debates around types and type systems. I think, not surprisingly,
that the way in which the vast majority of the O-O developers in the world approach
types and when/how they use them is flat wrong—both in terms of the times when they
create classes when they shouldn’t (or shouldn’t have to, anyway, though obviously
this is partly a measure of their language), and the times when they should create
classes and don’t.
&lt;/p&gt;
&lt;p&gt;
The latter point is the one I feel like exploring here; the former one is certainly
interesting on its own, but I’ll save that for a later date. For now, I want to think
about (and write about) how we often don’t create types in an O-O program, and should,
because doing so can often create clearer, more expressive programs.
&lt;/p&gt;
&lt;h3&gt;A Person
&lt;/h3&gt;
&lt;p&gt;
Common object-oriented parlance suggests that when we have a taxonomical entity that
we want to represent in code (i.e., a concept of some form), we use a class to do
so; for example, if we want to model a “person” in the world by capturing some of
their critical attributes, we do so using a class (in this case, C#):
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;class Person 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string FirstName { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string LastName { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public int Age { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public bool Gender { get; set; } 
&lt;br /&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Granted, this is a pretty simplified case; O-O enthusiasts will find lots of things
wrong with this code, most of which have to do with dealing with the complexities
that can arise.
&lt;/p&gt;
&lt;p&gt;
From here, there’s a lot of ways in which this conversation can get a lot more complicated—how,
where and when should inheritance factor into the discussion, for example, and how
exactly do we represent the relationship between parents and children (after all,
some children will be adopted, some will be natural birth, some will be disowned)
and the relationship between various members who wish to engage in some form of marital
status (putting aside the political hot-button of same-sex marriage, we find that
some states respect “civil unions” even where no formal ceremony has taken place,
many cultures still recognize polygamy—one man, many wives—as Utah did up until the
mid-1800s, and a growing movement around polyamory—one or more men, one or more women—looks
like it may be the next political hot-button around marriage) definitely depends on
the business issues in question…
&lt;/p&gt;
&lt;p&gt;
… but that’s the whole point of encapsulation, right? That if the business needs change,
we can adapt as necessary to the changed requirements without having to go back and
rewrite everything.
&lt;/p&gt;
&lt;h4&gt;Genders
&lt;/h4&gt;
&lt;p&gt;
Consider, for example, the rather horrible decision to represent “gender” as a boolean:
while, yes, at birth, there are essentially two genders at the biological level, there
are some interesting birth defects/disorders/conditions in which a person’s gender
is, for lack of a better term, screwed up—men born with female plumbing and vice versa.
The system might need to track that. Or, there are those who consider themselves to
have been born into the wrong gender, and choose to live a lifestyle that is markedly
different from what societal norms suggest (the transgender crowd). Or, in some cases,
the gender may not have even been determined yet: fetuses don’t develop gender until
about halfway through the pregnancy.
&lt;/p&gt;
&lt;p&gt;
Which suggests, offhand, that the use of a boolean here is clearly a Bad Idea. But
what suggests as its replacement? Certainly we could maintain an internal state string
or something similar, using the get/set properties to verify that the strings being
set are correct and valid, but the .NET type system has a better answer: Given that
there is a finite number of choices to gender—whether that’s two or four or a dozen—it
seems that an enumeration is a good replacement:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;enum Gender 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Male, Female, 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Indeterminate, 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; Transgender 
&lt;br /&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;class Person 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string FirstName { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string LastName { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public int Age { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public Gender Gender { get; set; } 
&lt;br /&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Don’t let the fact that the property and the type have the same name be too confusing—not
only does it compile cleanly, but it actually provides some clear description of what’s
being stored. (Although, I’ll admit, it’s confusing the first time you look at it.)
More importantly, there’s no additional code that needs to be written to enforce only
the four acceptable values—or, extend it as necessary when that becomes necessary.
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h4&gt;Ages
&lt;/h4&gt;
&lt;p&gt;
Similarly, the age of a person is not an integer value—people cannot be negative age,
nor do they usually age beyond a hundred or so. Again, we could put code around the
get/set blocks of the Age property to ensure the proper values, but it would again
be easier to let the type system do all the work:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;struct Age 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; int data; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public Age(int d) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Validate(d); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data = d; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; public static void Validate(int d) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (d &amp;lt; 0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;Age
cannot be negative&amp;quot;); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (d &amp;gt; 120) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;Age
cannot be over 120&amp;quot;); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; // explicit int to Age conversion operator 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public static implicit operator Age(int a) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { return new Age(a); }&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; // explicit Age to int conversion operator 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public static implicit operator int(Age a) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { return a.data; } 
&lt;br /&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;class Person 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string FirstName { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string LastName { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public Age Age { get; set; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public Gender Gender { get; set; } 
&lt;br /&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Notice that we’re still having to write the same code, but now the code is embodied
in a type, which is itself intrinsically reusable—we can reuse the Age type in other
classes, which is more than we can say if that code lives in the Person.Age property
getter/setter. Again, too, now the Person class really has nothing to do in terms
of ensuring that age is maintained properly (and by that, I mean greater than zero
and less than 120). (The “implicit” in the conversion operators means that the code
doesn’t need to explicitly cast the int to an Age or vice versa.)
&lt;/p&gt;
&lt;p&gt;
Technically, what I’ve done with Age is create a restriction around the integer (System.Int32
in .NET terms) type; were this XSD Schema types, I could do a derivation-by-restriction
to restrict an xsd:int to the values I care about (0 – 120, inclusive). Unfortunately,
no O-O language I know of permits derivation-by-restriction, so it requires work to
create a type that “wraps” another, in this case, an Int32.
&lt;/p&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;Names
&lt;/h4&gt;
&lt;p&gt;
Names are another point of problem, in that there’s all kinds of crazy cases that
(as much as we’d like to pretend otherwise) turn out to be far more common than we’d
like—not only do most people have middle names, but sometimes women will take their
husband’s last name and hyphenate it with their own, making it sort of a middle name
but not really, or sometimes people will give their children to multiple middle names,
Japanese names put family names first, sometimes people choose to take a single name,
and so on. This is again a case where we can either choose to bake that logic into
property getters/setters, or bake it into a single type (a “Name” type) that has the
necessary code and properties to provide all the functionality that a person’s name
represents.
&lt;/p&gt;
&lt;p&gt;
So, without getting into the actual implementation, then, if we want to represent
names in the system, then we should have a full-fledged “Name” class that captures
the various permutations that arise:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;class Name 
&lt;br /&gt;
{&amp;#160;&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public Title Honorific { get { ... } } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string Individual { get { ... } } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string Nickname { get { ... } } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string Family { get { ... } } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public string Full { get { ... } } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public static Name Parse(string incoming) { ... }&amp;#160; 
&lt;br /&gt;
}&lt;/font&gt;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
See, ultimately, everything will have to boil back to the core primitives within the
language, but we need to build stronger primitives for the system—Name, Title, Age,
and don’t even get me started on relationships.
&lt;/p&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;Relationships
&lt;/h4&gt;
&lt;p&gt;
Parent-child relationships are also a case where things are vastly more complicated
than just the one-to-many or one-to-one (or two-to-one) that direct object references
encourage; in the case of families, given how complex the modern American family can
get (and frankly, it’s not any easier if we go back and look at medieval families,
either—go have a look at any royal European genealogical line and think about how
you’d model that, particularly Henry VIII), it becomes pretty quickly apparent that
modeling the relationships themselves often presents itself as the only reasonable
solution.
&lt;/p&gt;
&lt;p&gt;
I won’t even begin to get into that example, by the way, simply because this blog
post is too long as it is. I might try it for a later blog post to explore the idea
further, but I think the point is made at this point.
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;Summary
&lt;/h3&gt;
&lt;p&gt;
The object-oriented paradigm often finds itself wading in tens of thousands of types,
so it seems counterintuitive to suggest that we need more of them to make programs
more clear. I agree, many O-O programs are too type-heavy, but part of the problem
there is that we’re spending too much time creating classes that we shouldn’t need
to create (DTOs and the like) and not enough time thinking about the actual entities
in the system.
&lt;/p&gt;
&lt;p&gt;
I’ll be the first to admit, too, that not all systems will need to treat names the
way that I’ve done—sometimes an age is just an integer, and we’re OK with that. Truthfully,
though, it seems more often than not that we’re later adding the necessary code to
ensure that ages can never be negative, have to fall within a certain range, and so
on.
&lt;/p&gt;
&lt;p&gt;
As a suggestion, then, I throw out this idea: &lt;strong&gt;&lt;em&gt;Ensure that all of your
domain classes never expose primitive types to the user of the system.&lt;/em&gt;&lt;/strong&gt; In
other words, Name never exposes an “int” for Age, but only an “Age” type. C# makes
this easy via “using” declarations, like so:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Consolas"&gt;using FirstName = System.String; 
&lt;br /&gt;
using LastName = System.String;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
which can then, if you’re thorough and disciplined about using the FirstName and LastName
types instead of “string”, evolve into fully-formed types later in their own right
if they need to. C++ provides “typedef” for this purpose—unfortunately, Java lacks
any such facility, making this a much harder prospect. (This is something I’d stick
at the top of my TODO list were I nominated to take Brian Goetz’s place at the head
of Java9 development.)
&lt;/p&gt;
&lt;p&gt;
In essence, encapsulate the primitive types away so that when they don’t need to be
primitives, or when they need to be more complex than just simple holders of data,
they don’t have to be, and clients will never know the difference. That, folks, is
what encapsulation is trying to be about.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=1a5622b2-d891-43ad-af4b-785ba018e862" /&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,1a5622b2-d891-43ad-af4b-785ba018e862.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</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>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Visual Basic</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.techfounder.net/2013/04/04/there-are-no-x10-developers-but-there-are-certainly-110-ones/">This
blog, talking about the "1/10" developer as a sort of factored replacement for the
"x10" developer</a>, caught my eye over Twitter. Frankly, I'm not sure what to say
about it, but there's a part of me that says I need to say something.
</p>
        <p>
          <b>I don't like the terminology "1/10 developer".</b> As the commenters on the author's
blog suggest, it implies a denigration of the individual in question. I don't think
that was the author's intent, but intentions don't matter--results do. You're still
suggesting that this guy is effectively worthless, even if your intent is to say that
his programming skills aren't great.
</p>
        <p>
          <b>Some programmers shouldn't be.</b> It's hard to say it, but yes, there are going
to be some programmers at either end of the bell curve. (Assuming that skill in programming
is a bell curve, and some have suggested that it's not, which is its own fascinating
discussion, but for another day.) That means that some of the people writing code
with you or for you are not going to be from the end you'd hope them to be from. That
doesn't necessarily mean they should all immediately retire and take up farming.
</p>
        <p>
          <b>Be careful how you measure.</b> The author assumed that because this programmer
wasn't able to churn out code at the same rate that the author himself could, the
programmer in question was therefore one of these "1/10" programmers. Hubris is a
dangerous thing in a CTO, even a temporary one--assuming that you could write it in
"like, 2 hours, tops" is a dangerous, dangerous path. Every programmer I've ever known
has looked at a feature or a story, thought, "Oh, that should only take me, like,
2 hours, tops" and then discovered later, to his/her chagrin, that there's a lot more
involved in that than first considered. It's very possible the author/CTO is a wunderkind
programmer who could do everything he talked about in, like, 1 or 2 hours, tops. It's
also very possible that this author/CTO misunderstood the problem (which he never
once seems to consider).
</p>
        <p>
          <b>The teacher isn't finished teaching until the student learns.</b> From the sound
of the blog post, it doesn't sound like the author/CTO was really putting that much
of an effort into teaching the programmer, but just "leading him step by step" to
the solution. Give a man a fish... teach a man to fish.... Not all wunderkind programmer/author/CTOs
are great teachers.
</p>
        <p>
          <b>Some students just don't learn very well.</b> The sword of teaching swings both
ways, though: sometimes, some teachers just can't reach some students. It sucks, but
it's life.
</p>
        <p>
          <b>This programmer was a PhD candidate?</b> The programmer in question, by the way,
was (according to the blog) studying for a PhD at the time. And couldn't grasp MVC?
Something is off here. I believe it, on the surface of it, because I worked with a
guy who had graduated university with a PhD, and couldn't understand C++ and MFC to
save his life, and got fired (and I inherited his project, which was a mess, to be
blunt), but he'd spent all his time in university studying artificial intelligence,
and had written it all using straight C code because that's what the libraries and
platform he was using for his research demanded. I don't think he was a "1/10" developer,
I think he was woefully mis-placed. Would you like an offensive lineman and put him
as a slot receiver? Would you take a catcher and put him at pitcher? Would you take
a Marketing guy and put him on server support? We need to stop thinking that all programmers
are skilled alike--this is probably creating more problems than we really realize.
Sure, on the whole, it sounds great that "craftsmen" should be able to pick up any
tool and be just as effective with that tool as they are with any other--just like
a drywaller can pick up a wrench and be just as effective a plumber, and pick up a
circuit breaker and be just as effective an electrician. Right?
</p>
        <p>
In the end reckoning, I don't think the "1/10" vs "10x" designation really does a
whole lot--I have a hard time caring where the decimal point goes in this particular
home-spun tale of metrics. And I'll even give the author the benefit of the doubt
and assume the programmer he had was, in fact, from the lower end of the bell curve,
and just wasn't capable of putting together the necessary abstractions in his head
to get from point "A" to point "B", figuratively and literally.
</p>
        <p>
But to draw this conclusion from a data point of one person? Seems a little sketchy,
to me.
</p>
        <p>
Software development, once again, thy name is hubris.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa" />
        <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>"Craftsmanship", by another name</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa.aspx</guid>
      <link>http://blogs.tedneward.com/2013/04/05/Craftsmanship+By+Another+Name.aspx</link>
      <pubDate>Fri, 05 Apr 2013 08:35:47 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.techfounder.net/2013/04/04/there-are-no-x10-developers-but-there-are-certainly-110-ones/"&gt;This
blog, talking about the "1/10" developer as a sort of factored replacement for the
"x10" developer&lt;/a&gt;, caught my eye over Twitter. Frankly, I'm not sure what to say
about it, but there's a part of me that says I need to say something.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;I don't like the terminology "1/10 developer".&lt;/b&gt; As the commenters on the author's
blog suggest, it implies a denigration of the individual in question. I don't think
that was the author's intent, but intentions don't matter--results do. You're still
suggesting that this guy is effectively worthless, even if your intent is to say that
his programming skills aren't great.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Some programmers shouldn't be.&lt;/b&gt; It's hard to say it, but yes, there are going
to be some programmers at either end of the bell curve. (Assuming that skill in programming
is a bell curve, and some have suggested that it's not, which is its own fascinating
discussion, but for another day.) That means that some of the people writing code
with you or for you are not going to be from the end you'd hope them to be from. That
doesn't necessarily mean they should all immediately retire and take up farming.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Be careful how you measure.&lt;/b&gt; The author assumed that because this programmer
wasn't able to churn out code at the same rate that the author himself could, the
programmer in question was therefore one of these "1/10" programmers. Hubris is a
dangerous thing in a CTO, even a temporary one--assuming that you could write it in
"like, 2 hours, tops" is a dangerous, dangerous path. Every programmer I've ever known
has looked at a feature or a story, thought, "Oh, that should only take me, like,
2 hours, tops" and then discovered later, to his/her chagrin, that there's a lot more
involved in that than first considered. It's very possible the author/CTO is a wunderkind
programmer who could do everything he talked about in, like, 1 or 2 hours, tops. It's
also very possible that this author/CTO misunderstood the problem (which he never
once seems to consider).
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;The teacher isn't finished teaching until the student learns.&lt;/b&gt; From the sound
of the blog post, it doesn't sound like the author/CTO was really putting that much
of an effort into teaching the programmer, but just "leading him step by step" to
the solution. Give a man a fish... teach a man to fish.... Not all wunderkind programmer/author/CTOs
are great teachers.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Some students just don't learn very well.&lt;/b&gt; The sword of teaching swings both
ways, though: sometimes, some teachers just can't reach some students. It sucks, but
it's life.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;This programmer was a PhD candidate?&lt;/b&gt; The programmer in question, by the way,
was (according to the blog) studying for a PhD at the time. And couldn't grasp MVC?
Something is off here. I believe it, on the surface of it, because I worked with a
guy who had graduated university with a PhD, and couldn't understand C++ and MFC to
save his life, and got fired (and I inherited his project, which was a mess, to be
blunt), but he'd spent all his time in university studying artificial intelligence,
and had written it all using straight C code because that's what the libraries and
platform he was using for his research demanded. I don't think he was a "1/10" developer,
I think he was woefully mis-placed. Would you like an offensive lineman and put him
as a slot receiver? Would you take a catcher and put him at pitcher? Would you take
a Marketing guy and put him on server support? We need to stop thinking that all programmers
are skilled alike--this is probably creating more problems than we really realize.
Sure, on the whole, it sounds great that "craftsmen" should be able to pick up any
tool and be just as effective with that tool as they are with any other--just like
a drywaller can pick up a wrench and be just as effective a plumber, and pick up a
circuit breaker and be just as effective an electrician. Right?
&lt;/p&gt;
&lt;p&gt;
In the end reckoning, I don't think the "1/10" vs "10x" designation really does a
whole lot--I have a hard time caring where the decimal point goes in this particular
home-spun tale of metrics. And I'll even give the author the benefit of the doubt
and assume the programmer he had was, in fact, from the lower end of the bell curve,
and just wasn't capable of putting together the necessary abstractions in his head
to get from point "A" to point "B", figuratively and literally.
&lt;/p&gt;
&lt;p&gt;
But to draw this conclusion from a data point of one person? Seems a little sketchy,
to me.
&lt;/p&gt;
&lt;p&gt;
Software development, once again, thy name is hubris.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa" /&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,63c1f9e5-207c-4f1b-9f4f-35ed14e6d5aa.aspx</comments>
      <category>Development Processes</category>
      <category>Industry</category>
      <category>Languages</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Social</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=e02917fc-91bb-462e-9c3b-44bf2929cae3</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,e02917fc-91bb-462e-9c3b-44bf2929cae3.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,e02917fc-91bb-462e-9c3b-44bf2929cae3.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e02917fc-91bb-462e-9c3b-44bf2929cae3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Every once in a while, there is a moment in your life when inspiration just BAM! strikes
out of nowhere, telling you what your next blog post is.
</p>
        <p>
Then, there’s this one.
</p>
        <p>
This blog post wasn’t inspired by any sort of bolt from the blue, or even a conversation
with a buddy that led me to think, “Yeah, this is something that I should share with
the world”. No, this one comes directly to you, from you. You see, I was cruising
through my blog logs, and in particular looking at the Google Search queries that
led to the blog site, and yesterday apparently two different Google Searches, both
titled “Ted Neward on Java 8 adoption”, came in twice each.
</p>
        <p>
I take that as a sign that y’all are kinda curious what my thoughts on Java 8 adoption
are. Consider the message received: from your fingers to my eyes, as the old saying
(slightly rephrased) goes.
</p>
        <h2>Java 8: Overview
</h2>
        <p>
For those of you who’ve been too busy to track what’s going on with the Java language
recently, the upcoming release of the JDK, the JavaSE 8 release, marks a fairly significant
moment in Java’s history, one that ranks right up there with Java 5, in that the language
is going to get a significant “bump” in functionality. Historically, Sun tried very
hard to avoid such changes: Java 1.1 introduced inner classes, Java 1.4 introduced
“assert”, and beyond that the language was the same language we’d been using since
1996 or so. The JVM saw some huge growth, by leaps and bounds, and the Java libraries
grew exponentially, it seemed, but the language itself remained pretty static until
Java 5. With Java 5 we got generics, enumerations, annotations, enhanced for loops,
variable argument declarations, and a few other things besides; with Java 7 (the last
release) we got a couple of trivial changes that really didn’t ruffle anybody’s hair,
much less blow anybody’s socks off.
</p>
        <p>
Java 8 represents another Java 5-like “sea change” kind of release. Not because there’s
a ton of new features, like Java 5 had, but because the introduction of lambdas—anonymous
function literals—will change a lot of the ways we can express concepts in Java, and
that’s going to ripple throughout the language and the ecosystem. (Well, over time,
it will—it’s hard to say exactly how much things will change in the days and months
immediately following 8’s release.)
</p>
        <p>
I won’t go into the details of Java 8’s new syntax—that’s not only still being finalized,
but it’s also been pretty well-documented and discussed elsewhere (including a forthcoming
Java Magazine issue from Oracle TechNet on the subject that’s been written by yours
truly), and I only have a few minutes to write this in between flights home from a
conference, to boot. For those who are familiar with lambdas, suffice to say that
Java lambdas will look astonishingly like Scala or C# lambdas, partly because there’s
really only a few ways you can make lambdas look in a C-style language, and partly
because the folks writing the new features want the syntax to look familiar to programmers,
and borrowing somebody else’s syntax (or at least big chunks of it) is a good way
to do that.
</p>
        <h2>Java 8: Adoption
</h2>
        <p>
When we talk about “adoption” of a given Java release, there’s a couple of different
concepts we should tease out and examine individually: those customers who will deploy
their non-Java8-written code on top of the Java8 JVM; those customers who will start
using libraries written using Java8 features; and those customers who will start writing
their own designs and implementations in the Java8 syntax and style.
</p>
        <p>
          <strong>Customers deploying Java8 for the JVM.</strong> Frankly, I expect this to
happen relatively quickly, in line with the Java releases before this one. The JVM
gets better and better with each release, and there’s no reason to assume that this
release will be any different, and once Oracle and the JVM itself have demonstrated
that there’s little to no risk to dropping the new JVM into the production data center
and firing up your current version of JBoss or Tomcat or whatever on top of it, customers
will begin to take a hard look at the risks involved in doing so (if any) and make
that transition. It’s really a high-win-low-cost thing to do, again, once the Java8
JVM has some actual production miles under its belt, so to speak. (This isn’t a new
rewrite of the JVM, by the way—customers just don’t want to be the first one to discover
stupid bugs. My Dad once summarized this attitude this way: “Pilots never want to
the fly the ‘A’ model of any aircraft.”) I give it about a year, maybe as early as
six months, after the Java8 release before customers start putting Java8 into production.
</p>
        <p>
          <strong>Customers using libraries written using Java8 features.</strong> And let’s
be clear, by “Java8 features” we’re talking about lambdas and virtual extension methods
(a.k.a. “defender methods” from earlier draft specs), and by “libraries”, we’re talking
about major open-source favorites like Spring, Hibernate, Commons Collections and
so on. Essentially, the reason this is important as a category centers around the
idea that Java developers, like a lot of developers, aren’t going to adopt the language
features of the new Java until they see them in action—passing lambdas in to Spring
for executing inside a database transaction, for example, or passing a lambda in to
a collection for execution across a collection. The timeline here will be somewhat
dependent on the library, and on the commitment of the developers around those libraries,
but I’m a little less optimistic here—many of the open-source committers have historically
been the loudest to cry foul over some of the changes Sun made to the language, and
I’m not convinced yet that they have come around to embrace Oracle’s intentions regarding
the language’s evolution. (In many ways, the image that strikes me is that of a large
number of grumpy old men sitting around the office, gruffly tossing off one-liners
like “Didn’t work like that in MY day” and “Don’t these kids realize that sometimes
the old ways are the best ways?”.) I’m guessing that this transition will take longer,
like two years at the minimum, and some libraries will never actually make the transition
at all, choosing instead to remain “pre-Java8 compatible”, in the same way that some
libraries chose to remain “pre-Java5 compatible” (and, IMHO, essentially put themselves
out to pasture as a result).
</p>
        <p>
          <strong>Customers writing their own designs and implementations in Java8.</strong> And
really, what I mean here is “how long before they start creating classes that utilize
lambdas in the domain object design”? Interestingly enough, I think this is tangentially
related to how quickly the open-source community adopts Java8 (the previous point),
because then customers will begin to see some design patterns and idioms that they
can copy/follow/embrace/extend, but even if the open-source community roundly rejects
Java8, I still see customers starting to design and build code using lambdas by 2015
or ‘16. Some will jump on it early, or be able to transition their existing anonymous-inner-class-based
(that is, “poor man’s lambda”) code over to lambdas within months of Java8’s release,
but it will take longer to percolate through the rest of the industry—there are more
than a few companies out there still running Java6, for example, and those folks aren’t
going to accelerate their use of Java8 just to get lambdas.
</p>
        <h2>Java 8: Perception
</h2>
        <p>
Having said all that, though, I think the overall perception of Java8’s adoption will
be entirely dependent on how well Oracle addresses some of the recent “security flaws”
that have been coming out of Java in the press. Even though the security flaws all
seem to be applet- or client-side Java related, the perception that Java is somehow
insecure likely has Microsoft chuckling internally—it certainly has Microsoft’s community
(of which I and a number of my friends are a part) giggling and roaring and engaging
in a few “Neener-neener-neener” moments; after all the crap that Java guys gave the
Microsoft community back in the days of Bill Gates’ famous Security Memo, I can’t
say that it’s unwarranted.
</p>
        <p>
Aside from that, though, I think there’s no real reason not to expect adoption of
Java8 to follow the same broad strokes path that previous Java releases have enjoyed,
and thus within three years I fully expect that widescale adoption will be well under
way.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=e02917fc-91bb-462e-9c3b-44bf2929cae3" />
        <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>Ted Neward on Java 8 adoption</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,e02917fc-91bb-462e-9c3b-44bf2929cae3.aspx</guid>
      <link>http://blogs.tedneward.com/2013/03/19/Ted+Neward+On+Java+8+Adoption.aspx</link>
      <pubDate>Tue, 19 Mar 2013 01:46:36 GMT</pubDate>
      <description>&lt;p&gt;
Every once in a while, there is a moment in your life when inspiration just BAM! strikes
out of nowhere, telling you what your next blog post is.
&lt;/p&gt;
&lt;p&gt;
Then, there’s this one.
&lt;/p&gt;
&lt;p&gt;
This blog post wasn’t inspired by any sort of bolt from the blue, or even a conversation
with a buddy that led me to think, “Yeah, this is something that I should share with
the world”. No, this one comes directly to you, from you. You see, I was cruising
through my blog logs, and in particular looking at the Google Search queries that
led to the blog site, and yesterday apparently two different Google Searches, both
titled “Ted Neward on Java 8 adoption”, came in twice each.
&lt;/p&gt;
&lt;p&gt;
I take that as a sign that y’all are kinda curious what my thoughts on Java 8 adoption
are. Consider the message received: from your fingers to my eyes, as the old saying
(slightly rephrased) goes.
&lt;/p&gt;
&lt;h2&gt;Java 8: Overview
&lt;/h2&gt;
&lt;p&gt;
For those of you who’ve been too busy to track what’s going on with the Java language
recently, the upcoming release of the JDK, the JavaSE 8 release, marks a fairly significant
moment in Java’s history, one that ranks right up there with Java 5, in that the language
is going to get a significant “bump” in functionality. Historically, Sun tried very
hard to avoid such changes: Java 1.1 introduced inner classes, Java 1.4 introduced
“assert”, and beyond that the language was the same language we’d been using since
1996 or so. The JVM saw some huge growth, by leaps and bounds, and the Java libraries
grew exponentially, it seemed, but the language itself remained pretty static until
Java 5. With Java 5 we got generics, enumerations, annotations, enhanced for loops,
variable argument declarations, and a few other things besides; with Java 7 (the last
release) we got a couple of trivial changes that really didn’t ruffle anybody’s hair,
much less blow anybody’s socks off.
&lt;/p&gt;
&lt;p&gt;
Java 8 represents another Java 5-like “sea change” kind of release. Not because there’s
a ton of new features, like Java 5 had, but because the introduction of lambdas—anonymous
function literals—will change a lot of the ways we can express concepts in Java, and
that’s going to ripple throughout the language and the ecosystem. (Well, over time,
it will—it’s hard to say exactly how much things will change in the days and months
immediately following 8’s release.)
&lt;/p&gt;
&lt;p&gt;
I won’t go into the details of Java 8’s new syntax—that’s not only still being finalized,
but it’s also been pretty well-documented and discussed elsewhere (including a forthcoming
Java Magazine issue from Oracle TechNet on the subject that’s been written by yours
truly), and I only have a few minutes to write this in between flights home from a
conference, to boot. For those who are familiar with lambdas, suffice to say that
Java lambdas will look astonishingly like Scala or C# lambdas, partly because there’s
really only a few ways you can make lambdas look in a C-style language, and partly
because the folks writing the new features want the syntax to look familiar to programmers,
and borrowing somebody else’s syntax (or at least big chunks of it) is a good way
to do that.
&lt;/p&gt;
&lt;h2&gt;Java 8: Adoption
&lt;/h2&gt;
&lt;p&gt;
When we talk about “adoption” of a given Java release, there’s a couple of different
concepts we should tease out and examine individually: those customers who will deploy
their non-Java8-written code on top of the Java8 JVM; those customers who will start
using libraries written using Java8 features; and those customers who will start writing
their own designs and implementations in the Java8 syntax and style.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Customers deploying Java8 for the JVM.&lt;/strong&gt; Frankly, I expect this to
happen relatively quickly, in line with the Java releases before this one. The JVM
gets better and better with each release, and there’s no reason to assume that this
release will be any different, and once Oracle and the JVM itself have demonstrated
that there’s little to no risk to dropping the new JVM into the production data center
and firing up your current version of JBoss or Tomcat or whatever on top of it, customers
will begin to take a hard look at the risks involved in doing so (if any) and make
that transition. It’s really a high-win-low-cost thing to do, again, once the Java8
JVM has some actual production miles under its belt, so to speak. (This isn’t a new
rewrite of the JVM, by the way—customers just don’t want to be the first one to discover
stupid bugs. My Dad once summarized this attitude this way: “Pilots never want to
the fly the ‘A’ model of any aircraft.”) I give it about a year, maybe as early as
six months, after the Java8 release before customers start putting Java8 into production.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Customers using libraries written using Java8 features.&lt;/strong&gt; And let’s
be clear, by “Java8 features” we’re talking about lambdas and virtual extension methods
(a.k.a. “defender methods” from earlier draft specs), and by “libraries”, we’re talking
about major open-source favorites like Spring, Hibernate, Commons Collections and
so on. Essentially, the reason this is important as a category centers around the
idea that Java developers, like a lot of developers, aren’t going to adopt the language
features of the new Java until they see them in action—passing lambdas in to Spring
for executing inside a database transaction, for example, or passing a lambda in to
a collection for execution across a collection. The timeline here will be somewhat
dependent on the library, and on the commitment of the developers around those libraries,
but I’m a little less optimistic here—many of the open-source committers have historically
been the loudest to cry foul over some of the changes Sun made to the language, and
I’m not convinced yet that they have come around to embrace Oracle’s intentions regarding
the language’s evolution. (In many ways, the image that strikes me is that of a large
number of grumpy old men sitting around the office, gruffly tossing off one-liners
like “Didn’t work like that in MY day” and “Don’t these kids realize that sometimes
the old ways are the best ways?”.) I’m guessing that this transition will take longer,
like two years at the minimum, and some libraries will never actually make the transition
at all, choosing instead to remain “pre-Java8 compatible”, in the same way that some
libraries chose to remain “pre-Java5 compatible” (and, IMHO, essentially put themselves
out to pasture as a result).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Customers writing their own designs and implementations in Java8.&lt;/strong&gt; And
really, what I mean here is “how long before they start creating classes that utilize
lambdas in the domain object design”? Interestingly enough, I think this is tangentially
related to how quickly the open-source community adopts Java8 (the previous point),
because then customers will begin to see some design patterns and idioms that they
can copy/follow/embrace/extend, but even if the open-source community roundly rejects
Java8, I still see customers starting to design and build code using lambdas by 2015
or ‘16. Some will jump on it early, or be able to transition their existing anonymous-inner-class-based
(that is, “poor man’s lambda”) code over to lambdas within months of Java8’s release,
but it will take longer to percolate through the rest of the industry—there are more
than a few companies out there still running Java6, for example, and those folks aren’t
going to accelerate their use of Java8 just to get lambdas.
&lt;/p&gt;
&lt;h2&gt;Java 8: Perception
&lt;/h2&gt;
&lt;p&gt;
Having said all that, though, I think the overall perception of Java8’s adoption will
be entirely dependent on how well Oracle addresses some of the recent “security flaws”
that have been coming out of Java in the press. Even though the security flaws all
seem to be applet- or client-side Java related, the perception that Java is somehow
insecure likely has Microsoft chuckling internally—it certainly has Microsoft’s community
(of which I and a number of my friends are a part) giggling and roaring and engaging
in a few “Neener-neener-neener” moments; after all the crap that Java guys gave the
Microsoft community back in the days of Bill Gates’ famous Security Memo, I can’t
say that it’s unwarranted.
&lt;/p&gt;
&lt;p&gt;
Aside from that, though, I think there’s no real reason not to expect adoption of
Java8 to follow the same broad strokes path that previous Java releases have enjoyed,
and thus within three years I fully expect that widescale adoption will be well under
way.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=e02917fc-91bb-462e-9c3b-44bf2929cae3" /&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,e02917fc-91bb-462e-9c3b-44bf2929cae3.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Ruby</category>
      <category>Scala</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=d45aa93c-e207-4523-aca2-1f4331fc068b</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d45aa93c-e207-4523-aca2-1f4331fc068b</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There are times when the industry in which I find myself does things that I just don't
understand.
</p>
        <p>
Consider, for a moment, <a href="http://jeffhandley.com/archive/2013/02/25/The-We-accept-pull-requests-Addiction.aspx">this
blog</a> by Jeff Handley, in which he essentially says that the phrase "We accept
pull requests" is "cringe-inducing": 
</p>
        <blockquote> Why do the words “we accept pull requests” have such a stigma? Why
were they cringe-inducing when I spoke them? Because too many OSS projects use these
words as an easy way to shut people up. We (the collective of OSS project owners)
can too easily jump to this phrase when we don’t want to do something ourselves. If
we don’t see the value in a feature, but the requester persists, we can simply utter,
“We accept pull requests,” and drop it until the end of days or when a pull request
is submitted, whichever comes first. The phrase now basically means, “Buzz off!” </blockquote> OK,
I admit that I'm somewhat removed from the OSS community--I don't have any particular
dogs in that race, as the old saying goes--and the idea that "We accept pull requests"
is a "Buzz off!" phrase is news to me. But I understand what Jeff is saying: a phrase
has taken on a meaning of its own, and as is often the case, it's a meaning that's
contrary to its stated one: <blockquote> At Microsoft, having open source projects
that actually accept pull requests is a fairly new concept. I work on NuGet, which
is an Outercurve project that accepts contributions from Microsoft and many others.
I was the dev lead for Razor and Web Pages at the time it went open source through
Microsoft Open Tech. I collaborate with teams that work on EntityFramework, SignalR,
MVC, and several other open source projects. I spend virtually all my time thinking
about projects that are open source. Just a few years ago, this was unimaginable at
Microsoft. Sometimes I feel like it still hasn’t sunk in how awesome it is that we
have gotten to where we are, and I think I’ve been trigger happy and I’ve said “We
accept pull requests” too often I typically use the phrase in jest, but I admit that
I have said it when I was really thinking “Buzz off!” </blockquote> Honestly, I've
heard the same kind of thing from the mouths of Microsoft developers during Software
Development Reviews (SDRs), in the form of the phrase "Thank you for your feedback"--it's
usually at the end of a fervent discussion when one of the reviewers is commenting
on a feature being done (or not being done) and the team is in some kind of disagreement
about the feature's relative importance or the implementation used. It's usually uttered
in a manner that gives the crowd a very clear intent: "You can stop talking now, because
I've stopped listening." <blockquote> The weekend after the MVP summit, I was still
regretting having said what I said. I wished all week I could take the words back.
And then I saw someone else fall victim. On a highly controversial NuGet issue, the
infamous Phil Haack used a similar phrase as part of a response stating that the core
team probably wouldn’t be taking action on the proposed changes, but that there was
nothing stopping those affected from issuing a pull request. With my mistake still
fresh in my mind, I read Phil’s words just as I’m sure everyone in the room at the
MVP summit heard my own. It sounded flippant and it had the opposite effect from what
Phil intended or what I would want people thinking of the NuGet core team. From there,
the thread started turning nasty. We were stuck arguing opinions and we were no longer
discussing the actual issue and how it could be solved. </blockquote> As Jeff goes
on to mention, I got involved in that Twitter conversation, along with a number of
others, and as he says, the conversation moved on to JabbR, but without me--I bailed
on it for a couple of reasons. Phil proposed a resolution to the problem, though,
that seemed to satisfy at least a few folks: <blockquote> With that many mentions
on the tweets, we ran out of characters and eventually moved into JabbR. By the end
of the conversation, we all agreed that the words “we accept pull requests” should
never be used again. Phil proposed a great phrase to use instead: “Want to take a
crack at it? We’ll help.” </blockquote> But frankly, I don't care for this phraseology.
Yes, I understand the intent--the owners of open-source projects shouldn't brush off
people's suggestions about things to do with the project in the future and shouldn't
reach for a handy phrase that will essentially serve the purpose of saying "Buzz off".
And keeping an open ear to your community is a good thing, yes.
<p>
What I don't like about the new phrase is twofold. First, if people use the phrase
casually enough, eventually it too will be overused and interpreted to mean "Buzz
off!", just as "Thank you for your feedback" became. But secondly, where in the world
did it somehow become a law that open source projects MUST implement every feature
that their users suggest? This is part of the strange economics of open source--in
a commercial product, if the developers stray too far away from what customers need
or want, declining sales will serve as a corrective force to bring them back around
(or, if they don't, bankruptcy of either the product or the company will eventually
follow). But in an open-source project, there's no real visible marker to serve as
that accountability and feedback--and so the project owners, those who want to try
and stay in tune with their users anyway, feel a deeper responsibility to respond
to user requests. And on its own, that's a good thing.
</p><p>
The part that bothers me, though, is that this new phraseology essentially implies
that any open-source project has a responsibility to implement the features that its
users ask for, and frankly, that's not sustainable. Open-source projects are, for
the most part, maintained by volunteers, but even those that are backed by commercial
firms (like Microsoft or GitHub) have finite resources--they simply cannot commit
resources, even just "help", to every feature request that any user makes of them.
This is why the "We accept pull requests" was always, to my mind, an acceptable response:
loosely translated, to me at least, it meant, "Look, that's an interesting idea, but
it either isn't on our immediate roadmap, or it takes the project in a different direction
than we'd intended, or we're not even entirely sure that it's feasible or doable or
easily managed or what-have-you. Why don't you take a stab at implementing it in your
own fork of the code, and if you can get it to some point of implementation that you
can show us, send us a copy of the code in the form of a pull request so we can take
a look and see if it fits with how we see the project going." This is not an unreasonable
response: if you care passionately about this feature, either because you think it
should be there or because your company needs that feature to get its work done, then
you have the time, energy and motivation to at least take a first pass at it and prove
the concept (or, sometimes, prove to yourself that it's not such an easy request as
you thought). Cultivating a sense of entitlement in your users is not a good practice--it's
a step towards a completely unsustainable model that could, if not curbed, eventually
lead to the death of the project as the maintainers essentially give up when faced
with feature request after feature request.
</p><p>
I applaud the efforts on the part of project maintainers, particularly those at large
commercial corporations involved in open source, to avoid "Buzz off" phrases. But
it's not OK for project maintainers to feel like they are under a responsibility to
implement any particular feature or idea suggested by a user. Some ideas are going
to be good ones, some are going to be just "off the radar" of the project's core committers,
and some are going to be just plain bad. You think your idea is one of those? Take
a stab at it. Write the code. And if you've got it to a point where it seems to be
working, then submit a pull request.
</p><p>
But please, let's not blow this out of proportion. Users need to cut the people who
give them software for free some slack.
</p><p>
(<b>EDIT:</b> I accidentally referred to Jeff as "Anthony" in one place and "Andrew"
in another. Not really sure how or why, but... Edited.)
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d45aa93c-e207-4523-aca2-1f4331fc068b" /><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>"We Accept Pull Requests"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</guid>
      <link>http://blogs.tedneward.com/2013/02/26/We+Accept+Pull+Requests.aspx</link>
      <pubDate>Tue, 26 Feb 2013 09:52:45 GMT</pubDate>
      <description>&lt;p&gt;
There are times when the industry in which I find myself does things that I just don't
understand.
&lt;/p&gt;
&lt;p&gt;
Consider, for a moment, &lt;a href="http://jeffhandley.com/archive/2013/02/25/The-We-accept-pull-requests-Addiction.aspx"&gt;this
blog&lt;/a&gt; by Jeff Handley, in which he essentially says that the phrase "We accept
pull requests" is "cringe-inducing": &lt;blockquote&gt; Why do the words “we accept pull
requests” have such a stigma? Why were they cringe-inducing when I spoke them? Because
too many OSS projects use these words as an easy way to shut people up. We (the collective
of OSS project owners) can too easily jump to this phrase when we don’t want to do
something ourselves. If we don’t see the value in a feature, but the requester persists,
we can simply utter, “We accept pull requests,” and drop it until the end of days
or when a pull request is submitted, whichever comes first. The phrase now basically
means, “Buzz off!” &lt;/blockquote&gt; OK, I admit that I'm somewhat removed from the OSS
community--I don't have any particular dogs in that race, as the old saying goes--and
the idea that "We accept pull requests" is a "Buzz off!" phrase is news to me. But
I understand what Jeff is saying: a phrase has taken on a meaning of its own, and
as is often the case, it's a meaning that's contrary to its stated one: &lt;blockquote&gt; At
Microsoft, having open source projects that actually accept pull requests is a fairly
new concept. I work on NuGet, which is an Outercurve project that accepts contributions
from Microsoft and many others. I was the dev lead for Razor and Web Pages at the
time it went open source through Microsoft Open Tech. I collaborate with teams that
work on EntityFramework, SignalR, MVC, and several other open source projects. I spend
virtually all my time thinking about projects that are open source. Just a few years
ago, this was unimaginable at Microsoft. Sometimes I feel like it still hasn’t sunk
in how awesome it is that we have gotten to where we are, and I think I’ve been trigger
happy and I’ve said “We accept pull requests” too often I typically use the phrase
in jest, but I admit that I have said it when I was really thinking “Buzz off!” &lt;/blockquote&gt; Honestly,
I've heard the same kind of thing from the mouths of Microsoft developers during Software
Development Reviews (SDRs), in the form of the phrase "Thank you for your feedback"--it's
usually at the end of a fervent discussion when one of the reviewers is commenting
on a feature being done (or not being done) and the team is in some kind of disagreement
about the feature's relative importance or the implementation used. It's usually uttered
in a manner that gives the crowd a very clear intent: "You can stop talking now, because
I've stopped listening." &lt;blockquote&gt; The weekend after the MVP summit, I was still
regretting having said what I said. I wished all week I could take the words back.
And then I saw someone else fall victim. On a highly controversial NuGet issue, the
infamous Phil Haack used a similar phrase as part of a response stating that the core
team probably wouldn’t be taking action on the proposed changes, but that there was
nothing stopping those affected from issuing a pull request. With my mistake still
fresh in my mind, I read Phil’s words just as I’m sure everyone in the room at the
MVP summit heard my own. It sounded flippant and it had the opposite effect from what
Phil intended or what I would want people thinking of the NuGet core team. From there,
the thread started turning nasty. We were stuck arguing opinions and we were no longer
discussing the actual issue and how it could be solved. &lt;/blockquote&gt; As Jeff goes
on to mention, I got involved in that Twitter conversation, along with a number of
others, and as he says, the conversation moved on to JabbR, but without me--I bailed
on it for a couple of reasons. Phil proposed a resolution to the problem, though,
that seemed to satisfy at least a few folks: &lt;blockquote&gt; With that many mentions
on the tweets, we ran out of characters and eventually moved into JabbR. By the end
of the conversation, we all agreed that the words “we accept pull requests” should
never be used again. Phil proposed a great phrase to use instead: “Want to take a
crack at it? We’ll help.” &lt;/blockquote&gt; But frankly, I don't care for this phraseology.
Yes, I understand the intent--the owners of open-source projects shouldn't brush off
people's suggestions about things to do with the project in the future and shouldn't
reach for a handy phrase that will essentially serve the purpose of saying "Buzz off".
And keeping an open ear to your community is a good thing, yes.&gt;
&lt;p&gt;
What I don't like about the new phrase is twofold. First, if people use the phrase
casually enough, eventually it too will be overused and interpreted to mean "Buzz
off!", just as "Thank you for your feedback" became. But secondly, where in the world
did it somehow become a law that open source projects MUST implement every feature
that their users suggest? This is part of the strange economics of open source--in
a commercial product, if the developers stray too far away from what customers need
or want, declining sales will serve as a corrective force to bring them back around
(or, if they don't, bankruptcy of either the product or the company will eventually
follow). But in an open-source project, there's no real visible marker to serve as
that accountability and feedback--and so the project owners, those who want to try
and stay in tune with their users anyway, feel a deeper responsibility to respond
to user requests. And on its own, that's a good thing.
&lt;/p&gt;
&lt;p&gt;
The part that bothers me, though, is that this new phraseology essentially implies
that any open-source project has a responsibility to implement the features that its
users ask for, and frankly, that's not sustainable. Open-source projects are, for
the most part, maintained by volunteers, but even those that are backed by commercial
firms (like Microsoft or GitHub) have finite resources--they simply cannot commit
resources, even just "help", to every feature request that any user makes of them.
This is why the "We accept pull requests" was always, to my mind, an acceptable response:
loosely translated, to me at least, it meant, "Look, that's an interesting idea, but
it either isn't on our immediate roadmap, or it takes the project in a different direction
than we'd intended, or we're not even entirely sure that it's feasible or doable or
easily managed or what-have-you. Why don't you take a stab at implementing it in your
own fork of the code, and if you can get it to some point of implementation that you
can show us, send us a copy of the code in the form of a pull request so we can take
a look and see if it fits with how we see the project going." This is not an unreasonable
response: if you care passionately about this feature, either because you think it
should be there or because your company needs that feature to get its work done, then
you have the time, energy and motivation to at least take a first pass at it and prove
the concept (or, sometimes, prove to yourself that it's not such an easy request as
you thought). Cultivating a sense of entitlement in your users is not a good practice--it's
a step towards a completely unsustainable model that could, if not curbed, eventually
lead to the death of the project as the maintainers essentially give up when faced
with feature request after feature request.
&lt;/p&gt;
&lt;p&gt;
I applaud the efforts on the part of project maintainers, particularly those at large
commercial corporations involved in open source, to avoid "Buzz off" phrases. But
it's not OK for project maintainers to feel like they are under a responsibility to
implement any particular feature or idea suggested by a user. Some ideas are going
to be good ones, some are going to be just "off the radar" of the project's core committers,
and some are going to be just plain bad. You think your idea is one of those? Take
a stab at it. Write the code. And if you've got it to a point where it seems to be
working, then submit a pull request.
&lt;/p&gt;
&lt;p&gt;
But please, let's not blow this out of proportion. Users need to cut the people who
give them software for free some slack.
&lt;/p&gt;
&lt;p&gt;
(&lt;b&gt;EDIT:&lt;/b&gt; I accidentally referred to Jeff as "Anthony" in one place and "Andrew"
in another. Not really sure how or why, but... Edited.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d45aa93c-e207-4523-aca2-1f4331fc068b" /&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,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</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>Python</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>XML Services</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>
  </channel>
</rss>