<?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</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=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In incarnations past, I have had debates, public and otherwise, with friends and colleagues
who have asserted that HTML5 (by which we really mean HTML5/JavaScript/CSS3) will
essentially become the platform of choice for all applications going forward—that
essentially, <em>this</em> time, standards will win out, and companies that try to
subvert the open nature of the web by creating their own implementations with their
own extensions and proprietary features that aren’t part of the standards, lose.
</p>
        <p>
Then, I read the Wired news post about <a href="http://www.wired.com/wiredenterprise/2013/04/blink/" target="_blank">Google’s
departure from WebKit</a>, and I’m a little surprised that the Internet (and by “the
Internet”, I mean “the very people who get up in arms about standards and subverting
them and blah blah blah”) hasn’t taken more issues with some of the things cited therein:
</p>
        <blockquote>
          <p>
Google’s decision is in tune with its overall efforts to improve the infrastructure
of the internet. When it comes to browser software and other web technologies that
directly effect the how quickly and effectively your machine grabs and displays webpages,
the company likes to use open source technologies. That way, it can feed their adoption
outside the company — and ultimately improve the delivery of its many online services
(including all important advertisements). But if it believes the rest of the web is
moving too slowly, it has no problem starting up its own project.
</p>
        </blockquote>
        <p>
Just to be clear, Google is happy to use open-source technologies, so it can feed
adoption of those technologies, but if it’s something that Google thinks is being
adopted too slowly—like, say, Google’s extensions to the various standards that aren’t
being picked up by its competitors—then Google feels the need to kick off its own
thing. Interesting.
</p>
        <blockquote>
          <p>
… [T]he trouble with WebKit is that is used different “multi-process architecture”
than its Chrome browser, which basically means it didn’t handle concurrent tasks in
the same way. When Chrome was first released in 2008 WebKit didn’t have a multi-process
architecture, so Google had to build its own. WebKit2, released in 2010, adds multi-process
features, but is quite different from what Google had already built. Apple and Google
don’t see eye to eye on the project, and it became too difficult and too time-consuming
for the company juggle the two architectures. “Supporting multiple architectures over
the years has led to increasing complexity for both [projects],” the post says. “This
has slowed down the collective pace of innovation.”
</p>
        </blockquote>
        <p>
So… Google tried to use some open-source software, but discovered that the project
didn’t work the way they built the rest of their application to work. (I’m certain
that’s the first time that has happened, ever.) When the custodians of the project
did add the feature Google wanted, the feature was implemented in a manner that still
wasn’t in lockstep with the way Google wanted things to work in their application.
This meant that “innovation” is “slowed down”.
</p>
        <p>
(As an aside, I find it fascinating that whenever a company adopts open-source, it’s
to “foster interoperability and open standards”, but when they abandon open-source,
it’s to “foster innovation and faster evolution”. And I’m sure it’s entirely accidental
that most of the time, adopting “open standards” is usually when the company is way
behind on the technology curve for a given thing, and adopting “faster innovation”
is usually when that same company thinks they’ve caught up the distance or surged
ahead of their competitors in that space.)
</p>
        <p>
Of course, a new implementation has its risks of bugs and incompatibilities, but Google
has a plan for that:
</p>
        <blockquote>
          <p>
“Throughout this transition, we’ll collaborate closely with other browser vendors
to move the web forward and preserve the compatibility that made it a successful ecosystem,”
the announcement reads.
</p>
        </blockquote>
        <p>
Ah, there. See? By collaborating closely with their competitors, they will preserve
compatibility. Because when Microsoft did that, everybody was totally OK with that….
uh, and… yeah… it worked pretty well, too, and….
</p>
        <p>
Look, it seems pretty reasonable to assume that even if the tags and the DOM and the
APIs are all 100% unchanged from Chrome v.Past to v.Next, there’s still going to be
places where they optimize differently than WebKit does, which means now that developers
will need to learn (and implement) optimizations in their Web-based applications differently.
And frankly, the assumption that Chrome’s Blink and WebKit will somehow be bug-for-bug
compatible/identical with each other is a pretty steep bar to accept blindly, considering
the history.
</p>
        <p>
Once again, we see the cycle coming around: in the beginning, when a technology is
fleshing out, companies yearn for standards in order to create adoption. After a certain
tipping point of adoption, however, the major players start to seek ways to avoid
becoming a commodity, and start introducing “extensions” and “innovations” that for
some odd reason their competitors in the standards meetings don’t seem all that inclined
to adopt. That’s when they start forking and shying away from staying true to the
standard, and eventually, the standard becomes either a least-common-denominator…
or a joke.
</p>
        <p>
Anybody want to bet on which outcome emerges for HTML5?
</p>
        <p>
(Before you reach for the “Comment” link to flame me all to Hell, yes, even an HTML
5 standard that is 80% consistent across all the browsers is still pretty damn useful—just
as a SQL standard that is 80% consistent across all the databases is useful. But this
is a far cry from the utopia of interconnectedness and interoperability that was promised
to us by the HTMLophiles, and it simply demonstrates that the Circle of TechnoLife
continues, unabated, as it has ever since PC manufacturers—and the rest of us watching
them--discovered what happens to them when they become a commodity.)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435" />
        <br />
        <hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Say that part about HTML standards, again?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</guid>
      <link>http://blogs.tedneward.com/2013/04/13/Say+That+Part+About+HTML+Standards+Again.aspx</link>
      <pubDate>Sat, 13 Apr 2013 08:30:45 GMT</pubDate>
      <description>&lt;p&gt;
In incarnations past, I have had debates, public and otherwise, with friends and colleagues
who have asserted that HTML5 (by which we really mean HTML5/JavaScript/CSS3) will
essentially become the platform of choice for all applications going forward—that
essentially, &lt;em&gt;this&lt;/em&gt; time, standards will win out, and companies that try to
subvert the open nature of the web by creating their own implementations with their
own extensions and proprietary features that aren’t part of the standards, lose.
&lt;/p&gt;
&lt;p&gt;
Then, I read the Wired news post about &lt;a href="http://www.wired.com/wiredenterprise/2013/04/blink/" target="_blank"&gt;Google’s
departure from WebKit&lt;/a&gt;, and I’m a little surprised that the Internet (and by “the
Internet”, I mean “the very people who get up in arms about standards and subverting
them and blah blah blah”) hasn’t taken more issues with some of the things cited therein:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Google’s decision is in tune with its overall efforts to improve the infrastructure
of the internet. When it comes to browser software and other web technologies that
directly effect the how quickly and effectively your machine grabs and displays webpages,
the company likes to use open source technologies. That way, it can feed their adoption
outside the company — and ultimately improve the delivery of its many online services
(including all important advertisements). But if it believes the rest of the web is
moving too slowly, it has no problem starting up its own project.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Just to be clear, Google is happy to use open-source technologies, so it can feed
adoption of those technologies, but if it’s something that Google thinks is being
adopted too slowly—like, say, Google’s extensions to the various standards that aren’t
being picked up by its competitors—then Google feels the need to kick off its own
thing. Interesting.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
… [T]he trouble with WebKit is that is used different “multi-process architecture”
than its Chrome browser, which basically means it didn’t handle concurrent tasks in
the same way. When Chrome was first released in 2008 WebKit didn’t have a multi-process
architecture, so Google had to build its own. WebKit2, released in 2010, adds multi-process
features, but is quite different from what Google had already built. Apple and Google
don’t see eye to eye on the project, and it became too difficult and too time-consuming
for the company juggle the two architectures. “Supporting multiple architectures over
the years has led to increasing complexity for both [projects],” the post says. “This
has slowed down the collective pace of innovation.”
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
So… Google tried to use some open-source software, but discovered that the project
didn’t work the way they built the rest of their application to work. (I’m certain
that’s the first time that has happened, ever.) When the custodians of the project
did add the feature Google wanted, the feature was implemented in a manner that still
wasn’t in lockstep with the way Google wanted things to work in their application.
This meant that “innovation” is “slowed down”.
&lt;/p&gt;
&lt;p&gt;
(As an aside, I find it fascinating that whenever a company adopts open-source, it’s
to “foster interoperability and open standards”, but when they abandon open-source,
it’s to “foster innovation and faster evolution”. And I’m sure it’s entirely accidental
that most of the time, adopting “open standards” is usually when the company is way
behind on the technology curve for a given thing, and adopting “faster innovation”
is usually when that same company thinks they’ve caught up the distance or surged
ahead of their competitors in that space.)
&lt;/p&gt;
&lt;p&gt;
Of course, a new implementation has its risks of bugs and incompatibilities, but Google
has a plan for that:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
“Throughout this transition, we’ll collaborate closely with other browser vendors
to move the web forward and preserve the compatibility that made it a successful ecosystem,”
the announcement reads.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ah, there. See? By collaborating closely with their competitors, they will preserve
compatibility. Because when Microsoft did that, everybody was totally OK with that….
uh, and… yeah… it worked pretty well, too, and….
&lt;/p&gt;
&lt;p&gt;
Look, it seems pretty reasonable to assume that even if the tags and the DOM and the
APIs are all 100% unchanged from Chrome v.Past to v.Next, there’s still going to be
places where they optimize differently than WebKit does, which means now that developers
will need to learn (and implement) optimizations in their Web-based applications differently.
And frankly, the assumption that Chrome’s Blink and WebKit will somehow be bug-for-bug
compatible/identical with each other is a pretty steep bar to accept blindly, considering
the history.
&lt;/p&gt;
&lt;p&gt;
Once again, we see the cycle coming around: in the beginning, when a technology is
fleshing out, companies yearn for standards in order to create adoption. After a certain
tipping point of adoption, however, the major players start to seek ways to avoid
becoming a commodity, and start introducing “extensions” and “innovations” that for
some odd reason their competitors in the standards meetings don’t seem all that inclined
to adopt. That’s when they start forking and shying away from staying true to the
standard, and eventually, the standard becomes either a least-common-denominator…
or a joke.
&lt;/p&gt;
&lt;p&gt;
Anybody want to bet on which outcome emerges for HTML5?
&lt;/p&gt;
&lt;p&gt;
(Before you reach for the “Comment” link to flame me all to Hell, yes, even an HTML
5 standard that is 80% consistent across all the browsers is still pretty damn useful—just
as a SQL standard that is 80% consistent across all the databases is useful. But this
is a far cry from the utopia of interconnectedness and interoperability that was promised
to us by the HTMLophiles, and it simply demonstrates that the Circle of TechnoLife
continues, unabated, as it has ever since PC manufacturers—and the rest of us watching
them--discovered what happens to them when they become a commodity.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5fe4fd54-563d-4ac8-87cf-0aeaecaa2435" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,5fe4fd54-563d-4ac8-87cf-0aeaecaa2435.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>F#</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=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=0da7cc17-b113-465d-a8bb-3ab0ec47bfa1</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,0da7cc17-b113-465d-a8bb-3ab0ec47bfa1.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,0da7cc17-b113-465d-a8bb-3ab0ec47bfa1.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0da7cc17-b113-465d-a8bb-3ab0ec47bfa1</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Oh, boy. Diving into this whole <a href="http://venturebeat.com/2013/03/20/playhaven-developer-fired-for-making-sexual-jokes-after-sendgrids-developer-evangelist-outs-him-on-twitter/" target="_blank">Adria
Richards/people-getting-fired thing</a> is probably a mistake, but it’s reached levels
at which I’m just too annoyed by everyone and everything in this to not say something.
You have one of three choices: read the summary below and conclude I’m a misogynist
without reading the rest; read the summary below and conclude I’m spot-on without
reading the rest; or read the rest and draw your own conclusions after hearing the
arguments.
</p>
        <p>
          <strong>TL;DR</strong> Adria Richards was right to be fired; the developer/s from
PlayHaven shouldn’t have been fired; the developer/s from PlayHaven could very well
be a pair of immature assholes; the rape and death threats against Adria Richards
undermine the positions of those who support the developer/s formerly from PlayHaven;
the content of the jokes don’t constitute sexism nor should conferences overreact
this way; half the Internet will label me a misogynist for these views; and none of
this ends well.
</p>
        <h3>The Facts, as I understand them
</h3>
        <p>
Three people are sitting in a keynote at a software conference. A presenter makes
a comment on stage that leads two people sitting in the audience to start making jokes
with all the emotional maturity of Beavis and Butthead. (Said developers are claiming
that any and all sexual innuendo was inferred by the third, but frankly, let’s assume
worst case here and assume they were, in fact, making cheap tawdry sex jokes out of
“dongle” and “forking”.) A third person, after listening to it for a while, turns
around, smiles, snaps a photo of the two of them, and Tweets them out as assholes.
Conference staff approach third person, ask her to identify the two perpetrators, <strike>escort
the developers out of the conference based on nothing but her word and (so far as
I can tell) zero supporting evidence</strike>. Firestorm erupts over the Internet,
and now all three (?) are jobless.
</p>
        <p>
(<strong>UPDATE:</strong> Roberto Guerra mentioned, in private email, that <a href="http://pycon.blogspot.com/2013/03/pycon-response-to-inappropriate.html" target="_blank">PyCon
has published their version of the events</a>, which does not mention the developers
being asked to leave; Roberto also tells me that the above link, which states that,
apparently got it wrong, and that the original source they used was mistaken. Apologies
to PyCon if this is the case.)
</p>
        <h3>
        </h3>
        <h3>My Interpretations
</h3>
        <p>
Note that with typical software developer hubris, I feel eminently qualified to comment
on all of this. (Which is my way of saying, take all of this with a grain of salt—I
have some experience with this, being on the “accused” end of sexual harassment, and
what I’m saying stems from my enforced “sit through the class” time from a decade
or more ago, but I’m no lawyer, and like everybody else, I’m at the mercy of the reports
since I wasn’t there.)
</p>
        <p>
          <strong>Developers who make “dongle” jokes and “forking” jokes are not only being
stupid, those jokes have already been made. So they’re stupid twice over.</strong> C’mon,
guys. New material. Seriously.
</p>
        <p>
          <strong>Making jokes in public that others might find offensive is taking a risk.</strong> Do
it on stage, you run the risk of earning the wrath of the crowd. (Of course, nobody
on <em>this</em> blog would, say, drop “the f-bomb” something like 23 times on stage
in a keynote, right?) Do it in a crowd, you run the risk of pissing somebody off around
you and looking/acting like douche. Might be in your best interests to keep your voice
down or just chuckle to yourself and have that conversation later.
</p>
        <p>
          <strong>Photos taken in public are considered public, if rude.</strong> If I walk
out into the street and start filming you, I have perfect right to do so, according
to US law: what happens in public is considered public domain. Paparazzi depend on
this for their “right” to follow and photograph moviestars, atheletes, and other “public”
figures. Adria was entirely within her rights to photograph those two and Tweet it.
But if I snap a pic of a cute girl and Tweet it with “Wow, want to guess whether her
code is hot too?”, it’s a douche move because I’m using her likeness without her permission.
If I do that for profit, now I’m actually open to lawsuit. So photos in public are
in still something of a grey area, legally. Basic rule of thumb: if you want to be
safe, ask before you put a photo of somebody else, taken in public or not, someplace
other than on your own private device.
</p>
        <p>
          <strong>Third parties who overhear conversations could arguably be violating privacy.</strong> There’s
a fine line here, but eavesdropping is rude. Now, I don’t know how loud they were
making the jokes—shouting it out across the room is a very different scenario than
whispering it to your seatmate and co-worker—but frankly, it’s usually pretty easy
to tell when a joke is meant for general distribution in a room like that, and when
it’s not. If it’s not meant for you, how about you just not hear it and concentrate
on something else? Chalk up the commentary as “idiots being idiots”, and if there’s
no implied threat to anybody going on, leave it be.
</p>
        <p>
          <strong>If you’re offended, you have an obligation to tell the parties in question
and give them a choice to make good.</strong> Imagine this scenario: a guy sits down
next to a girl on a bus. His leg brushes up against hers. She immediately stands up
and shouts out “THIS MAN IS MAKING UNWANTED SEXUAL ADVANCES AT ME!” at the top of
her lungs. Who’s the societally maladjusted person here? If, instead, she says, “Oh,
please don’t make physical contact with me”, and he says, “But that’s my right as
a human male”, and refuses to move his leg from pressing up against hers, then who’s
the societally maladjusted one? Slice this one as finely as you like, but if you’re
offended at something I do, it’s your responsibility to tell me so that I can make
it right, by apologizing and/or ceasing the behavior in question, or telling you that
I have Tourette’s, or by telling you you’re an uptight party-pooper, or however else
this story can play out. If the party in question continues the behavior, then you’ve
got grounds—moral and legal—to go to the authorities.
</p>
        <p>
          <strong>Just because you call it harassment doesn’t make it such.</strong> Legally,
from what I remember, harassment is defined as “repeated acts of unwanted sexual attention”;
in this case, I don’t see a history of repetition, nor do I see there being actual
“attention” to Adria in this case—this was a conversation being held between two individuals
that didn’t include her.
</p>
        <p>
          <strong>Just because it involves sex doesn’t make it sexist.</strong> Two guys were
making jokes about male genitalia. It may have been inappropriate, but honestly, unless
somebody widened the definition of sexism (“making disparaging comments about someone
based on their gender or sexual preferences”) when I wasn’t looking, this ain’t it.
And for Adria to claim sexism in public is bad when she Tweeted just a few days prior
about stuffing a sock down your shorts during a TSA patdown seems a little…. *shrug*
You pick the world.
</p>
        <p>
          <strong>The conference needs to follow basic due process.</strong> You know—innocent
until proven guilty, measured and proportional response, warnings, and so on. I don’t
care what it says on the conference’s website by way of disclaimer—you have to figure
out if what was said to happen actually happened before you respond to it. Nowhere
in the facts above do I hear the conference taking any steps to protect the accused—a
woman said a couple of guys said sexual things, so we must act quickly! This has “bad”
written all over it for the next five conferences.
</p>
        <p>
(<strong>UPDATE</strong>: Again, PyCon apparently didn’t escort the developer/s out
of the conference, but instead according to their site, “Both parties were met with,
in private. The comments that were made were in poor taste, and individuals involved
agreed, apologized and no further actions were taken by the staff of PyCon 2013. No
individuals were removed from the conference, no sanctions were levied.” It sounds
like, contrary to what I first heard, PyCon handled it in a classy manner, so I apologize
for perpetrating the image that they didn’t. Having said that, though, I find it curious
that this storm blew up this way—did no one think to push those apologies to Twitter
so everyone else knew that things had blown over, or did they in fact do that and
we’re all too busy gawking and screaming “fight! fight! fight” on the playground to
notice?)
</p>
        <p>
          <strong>The material shouldn’t matter.</strong> I know we’re all being all sexually
politically correct these days about women in IT, but this is a Pandora’s Box of a
precedent that will eventually get way out of hand, if it isn’t already (and I think
it is). Imagine how this story goes for the conference if a man Tweets out a picture
of a woman and says, “This woman was talking to another woman and insulted my religion,
and the conversation made me uncomfortable.” Is the conference now on the hook to
escort those two women out of the building? How about programming language choice?
How about race? How about sports teams? Where do we draw this line?
</p>
        <p>
          <strong>Adria was right to be fired.</strong> It’s harsh, but as any celebrity endorsement
negotiator will tell you, when you represent a brand, you represent the brand even
when the cameras aren’t rolling. (Just ask Tiger Woods about this.) Her actions brought
a ton of unwanted negative attention (and a DDOS attack, apparently) to the company;
that’s in direct contrast to the reasons they were paying her, and seeing as how her
actions were something she did (as opposed to had done to her), her termination is
entirely justified. You might see it as a bit harsh, but the company is well within
boundaries here.
</p>
        <p>
          <strong>The PlayHaven developers weren’t right to be fired.</strong> Again, nowhere
do we see them getting the opportunity to confront their accuser, or make restitution
(apology). Now, you can argue that they, too, were representing their firm, but unless
their job is to act as an evangelist and brand recognition activities are part of
their job description, you can’t terminate them for gross negligence in this. Of course,
most employment is “at-will”, meaning a company can fire you for any reason it likes,
but this is sort of akin to getting fired for getting drunk and making lewd comments
to the wait staff at Denny’s while wearing a company T-shirt.
</p>
        <p>
          <strong>Sexism in IT is bad.</strong> Duh. I don’t think I’ve met anyone who said
otherwise. But this wasn’t sexism. Inappropriate, perhaps, but not sexism. By the
way, racism in IT is bad, and so is age-ism, role-ism (discounting somebody’s opinions
just because they’re in Marketing or Sales), and technacism (discounting a technology
based on no factual knowledge).
</p>
        <p>
          <strong>It’s politically correct to jump to attention when “women in IT” come up.</strong> This
subject is gathering a lot of momentum, and most of it I think is of the bad variety.
Hate speech should not be tolerated—the rape and death threats against Adria cannot,
should not, and are not acceptable in any way shape or form. Nor should similar kinds
of direct comments against gays, lesbians, transsexuals, blacks, Asians, Jews, or
any of the other “other” groups out there. But there is a far cry between this and
the discrimination and hate speech that people go through: I have a friend who is
lesbian and a school teacher, and she is receiving death threats for teaching at that
school. She has dogs at the house, shotgun loaded, and she is waiting for the Mormons
and news reporters to vacate her lawn so she can try to resume some kind of normal
life. Putting up with a few lewd jokes in a crowd at a conference, I would guess,
sounds pretty heavenly to her right now. 
</p>
        <p>
I think we have time for a patronizing plea, by the way: Ladies, I know you’ve had
something of a rough time in the IT industry, but it’s pretty obvious that it’s getting
better, and frankly, you run a big risk of ostracizing yourself and making it harder
if every time a woman doesn’t get selected for something (a conference speaking slot,
a tech lead role, or a particular job) the whole “women in IT” banner gets unfurled
and raised. Don’t get me wrong—I don’t think there’s many of you that are doing that.
There are some, though, who do claim special privilege just for being female, and
there’s enough of a correlation between these two things that I think before too long
it’s going to lose its impact and the real good that could be done will be lost. Don’t
demand that you get special privilege—earn it. Believe me, there’s plenty of opportunities
for you to do so, so if you get blocked on something, look for a way around it. Demand
equality, not artificially-imposed advantage. 
</p>
        <p>
(As trends go, quite honestly, given the declining rates of men graduating college
and actually making a life for themselves, before too long the shoe will be on the
other foot anyway, just give it time.)
</p>
        <p>
          <strong>There is no happy ending here.</strong> Nobody can fix this; three lives have
been forever affected, negatively, by all of this. The ones I feel truly sorry for?
SendGrid and PlayHaven—they had nothing to do with it, and now their names are going
to be associated with this whole crappy mess.
</p>
        <p>
Call me a misogynist for not whole-heartedly backing the woman in this case, if you
will, but frankly, it was a disaster from the moment she chose to snap the photo and
Tweet to the world instead of saying, “Excuse me, can you not make those jokes here?
I don’t think they’re particularly appropriate.” I could theorize why she chose the
one route over the other, but that’s an essay for another day.
</p>
        <p>
Let the flaming begin.
</p>
        <p>
          <b>UPDATE</b>: This post <a href="http://amandablumwords.wordpress.com/2013/03/21/3/">puts
more context</a> around Adria, and I think is the best-written commentary I've seen
on this so far, particularly since it's a woman's point of view on the whole thing
(assuming, of course, that "Amanda" is in this case applied to a human of
the female persuasion).
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0da7cc17-b113-465d-a8bb-3ab0ec47bfa1" />
        <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 Sexism, Harassment, and Termination</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,0da7cc17-b113-465d-a8bb-3ab0ec47bfa1.aspx</guid>
      <link>http://blogs.tedneward.com/2013/03/21/On+Sexism+Harassment+And+Termination.aspx</link>
      <pubDate>Thu, 21 Mar 2013 23:09:20 GMT</pubDate>
      <description>&lt;p&gt;
Oh, boy. Diving into this whole &lt;a href="http://venturebeat.com/2013/03/20/playhaven-developer-fired-for-making-sexual-jokes-after-sendgrids-developer-evangelist-outs-him-on-twitter/" target="_blank"&gt;Adria
Richards/people-getting-fired thing&lt;/a&gt; is probably a mistake, but it’s reached levels
at which I’m just too annoyed by everyone and everything in this to not say something.
You have one of three choices: read the summary below and conclude I’m a misogynist
without reading the rest; read the summary below and conclude I’m spot-on without
reading the rest; or read the rest and draw your own conclusions after hearing the
arguments.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;TL;DR&lt;/strong&gt; Adria Richards was right to be fired; the developer/s from
PlayHaven shouldn’t have been fired; the developer/s from PlayHaven could very well
be a pair of immature assholes; the rape and death threats against Adria Richards
undermine the positions of those who support the developer/s formerly from PlayHaven;
the content of the jokes don’t constitute sexism nor should conferences overreact
this way; half the Internet will label me a misogynist for these views; and none of
this ends well.
&lt;/p&gt;
&lt;h3&gt;The Facts, as I understand them
&lt;/h3&gt;
&lt;p&gt;
Three people are sitting in a keynote at a software conference. A presenter makes
a comment on stage that leads two people sitting in the audience to start making jokes
with all the emotional maturity of Beavis and Butthead. (Said developers are claiming
that any and all sexual innuendo was inferred by the third, but frankly, let’s assume
worst case here and assume they were, in fact, making cheap tawdry sex jokes out of
“dongle” and “forking”.) A third person, after listening to it for a while, turns
around, smiles, snaps a photo of the two of them, and Tweets them out as assholes.
Conference staff approach third person, ask her to identify the two perpetrators, &lt;strike&gt;escort
the developers out of the conference based on nothing but her word and (so far as
I can tell) zero supporting evidence&lt;/strike&gt;. Firestorm erupts over the Internet,
and now all three (?) are jobless.
&lt;/p&gt;
&lt;p&gt;
(&lt;strong&gt;UPDATE:&lt;/strong&gt; Roberto Guerra mentioned, in private email, that &lt;a href="http://pycon.blogspot.com/2013/03/pycon-response-to-inappropriate.html" target="_blank"&gt;PyCon
has published their version of the events&lt;/a&gt;, which does not mention the developers
being asked to leave; Roberto also tells me that the above link, which states that,
apparently got it wrong, and that the original source they used was mistaken. Apologies
to PyCon if this is the case.)
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;My Interpretations
&lt;/h3&gt;
&lt;p&gt;
Note that with typical software developer hubris, I feel eminently qualified to comment
on all of this. (Which is my way of saying, take all of this with a grain of salt—I
have some experience with this, being on the “accused” end of sexual harassment, and
what I’m saying stems from my enforced “sit through the class” time from a decade
or more ago, but I’m no lawyer, and like everybody else, I’m at the mercy of the reports
since I wasn’t there.)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Developers who make “dongle” jokes and “forking” jokes are not only being
stupid, those jokes have already been made. So they’re stupid twice over.&lt;/strong&gt; C’mon,
guys. New material. Seriously.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Making jokes in public that others might find offensive is taking a risk.&lt;/strong&gt; Do
it on stage, you run the risk of earning the wrath of the crowd. (Of course, nobody
on &lt;em&gt;this&lt;/em&gt; blog would, say, drop “the f-bomb” something like 23 times on stage
in a keynote, right?) Do it in a crowd, you run the risk of pissing somebody off around
you and looking/acting like douche. Might be in your best interests to keep your voice
down or just chuckle to yourself and have that conversation later.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Photos taken in public are considered public, if rude.&lt;/strong&gt; If I walk
out into the street and start filming you, I have perfect right to do so, according
to US law: what happens in public is considered public domain. Paparazzi depend on
this for their “right” to follow and photograph moviestars, atheletes, and other “public”
figures. Adria was entirely within her rights to photograph those two and Tweet it.
But if I snap a pic of a cute girl and Tweet it with “Wow, want to guess whether her
code is hot too?”, it’s a douche move because I’m using her likeness without her permission.
If I do that for profit, now I’m actually open to lawsuit. So photos in public are
in still something of a grey area, legally. Basic rule of thumb: if you want to be
safe, ask before you put a photo of somebody else, taken in public or not, someplace
other than on your own private device.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Third parties who overhear conversations could arguably be violating privacy.&lt;/strong&gt; There’s
a fine line here, but eavesdropping is rude. Now, I don’t know how loud they were
making the jokes—shouting it out across the room is a very different scenario than
whispering it to your seatmate and co-worker—but frankly, it’s usually pretty easy
to tell when a joke is meant for general distribution in a room like that, and when
it’s not. If it’s not meant for you, how about you just not hear it and concentrate
on something else? Chalk up the commentary as “idiots being idiots”, and if there’s
no implied threat to anybody going on, leave it be.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;If you’re offended, you have an obligation to tell the parties in question
and give them a choice to make good.&lt;/strong&gt; Imagine this scenario: a guy sits down
next to a girl on a bus. His leg brushes up against hers. She immediately stands up
and shouts out “THIS MAN IS MAKING UNWANTED SEXUAL ADVANCES AT ME!” at the top of
her lungs. Who’s the societally maladjusted person here? If, instead, she says, “Oh,
please don’t make physical contact with me”, and he says, “But that’s my right as
a human male”, and refuses to move his leg from pressing up against hers, then who’s
the societally maladjusted one? Slice this one as finely as you like, but if you’re
offended at something I do, it’s your responsibility to tell me so that I can make
it right, by apologizing and/or ceasing the behavior in question, or telling you that
I have Tourette’s, or by telling you you’re an uptight party-pooper, or however else
this story can play out. If the party in question continues the behavior, then you’ve
got grounds—moral and legal—to go to the authorities.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Just because you call it harassment doesn’t make it such.&lt;/strong&gt; Legally,
from what I remember, harassment is defined as “repeated acts of unwanted sexual attention”;
in this case, I don’t see a history of repetition, nor do I see there being actual
“attention” to Adria in this case—this was a conversation being held between two individuals
that didn’t include her.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Just because it involves sex doesn’t make it sexist.&lt;/strong&gt; Two guys were
making jokes about male genitalia. It may have been inappropriate, but honestly, unless
somebody widened the definition of sexism (“making disparaging comments about someone
based on their gender or sexual preferences”) when I wasn’t looking, this ain’t it.
And for Adria to claim sexism in public is bad when she Tweeted just a few days prior
about stuffing a sock down your shorts during a TSA patdown seems a little…. *shrug*
You pick the world.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The conference needs to follow basic due process.&lt;/strong&gt; You know—innocent
until proven guilty, measured and proportional response, warnings, and so on. I don’t
care what it says on the conference’s website by way of disclaimer—you have to figure
out if what was said to happen actually happened before you respond to it. Nowhere
in the facts above do I hear the conference taking any steps to protect the accused—a
woman said a couple of guys said sexual things, so we must act quickly! This has “bad”
written all over it for the next five conferences.
&lt;/p&gt;
&lt;p&gt;
(&lt;strong&gt;UPDATE&lt;/strong&gt;: Again, PyCon apparently didn’t escort the developer/s out
of the conference, but instead according to their site, “Both parties were met with,
in private. The comments that were made were in poor taste, and individuals involved
agreed, apologized and no further actions were taken by the staff of PyCon 2013. No
individuals were removed from the conference, no sanctions were levied.” It sounds
like, contrary to what I first heard, PyCon handled it in a classy manner, so I apologize
for perpetrating the image that they didn’t. Having said that, though, I find it curious
that this storm blew up this way—did no one think to push those apologies to Twitter
so everyone else knew that things had blown over, or did they in fact do that and
we’re all too busy gawking and screaming “fight! fight! fight” on the playground to
notice?)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The material shouldn’t matter.&lt;/strong&gt; I know we’re all being all sexually
politically correct these days about women in IT, but this is a Pandora’s Box of a
precedent that will eventually get way out of hand, if it isn’t already (and I think
it is). Imagine how this story goes for the conference if a man Tweets out a picture
of a woman and says, “This woman was talking to another woman and insulted my religion,
and the conversation made me uncomfortable.” Is the conference now on the hook to
escort those two women out of the building? How about programming language choice?
How about race? How about sports teams? Where do we draw this line?
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Adria was right to be fired.&lt;/strong&gt; It’s harsh, but as any celebrity endorsement
negotiator will tell you, when you represent a brand, you represent the brand even
when the cameras aren’t rolling. (Just ask Tiger Woods about this.) Her actions brought
a ton of unwanted negative attention (and a DDOS attack, apparently) to the company;
that’s in direct contrast to the reasons they were paying her, and seeing as how her
actions were something she did (as opposed to had done to her), her termination is
entirely justified. You might see it as a bit harsh, but the company is well within
boundaries here.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The PlayHaven developers weren’t right to be fired.&lt;/strong&gt; Again, nowhere
do we see them getting the opportunity to confront their accuser, or make restitution
(apology). Now, you can argue that they, too, were representing their firm, but unless
their job is to act as an evangelist and brand recognition activities are part of
their job description, you can’t terminate them for gross negligence in this. Of course,
most employment is “at-will”, meaning a company can fire you for any reason it likes,
but this is sort of akin to getting fired for getting drunk and making lewd comments
to the wait staff at Denny’s while wearing a company T-shirt.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Sexism in IT is bad.&lt;/strong&gt; Duh. I don’t think I’ve met anyone who said
otherwise. But this wasn’t sexism. Inappropriate, perhaps, but not sexism. By the
way, racism in IT is bad, and so is age-ism, role-ism (discounting somebody’s opinions
just because they’re in Marketing or Sales), and technacism (discounting a technology
based on no factual knowledge).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;It’s politically correct to jump to attention when “women in IT” come up.&lt;/strong&gt; This
subject is gathering a lot of momentum, and most of it I think is of the bad variety.
Hate speech should not be tolerated—the rape and death threats against Adria cannot,
should not, and are not acceptable in any way shape or form. Nor should similar kinds
of direct comments against gays, lesbians, transsexuals, blacks, Asians, Jews, or
any of the other “other” groups out there. But there is a far cry between this and
the discrimination and hate speech that people go through: I have a friend who is
lesbian and a school teacher, and she is receiving death threats for teaching at that
school. She has dogs at the house, shotgun loaded, and she is waiting for the Mormons
and news reporters to vacate her lawn so she can try to resume some kind of normal
life. Putting up with a few lewd jokes in a crowd at a conference, I would guess,
sounds pretty heavenly to her right now. 
&lt;/p&gt;
&lt;p&gt;
I think we have time for a patronizing plea, by the way: Ladies, I know you’ve had
something of a rough time in the IT industry, but it’s pretty obvious that it’s getting
better, and frankly, you run a big risk of ostracizing yourself and making it harder
if every time a woman doesn’t get selected for something (a conference speaking slot,
a tech lead role, or a particular job) the whole “women in IT” banner gets unfurled
and raised. Don’t get me wrong—I don’t think there’s many of you that are doing that.
There are some, though, who do claim special privilege just for being female, and
there’s enough of a correlation between these two things that I think before too long
it’s going to lose its impact and the real good that could be done will be lost. Don’t
demand that you get special privilege—earn it. Believe me, there’s plenty of opportunities
for you to do so, so if you get blocked on something, look for a way around it. Demand
equality, not artificially-imposed advantage. 
&lt;/p&gt;
&lt;p&gt;
(As trends go, quite honestly, given the declining rates of men graduating college
and actually making a life for themselves, before too long the shoe will be on the
other foot anyway, just give it time.)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;There is no happy ending here.&lt;/strong&gt; Nobody can fix this; three lives have
been forever affected, negatively, by all of this. The ones I feel truly sorry for?
SendGrid and PlayHaven—they had nothing to do with it, and now their names are going
to be associated with this whole crappy mess.
&lt;/p&gt;
&lt;p&gt;
Call me a misogynist for not whole-heartedly backing the woman in this case, if you
will, but frankly, it was a disaster from the moment she chose to snap the photo and
Tweet to the world instead of saying, “Excuse me, can you not make those jokes here?
I don’t think they’re particularly appropriate.” I could theorize why she chose the
one route over the other, but that’s an essay for another day.
&lt;/p&gt;
&lt;p&gt;
Let the flaming begin.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;UPDATE&lt;/b&gt;: This post &lt;a href="http://amandablumwords.wordpress.com/2013/03/21/3/"&gt;puts
more context&lt;/a&gt; around Adria, and I think is the best-written commentary I've seen
on this so far, particularly since it's a woman's point of view on the whole thing
(assuming, of course, that &amp;quot;Amanda&amp;quot; is in this case applied to a human of
the female persuasion).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0da7cc17-b113-465d-a8bb-3ab0ec47bfa1" /&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,0da7cc17-b113-465d-a8bb-3ab0ec47bfa1.aspx</comments>
      <category>Conferences</category>
      <category>Industry</category>
      <category>Personal</category>
      <category>Python</category>
      <category>Reading</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=b3a5fc0b-a90d-4b87-bd5b-977500572e50</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,b3a5fc0b-a90d-4b87-bd5b-977500572e50.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,b3a5fc0b-a90d-4b87-bd5b-977500572e50.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b3a5fc0b-a90d-4b87-bd5b-977500572e50</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <b>TL;DR</b>: I'm "unemployed", I'm looking to land a position as a director of development
or similar kind of development management role; I'm ridiculously busy in the meantime.
</p>
        <p>
My employer, after having suffered the loss of close to a quarter of its consultant
workforce on a single project when that project chose to "re-examine its current approach",
has decided that (not surprisingly) given the blow to its current cash flow, it's
a little expensive keeping an architectural consultant of my caliber on staff, particularly
since it seems to me they don't appear to have the projects lined up for all these
people to go. Today was my last day, the paperwork and final check are processing
through the system, there were no tears nor angry accusations from either side, and
tomorrow I get to wake up "unemployed".
</p>
        <p>
It's a funny word, that word "unemployed", because it indicates both a state of emotion
and existence that I don't really share. On the emotional front, I'm not upset. A
number of people expressed condolences ("I'm so sorry, Ted"), but frankly, I'm not
angry, upset, hurt, or any of those other emotions that so often come with that. Part
of my reaction stems from the fact that I've been expecting this for a while--the
company and I had lots of plans in the beginning of my tenure there, but those plans
more or less never got past the planning stage, and the focus was clearly always on
billability, which at the level I'm at usually implies travel, something I'm not willing
to commit to at the 80%/100% level that consulting clients often demand. We just grew
apart, the company and I, and I think we've both known it for a few months now; this
is just putting the signatures on the divorce and splitting up the CD collection.
On the "existence" front, unemployment often means "waking up with nothing to do"
and "no more money coming in", which, honestly, doesn't really apply, either. While
I'm not going to be drawing a salary on a twice-monthly basis like I was for the last
twenty months, it's not like I have no income coming in or nothing to do: I've got
my columns with <a href="http://msdn.microsoft.com/en-us/magazine/default.aspx">MSDN</a>, <a href="http://www.code-magazine.com/">CoDe</a>,
and <a href="http://www.oracle.com/technetwork/java/javamagazine/index.html">Oracle
TechNet</a>, I've got two conferences this month (<a href="http://2013.33degree.org/">33rd
Degree</a> in Warsaw, and <a href="http://vslive.com/events/las-vegas-2013/home.aspx">VSLive!</a> in
Vegas) I've got a contract in place for doing some content work and research for <a href="http://www.jetbrains.com">JetBrains</a> on <a href="http://www.jetbrains.com/mps/">MPS</a>,
their language workbench, and I've just commissioned a course with <a href="http://www.pluralsight.com">PluralSight</a>,
"JVM Fundamentals", which will essentially be an amalgamation of the conference talks
I did at NFJS over the past five or six years (ClassLoaders, threading and concurrency,
collections, and so on), with a few more PluralSight courses and JetBrains articles/vidcasts/etc
sketched out after that. If I'm "unemployed", then it's the busiest damn unemployment
I've ever heard of.
</p>
        <p>
And in all honesty, this enforced change on my career is not unwelcome--I've been
thinking now for the past few months that it's time for me to challenge myself again,
and the chosen challenge I've laid out for myself is to run a team, not an architecture.
I want to find a position where I can take a team, throw us at a project, and produce
something awesome... or at least acceptable... to the customer. After so many years
of making fun of managers at conferences and such, I find myself wanting to become
one. I'm not naive, I know this isn't all rainbows and unicorns, and that there will
be times I just want to go back to the editor and write code because at least code
is deterministic (most of the time), but it's an entirely new set of challenges, and
frankly, I've been bored the last few years, I just have to admit that out loud. And
I may not like it and in a year or two say to myself, "What was I THINKING?!?", but
at least I'll have given it a shot, gotten the experience, and learned a few new things.
And it's not like I'm going to give up technology completely, because I'm still going
to be writing, blogging, recording, speaking, and researching. I don't think I could
give that up if I tried.
</p>
        <p>
So if you know of a company in the Greater Seattle area that's looking for someone
who's got a ton of technical skills and an intuitive sense of people to run a development
team, drop me a note. Oh, and don't be too surprised if the website gets a face lift
in the next month or two--the design is a little old, and I want to play around with
Bootstrap and some static-HTML-plus-Javascript kinds of design/development. Should
be fun, in all my copious spare time...
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b3a5fc0b-a90d-4b87-bd5b-977500572e50" />
        <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>That Thing They Call "Unemployment"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,b3a5fc0b-a90d-4b87-bd5b-977500572e50.aspx</guid>
      <link>http://blogs.tedneward.com/2013/03/05/That+Thing+They+Call+Unemployment.aspx</link>
      <pubDate>Tue, 05 Mar 2013 08:52:24 GMT</pubDate>
      <description>&lt;p&gt;
&lt;b&gt;TL;DR&lt;/b&gt;: I'm "unemployed", I'm looking to land a position as a director of development
or similar kind of development management role; I'm ridiculously busy in the meantime.
&lt;/p&gt;
&lt;p&gt;
My employer, after having suffered the loss of close to a quarter of its consultant
workforce on a single project when that project chose to "re-examine its current approach",
has decided that (not surprisingly) given the blow to its current cash flow, it's
a little expensive keeping an architectural consultant of my caliber on staff, particularly
since it seems to me they don't appear to have the projects lined up for all these
people to go. Today was my last day, the paperwork and final check are processing
through the system, there were no tears nor angry accusations from either side, and
tomorrow I get to wake up "unemployed".
&lt;/p&gt;
&lt;p&gt;
It's a funny word, that word "unemployed", because it indicates both a state of emotion
and existence that I don't really share. On the emotional front, I'm not upset. A
number of people expressed condolences ("I'm so sorry, Ted"), but frankly, I'm not
angry, upset, hurt, or any of those other emotions that so often come with that. Part
of my reaction stems from the fact that I've been expecting this for a while--the
company and I had lots of plans in the beginning of my tenure there, but those plans
more or less never got past the planning stage, and the focus was clearly always on
billability, which at the level I'm at usually implies travel, something I'm not willing
to commit to at the 80%/100% level that consulting clients often demand. We just grew
apart, the company and I, and I think we've both known it for a few months now; this
is just putting the signatures on the divorce and splitting up the CD collection.
On the "existence" front, unemployment often means "waking up with nothing to do"
and "no more money coming in", which, honestly, doesn't really apply, either. While
I'm not going to be drawing a salary on a twice-monthly basis like I was for the last
twenty months, it's not like I have no income coming in or nothing to do: I've got
my columns with &lt;a href="http://msdn.microsoft.com/en-us/magazine/default.aspx"&gt;MSDN&lt;/a&gt;, &lt;a href="http://www.code-magazine.com/"&gt;CoDe&lt;/a&gt;,
and &lt;a href="http://www.oracle.com/technetwork/java/javamagazine/index.html"&gt;Oracle
TechNet&lt;/a&gt;, I've got two conferences this month (&lt;a href="http://2013.33degree.org/"&gt;33rd
Degree&lt;/a&gt; in Warsaw, and &lt;a href="http://vslive.com/events/las-vegas-2013/home.aspx"&gt;VSLive!&lt;/a&gt; in
Vegas) I've got a contract in place for doing some content work and research for &lt;a href="http://www.jetbrains.com"&gt;JetBrains&lt;/a&gt; on &lt;a href="http://www.jetbrains.com/mps/"&gt;MPS&lt;/a&gt;,
their language workbench, and I've just commissioned a course with &lt;a href="http://www.pluralsight.com"&gt;PluralSight&lt;/a&gt;,
"JVM Fundamentals", which will essentially be an amalgamation of the conference talks
I did at NFJS over the past five or six years (ClassLoaders, threading and concurrency,
collections, and so on), with a few more PluralSight courses and JetBrains articles/vidcasts/etc
sketched out after that. If I'm "unemployed", then it's the busiest damn unemployment
I've ever heard of.
&lt;/p&gt;
&lt;p&gt;
And in all honesty, this enforced change on my career is not unwelcome--I've been
thinking now for the past few months that it's time for me to challenge myself again,
and the chosen challenge I've laid out for myself is to run a team, not an architecture.
I want to find a position where I can take a team, throw us at a project, and produce
something awesome... or at least acceptable... to the customer. After so many years
of making fun of managers at conferences and such, I find myself wanting to become
one. I'm not naive, I know this isn't all rainbows and unicorns, and that there will
be times I just want to go back to the editor and write code because at least code
is deterministic (most of the time), but it's an entirely new set of challenges, and
frankly, I've been bored the last few years, I just have to admit that out loud. And
I may not like it and in a year or two say to myself, "What was I THINKING?!?", but
at least I'll have given it a shot, gotten the experience, and learned a few new things.
And it's not like I'm going to give up technology completely, because I'm still going
to be writing, blogging, recording, speaking, and researching. I don't think I could
give that up if I tried.
&lt;/p&gt;
&lt;p&gt;
So if you know of a company in the Greater Seattle area that's looking for someone
who's got a ton of technical skills and an intuitive sense of people to run a development
team, drop me a note. Oh, and don't be too surprised if the website gets a face lift
in the next month or two--the design is a little old, and I want to play around with
Bootstrap and some static-HTML-plus-Javascript kinds of design/development. Should
be fun, in all my copious spare time...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b3a5fc0b-a90d-4b87-bd5b-977500572e50" /&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,b3a5fc0b-a90d-4b87-bd5b-977500572e50.aspx</comments>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Industry</category>
      <category>Personal</category>
      <category>Reading</category>
      <category>Social</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=fa0380ef-5b83-48fd-8111-b3e4612b420f</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,fa0380ef-5b83-48fd-8111-b3e4612b420f.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,fa0380ef-5b83-48fd-8111-b3e4612b420f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=fa0380ef-5b83-48fd-8111-b3e4612b420f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
According to <a href="http://www.theverge.com/2013/2/28/4032718/apple-deleting-icloud-emails-containing-barely-legal-teen">this
report</a>, Apple is now not only spam-filtering out emails containing particular
phraseology (in this case, "barely legal teens"), but deleting them entirely, whether
they're being sent to your account, or from your account. And what's even more interesting,
apparently iCloud users agreed to give Apple that kind of power.
</p>
        <p>
The precedent here is dangerous, and one that needs to be carefully examined--if corporations
are going to exercise the ability to investigate/examine (even from an automated tool)
the email that you're sending or receiving, then technically privacy is being violated.
This has always been an issue with email--corporations have always maintained that
email sent on their servers to their employees is their property, and the legal world
has held that up to be the case (which is the same rationale that then gives DOJ and
other prosecutors the right to examine corporate email in order to see if there's
been any wrongdoing taking place, so this is a good thing). But when you're not an
employee of the corporation, does the fact that the email travels through their servers
mean that they have the right to view your email, even through an algorithm? Does
an ISP have the right to read its subscribers' email, too? The fact that iCloud users
agree to allow Apple this power is an interesting twist, but frankly the courts have
seen fit to throw out waivers that were deemed unenforceable or illegal, so that's
something of a red herring, I think.
</p>
        <p>
The much deeper issue here is one of privacy: how much privacy is really left to us
these days? And, speaking for myself, why don't more people care?
</p>
        <p>
This also has me wondering if, maybe, email and Internet services haven't reached
a level of ubiquity that suggests that they should be considered part of the national
or state infrastructure--as in, should local/city/state/federal government maintain
an email infrastructure (servers) with the same degree of privacy guarantees that
they held up for the US Postal Service? Or, maybe even, should the US Postal Service
be that entity?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=fa0380ef-5b83-48fd-8111-b3e4612b420f" />
        <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>When Apple decides what email you get to see</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,fa0380ef-5b83-48fd-8111-b3e4612b420f.aspx</guid>
      <link>http://blogs.tedneward.com/2013/03/01/When+Apple+Decides+What+Email+You+Get+To+See.aspx</link>
      <pubDate>Fri, 01 Mar 2013 04:20:44 GMT</pubDate>
      <description>&lt;p&gt;
According to &lt;a href="http://www.theverge.com/2013/2/28/4032718/apple-deleting-icloud-emails-containing-barely-legal-teen"&gt;this
report&lt;/a&gt;, Apple is now not only spam-filtering out emails containing particular
phraseology (in this case, "barely legal teens"), but deleting them entirely, whether
they're being sent to your account, or from your account. And what's even more interesting,
apparently iCloud users agreed to give Apple that kind of power.
&lt;/p&gt;
&lt;p&gt;
The precedent here is dangerous, and one that needs to be carefully examined--if corporations
are going to exercise the ability to investigate/examine (even from an automated tool)
the email that you're sending or receiving, then technically privacy is being violated.
This has always been an issue with email--corporations have always maintained that
email sent on their servers to their employees is their property, and the legal world
has held that up to be the case (which is the same rationale that then gives DOJ and
other prosecutors the right to examine corporate email in order to see if there's
been any wrongdoing taking place, so this is a good thing). But when you're not an
employee of the corporation, does the fact that the email travels through their servers
mean that they have the right to view your email, even through an algorithm? Does
an ISP have the right to read its subscribers' email, too? The fact that iCloud users
agree to allow Apple this power is an interesting twist, but frankly the courts have
seen fit to throw out waivers that were deemed unenforceable or illegal, so that's
something of a red herring, I think.
&lt;/p&gt;
&lt;p&gt;
The much deeper issue here is one of privacy: how much privacy is really left to us
these days? And, speaking for myself, why don't more people care?
&lt;/p&gt;
&lt;p&gt;
This also has me wondering if, maybe, email and Internet services haven't reached
a level of ubiquity that suggests that they should be considered part of the national
or state infrastructure--as in, should local/city/state/federal government maintain
an email infrastructure (servers) with the same degree of privacy guarantees that
they held up for the US Postal Service? Or, maybe even, should the US Postal Service
be that entity?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=fa0380ef-5b83-48fd-8111-b3e4612b420f" /&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,fa0380ef-5b83-48fd-8111-b3e4612b420f.aspx</comments>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Personal</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>
  </channel>
</rss>