<?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 - LLVM</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=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=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=d45aa93c-e207-4523-aca2-1f4331fc068b</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d45aa93c-e207-4523-aca2-1f4331fc068b</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There are times when the industry in which I find myself does things that I just don't
understand.
</p>
        <p>
Consider, for a moment, <a href="http://jeffhandley.com/archive/2013/02/25/The-We-accept-pull-requests-Addiction.aspx">this
blog</a> by Jeff Handley, in which he essentially says that the phrase "We accept
pull requests" is "cringe-inducing": 
</p>
        <blockquote> Why do the words “we accept pull requests” have such a stigma? Why
were they cringe-inducing when I spoke them? Because too many OSS projects use these
words as an easy way to shut people up. We (the collective of OSS project owners)
can too easily jump to this phrase when we don’t want to do something ourselves. If
we don’t see the value in a feature, but the requester persists, we can simply utter,
“We accept pull requests,” and drop it until the end of days or when a pull request
is submitted, whichever comes first. The phrase now basically means, “Buzz off!” </blockquote> OK,
I admit that I'm somewhat removed from the OSS community--I don't have any particular
dogs in that race, as the old saying goes--and the idea that "We accept pull requests"
is a "Buzz off!" phrase is news to me. But I understand what Jeff is saying: a phrase
has taken on a meaning of its own, and as is often the case, it's a meaning that's
contrary to its stated one: <blockquote> At Microsoft, having open source projects
that actually accept pull requests is a fairly new concept. I work on NuGet, which
is an Outercurve project that accepts contributions from Microsoft and many others.
I was the dev lead for Razor and Web Pages at the time it went open source through
Microsoft Open Tech. I collaborate with teams that work on EntityFramework, SignalR,
MVC, and several other open source projects. I spend virtually all my time thinking
about projects that are open source. Just a few years ago, this was unimaginable at
Microsoft. Sometimes I feel like it still hasn’t sunk in how awesome it is that we
have gotten to where we are, and I think I’ve been trigger happy and I’ve said “We
accept pull requests” too often I typically use the phrase in jest, but I admit that
I have said it when I was really thinking “Buzz off!” </blockquote> Honestly, I've
heard the same kind of thing from the mouths of Microsoft developers during Software
Development Reviews (SDRs), in the form of the phrase "Thank you for your feedback"--it's
usually at the end of a fervent discussion when one of the reviewers is commenting
on a feature being done (or not being done) and the team is in some kind of disagreement
about the feature's relative importance or the implementation used. It's usually uttered
in a manner that gives the crowd a very clear intent: "You can stop talking now, because
I've stopped listening." <blockquote> The weekend after the MVP summit, I was still
regretting having said what I said. I wished all week I could take the words back.
And then I saw someone else fall victim. On a highly controversial NuGet issue, the
infamous Phil Haack used a similar phrase as part of a response stating that the core
team probably wouldn’t be taking action on the proposed changes, but that there was
nothing stopping those affected from issuing a pull request. With my mistake still
fresh in my mind, I read Phil’s words just as I’m sure everyone in the room at the
MVP summit heard my own. It sounded flippant and it had the opposite effect from what
Phil intended or what I would want people thinking of the NuGet core team. From there,
the thread started turning nasty. We were stuck arguing opinions and we were no longer
discussing the actual issue and how it could be solved. </blockquote> As Jeff goes
on to mention, I got involved in that Twitter conversation, along with a number of
others, and as he says, the conversation moved on to JabbR, but without me--I bailed
on it for a couple of reasons. Phil proposed a resolution to the problem, though,
that seemed to satisfy at least a few folks: <blockquote> With that many mentions
on the tweets, we ran out of characters and eventually moved into JabbR. By the end
of the conversation, we all agreed that the words “we accept pull requests” should
never be used again. Phil proposed a great phrase to use instead: “Want to take a
crack at it? We’ll help.” </blockquote> But frankly, I don't care for this phraseology.
Yes, I understand the intent--the owners of open-source projects shouldn't brush off
people's suggestions about things to do with the project in the future and shouldn't
reach for a handy phrase that will essentially serve the purpose of saying "Buzz off".
And keeping an open ear to your community is a good thing, yes.
<p>
What I don't like about the new phrase is twofold. First, if people use the phrase
casually enough, eventually it too will be overused and interpreted to mean "Buzz
off!", just as "Thank you for your feedback" became. But secondly, where in the world
did it somehow become a law that open source projects MUST implement every feature
that their users suggest? This is part of the strange economics of open source--in
a commercial product, if the developers stray too far away from what customers need
or want, declining sales will serve as a corrective force to bring them back around
(or, if they don't, bankruptcy of either the product or the company will eventually
follow). But in an open-source project, there's no real visible marker to serve as
that accountability and feedback--and so the project owners, those who want to try
and stay in tune with their users anyway, feel a deeper responsibility to respond
to user requests. And on its own, that's a good thing.
</p><p>
The part that bothers me, though, is that this new phraseology essentially implies
that any open-source project has a responsibility to implement the features that its
users ask for, and frankly, that's not sustainable. Open-source projects are, for
the most part, maintained by volunteers, but even those that are backed by commercial
firms (like Microsoft or GitHub) have finite resources--they simply cannot commit
resources, even just "help", to every feature request that any user makes of them.
This is why the "We accept pull requests" was always, to my mind, an acceptable response:
loosely translated, to me at least, it meant, "Look, that's an interesting idea, but
it either isn't on our immediate roadmap, or it takes the project in a different direction
than we'd intended, or we're not even entirely sure that it's feasible or doable or
easily managed or what-have-you. Why don't you take a stab at implementing it in your
own fork of the code, and if you can get it to some point of implementation that you
can show us, send us a copy of the code in the form of a pull request so we can take
a look and see if it fits with how we see the project going." This is not an unreasonable
response: if you care passionately about this feature, either because you think it
should be there or because your company needs that feature to get its work done, then
you have the time, energy and motivation to at least take a first pass at it and prove
the concept (or, sometimes, prove to yourself that it's not such an easy request as
you thought). Cultivating a sense of entitlement in your users is not a good practice--it's
a step towards a completely unsustainable model that could, if not curbed, eventually
lead to the death of the project as the maintainers essentially give up when faced
with feature request after feature request.
</p><p>
I applaud the efforts on the part of project maintainers, particularly those at large
commercial corporations involved in open source, to avoid "Buzz off" phrases. But
it's not OK for project maintainers to feel like they are under a responsibility to
implement any particular feature or idea suggested by a user. Some ideas are going
to be good ones, some are going to be just "off the radar" of the project's core committers,
and some are going to be just plain bad. You think your idea is one of those? Take
a stab at it. Write the code. And if you've got it to a point where it seems to be
working, then submit a pull request.
</p><p>
But please, let's not blow this out of proportion. Users need to cut the people who
give them software for free some slack.
</p><p>
(<b>EDIT:</b> I accidentally referred to Jeff as "Anthony" in one place and "Andrew"
in another. Not really sure how or why, but... Edited.)
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d45aa93c-e207-4523-aca2-1f4331fc068b" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>"We Accept Pull Requests"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</guid>
      <link>http://blogs.tedneward.com/2013/02/26/We+Accept+Pull+Requests.aspx</link>
      <pubDate>Tue, 26 Feb 2013 09:52:45 GMT</pubDate>
      <description>&lt;p&gt;
There are times when the industry in which I find myself does things that I just don't
understand.
&lt;/p&gt;
&lt;p&gt;
Consider, for a moment, &lt;a href="http://jeffhandley.com/archive/2013/02/25/The-We-accept-pull-requests-Addiction.aspx"&gt;this
blog&lt;/a&gt; by Jeff Handley, in which he essentially says that the phrase "We accept
pull requests" is "cringe-inducing": &lt;blockquote&gt; Why do the words “we accept pull
requests” have such a stigma? Why were they cringe-inducing when I spoke them? Because
too many OSS projects use these words as an easy way to shut people up. We (the collective
of OSS project owners) can too easily jump to this phrase when we don’t want to do
something ourselves. If we don’t see the value in a feature, but the requester persists,
we can simply utter, “We accept pull requests,” and drop it until the end of days
or when a pull request is submitted, whichever comes first. The phrase now basically
means, “Buzz off!” &lt;/blockquote&gt; OK, I admit that I'm somewhat removed from the OSS
community--I don't have any particular dogs in that race, as the old saying goes--and
the idea that "We accept pull requests" is a "Buzz off!" phrase is news to me. But
I understand what Jeff is saying: a phrase has taken on a meaning of its own, and
as is often the case, it's a meaning that's contrary to its stated one: &lt;blockquote&gt; At
Microsoft, having open source projects that actually accept pull requests is a fairly
new concept. I work on NuGet, which is an Outercurve project that accepts contributions
from Microsoft and many others. I was the dev lead for Razor and Web Pages at the
time it went open source through Microsoft Open Tech. I collaborate with teams that
work on EntityFramework, SignalR, MVC, and several other open source projects. I spend
virtually all my time thinking about projects that are open source. Just a few years
ago, this was unimaginable at Microsoft. Sometimes I feel like it still hasn’t sunk
in how awesome it is that we have gotten to where we are, and I think I’ve been trigger
happy and I’ve said “We accept pull requests” too often I typically use the phrase
in jest, but I admit that I have said it when I was really thinking “Buzz off!” &lt;/blockquote&gt; Honestly,
I've heard the same kind of thing from the mouths of Microsoft developers during Software
Development Reviews (SDRs), in the form of the phrase "Thank you for your feedback"--it's
usually at the end of a fervent discussion when one of the reviewers is commenting
on a feature being done (or not being done) and the team is in some kind of disagreement
about the feature's relative importance or the implementation used. It's usually uttered
in a manner that gives the crowd a very clear intent: "You can stop talking now, because
I've stopped listening." &lt;blockquote&gt; The weekend after the MVP summit, I was still
regretting having said what I said. I wished all week I could take the words back.
And then I saw someone else fall victim. On a highly controversial NuGet issue, the
infamous Phil Haack used a similar phrase as part of a response stating that the core
team probably wouldn’t be taking action on the proposed changes, but that there was
nothing stopping those affected from issuing a pull request. With my mistake still
fresh in my mind, I read Phil’s words just as I’m sure everyone in the room at the
MVP summit heard my own. It sounded flippant and it had the opposite effect from what
Phil intended or what I would want people thinking of the NuGet core team. From there,
the thread started turning nasty. We were stuck arguing opinions and we were no longer
discussing the actual issue and how it could be solved. &lt;/blockquote&gt; As Jeff goes
on to mention, I got involved in that Twitter conversation, along with a number of
others, and as he says, the conversation moved on to JabbR, but without me--I bailed
on it for a couple of reasons. Phil proposed a resolution to the problem, though,
that seemed to satisfy at least a few folks: &lt;blockquote&gt; With that many mentions
on the tweets, we ran out of characters and eventually moved into JabbR. By the end
of the conversation, we all agreed that the words “we accept pull requests” should
never be used again. Phil proposed a great phrase to use instead: “Want to take a
crack at it? We’ll help.” &lt;/blockquote&gt; But frankly, I don't care for this phraseology.
Yes, I understand the intent--the owners of open-source projects shouldn't brush off
people's suggestions about things to do with the project in the future and shouldn't
reach for a handy phrase that will essentially serve the purpose of saying "Buzz off".
And keeping an open ear to your community is a good thing, yes.&gt;
&lt;p&gt;
What I don't like about the new phrase is twofold. First, if people use the phrase
casually enough, eventually it too will be overused and interpreted to mean "Buzz
off!", just as "Thank you for your feedback" became. But secondly, where in the world
did it somehow become a law that open source projects MUST implement every feature
that their users suggest? This is part of the strange economics of open source--in
a commercial product, if the developers stray too far away from what customers need
or want, declining sales will serve as a corrective force to bring them back around
(or, if they don't, bankruptcy of either the product or the company will eventually
follow). But in an open-source project, there's no real visible marker to serve as
that accountability and feedback--and so the project owners, those who want to try
and stay in tune with their users anyway, feel a deeper responsibility to respond
to user requests. And on its own, that's a good thing.
&lt;/p&gt;
&lt;p&gt;
The part that bothers me, though, is that this new phraseology essentially implies
that any open-source project has a responsibility to implement the features that its
users ask for, and frankly, that's not sustainable. Open-source projects are, for
the most part, maintained by volunteers, but even those that are backed by commercial
firms (like Microsoft or GitHub) have finite resources--they simply cannot commit
resources, even just "help", to every feature request that any user makes of them.
This is why the "We accept pull requests" was always, to my mind, an acceptable response:
loosely translated, to me at least, it meant, "Look, that's an interesting idea, but
it either isn't on our immediate roadmap, or it takes the project in a different direction
than we'd intended, or we're not even entirely sure that it's feasible or doable or
easily managed or what-have-you. Why don't you take a stab at implementing it in your
own fork of the code, and if you can get it to some point of implementation that you
can show us, send us a copy of the code in the form of a pull request so we can take
a look and see if it fits with how we see the project going." This is not an unreasonable
response: if you care passionately about this feature, either because you think it
should be there or because your company needs that feature to get its work done, then
you have the time, energy and motivation to at least take a first pass at it and prove
the concept (or, sometimes, prove to yourself that it's not such an easy request as
you thought). Cultivating a sense of entitlement in your users is not a good practice--it's
a step towards a completely unsustainable model that could, if not curbed, eventually
lead to the death of the project as the maintainers essentially give up when faced
with feature request after feature request.
&lt;/p&gt;
&lt;p&gt;
I applaud the efforts on the part of project maintainers, particularly those at large
commercial corporations involved in open source, to avoid "Buzz off" phrases. But
it's not OK for project maintainers to feel like they are under a responsibility to
implement any particular feature or idea suggested by a user. Some ideas are going
to be good ones, some are going to be just "off the radar" of the project's core committers,
and some are going to be just plain bad. You think your idea is one of those? Take
a stab at it. Write the code. And if you've got it to a point where it seems to be
working, then submit a pull request.
&lt;/p&gt;
&lt;p&gt;
But please, let's not blow this out of proportion. Users need to cut the people who
give them software for free some slack.
&lt;/p&gt;
&lt;p&gt;
(&lt;b&gt;EDIT:&lt;/b&gt; I accidentally referred to Jeff as "Anthony" in one place and "Andrew"
in another. Not really sure how or why, but... Edited.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d45aa93c-e207-4523-aca2-1f4331fc068b" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,d45aa93c-e207-4523-aca2-1f4331fc068b.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=8255fffa-2a91-4635-ab6d-a1fd7aebc381</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8255fffa-2a91-4635-ab6d-a1fd7aebc381</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Charlie Kindel <a href="http://ceklog.kindel.com/2013/02/21/james-gosling-screwed-us-write-once-is-anti-customer/">blogs
that he thinks James Gosling (and the rest of Sun) screwed us all with Java and it's
"Write Once, Run Anywhere" mantra</a>. It's catchy, but it's wrong.
</p>
        <p>
Like a lot of Charlie's blogs, he nails parts of this one squarely on the head: 
</p>
        <blockquote> WORA was, is, and always will be, a fallacy. ... It is the “Write
once…“ part that’s the most dangerous. We all wish the world was rainbows and unicorns,
and “Write once…” implies that there is a world where you can actually write an app
once and it will run on all devices. But this is precisely the fantasy that the platform
vendors will never allow to become reality. ... </blockquote> And, given his current
focus on building a mobile startup, he of course takes this lesson directly into the
"native mobile app vs HTML 5 app" discussion that I've been a part of on way too many
speaker panels and conference BOFs and keynotes and such: <blockquote> HTML5 is awesome
in many ways. If applied judiciously, it can be a great technology and tool. As a
tool, it can absolutely be used to reduce the amount of platform specific code you
have to write. But it is not a starting place. Starting with HTML5 is the most customer
unfriendly thing a developer can do. ... Like many ‘solutions’ in our industry the
“Hey, write it once in in HTML5 and it will run anywhere” story didn’t actually start
with the end-user customer. It started with idealistic thoughts about technology.
It was then turned into snake oil for developers. Not only is the “build a mobile
app that hosts a web view that contains HTML5″ approach bass-ackwards, it is a recipe
for execution disaster. Yes, there are examples of teams that have built great apps
using this technique, but if you actually look at what they did, they focused on their
experience first and then made the technology work. What happens when the shop starts
with “we gotta use HTML5 running in a UIWebView” is initial euphoria over productivity,
followed by incredible pain doing the final 20%. </blockquote> And he's flat-out right
about this: HTML 5, as an application development technology, takes you about 60 -
80% of the way home, depending on what you want your application to do. 
<p>
In fact, about the only part of Charlie's blog post that I disagree with is the part
where he blames Gosling and Java: 
</p><blockquote> I blame James Gosling. He foisted Java on us and as a result Sun
coined the term Write Once Run Anywhere. ... Developers really want to believe it
is possible to “Write once…”. They also really want to believe that more threads will
help. But we all know they just make the problems worse. Just as we’ve all grown to
accept that starting with “make it multi-threaded” is evil, we need to accept “Write
once…” is evil. </blockquote> It didn't start with Java--it started well before that,
with a set of cross-platform C++ toolkits that promised the same kind of promise:
write your application in platform-standard C++ to our API, and we'll have the libraries
on all the major platforms (back in those days, it was Windows, Mac OS, Solaris OpenView,
OSF/Motif, and a few others) and it will just work. Even Microsoft got into this game
briefly (I worked at Intuit, and helped a consultant who was struggling to port QuickBooks,
I think it was, over to the Mac using Microsoft's short-lived "MFC For Mac OS" release),
And, even before that, we had the discussions of "Standard C" and the #ifdef tricks
we used to play to struggle to get one source file to compile on all the different
platforms that C runs on.
<p>
And that, folks, is the heart of the matter: long before Gosling took his fledgling
failed set-top box Oak-named project and looked around for a space to which to apply
it next, developers... no, let's get that right, "developers and their managers who
hate the idea of violating DRY by having the code in umpteen different codebases"
have been looking for ways to have a single source base that runs across all the platforms.
We've tried it with portable languages (see C, C++, Java, for starters), portable
libraries (in the C++ space see Zinc, zApp, XVT, Tools.h++), portable containers (see
EJB, the web browser), and now portable platforms (see PhoneGap/Cordova, Titanium,
etc), portable cross-compilers (see MonoTouch/MonoDroid, for recent examples), and
I'm sure there will be other efforts along these lines for years and decades to come.
It's a noble goal, but the major players in the space to which we are targeting--whether
that be operating systems, browsers, mobile platforms, console game devices, or whatever
comes next two decades from now--will not allow their systems to be commoditized that
easily. Because at the heart of it, that's exactly what these "cross-platform" tools
and languages and libraries are trying to do: reduce the underlying "thing" to a commodity
that lacks interest or impact.
</p><p>
Interestingly enough, as a side-note, one thing I'm starting to notice is that the
more pervasive mobile devices become and the more mobile applications we see reaching
those devices, the less and less "device-standard" those interfaces are trying to
look even as they try to achieve cross-platform similarities. Consider, for a moment,
the Fly Delta app on iPhone: it doesn't really use any of the standard iOS UI metaphors
(except for some of the basic ones), largely because they've defined their own look-and-feel
across all the platforms they support (iOS and Android, at least so far). Ditto for
the CNN and USA Today apps, as well as the ESPN app, and of course just about every
game ever written for any of those platforms. So even as Charlie argues: 
</p><blockquote> The problem is each major platform has its own UI model, its own
model for how a web view is hosted, its own HTML rendering engine, and its own JavaScript
engine. These inter-platform differences mean that not only is the platform-specific
code unique, but the interactions between that code and the code running within the
web view becomes device specific. And to make matters worse intra-platform fragmentation,
particularly on the platform with the largest number of users, Android, is so bad
that this “Write Once..” approach provides no help. </blockquote> We are starting
to see mobile app developers actually striving to define their own UI model entirely,
with only passing nod to the standards of the device on which they're running. Which
then makes me wonder if we're going to start to see new portable toolkits that define
their own unique UI model on each of these platforms, or will somehow allow developers
to define their own UI model on each of these platforms--a UI model toolkit, so to
speak. Which would be an interesting development, but one that will eventually run
into many of the same problems as the others did.
<img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8255fffa-2a91-4635-ab6d-a1fd7aebc381" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Java was not the first</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</guid>
      <link>http://blogs.tedneward.com/2013/02/22/Java+Was+Not+The+First.aspx</link>
      <pubDate>Fri, 22 Feb 2013 00:08:04 GMT</pubDate>
      <description>&lt;p&gt;
Charlie Kindel &lt;a href="http://ceklog.kindel.com/2013/02/21/james-gosling-screwed-us-write-once-is-anti-customer/"&gt;blogs
that he thinks James Gosling (and the rest of Sun) screwed us all with Java and it's
"Write Once, Run Anywhere" mantra&lt;/a&gt;. It's catchy, but it's wrong.
&lt;/p&gt;
&lt;p&gt;
Like a lot of Charlie's blogs, he nails parts of this one squarely on the head: &lt;blockquote&gt; WORA
was, is, and always will be, a fallacy. ... It is the “Write once…“ part that’s the
most dangerous. We all wish the world was rainbows and unicorns, and “Write once…”
implies that there is a world where you can actually write an app once and it will
run on all devices. But this is precisely the fantasy that the platform vendors will
never allow to become reality. ... &lt;/blockquote&gt; And, given his current focus on building
a mobile startup, he of course takes this lesson directly into the "native mobile
app vs HTML 5 app" discussion that I've been a part of on way too many speaker panels
and conference BOFs and keynotes and such: &lt;blockquote&gt; HTML5 is awesome in many ways.
If applied judiciously, it can be a great technology and tool. As a tool, it can absolutely
be used to reduce the amount of platform specific code you have to write. But it is
not a starting place. Starting with HTML5 is the most customer unfriendly thing a
developer can do. ... Like many ‘solutions’ in our industry the “Hey, write it once
in in HTML5 and it will run anywhere” story didn’t actually start with the end-user
customer. It started with idealistic thoughts about technology. It was then turned
into snake oil for developers. Not only is the “build a mobile app that hosts a web
view that contains HTML5″ approach bass-ackwards, it is a recipe for execution disaster.
Yes, there are examples of teams that have built great apps using this technique,
but if you actually look at what they did, they focused on their experience first
and then made the technology work. What happens when the shop starts with “we gotta
use HTML5 running in a UIWebView” is initial euphoria over productivity, followed
by incredible pain doing the final 20%. &lt;/blockquote&gt; And he's flat-out right about
this: HTML 5, as an application development technology, takes you about 60 - 80% of
the way home, depending on what you want your application to do. &gt;
&lt;p&gt;
In fact, about the only part of Charlie's blog post that I disagree with is the part
where he blames Gosling and Java: &lt;blockquote&gt; I blame James Gosling. He foisted Java
on us and as a result Sun coined the term Write Once Run Anywhere. ... Developers
really want to believe it is possible to “Write once…”. They also really want to believe
that more threads will help. But we all know they just make the problems worse. Just
as we’ve all grown to accept that starting with “make it multi-threaded” is evil,
we need to accept “Write once…” is evil. &lt;/blockquote&gt; It didn't start with Java--it
started well before that, with a set of cross-platform C++ toolkits that promised
the same kind of promise: write your application in platform-standard C++ to our API,
and we'll have the libraries on all the major platforms (back in those days, it was
Windows, Mac OS, Solaris OpenView, OSF/Motif, and a few others) and it will just work.
Even Microsoft got into this game briefly (I worked at Intuit, and helped a consultant
who was struggling to port QuickBooks, I think it was, over to the Mac using Microsoft's
short-lived "MFC For Mac OS" release), And, even before that, we had the discussions
of "Standard C" and the #ifdef tricks we used to play to struggle to get one source
file to compile on all the different platforms that C runs on.&gt;
&lt;p&gt;
And that, folks, is the heart of the matter: long before Gosling took his fledgling
failed set-top box Oak-named project and looked around for a space to which to apply
it next, developers... no, let's get that right, "developers and their managers who
hate the idea of violating DRY by having the code in umpteen different codebases"
have been looking for ways to have a single source base that runs across all the platforms.
We've tried it with portable languages (see C, C++, Java, for starters), portable
libraries (in the C++ space see Zinc, zApp, XVT, Tools.h++), portable containers (see
EJB, the web browser), and now portable platforms (see PhoneGap/Cordova, Titanium,
etc), portable cross-compilers (see MonoTouch/MonoDroid, for recent examples), and
I'm sure there will be other efforts along these lines for years and decades to come.
It's a noble goal, but the major players in the space to which we are targeting--whether
that be operating systems, browsers, mobile platforms, console game devices, or whatever
comes next two decades from now--will not allow their systems to be commoditized that
easily. Because at the heart of it, that's exactly what these "cross-platform" tools
and languages and libraries are trying to do: reduce the underlying "thing" to a commodity
that lacks interest or impact.
&lt;/p&gt;
&lt;p&gt;
Interestingly enough, as a side-note, one thing I'm starting to notice is that the
more pervasive mobile devices become and the more mobile applications we see reaching
those devices, the less and less "device-standard" those interfaces are trying to
look even as they try to achieve cross-platform similarities. Consider, for a moment,
the Fly Delta app on iPhone: it doesn't really use any of the standard iOS UI metaphors
(except for some of the basic ones), largely because they've defined their own look-and-feel
across all the platforms they support (iOS and Android, at least so far). Ditto for
the CNN and USA Today apps, as well as the ESPN app, and of course just about every
game ever written for any of those platforms. So even as Charlie argues: &lt;blockquote&gt; The
problem is each major platform has its own UI model, its own model for how a web view
is hosted, its own HTML rendering engine, and its own JavaScript engine. These inter-platform
differences mean that not only is the platform-specific code unique, but the interactions
between that code and the code running within the web view becomes device specific.
And to make matters worse intra-platform fragmentation, particularly on the platform
with the largest number of users, Android, is so bad that this “Write Once..” approach
provides no help. &lt;/blockquote&gt; We are starting to see mobile app developers actually
striving to define their own UI model entirely, with only passing nod to the standards
of the device on which they're running. Which then makes me wonder if we're going
to start to see new portable toolkits that define their own unique UI model on each
of these platforms, or will somehow allow developers to define their own UI model
on each of these platforms--a UI model toolkit, so to speak. Which would be an interesting
development, but one that will eventually run into many of the same problems as the
others did.&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8255fffa-2a91-4635-ab6d-a1fd7aebc381" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,8255fffa-2a91-4635-ab6d-a1fd7aebc381.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=9fc99f7c-088b-45e9-b52a-3ccd9976c28d</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9fc99f7c-088b-45e9-b52a-3ccd9976c28d</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
While cruising through the Internet a few minute ago, I wandered across <a href="http://meteor.com">Meteor</a>,
which looks like a really cool tool/system/platform/whatever for building modern web
applications. JavaScript on the front, JavaScript on the back, Mongo backing, it's
definitely something worth looking into, IMHO.
</p>
        <p>
Thus emboldened, I decide to look at how to start playing with it, and lo and behold
I discover that the instructions for installation are: 
</p>
        <pre>
curl https://install.meteor.com | sh
</pre>
Um.... Wat?
<p>
Now, I'm sure the Meteor folks are all nice people, and they're making sure (via the
use of the https URL) that whatever is piped into my shell is, in fact, coming from
their servers, but I don't know these people from Adam or Eve, and that's taking an
awfully big risk on my part, just letting them pipe whatever-the-hell-they-want into
a shell Terminal. Hell, you don't even need root access to fill my hard drive with
whatever random bits of goo you wanted.
</p><p>
I looked at the shell script, and it's all OK, mind you--the Meteor people definitely
look trustworthy, I want to reassure anyone of that. But I'm really, really hoping
that this is NOT their preferred mechanism for delivery... nor is it anyone's preferred
mechanism for delivery... because that's got a gaping security hole in it about twelve
miles wide. It's just begging for some random evil hacker to post a website saying,
"Hey, all, I've got his really cool framework y'all should try..." and bury the malware
inside the code somewhere.
</p><p>
Which leads to today's Random Thought Experiment of the Day: How long would it take
the open source community to discover malware buried inside of an open-source package,
particularly one that's in widespread use, a la Apache or Tomcat or JBoss? (Assume
all the core committers were in on it--how many people, aside from the core committers,
actually look at the source of the packages we download and install, sometimes under
root permissions?)
</p><p>
Not saying we should abandon open source; just saying we should be responsible citizens
about who we let in our front door.
</p><p><b>UPDATE</b>: Having done the install, I realize that it's a two-step download...
the shell script just figures out which OS you're on, which tool (curl or wget) to
use, and asks you for root access to download and install the actual distribution.
Which, honestly, I didn't look at. So, here's hoping the Meteor folks are as good
as I'm assuming them to be....
</p><p>
Still highlights that this is a huge security risk.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=9fc99f7c-088b-45e9-b52a-3ccd9976c28d" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>Um... Security risk much?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</guid>
      <link>http://blogs.tedneward.com/2013/02/15/Um+Security+Risk+Much.aspx</link>
      <pubDate>Fri, 15 Feb 2013 04:25:38 GMT</pubDate>
      <description>&lt;p&gt;
While cruising through the Internet a few minute ago, I wandered across &lt;a href="http://meteor.com"&gt;Meteor&lt;/a&gt;,
which looks like a really cool tool/system/platform/whatever for building modern web
applications. JavaScript on the front, JavaScript on the back, Mongo backing, it's
definitely something worth looking into, IMHO.
&lt;/p&gt;
&lt;p&gt;
Thus emboldened, I decide to look at how to start playing with it, and lo and behold
I discover that the instructions for installation are: &lt;pre&gt;
curl https://install.meteor.com | sh
&lt;/pre&gt;
Um.... Wat?&gt;
&lt;p&gt;
Now, I'm sure the Meteor folks are all nice people, and they're making sure (via the
use of the https URL) that whatever is piped into my shell is, in fact, coming from
their servers, but I don't know these people from Adam or Eve, and that's taking an
awfully big risk on my part, just letting them pipe whatever-the-hell-they-want into
a shell Terminal. Hell, you don't even need root access to fill my hard drive with
whatever random bits of goo you wanted.
&lt;/p&gt;
&lt;p&gt;
I looked at the shell script, and it's all OK, mind you--the Meteor people definitely
look trustworthy, I want to reassure anyone of that. But I'm really, really hoping
that this is NOT their preferred mechanism for delivery... nor is it anyone's preferred
mechanism for delivery... because that's got a gaping security hole in it about twelve
miles wide. It's just begging for some random evil hacker to post a website saying,
"Hey, all, I've got his really cool framework y'all should try..." and bury the malware
inside the code somewhere.
&lt;/p&gt;
&lt;p&gt;
Which leads to today's Random Thought Experiment of the Day: How long would it take
the open source community to discover malware buried inside of an open-source package,
particularly one that's in widespread use, a la Apache or Tomcat or JBoss? (Assume
all the core committers were in on it--how many people, aside from the core committers,
actually look at the source of the packages we download and install, sometimes under
root permissions?)
&lt;/p&gt;
&lt;p&gt;
Not saying we should abandon open source; just saying we should be responsible citizens
about who we let in our front door.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;UPDATE&lt;/b&gt;: Having done the install, I realize that it's a two-step download...
the shell script just figures out which OS you're on, which tool (curl or wget) to
use, and asks you for root access to download and install the actual distribution.
Which, honestly, I didn't look at. So, here's hoping the Meteor folks are as good
as I'm assuming them to be....
&lt;/p&gt;
&lt;p&gt;
Still highlights that this is a huge security risk.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=9fc99f7c-088b-45e9-b52a-3ccd9976c28d" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,9fc99f7c-088b-45e9-b52a-3ccd9976c28d.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>Azure</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
      <category>XNA</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=73f28449-07ec-4638-8bf6-24dd3c400c39</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=73f28449-07ec-4638-8bf6-24dd3c400c39</wfw:commentRss>
      <slash:comments>14</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I don't know Heather Arthur from Eve. Never met her, never read an article by her,
seen a video she's in or shot, or seen her code. Matter of fact, I don't even know
that she is a "she"--I'm just guessing from the name.
</p>
        <p>
But apparently she got <a href="http://harthur.wordpress.com/2013/01/24/771/">quite
an ugly reaction</a> from a few folks when she open-sourced some code: 
</p>
        <blockquote> So I went to see what people were saying about this project. I searched
Twitter and several tweets came up. One of them, I guess the original one, was basically
like “hey, this is cool”, but then the rest went like this: 
<br />
"I cannot even make this stuff up." --@steveklabnik 
<br />
"Ever wanted to make sed or grep worse?" --@zeeg 
<br />
"@steveklabnik or just point to the actual code file. eyes bleeding!" --@coreyhaines 
<br />
At this point, all I know is that by creating this project I’ve done something very
wrong. It seemed liked I’d done something fundamentally wrong, so stupid that it flabbergasts
someone. So wrong that it doesn’t even need to be explained. And my code is so bad
it makes people’s eyes bleed. So of course I start sobbing. </blockquote> Now, to
be fair, <a href="http://programmingtour.blogspot.com/2013/01/im-sorry.html">Corey
later apologized</a>. But I'm still going to criticize the response. Not because Heather's
a "she" and we should be more supportive of women in IT. Not because somebody took
something they found interesting and put it up on github for anyone to take a look
at and use if they found it useful. Not even because it's good code when they said
it was bad code or vice versa. (To be honest, I haven't even looked at the code--that's
how immaterial it is to my point.)
<p>
I'm criticizing because this is what "software craftsmanship" gets us: an imposed
segregation of those who "get it" from those who "don't" based on somebody's arbitrary
criteria of what we should or shouldn't be doing. And if somebody doesn't use the
"right" tools or code it in the "right" way, then bam! You clearly aren't a "craftsman"
(or "craftswoman"?) and you clearly don't care about your craft and you clearly aren't
worth the time or energy necessary to support and nourish and grow and....
</p><p>
Frankly, I've not been a fan of this movement since its inception. Dave Thomas (Ruby
Dave) was on a software panel with me at a No Fluff Just Stuff show about five years
ago when we got on to this subject, and Dave said, point blank, "About half of the
programmers in the world should just go take up farming." He paused, and in the moment
that followed, I said, "Wow, Dave, way to insult half the room." He immediately pointed
out that the people in the room were part of the first half, since they were at a
conference, but it just sort of underscored to me how high-handed and high-minded
that kind of talk and position can be.
</p><p>
Not all of us writing code have to be artists. Frankly, in the world of painting,
there are those who will spend hours and days and months, tiny brushes in hand, jars
of pigment just one lumens different from one another, laboring over the finest details,
creating just one piece... and then there are those who paint houses with paint-sprayers,
out of cans of mass-produced "Cream Beige" found at your local Lowes. And you know
what? <i>We need both of them.</i></p><p>
I will now coin a term that I consider to be the opposite of "software craftsman":
the "software laborer". In my younger days, believing myself to be one of those "craftsmen",
a developer who knew C++ in and out, who understood memory management and pointers,
who could create elegant and useful solutions in templates and classes and inheritance,
I turned up my nose at those "laborers" who cranked out one crappy app after another
in (what else?) Visual Basic. My app was tight, lean, and well-tuned; their apps were
sloppy, bloated, and ugly. My app was a paragon of reused code; their apps were cut-and-paste
cobbled-together duct-tape wonders. My app was a shining beacon on a hill for all
the world to admire; their apps were mindless drones, slogging through the mud....
Yeah, OK, so you get the idea.
</p><p>
But the funny thing was, those "laborers" were going home at 5 every day. Me, I was
staying sometimes until 9pm, wallowing in the wonderment of my code. And, I have to
wonder, how much of that was actually not the wonderment of my code, but the wonderment
of "me" over the wonderment of "code".
</p><p>
Speaking of, by the way, there appear to be the makings of another such false segregation,
in the areas of "functional programming". In defense of Elliott Rusty Harold's blog
the other day (which I criticized, and still stand behind, for the reasons I cited
there), there are a lot of programmers that are falling into the trap of thinking
that "all the cool kids are using functional programming, so if I want to be a cool
kid, I have to use functional programming too, even though I'm not sure what I'm doing....".
Not all the cool kids are using FP. Some aren't even using OOP. Some are just happily
humming along using good ol' fashioned C. And producing some really quality stuff
doing so.
</p><p>
See, I have to wonder just how much of the software "craftsmanship" being touted isn't
really a narcissistic "Look at me, world! Look at how much better I am because I care
about what I do! Look upon my works, ye mighty, and despair!" kind of mentality. Too
much of software "craftsmanship" seems to be about the "me" part of "my code". And
when I think about why that is, I come to an interesting assertion: That if we take
the name away from the code, and just look at the code, we can't really tell what's
"elegant" code, what's "hack" code, and what was "elegant hack because there were
all these other surrounding constraints outside the code". Without the context, we
can't tell.
</p><p>
A few years after my high point as a C++ "craftsman", I was asked to do a short, one-week
programming gig/assignment, and the more I looked at it, the more it screamed "VB"
at me. And I discovered that what would've taken me probably a month to do in C++
was easily accomplished in a few days in VB. I remember looking at the code, and feeling
this sickening, sinking sense of despair at how stupid I must've looked, crowing.
VB isn't a bad language--and neither is C++. Or Java. Or C#. Or Groovy, or Scala,
or Python, or, heck, just about any language you choose to name. (Except Perl. I refuse
to cave on that point. Mostly for comedic effect.)
</p><p>
But more importantly, somebody who comes in at 9, does what they're told, leaves at
5, and <i>never gives a rat's ass about programming except for what they need to know
to get their job done</i>, I have respect for them. Yes, some people will want to
hold themselves up as "painters", and others will just show up at your house at 8
in the morning with drop cloths. Both have their place in the world. Neither should
be denigrated for their choices about how they live their lives or manage their careers.
(Yes, there's a question of professional ethics--I want the house painters to make
sure they do a good job, too, but quality can come just as easily from the nozzle
of a spray painter as it does from the tip of a paintbrush.)
</p><p>
I end this with one of my favorite parables from Japanese lore: 
</p><blockquote><p>
Several centuries ago, a tea master worked in the service of Lord Yamanouchi. No-one
else performed the way of the tea to such perfection. The timing and the grace of
his every move, from the unfurling of mat, to the setting out of the cups, and the
sifting of the green leaves, was beauty itself. His master was so pleased with his
servant, that he bestowed upon him the rank and robes of a Samurai warrior.
</p><p>
When Lord Yamanouchi travelled, he always took his tea master with him, so that others
could appreciate the perfection of his art. On one occasion, he went on business to
the great city of Edo, which we now know as Tokyo.
</p><p>
When evening fell, the tea master and his friends set out to explore the pleasure
district, known as the floating world. As they turned the corner of a wooden pavement,
they found themselves face to face with two Samurai warriors.
</p><p>
The tea master bowed, and politely step into the gutter to let the fearsome ones pass.
But although one warrior went by, the other remained rooted to the spot. He stroked
a long black whisker that decorated his face, gnarled by the sun, and scarred by the
sword. His eyes pierced through the tea maker’s heart like an arrow.
</p><p>
He did not quite know what to make of the fellow who dressed like a fellow Samurai,
yet who would willingly step aside into a gutter. What kind of warrior was this? He
looked him up and down. Where were broad shoulders and the thick neck of a man of
force and muscle? Instinct told him that this was no soldier. He was an impostor who
by ignorance or impudence had donned the uniform of a Samurai. He snarled: “Tell me,
oh strange one, where are you from and what is your rank?”
</p><p>
The tea master bowed once more. “It is my honour to serve Lord Yamanouchi and I am
his master of the way of the tea.”
</p><p>
“A tea-sprout who dares to wear the robes of Samurai?” exclaimed the rough warrior.
</p><p>
The tea master’s lip trembled. He pressed his hands together and said: “My lord has
honoured me with the rank of a Samurai and he requires me to wear these robes. “
</p><p>
The warrior stamped the ground like a raging a bull and exclaimed: “He who wears the
robes of a Samurai must fight like a Samurai. I challenge you to a duel. If you die
with dignity, you will bring honour to your ancestors. And if you die like a dog,
at least you will be no longer insult the rank of the Samurai !”
</p><p>
By now, the hairs on the tea master’s neck were standing on end like the feet of a
helpless centipede that has been turned upside down. He imagined he could feel that
edge of the Samurai blade against his skin. He thought that his last second on earth
had come.
</p><p>
But the corner of the street was no place for a duel with honour. Death is a serious
matter, and everything has to be arranged just so. The Samurai’s friend spoke to the
tea master’s friends, and gave them the time and the place for the mortal contest.
</p><p>
When the fierce warriors had departed, the tea master’s friends fanned his face and
treated his faint nerves with smelling salts. They steadied him as they took him into
a nearby place of rest and refreshment. There they assured him that there was no need
to fear for his life. Each one of them would give freely of money from his own purse,
and they would collect a handsome enough sum to buy the warrior off and make him forget
his desire to fight a duel. And if by chance the warrior was not satisfied with the
bribe, then surely Lord Yamanouchi would give generously to save his much prized master
of the way of the tea.
</p><p>
But these generous words brought no cheer to the tea master. He thought of his family,
and his ancestors, and of Lord Yamanouchi himself, and he knew that he must not bring
them any reason to be ashamed of him.
</p><p>
“No,” he said with a firmness that surprised his friends. “I have one day and one
night to learn how to die with honour, and I will do so.”
</p><p>
And so speaking, he got up and returned alone to the court of Lord Yamanouchi. There
he found his equal in rank, the master of fencing, he was skilled as no other in the
art of fighting with a sword.
</p><p>
“Master,” he said, when he had explained his tale, “Teach me to die like a Samurai.”
</p><p>
But the master of fencing was a wise man, and he had a great respect for the master
of the Tea ceremony. And so he said: “I will teach you all you require, but first,
I ask that you perform the way of the Tea for me one last time.”
</p><p>
The tea master could not refuse this request. As he performed the ceremony, all trace
of fear seemed to leave his face. He was serenely concentrated on the simple but beautiful
cups and pots, and the delicate aroma of the leaves. There was no room in his mind
for anxiety. His thoughts were focused on the ritual.
</p><p>
When the ceremony was complete, the fencing master slapped his thigh and exclaimed
with pleasure : “There you have it. No need to learn anything of the way of death.
Your state of mind when you perform the tea ceremony is all that is required. When
you see your challenger tomorrow, imagine that you are about to serve tea for him.
Salute him courteously, express regret that you could not meet him sooner, take of
your coat and fold it as you did just now. Wrap your head in a silken scarf and and
do it with the same serenity as you dress for the tea ritual. Draw your sword, and
hold it high above your head. Then close your eyes and ready yourself for combat.
“
</p><p>
And that is exactly what the tea master did when, the following morning, at the crack
of dawn he met his opponent. The Samurai warrior had been expecting a quivering wreck
and he was amazed by the tea master’s presence of mind as he prepared himself for
combat. The Samurai’s eyes were opened and he saw a different man altogether. He thought
he must have fallen victim to some kind of trick or deception ,and now it was he who
feared for his life. The warrior bowed, asked to be excused for his rude behaviour,
and left the place of combat with as much speed and dignity as he could muster.
</p></blockquote> (excerpted from <a href="http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/">http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/</a>) 
<p>
My name is Ted Neward. And I bow with respect to the "software laborers" of the world,
who churn out quality code without concern for "craftsmanship", because their lives
are more than just their code.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=73f28449-07ec-4638-8bf6-24dd3c400c39" /><br /><hr />
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. <a href="mailto:ted@tedneward.com">Contact
me for details</a>.</body>
      <title>On the Dark Side of "Craftsmanship"</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</guid>
      <link>http://blogs.tedneward.com/2013/01/24/On+The+Dark+Side+Of+Craftsmanship.aspx</link>
      <pubDate>Thu, 24 Jan 2013 05:06:24 GMT</pubDate>
      <description>&lt;p&gt;
I don't know Heather Arthur from Eve. Never met her, never read an article by her,
seen a video she's in or shot, or seen her code. Matter of fact, I don't even know
that she is a "she"--I'm just guessing from the name.
&lt;/p&gt;
&lt;p&gt;
But apparently she got &lt;a href="http://harthur.wordpress.com/2013/01/24/771/"&gt;quite
an ugly reaction&lt;/a&gt; from a few folks when she open-sourced some code: &lt;blockquote&gt; So
I went to see what people were saying about this project. I searched Twitter and several
tweets came up. One of them, I guess the original one, was basically like “hey, this
is cool”, but then the rest went like this: 
&lt;br /&gt;
"I cannot even make this stuff up." --@steveklabnik 
&lt;br /&gt;
"Ever wanted to make sed or grep worse?" --@zeeg 
&lt;br /&gt;
"@steveklabnik or just point to the actual code file. eyes bleeding!" --@coreyhaines 
&lt;br /&gt;
At this point, all I know is that by creating this project I’ve done something very
wrong. It seemed liked I’d done something fundamentally wrong, so stupid that it flabbergasts
someone. So wrong that it doesn’t even need to be explained. And my code is so bad
it makes people’s eyes bleed. So of course I start sobbing. &lt;/blockquote&gt; Now, to
be fair, &lt;a href="http://programmingtour.blogspot.com/2013/01/im-sorry.html"&gt;Corey
later apologized&lt;/a&gt;. But I'm still going to criticize the response. Not because Heather's
a "she" and we should be more supportive of women in IT. Not because somebody took
something they found interesting and put it up on github for anyone to take a look
at and use if they found it useful. Not even because it's good code when they said
it was bad code or vice versa. (To be honest, I haven't even looked at the code--that's
how immaterial it is to my point.)&gt;
&lt;p&gt;
I'm criticizing because this is what "software craftsmanship" gets us: an imposed
segregation of those who "get it" from those who "don't" based on somebody's arbitrary
criteria of what we should or shouldn't be doing. And if somebody doesn't use the
"right" tools or code it in the "right" way, then bam! You clearly aren't a "craftsman"
(or "craftswoman"?) and you clearly don't care about your craft and you clearly aren't
worth the time or energy necessary to support and nourish and grow and....
&lt;/p&gt;
&lt;p&gt;
Frankly, I've not been a fan of this movement since its inception. Dave Thomas (Ruby
Dave) was on a software panel with me at a No Fluff Just Stuff show about five years
ago when we got on to this subject, and Dave said, point blank, "About half of the
programmers in the world should just go take up farming." He paused, and in the moment
that followed, I said, "Wow, Dave, way to insult half the room." He immediately pointed
out that the people in the room were part of the first half, since they were at a
conference, but it just sort of underscored to me how high-handed and high-minded
that kind of talk and position can be.
&lt;/p&gt;
&lt;p&gt;
Not all of us writing code have to be artists. Frankly, in the world of painting,
there are those who will spend hours and days and months, tiny brushes in hand, jars
of pigment just one lumens different from one another, laboring over the finest details,
creating just one piece... and then there are those who paint houses with paint-sprayers,
out of cans of mass-produced "Cream Beige" found at your local Lowes. And you know
what? &lt;i&gt;We need both of them.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;
I will now coin a term that I consider to be the opposite of "software craftsman":
the "software laborer". In my younger days, believing myself to be one of those "craftsmen",
a developer who knew C++ in and out, who understood memory management and pointers,
who could create elegant and useful solutions in templates and classes and inheritance,
I turned up my nose at those "laborers" who cranked out one crappy app after another
in (what else?) Visual Basic. My app was tight, lean, and well-tuned; their apps were
sloppy, bloated, and ugly. My app was a paragon of reused code; their apps were cut-and-paste
cobbled-together duct-tape wonders. My app was a shining beacon on a hill for all
the world to admire; their apps were mindless drones, slogging through the mud....
Yeah, OK, so you get the idea.
&lt;/p&gt;
&lt;p&gt;
But the funny thing was, those "laborers" were going home at 5 every day. Me, I was
staying sometimes until 9pm, wallowing in the wonderment of my code. And, I have to
wonder, how much of that was actually not the wonderment of my code, but the wonderment
of "me" over the wonderment of "code".
&lt;/p&gt;
&lt;p&gt;
Speaking of, by the way, there appear to be the makings of another such false segregation,
in the areas of "functional programming". In defense of Elliott Rusty Harold's blog
the other day (which I criticized, and still stand behind, for the reasons I cited
there), there are a lot of programmers that are falling into the trap of thinking
that "all the cool kids are using functional programming, so if I want to be a cool
kid, I have to use functional programming too, even though I'm not sure what I'm doing....".
Not all the cool kids are using FP. Some aren't even using OOP. Some are just happily
humming along using good ol' fashioned C. And producing some really quality stuff
doing so.
&lt;/p&gt;
&lt;p&gt;
See, I have to wonder just how much of the software "craftsmanship" being touted isn't
really a narcissistic "Look at me, world! Look at how much better I am because I care
about what I do! Look upon my works, ye mighty, and despair!" kind of mentality. Too
much of software "craftsmanship" seems to be about the "me" part of "my code". And
when I think about why that is, I come to an interesting assertion: That if we take
the name away from the code, and just look at the code, we can't really tell what's
"elegant" code, what's "hack" code, and what was "elegant hack because there were
all these other surrounding constraints outside the code". Without the context, we
can't tell.
&lt;/p&gt;
&lt;p&gt;
A few years after my high point as a C++ "craftsman", I was asked to do a short, one-week
programming gig/assignment, and the more I looked at it, the more it screamed "VB"
at me. And I discovered that what would've taken me probably a month to do in C++
was easily accomplished in a few days in VB. I remember looking at the code, and feeling
this sickening, sinking sense of despair at how stupid I must've looked, crowing.
VB isn't a bad language--and neither is C++. Or Java. Or C#. Or Groovy, or Scala,
or Python, or, heck, just about any language you choose to name. (Except Perl. I refuse
to cave on that point. Mostly for comedic effect.)
&lt;/p&gt;
&lt;p&gt;
But more importantly, somebody who comes in at 9, does what they're told, leaves at
5, and &lt;i&gt;never gives a rat's ass about programming except for what they need to know
to get their job done&lt;/i&gt;, I have respect for them. Yes, some people will want to
hold themselves up as "painters", and others will just show up at your house at 8
in the morning with drop cloths. Both have their place in the world. Neither should
be denigrated for their choices about how they live their lives or manage their careers.
(Yes, there's a question of professional ethics--I want the house painters to make
sure they do a good job, too, but quality can come just as easily from the nozzle
of a spray painter as it does from the tip of a paintbrush.)
&lt;/p&gt;
&lt;p&gt;
I end this with one of my favorite parables from Japanese lore: &lt;blockquote&gt; 
&lt;p&gt;
Several centuries ago, a tea master worked in the service of Lord Yamanouchi. No-one
else performed the way of the tea to such perfection. The timing and the grace of
his every move, from the unfurling of mat, to the setting out of the cups, and the
sifting of the green leaves, was beauty itself. His master was so pleased with his
servant, that he bestowed upon him the rank and robes of a Samurai warrior.
&lt;/p&gt;
&lt;p&gt;
When Lord Yamanouchi travelled, he always took his tea master with him, so that others
could appreciate the perfection of his art. On one occasion, he went on business to
the great city of Edo, which we now know as Tokyo.
&lt;/p&gt;
&lt;p&gt;
When evening fell, the tea master and his friends set out to explore the pleasure
district, known as the floating world. As they turned the corner of a wooden pavement,
they found themselves face to face with two Samurai warriors.
&lt;/p&gt;
&lt;p&gt;
The tea master bowed, and politely step into the gutter to let the fearsome ones pass.
But although one warrior went by, the other remained rooted to the spot. He stroked
a long black whisker that decorated his face, gnarled by the sun, and scarred by the
sword. His eyes pierced through the tea maker’s heart like an arrow.
&lt;/p&gt;
&lt;p&gt;
He did not quite know what to make of the fellow who dressed like a fellow Samurai,
yet who would willingly step aside into a gutter. What kind of warrior was this? He
looked him up and down. Where were broad shoulders and the thick neck of a man of
force and muscle? Instinct told him that this was no soldier. He was an impostor who
by ignorance or impudence had donned the uniform of a Samurai. He snarled: “Tell me,
oh strange one, where are you from and what is your rank?”
&lt;/p&gt;
&lt;p&gt;
The tea master bowed once more. “It is my honour to serve Lord Yamanouchi and I am
his master of the way of the tea.”
&lt;/p&gt;
&lt;p&gt;
“A tea-sprout who dares to wear the robes of Samurai?” exclaimed the rough warrior.
&lt;/p&gt;
&lt;p&gt;
The tea master’s lip trembled. He pressed his hands together and said: “My lord has
honoured me with the rank of a Samurai and he requires me to wear these robes. “
&lt;/p&gt;
&lt;p&gt;
The warrior stamped the ground like a raging a bull and exclaimed: “He who wears the
robes of a Samurai must fight like a Samurai. I challenge you to a duel. If you die
with dignity, you will bring honour to your ancestors. And if you die like a dog,
at least you will be no longer insult the rank of the Samurai !”
&lt;/p&gt;
&lt;p&gt;
By now, the hairs on the tea master’s neck were standing on end like the feet of a
helpless centipede that has been turned upside down. He imagined he could feel that
edge of the Samurai blade against his skin. He thought that his last second on earth
had come.
&lt;/p&gt;
&lt;p&gt;
But the corner of the street was no place for a duel with honour. Death is a serious
matter, and everything has to be arranged just so. The Samurai’s friend spoke to the
tea master’s friends, and gave them the time and the place for the mortal contest.
&lt;/p&gt;
&lt;p&gt;
When the fierce warriors had departed, the tea master’s friends fanned his face and
treated his faint nerves with smelling salts. They steadied him as they took him into
a nearby place of rest and refreshment. There they assured him that there was no need
to fear for his life. Each one of them would give freely of money from his own purse,
and they would collect a handsome enough sum to buy the warrior off and make him forget
his desire to fight a duel. And if by chance the warrior was not satisfied with the
bribe, then surely Lord Yamanouchi would give generously to save his much prized master
of the way of the tea.
&lt;/p&gt;
&lt;p&gt;
But these generous words brought no cheer to the tea master. He thought of his family,
and his ancestors, and of Lord Yamanouchi himself, and he knew that he must not bring
them any reason to be ashamed of him.
&lt;/p&gt;
&lt;p&gt;
“No,” he said with a firmness that surprised his friends. “I have one day and one
night to learn how to die with honour, and I will do so.”
&lt;/p&gt;
&lt;p&gt;
And so speaking, he got up and returned alone to the court of Lord Yamanouchi. There
he found his equal in rank, the master of fencing, he was skilled as no other in the
art of fighting with a sword.
&lt;/p&gt;
&lt;p&gt;
“Master,” he said, when he had explained his tale, “Teach me to die like a Samurai.”
&lt;/p&gt;
&lt;p&gt;
But the master of fencing was a wise man, and he had a great respect for the master
of the Tea ceremony. And so he said: “I will teach you all you require, but first,
I ask that you perform the way of the Tea for me one last time.”
&lt;/p&gt;
&lt;p&gt;
The tea master could not refuse this request. As he performed the ceremony, all trace
of fear seemed to leave his face. He was serenely concentrated on the simple but beautiful
cups and pots, and the delicate aroma of the leaves. There was no room in his mind
for anxiety. His thoughts were focused on the ritual.
&lt;/p&gt;
&lt;p&gt;
When the ceremony was complete, the fencing master slapped his thigh and exclaimed
with pleasure : “There you have it. No need to learn anything of the way of death.
Your state of mind when you perform the tea ceremony is all that is required. When
you see your challenger tomorrow, imagine that you are about to serve tea for him.
Salute him courteously, express regret that you could not meet him sooner, take of
your coat and fold it as you did just now. Wrap your head in a silken scarf and and
do it with the same serenity as you dress for the tea ritual. Draw your sword, and
hold it high above your head. Then close your eyes and ready yourself for combat.
“
&lt;/p&gt;
&lt;p&gt;
And that is exactly what the tea master did when, the following morning, at the crack
of dawn he met his opponent. The Samurai warrior had been expecting a quivering wreck
and he was amazed by the tea master’s presence of mind as he prepared himself for
combat. The Samurai’s eyes were opened and he saw a different man altogether. He thought
he must have fallen victim to some kind of trick or deception ,and now it was he who
feared for his life. The warrior bowed, asked to be excused for his rude behaviour,
and left the place of combat with as much speed and dignity as he could muster.
&lt;/p&gt;
&lt;/blockquote&gt; (excerpted from &lt;a href="http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/"&gt;http://storynory.com/2011/03/27/the-samurai-and-the-tea-master/&lt;/a&gt;) &gt;
&lt;p&gt;
My name is Ted Neward. And I bow with respect to the "software laborers" of the world,
who churn out quality code without concern for "craftsmanship", because their lives
are more than just their code.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=73f28449-07ec-4638-8bf6-24dd3c400c39" /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Enterprise consulting, mentoring or instruction. Java, C++, .NET or XML services.
1-day or multi-day workshops available. &lt;a href="mailto:ted@tedneward.com"&gt;Contact
me for details&lt;/a&gt;.</description>
      <comments>http://blogs.tedneward.com/CommentView,guid,73f28449-07ec-4638-8bf6-24dd3c400c39.aspx</comments>
      <category>.NET</category>
      <category>Android</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Social</category>
      <category>Visual Basic</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=345c85f3-4b46-4757-b204-eb2f63d59eb7</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,345c85f3-4b46-4757-b204-eb2f63d59eb7.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,345c85f3-4b46-4757-b204-eb2f63d59eb7.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=345c85f3-4b46-4757-b204-eb2f63d59eb7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Once again, it's time for my annual prognostication and <a href="http://blogs.tedneward.com/2012/01/02/Tech+Predictions+2012+Edition.aspx">review
of last year's efforts</a>. For those of you who've been long-time readers, you know
what this means, but for those two or three of you who haven't seen this before, let's
set the rules: if I got a prediction right from last year, you take a drink, and if
I didn't, you take a drink. (Best. Drinking game. EVAR!)
</p>
        <p>
Let's begin....
</p>
        <h3 id="recap-2012-predictions">Recap: 2012 Predictions
</h3>
        <p>
          <strong>THEN</strong>: <em>Lisps will be the languages to watch.</em></p>
        <blockquote>
          <p>
With Clojure leading the way, Lisps (that is, languages that are more or less loosely
based on Common Lisp or one of its variants) are slowly clawing their way back into
the limelight. Lisps are both functional languages as well as dynamic languages, which
gives them a significant reason for interest. Clojure runs on top of the JVM, which
makes it highly interoperable with other JVM languages/systems, and Clojure/CLR is
the version of Clojure for the CLR platform, though there seems to be less interest
in it in the .NET world (which is a mistake, if you ask me).
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Clojure is definitely cementing itself as a "critic's darling"
of a language among the digital cognoscenti, but I don't see its uptake increasing--or
decreasing. It seems that, like so many critic's darlings, those who like it are using
it, and those who aren't have either never heard of it (the far more likely scenario)
or don't care for it. Datomic, a NoSQL written by the creator of Clojure (Rich Hickey),
is interesting, but I've not heard of many folks taking it up, either. And Clojure/CLR
is all but dead, it seems. I score myself a "0" on this one.
</p>
        <p>
          <strong>THEN</strong>: <em>Functional languages will....</em></p>
        <blockquote>
          <p>
I have no idea. As I said above, I'm kind of stymied on the whole functional-language
thing and their future. I keep thinking they will either "take off" or "drop off",
and they keep tacking to the middle, doing neither, just sort of hanging in there
as a concept for programmers to take and run with. Mind you, I like functional languages,
and I want to see them become mainstream, or at least more so, but I keep wondering
if the mainstream programming public is ready to accept the ideas and concepts hiding
therein. So this year, let's try something different: I predict that they will remain
exactly where they are, neither "done" nor "accepted", but continue next year to sort
of hang out in the middle.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Functional concepts are slowly making their way into the mainstream
of programming topics, but in some cases, programmers seem to be picking-and-choosing
which of the functional concepts they believe in. I've heard developers argue vehemently
about "lazy values" but go "meh" about lack-of-side-effects, or vice versa. Moreover,
it seems that developers are still taking an "object-first, functional-when-I-need-it"
kind of approach, which seems a little object-heavy, if you ask me. So, since the
concepts seem to be taking some sort of shallow root, I don't know that I get the
point for this one, but at the same time, it's not like I was wildly off. So, let's
say "0" again.
</p>
        <p>
          <strong>THEN</strong>: <em>F#'s type providers will show up in C# v.Next.</em></p>
        <blockquote>
          <p>
This one is actually a "gimme", if you look across the history of F# and C#: for almost
every version of F# v."N", features from that version show up in C# v."N+1". More
importantly, F# 3.0's type provider feature is an amazing idea, and one that I think
will open up language research in some very interesting ways. (Not sure what F#'s
type providers are or what they'll do for you? Check out Don Syme's talk on it at
BUILD last year.)
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: C# v.Next hasn't been announced yet, so I can't say that this
one has come true. We should start hearing some vague rumors out of Redmond soon,
though, so maybe 2013 will be the year that C# gets type providers (or some scaled-back
version thereof). Again, a "0".
</p>
        <p>
          <strong>THEN</strong>: <em>Windows8 will generate a lot of chatter.</em></p>
        <blockquote>
          <p>
As 2012 progresses, Microsoft will try to force a lot of buzz around it by keeping
things under wraps until various points in the year that feel strategic (TechEd, BUILD,
etc). In doing so, though, they will annoy a number of people by not talking about
them more openly or transparently.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Oh, my, did they. Windows8 was announced with a bang, but Microsoft
(and Sinofsky, who ran the OS division up until recently) decided that they could
go it alone and leave critical partners (like Dropbox!) out of the loop entirely.
As a result, the Windows8 Store didn't have a lot of apps in it that people (including
myself) really expected would be there. And THEN, there was Surface... which took
everybody by surprise, as near as I can tell. Totally under wraps. I'm scoring myself
"+2" for that one.
</p>
        <p>
          <strong>THEN</strong>: <em>Windows8 ("Metro")-style apps won't impress at first.</em></p>
        <blockquote>
          <p>
The more I think about it, the more I'm becoming convinced that Metro-style apps on
a desktop machine are going to collectively underwhelm. The UI simply isn't designed
for keyboard-and-mouse kinds of interaction, and that's going to be the hardware setup
that most people first experience Windows8 on--contrary to what (I think) Microsoft
thinks, people do not just have tablets laying around waiting for Windows 8 to be
installed on it, nor are they going to buy a Windows8 tablet just to try it out, at
least not until it's gathered some mojo behind it. Microsoft is going to have to finesse
the messaging here very, very finely, and that's not something they've shown themselves
to be particularly good at over the last half-decade.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: I find myself somewhat at a loss how to score this one--on the
one hand, the "used-to-be-called-Metro"-style applications aren't terrible, and I
haven't really heard anyone complain about them tremendously, but at the same time,
I haven't heard anyone really go wild and ga-ga over them, either. Part of that, I
think, is because there just aren't a lot of apps out there for it yet, aside from
a rather skimpy selection of games (compared to the iOS App Store and Android Play
Store). Again, I think Microsoft really screwed themselves with this one--keeping
it all under wraps helped them make a big "Oh, WOW" kind of event buzz within the
conference hall when they announced Surface, for example, but that buzz sort of left
the room (figuratively) when people started looking for their favorite apps so they
could start using that device. (Which, by the way, isn't a bad piece of hardware,
I'm finding.) I'll give myself a "+1" for this.
</p>
        <p>
          <strong>THEN</strong>: <em>Scala will get bigger, thanks to Heroku.</em></p>
        <blockquote>
          <p>
With the adoption of Scala and Play for their Java apps, Heroku is going to make Scala
look attractive as a development platform, and the adoption of Play by Typesafe (the
same people who brought you Akka) means that these four--Heroku, Scala, Play and Akka--will
combine into a very compelling and interesting platform. I'm looking forward to seeing
what comes of that.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: We're going to get to cloud in a second, but on the whole, Heroku
is now starting to make Scala/Play attractive, arguably as attractive as Ruby/Rails
is. Play 2.0 unfortunately is not backwards-compatible with Play 1.x modules, which
hurts it, but hopefully the Play community brings that back up to speed fairly quickly.
"+1"
</p>
        <p>
          <strong>THEN</strong>: <em>Cloud will continue to whip up a lot of air.</em></p>
        <blockquote>
          <p>
For all the hype and money spent on it, it doesn't really seem like cloud is gathering
commensurate amounts of traction, across all the various cloud providers with the
possible exception of Amazon's cloud system. But, as the different cloud platforms
start to diversify their platform technology (Microsoft seems to be leading the way
here, ironically, with the introduction of Java, Hadoop and some limited NoSQL bits
into their Azure offerings), and as we start to get more experience with the pricing
and costs of cloud, 2012 might be the year that we start to see mainstream cloud adoption,
beyond "just" the usage patterns we've seen so far (as a backing server for mobile
apps and as an easy way to spin up startups).
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: It's been whipping up air, all right, but it's starting to look
like tornadoes and hurricanes--the talk of 2012 seems to have been more around notable
cloud outages instead of notable cloud successes, capped off by a nationwide Netflix
outage on Christmas Eve that seemed to dominate my Facebook feed that night. Later
analysis suggested that the outage was with Amazon's AWS cloud, on which Netflix resides,
and boy, did that make a few heads spin. I suspect we haven't yet (as of this writing)
seen the last of that discussion. Overall, it seems like lots of startups and other
greenfield apps are being deployed to the cloud, but it seems like corporations are
hesitating to pull the trigger on an "all-in" kind of cloud adoption, because of some
of the fears surrounding cloud security and now (of all things) robustness. "+1"
</p>
        <p>
          <strong>THEN</strong>: <em>Android tablets will start to gain momentum.</em></p>
        <blockquote>
          <p>
Amazon's Kindle Fire has hit the market strong, definitely better than any other Android-based
tablet before it. The Nooq (the Kindle's principal competitor, at least in the e-reader
world) is also an Android tablet, which means that right now, consumers can get into
the Android tablet world for far, far less than what an iPad costs. Apple rumors suggest
that they may have a 7" form factor tablet that will price competitively (in the $200/$300
range), but that's just rumor right now, and Apple has never shown an interest in
that form factor, which means the 7" world will remain exclusively Android's (at least
for now), and that's a nice form factor for a lot of things. This translates well
into more sales of Android tablets in general, I think.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Google's Nexus 7 came to dominate the discussion of the 7" tablet,
until...
</p>
        <p>
          <strong>THEN</strong>: <em>Apple will release an iPad 3, and it will be "more of the
same".</em></p>
        <blockquote>
          <p>
Trying to predict Apple is generally a lost cause, particularly when it comes to their
vaunted iOS lines, but somewhere around the middle of the year would be ripe for a
new iPad, at the very least. (With the iPhone 4S out a few months ago, it's hard to
imagine they'd cannibalize those sales by releasing a new iPhone, until the end of
the year at the earliest.) Frankly, though, I don't expect the iPad 3 to be all that
big of a boost, just a faster processor, more storage, and probably about the same
size. Probably the only thing I'd want added to the iPad would be a USB port, but
that conflicts with the Apple desire to present the iPad as a "device", rather than
as a "computer". (USB ports smack of "computers", not self-contained "devices".)
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: ... the iPad Mini. Which, I'd like to point out, is just an
iPad in a 7" form factor. (Actually, I think it's a little bit bigger than most 7"
tablets--it looks to be a smidge wider than the other 7" tablets I have.) And the
"new iPad" (not the iPad 3, which I call a massive FAIL on the part of Apple marketing)
is exactly that: same iPad, just faster. And still no USB port on either the iPad
or iPad Mini. So between this one and the previous one, I score myself at "+3" across
both.
</p>
        <p>
          <strong>THEN</strong>: <em>Apple will get hauled in front of the US government for...
something.</em></p>
        <blockquote>
          <p>
Apple's recent foray in the legal world, effectively informing Samsung that they can't
make square phones and offering advice as to what will avoid future litigation, smacks
of such hubris and arrogance, it makes Microsoft look like a Pollyanna Pushover by
comparison. It is pretty much a given, it seems to me, that a confrontation in the
legal halls is not far removed, either with the US or with the EU, over anti-cometitive
behavior. (And if this kind of behavior continues, and there is no legal action, it'll
be pretty apparent that Apple has a pretty good set of US Congressmen and Senators
in their pocket, something they probably learned from watching Microsoft and IBM slug
it out rather than just buy them off.)
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Congress has started to take a serious look at the patent system
and how it's being used by patent trolls (of which, folks, I include Apple these days)
to stifle innovation and create this Byzantine system of cross-patent licensing that
only benefits the big players, which was exactly what the patent system was designed
to avoid. (Patents were supposed to be a way to allow inventors, who are often independents,
to avoid getting crushed by bigger, established, well-monetized firms.) Apple hasn't
been put squarely in the crosshairs, but the Economist's article on Apple, Google,
Microsoft and Amazon in the Dec 11th issue definitely points out that all four are
squarely in the sights of governments on both sides of the Atlantic. Still, no points
for me.
</p>
        <p>
          <strong>THEN</strong>: <em>IBM will be entirely irrelevant again.</em></p>
        <blockquote>
          <p>
Look, IBM's main contribution to the Java world is/was Eclipse, and to a much lesser
degree, Harmony. With Eclipse more or less "done" (aside from all the work on plugins
being done by third parties), and with IBM abandoning Harmony in favor of OpenJDK,
IBM more or less removes themselves from the game, as far as developers are concerned.
Which shouldn't really be surprising--they've been more or less irrelevant pretty
much ever since the mid-2000s or so.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: IBM who? Wait, didn't they used to make a really kick-ass laptop,
back when we liked using laptops? "+1"
</p>
        <p>
          <strong>THEN</strong>: <em>Oracle will "screw it up" at least once.</em></p>
        <blockquote>
          <p>
Right now, the Java community is poised, like a starving vulture, waiting for Oracle
to do something else that demonstrates and befits their Evil Emperor status. The community
has already been quick (far too quick, if you ask me) to highlight Oracle's supposed
missteps, such as the JVM-crashing bug (which has already been fixed in the _u1 release
of Java7, which garnered no attention from the various Java news sites) and the debacle
around Hudson/Jenkins/whatever-the-heck-we-need-to-call-it-this-week. I'll grant you,
the Hudson/Jenkins debacle was deserving of ire, but Oracle is hardly the Evil Emperor
the community makes them out to be--at least, so far. (I'll admit it, though, I'm
a touch biased, both because Brian Goetz is a friend of mine and because Oracle TechNet
has asked me to write a column for them next year. Still, in the spirit of "innocent
until proven guilty"....)
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: It is with great pleasure that I score myself a "0" here. Oracle's
been pretty good about things, sticking with the OpenJDK approach to developing software
and talking very openly about what they're trying to do with Java8. They're not entirely
innocent, mind you--the fact that a Java install tries to monkey with my browser bar
by installing some plugin or other and so on is not something I really appreciate--but
they're not acting like Ming the Merciless, either. Matter of fact, they even seem
to be going out of their way to be community-inclusive, in some circles. I give myself
a "-1" here, and I'm happy to claim it. Good job, guys.
</p>
        <p>
          <strong>THEN</strong>: <em>VMWare/SpringSource will start pushing their cloud solution
in a major way.</em></p>
        <blockquote>
          <p>
Companies like Microsoft and Google are pushing cloud solutions because Software-as-a-Service
is a reoccurring revenue model, generating revenue even in years when the product
hasn't incremented. VMWare, being a product company, is in the same boat--the only
time they make money is when they sell a new copy of their product, unless they can
start pushing their virtualization story onto hardware on behalf of clients--a.k.a.
"the cloud". With SpringSource as the software stack, VMWare has a more-or-less complete
cloud play, so it's surprising that they didn't push it harder in 2011; I suspect
they'll start cramming it down everybody's throats in 2012. Expect to see Rod Johnson
talking a lot about the cloud as a result.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Again, I give myself a "-1" here, and frankly, I'm shocked to
be doing it. I really thought this one was a no-brainer. CloudFoundry seemed like
a pretty straightforward play, and VMWare already owned a significant share of the
virtualization story, so.... And yet, I really haven't seen much by way of significant
marketing, advertising, or developer outreach around their cloud story. It's much
the same as what it was in 2011; it almost feels like the parent corporation (EMC)
either doesn't "get" why they should push a cloud play, doesn't see it as worth the
cost, or else doesn't care. Count me confused. "0"
</p>
        <p>
          <strong>THEN</strong>: <em>JavaScript hype will continue to grow, and by years' end
will be at near-backlash levels.</em></p>
        <blockquote>
          <p>
JavaScript (more properly known as ECMAScript, not that anyone seems to care but me)
is gaining all kinds of steam as a mainstream development language (as opposed to
just-a-browser language), particularly with the release of NodeJS. That hype will
continue to escalate, and by the end of the year we may start to see a backlash against
it. (Speaking personally, NodeJS is an interesting solution, but suggesting that it
will replace your Tomcat or IIS server is a bit far-fetched; event-driven I/O is something
both of those servers have been doing for years, and the rest of it is "just" a language
discussion. We could pretty easily use JavaScript as the development language inside
both servers, as Sun demonstrated years ago with their "Phobos" project--not that
anybody really cared back then.)
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: JavaScript frameworks are exploding everywhere like fireworks
at a Disney theme park. Douglas Crockford is getting more invites to conference keynote
opportunities than James Gosling ever did. You can get a job if you know how to spell
"NodeJS". And yet, I'm starting to hear the same kinds of rumblings about "how in
the hell do we manage a 200K LOC codebase written in JavaScript" that I heard people
gripe about Ruby/Rails a few years ago. If the backlash hasn't started, then it's
right on the cusp. "+1"
</p>
        <p>
          <strong>THEN</strong>: <em>NoSQL buzz will continue to grow, and by years' end will
start to generate a backlash.</em></p>
        <blockquote>
          <p>
More and more companies are jumping into NoSQL-based solutions, and this trend will
continue to accelerate, until some extremely public failure will start to generate
a backlash against it. (This seems to be a pattern that shows up with a lot of technologies,
so it seems entirely realistic that it'll happen here, too.) Mind you, I don't mean
to suggest that the backlash will be factual or correct--usually these sorts of things
come from misuing the tool, not from any intrinsic failure in it--but it'll generate
some bad press.
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Recently, I heard that NBC was thinking about starting up a
new comedy series called "Everybody Hates Mongo", with Chris Rock narrating. And I
think that's just the beginning--lots of companies, particularly startups, decided
to run with a NoSQL solution before seriously contemplating how they were going to
make up for the things that a NoSQL doesn't provide (like a schema, for a lot of these),
and suddenly find themselves wishing they had spent a little more time thinking about
that back in the early days. Again, if the backlash isn't already started, it's about
to. "+1"
</p>
        <p>
          <strong>THEN</strong>: <em>Ted will thoroughly rock the house during his CodeMash
keynote.</em></p>
        <blockquote>
          <p>
Yeah, OK, that's more of a fervent wish than a prediction, but hey, keep a positive
attitude and all that, right?
</p>
        </blockquote>
        <p>
          <strong>NOW</strong>: Welllll..... Looking back at it with almost a years' worth of
distance, I can freely admit I dropped a few too many "F"-bombs (a buddy of mine counted
18), but aside from a (very) vocal minority, my takeaway is that a lot of people enjoyed
it. Still, I do wish I'd throttled it back some--InfoQ recorded it, and the fact that
it hasn't yet seen public posting on the website implies (to me) that they found it
too much work to "bleep" out all the naughty words. Which I call "my bad" on, because
I think they were really hoping to use that as part of their promotional activities
(not that they needed it, selling out again in minutes). To all those who found it
distasteful, I apologize, and to those who chafe at the fact that I'm apologizing,
I apologize. I take a "-1" here.
</p>
        <h3 id="predictions">2013 Predictions:
</h3>
        <p>
Having thus scored myself at a "9" (out of 17) for last year, let's take a stab at
a few for next year:
</p>
        <ul>
          <li>
            <strong>"Big data" and "data analytics" will dominate the enterprise landscape.</strong> I'm
actually pretty late to the ballgame to talk about this one, in fact--it was starting
its rapid climb up the hype wave already this year. And, part and parcel with going
up this end of the hype wave this quickly, it also stands to reason that companies
will start marketing the hell out of the term "big data" without being entirely too
precise about what they mean when they say "big data".... By the end of the year,
people will start building services and/or products on top of Hadoop, which appears
primed to be the "Big Data" platform of choice, thus far.</li>
          <li>
            <strong>NoSQL buzz will start to diversify.</strong> The various "NoSQL" vendors are
going to start wanting to differentiate themselves from each other, and will start
using "NoSQL" in their marketing and advertising talking points less and less. Some
of this will be because Pandora's Box on data storage has already been opened--nobody's
just assuming a relational database all the time, every time, anymore--but some of
this will be because the different NoSQL vendors, who are at different stages in the
adoption curve, will want to differentiate themselves from the vendors that are taking
on the backlash. I predict Mongo, who seems to be leading the way of the NoSQL vendors,
will be the sacrificial scapegoat for a lot of the NoSQL backlash that's coming down
the pike.</li>
          <li>
            <strong>Desktops increasingly become niche products.</strong> Look, does anyone buy
a desktop machine anymore? I have three sitting next to me in my office, and none
of the three has been turned on in probably two years--I'm exclusively laptop-bound
these days. Between tablets as consumption devices (slowly obsoleting the laptop),
and cloud offerings becoming more and more varied (slowly obsoleting the server),
there's just no room for companies that sell desktops--or the various Mom-and-Pop
shops that put them together for you. In fact, I'm starting to wonder if all those
parts I used to buy at Fry's Electronics and swap meets will start to disappear, too.
Gamers keep desktops alive, and I don't know if there's enough money in that world
to keep lots of those vendors alive. (I hope so, but I don't know for sure.)</li>
          <li>
            <strong>Home servers will start to grow in interest.</strong> This may seem paradoxical
to the previous point, but I think techno-geek leader-types are going to start looking
into "servers-in-a-box" that they can set up at home and have all their devices sync
to and store to. Sure, all the media will come through there, and the key here will
be "turnkey", since most folks are getting used to machines that "just work". Lots
of friends, for example, seem to be using Mac Minis for exactly this purpose, and
there's a vendor here in Redmond that sells a <a href="http://www.usmicro.com/hot-offers.php">ridiculously-powered
server in a box</a> for a couple thousand. (This is on my birthday list, right after
I get my maxed-out 13" MacBook Air and iPad 3.) This is also going to be fueled by...</li>
          <li>
            <strong>Private cloud is going to start getting hot.</strong> The great advantage
of cloud is that you don't have to have an IT department; the great disadvantage of
cloud is that when things go bad, you don't have an IT department. Too many well-publicized
cloud failures are going to drive corporations to try and find a solution that is
the best-of-both-worlds: the flexibility and resiliency of cloud provisioning, but
staffed by IT resources they can whip and threaten and cajole when things fail. (And,
by the way, I fully understand that most cloud providers have better uptimes than
most private IT organizations--this is about perception and control and the feelings
of powerlessness and helplessness when things go south, not reality.)</li>
          <li>
            <strong>Oracle will release Java8, and while several Java pundits will decry "it's
not the Java I love!", most will actually come to like it.</strong> Let's be blunt,
Java has long since moved past being the flower of fancy and a critic's darling, and
it's moved squarely into the battleship-gray of slogging out code and getting line-of-business
apps done. Java8 adopting function literals (aka "closures") and retrofitting the
Collection library to use them will be a subtle, but powerful, extension to the lifetime
of the Java language, but it's never going to be sexy again. Fortunately, it doesn't
need to be.</li>
          <li>
            <strong>Microsoft will start courting the .NET developers again.</strong> Windows8
left a bad impression in the minds of many .NET developers, with the emphasis on HTML/JavaScript
apps and C++ apps, leaving many .NET developers to wonder if they were somehow rendered
obsolete by the new platform. Despite numerous attempts in numerous ways to tell them
no, developers still seem to have that opinion--and Microsoft needs to go on the offensive
to show them that .NET and Windows8 (and WinRT) do, in fact, go very well together.
Microsoft can't afford for their loyal developer community to feel left out or abandoned.
They know that, and they'll start working on it.</li>
          <li>
            <strong>Samsung will start pushing themselves further and further into the consumer
market.</strong> They already have started gathering more and more of a consumer name
for themselves, they just need to solidify their tablet offerings and get closer in
line with either Google (for Android tablets) or even Microsoft (for Windows8 tablets
and/or Surface competitors) to compete with Apple. They may even start looking into
writing their own tablet OS, which would be something of a mistake, but an understandable
one.</li>
          <li>
            <strong>Apple's next release cycle will, again, be "more of the same".</strong> iPhone
6, iPad 4, iPad Mini 2, MacBooks, MacBook Airs, none of them are going to get much
in the way of innovation or new features. Apple is going to run squarely into the
Innovator's Dilemma soon, and their products are going to be "more of the same" for
a while. Incremental improvements along a couple of lines, perhaps, but nothing Earth-shattering.
(Hey, Apple, how about opening up Siri to us to program against, for example, so we
can hook into her command structure and hook our own apps up? I can do that with Android
today, why not her?)</li>
          <li>
            <strong>Visual Studio 2014 features will start being discussed at the end of the year.</strong> If
Microsoft is going to hit their every-two-year-cycle with Visual Studio, then they'll
start talking/whispering/rumoring some of the v.Next features towards the middle to
end of 2013. I fully expect C# 6 will get some form of type providers, Visual Basic
will be a close carbon copy of C# again, and F# 4 will have something completely revolutionary
that anyone who sees it will be like, "Oh, cool! Now, when can I get that in C#?"</li>
          <li>
            <strong>Scala interest wanes.</strong> As much as I don't want it to happen, I think
interest in Scala is going to slow down, and possibly regress. This will be the year
that Typesafe needs to make a major splash if they want to show the world that they're
serious, and I don't know that the JVM world is really all that interested in seeing
a new player. Instead, I think Scala will be seen as what "the 1%" of the Java community
uses, and the rest will take some ideas from there and apply them (poorly, perhaps)
to Java.</li>
          <li>
            <strong>Interest in native languages will rise.</strong> Just for kicks, developers
will start experimenting with some of the new compile-to-native-code languages (Go,
Rust, Slate, Haskell, whatever) and start finding some of the joys (and heartaches)
that come with running "on the metal". More importantly, they'll start looking at
ways to use these languages with platforms where running "on the metal" is more important,
like mobile devices and tablets.</li>
        </ul>
        <p>
As always, folks, thanks for reading. See you next year.
</p>
        <b>UPDATE:</b> Two things happened this week (7 Jan 2013) that made me want to add
to this list: 
<ul><li><strong>Hardware is the new platform.</strong> A buddy of mine (Scott Davis) pointed
out on a mailing list we share that "hardware is the new platform", and with Microsoft's
Surface out now, there's three major players (Apple, Google, Microsoft) in this game.
It's becoming apparent that more and more companies are starting to see opportunities
in going the Apple route of owning not just the OS and the store, but the hardware
underneath it. More and more companies are going to start playing this game, too,
I think, and we're going to see Amazon take some shots here, and probably a few others.
Of course, already announced is the Ubuntu Phone, and a new Android-like player, <a href="http://www.tizen.org">Tizen</a>,
but I'm not thinking about new players--there's always new players--but about some
of the big standouts. And look for companies like Dell and HP to start looking for
ways to play in this game, too, either through partnerships or acquisitions. (Hello,
Oracle, I'm looking at you.... And Adobe, too.)</li><li><strong>APIs for lots of things are going to come out.</strong> Ford <a href="http://techcrunch.com/2013/01/07/ford-launches-open-developer-program-to-let-mobile-apps-interface-with-its-cars/">just</a> did <a href="http://developer.ford.com">this</a>.
This is not going away--this is going to proliferate. And the startup community is
going to lap it up like kittens attacking a bowl of cream. If you're looking for a
play in the startup world, pursue this.</li></ul><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=345c85f3-4b46-4757-b204-eb2f63d59eb7" /><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>Tech Predictions, 2013</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,345c85f3-4b46-4757-b204-eb2f63d59eb7.aspx</guid>
      <link>http://blogs.tedneward.com/2013/01/01/Tech+Predictions+2013.aspx</link>
      <pubDate>Tue, 01 Jan 2013 09:22:30 GMT</pubDate>
      <description>&lt;p&gt;
Once again, it's time for my annual prognostication and &lt;a href="http://blogs.tedneward.com/2012/01/02/Tech+Predictions+2012+Edition.aspx"&gt;review
of last year's efforts&lt;/a&gt;. For those of you who've been long-time readers, you know
what this means, but for those two or three of you who haven't seen this before, let's
set the rules: if I got a prediction right from last year, you take a drink, and if
I didn't, you take a drink. (Best. Drinking game. EVAR!)
&lt;/p&gt;
&lt;p&gt;
Let's begin....
&lt;/p&gt;
&lt;h3 id="recap-2012-predictions"&gt;Recap: 2012 Predictions
&lt;/h3&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Lisps will be the languages to watch.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
With Clojure leading the way, Lisps (that is, languages that are more or less loosely
based on Common Lisp or one of its variants) are slowly clawing their way back into
the limelight. Lisps are both functional languages as well as dynamic languages, which
gives them a significant reason for interest. Clojure runs on top of the JVM, which
makes it highly interoperable with other JVM languages/systems, and Clojure/CLR is
the version of Clojure for the CLR platform, though there seems to be less interest
in it in the .NET world (which is a mistake, if you ask me).
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Clojure is definitely cementing itself as a "critic's darling"
of a language among the digital cognoscenti, but I don't see its uptake increasing--or
decreasing. It seems that, like so many critic's darlings, those who like it are using
it, and those who aren't have either never heard of it (the far more likely scenario)
or don't care for it. Datomic, a NoSQL written by the creator of Clojure (Rich Hickey),
is interesting, but I've not heard of many folks taking it up, either. And Clojure/CLR
is all but dead, it seems. I score myself a "0" on this one.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Functional languages will....&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I have no idea. As I said above, I'm kind of stymied on the whole functional-language
thing and their future. I keep thinking they will either "take off" or "drop off",
and they keep tacking to the middle, doing neither, just sort of hanging in there
as a concept for programmers to take and run with. Mind you, I like functional languages,
and I want to see them become mainstream, or at least more so, but I keep wondering
if the mainstream programming public is ready to accept the ideas and concepts hiding
therein. So this year, let's try something different: I predict that they will remain
exactly where they are, neither "done" nor "accepted", but continue next year to sort
of hang out in the middle.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Functional concepts are slowly making their way into the mainstream
of programming topics, but in some cases, programmers seem to be picking-and-choosing
which of the functional concepts they believe in. I've heard developers argue vehemently
about "lazy values" but go "meh" about lack-of-side-effects, or vice versa. Moreover,
it seems that developers are still taking an "object-first, functional-when-I-need-it"
kind of approach, which seems a little object-heavy, if you ask me. So, since the
concepts seem to be taking some sort of shallow root, I don't know that I get the
point for this one, but at the same time, it's not like I was wildly off. So, let's
say "0" again.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;F#'s type providers will show up in C# v.Next.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
This one is actually a "gimme", if you look across the history of F# and C#: for almost
every version of F# v."N", features from that version show up in C# v."N+1". More
importantly, F# 3.0's type provider feature is an amazing idea, and one that I think
will open up language research in some very interesting ways. (Not sure what F#'s
type providers are or what they'll do for you? Check out Don Syme's talk on it at
BUILD last year.)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: C# v.Next hasn't been announced yet, so I can't say that this
one has come true. We should start hearing some vague rumors out of Redmond soon,
though, so maybe 2013 will be the year that C# gets type providers (or some scaled-back
version thereof). Again, a "0".
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Windows8 will generate a lot of chatter.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
As 2012 progresses, Microsoft will try to force a lot of buzz around it by keeping
things under wraps until various points in the year that feel strategic (TechEd, BUILD,
etc). In doing so, though, they will annoy a number of people by not talking about
them more openly or transparently.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Oh, my, did they. Windows8 was announced with a bang, but Microsoft
(and Sinofsky, who ran the OS division up until recently) decided that they could
go it alone and leave critical partners (like Dropbox!) out of the loop entirely.
As a result, the Windows8 Store didn't have a lot of apps in it that people (including
myself) really expected would be there. And THEN, there was Surface... which took
everybody by surprise, as near as I can tell. Totally under wraps. I'm scoring myself
"+2" for that one.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Windows8 ("Metro")-style apps won't impress at first.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The more I think about it, the more I'm becoming convinced that Metro-style apps on
a desktop machine are going to collectively underwhelm. The UI simply isn't designed
for keyboard-and-mouse kinds of interaction, and that's going to be the hardware setup
that most people first experience Windows8 on--contrary to what (I think) Microsoft
thinks, people do not just have tablets laying around waiting for Windows 8 to be
installed on it, nor are they going to buy a Windows8 tablet just to try it out, at
least not until it's gathered some mojo behind it. Microsoft is going to have to finesse
the messaging here very, very finely, and that's not something they've shown themselves
to be particularly good at over the last half-decade.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: I find myself somewhat at a loss how to score this one--on the
one hand, the "used-to-be-called-Metro"-style applications aren't terrible, and I
haven't really heard anyone complain about them tremendously, but at the same time,
I haven't heard anyone really go wild and ga-ga over them, either. Part of that, I
think, is because there just aren't a lot of apps out there for it yet, aside from
a rather skimpy selection of games (compared to the iOS App Store and Android Play
Store). Again, I think Microsoft really screwed themselves with this one--keeping
it all under wraps helped them make a big "Oh, WOW" kind of event buzz within the
conference hall when they announced Surface, for example, but that buzz sort of left
the room (figuratively) when people started looking for their favorite apps so they
could start using that device. (Which, by the way, isn't a bad piece of hardware,
I'm finding.) I'll give myself a "+1" for this.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Scala will get bigger, thanks to Heroku.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
With the adoption of Scala and Play for their Java apps, Heroku is going to make Scala
look attractive as a development platform, and the adoption of Play by Typesafe (the
same people who brought you Akka) means that these four--Heroku, Scala, Play and Akka--will
combine into a very compelling and interesting platform. I'm looking forward to seeing
what comes of that.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: We're going to get to cloud in a second, but on the whole, Heroku
is now starting to make Scala/Play attractive, arguably as attractive as Ruby/Rails
is. Play 2.0 unfortunately is not backwards-compatible with Play 1.x modules, which
hurts it, but hopefully the Play community brings that back up to speed fairly quickly.
"+1"
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Cloud will continue to whip up a lot of air.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
For all the hype and money spent on it, it doesn't really seem like cloud is gathering
commensurate amounts of traction, across all the various cloud providers with the
possible exception of Amazon's cloud system. But, as the different cloud platforms
start to diversify their platform technology (Microsoft seems to be leading the way
here, ironically, with the introduction of Java, Hadoop and some limited NoSQL bits
into their Azure offerings), and as we start to get more experience with the pricing
and costs of cloud, 2012 might be the year that we start to see mainstream cloud adoption,
beyond "just" the usage patterns we've seen so far (as a backing server for mobile
apps and as an easy way to spin up startups).
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: It's been whipping up air, all right, but it's starting to look
like tornadoes and hurricanes--the talk of 2012 seems to have been more around notable
cloud outages instead of notable cloud successes, capped off by a nationwide Netflix
outage on Christmas Eve that seemed to dominate my Facebook feed that night. Later
analysis suggested that the outage was with Amazon's AWS cloud, on which Netflix resides,
and boy, did that make a few heads spin. I suspect we haven't yet (as of this writing)
seen the last of that discussion. Overall, it seems like lots of startups and other
greenfield apps are being deployed to the cloud, but it seems like corporations are
hesitating to pull the trigger on an "all-in" kind of cloud adoption, because of some
of the fears surrounding cloud security and now (of all things) robustness. "+1"
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Android tablets will start to gain momentum.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Amazon's Kindle Fire has hit the market strong, definitely better than any other Android-based
tablet before it. The Nooq (the Kindle's principal competitor, at least in the e-reader
world) is also an Android tablet, which means that right now, consumers can get into
the Android tablet world for far, far less than what an iPad costs. Apple rumors suggest
that they may have a 7" form factor tablet that will price competitively (in the $200/$300
range), but that's just rumor right now, and Apple has never shown an interest in
that form factor, which means the 7" world will remain exclusively Android's (at least
for now), and that's a nice form factor for a lot of things. This translates well
into more sales of Android tablets in general, I think.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Google's Nexus 7 came to dominate the discussion of the 7" tablet,
until...
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Apple will release an iPad 3, and it will be "more of the
same".&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Trying to predict Apple is generally a lost cause, particularly when it comes to their
vaunted iOS lines, but somewhere around the middle of the year would be ripe for a
new iPad, at the very least. (With the iPhone 4S out a few months ago, it's hard to
imagine they'd cannibalize those sales by releasing a new iPhone, until the end of
the year at the earliest.) Frankly, though, I don't expect the iPad 3 to be all that
big of a boost, just a faster processor, more storage, and probably about the same
size. Probably the only thing I'd want added to the iPad would be a USB port, but
that conflicts with the Apple desire to present the iPad as a "device", rather than
as a "computer". (USB ports smack of "computers", not self-contained "devices".)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: ... the iPad Mini. Which, I'd like to point out, is just an
iPad in a 7" form factor. (Actually, I think it's a little bit bigger than most 7"
tablets--it looks to be a smidge wider than the other 7" tablets I have.) And the
"new iPad" (not the iPad 3, which I call a massive FAIL on the part of Apple marketing)
is exactly that: same iPad, just faster. And still no USB port on either the iPad
or iPad Mini. So between this one and the previous one, I score myself at "+3" across
both.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Apple will get hauled in front of the US government for...
something.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Apple's recent foray in the legal world, effectively informing Samsung that they can't
make square phones and offering advice as to what will avoid future litigation, smacks
of such hubris and arrogance, it makes Microsoft look like a Pollyanna Pushover by
comparison. It is pretty much a given, it seems to me, that a confrontation in the
legal halls is not far removed, either with the US or with the EU, over anti-cometitive
behavior. (And if this kind of behavior continues, and there is no legal action, it'll
be pretty apparent that Apple has a pretty good set of US Congressmen and Senators
in their pocket, something they probably learned from watching Microsoft and IBM slug
it out rather than just buy them off.)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Congress has started to take a serious look at the patent system
and how it's being used by patent trolls (of which, folks, I include Apple these days)
to stifle innovation and create this Byzantine system of cross-patent licensing that
only benefits the big players, which was exactly what the patent system was designed
to avoid. (Patents were supposed to be a way to allow inventors, who are often independents,
to avoid getting crushed by bigger, established, well-monetized firms.) Apple hasn't
been put squarely in the crosshairs, but the Economist's article on Apple, Google,
Microsoft and Amazon in the Dec 11th issue definitely points out that all four are
squarely in the sights of governments on both sides of the Atlantic. Still, no points
for me.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;IBM will be entirely irrelevant again.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Look, IBM's main contribution to the Java world is/was Eclipse, and to a much lesser
degree, Harmony. With Eclipse more or less "done" (aside from all the work on plugins
being done by third parties), and with IBM abandoning Harmony in favor of OpenJDK,
IBM more or less removes themselves from the game, as far as developers are concerned.
Which shouldn't really be surprising--they've been more or less irrelevant pretty
much ever since the mid-2000s or so.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: IBM who? Wait, didn't they used to make a really kick-ass laptop,
back when we liked using laptops? "+1"
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Oracle will "screw it up" at least once.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Right now, the Java community is poised, like a starving vulture, waiting for Oracle
to do something else that demonstrates and befits their Evil Emperor status. The community
has already been quick (far too quick, if you ask me) to highlight Oracle's supposed
missteps, such as the JVM-crashing bug (which has already been fixed in the _u1 release
of Java7, which garnered no attention from the various Java news sites) and the debacle
around Hudson/Jenkins/whatever-the-heck-we-need-to-call-it-this-week. I'll grant you,
the Hudson/Jenkins debacle was deserving of ire, but Oracle is hardly the Evil Emperor
the community makes them out to be--at least, so far. (I'll admit it, though, I'm
a touch biased, both because Brian Goetz is a friend of mine and because Oracle TechNet
has asked me to write a column for them next year. Still, in the spirit of "innocent
until proven guilty"....)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: It is with great pleasure that I score myself a "0" here. Oracle's
been pretty good about things, sticking with the OpenJDK approach to developing software
and talking very openly about what they're trying to do with Java8. They're not entirely
innocent, mind you--the fact that a Java install tries to monkey with my browser bar
by installing some plugin or other and so on is not something I really appreciate--but
they're not acting like Ming the Merciless, either. Matter of fact, they even seem
to be going out of their way to be community-inclusive, in some circles. I give myself
a "-1" here, and I'm happy to claim it. Good job, guys.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;VMWare/SpringSource will start pushing their cloud solution
in a major way.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Companies like Microsoft and Google are pushing cloud solutions because Software-as-a-Service
is a reoccurring revenue model, generating revenue even in years when the product
hasn't incremented. VMWare, being a product company, is in the same boat--the only
time they make money is when they sell a new copy of their product, unless they can
start pushing their virtualization story onto hardware on behalf of clients--a.k.a.
"the cloud". With SpringSource as the software stack, VMWare has a more-or-less complete
cloud play, so it's surprising that they didn't push it harder in 2011; I suspect
they'll start cramming it down everybody's throats in 2012. Expect to see Rod Johnson
talking a lot about the cloud as a result.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Again, I give myself a "-1" here, and frankly, I'm shocked to
be doing it. I really thought this one was a no-brainer. CloudFoundry seemed like
a pretty straightforward play, and VMWare already owned a significant share of the
virtualization story, so.... And yet, I really haven't seen much by way of significant
marketing, advertising, or developer outreach around their cloud story. It's much
the same as what it was in 2011; it almost feels like the parent corporation (EMC)
either doesn't "get" why they should push a cloud play, doesn't see it as worth the
cost, or else doesn't care. Count me confused. "0"
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;JavaScript hype will continue to grow, and by years' end
will be at near-backlash levels.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
JavaScript (more properly known as ECMAScript, not that anyone seems to care but me)
is gaining all kinds of steam as a mainstream development language (as opposed to
just-a-browser language), particularly with the release of NodeJS. That hype will
continue to escalate, and by the end of the year we may start to see a backlash against
it. (Speaking personally, NodeJS is an interesting solution, but suggesting that it
will replace your Tomcat or IIS server is a bit far-fetched; event-driven I/O is something
both of those servers have been doing for years, and the rest of it is "just" a language
discussion. We could pretty easily use JavaScript as the development language inside
both servers, as Sun demonstrated years ago with their "Phobos" project--not that
anybody really cared back then.)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: JavaScript frameworks are exploding everywhere like fireworks
at a Disney theme park. Douglas Crockford is getting more invites to conference keynote
opportunities than James Gosling ever did. You can get a job if you know how to spell
"NodeJS". And yet, I'm starting to hear the same kinds of rumblings about "how in
the hell do we manage a 200K LOC codebase written in JavaScript" that I heard people
gripe about Ruby/Rails a few years ago. If the backlash hasn't started, then it's
right on the cusp. "+1"
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;NoSQL buzz will continue to grow, and by years' end will
start to generate a backlash.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
More and more companies are jumping into NoSQL-based solutions, and this trend will
continue to accelerate, until some extremely public failure will start to generate
a backlash against it. (This seems to be a pattern that shows up with a lot of technologies,
so it seems entirely realistic that it'll happen here, too.) Mind you, I don't mean
to suggest that the backlash will be factual or correct--usually these sorts of things
come from misuing the tool, not from any intrinsic failure in it--but it'll generate
some bad press.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Recently, I heard that NBC was thinking about starting up a
new comedy series called "Everybody Hates Mongo", with Chris Rock narrating. And I
think that's just the beginning--lots of companies, particularly startups, decided
to run with a NoSQL solution before seriously contemplating how they were going to
make up for the things that a NoSQL doesn't provide (like a schema, for a lot of these),
and suddenly find themselves wishing they had spent a little more time thinking about
that back in the early days. Again, if the backlash isn't already started, it's about
to. "+1"
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: &lt;em&gt;Ted will thoroughly rock the house during his CodeMash
keynote.&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Yeah, OK, that's more of a fervent wish than a prediction, but hey, keep a positive
attitude and all that, right?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;NOW&lt;/strong&gt;: Welllll..... Looking back at it with almost a years' worth of
distance, I can freely admit I dropped a few too many "F"-bombs (a buddy of mine counted
18), but aside from a (very) vocal minority, my takeaway is that a lot of people enjoyed
it. Still, I do wish I'd throttled it back some--InfoQ recorded it, and the fact that
it hasn't yet seen public posting on the website implies (to me) that they found it
too much work to "bleep" out all the naughty words. Which I call "my bad" on, because
I think they were really hoping to use that as part of their promotional activities
(not that they needed it, selling out again in minutes). To all those who found it
distasteful, I apologize, and to those who chafe at the fact that I'm apologizing,
I apologize. I take a "-1" here.
&lt;/p&gt;
&lt;h3 id="predictions"&gt;2013 Predictions:
&lt;/h3&gt;
&lt;p&gt;
Having thus scored myself at a "9" (out of 17) for last year, let's take a stab at
a few for next year:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Big data" and "data analytics" will dominate the enterprise landscape.&lt;/strong&gt; I'm
actually pretty late to the ballgame to talk about this one, in fact--it was starting
its rapid climb up the hype wave already this year. And, part and parcel with going
up this end of the hype wave this quickly, it also stands to reason that companies
will start marketing the hell out of the term "big data" without being entirely too
precise about what they mean when they say "big data".... By the end of the year,
people will start building services and/or products on top of Hadoop, which appears
primed to be the "Big Data" platform of choice, thus far.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NoSQL buzz will start to diversify.&lt;/strong&gt; The various "NoSQL" vendors are
going to start wanting to differentiate themselves from each other, and will start
using "NoSQL" in their marketing and advertising talking points less and less. Some
of this will be because Pandora's Box on data storage has already been opened--nobody's
just assuming a relational database all the time, every time, anymore--but some of
this will be because the different NoSQL vendors, who are at different stages in the
adoption curve, will want to differentiate themselves from the vendors that are taking
on the backlash. I predict Mongo, who seems to be leading the way of the NoSQL vendors,
will be the sacrificial scapegoat for a lot of the NoSQL backlash that's coming down
the pike.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktops increasingly become niche products.&lt;/strong&gt; Look, does anyone buy
a desktop machine anymore? I have three sitting next to me in my office, and none
of the three has been turned on in probably two years--I'm exclusively laptop-bound
these days. Between tablets as consumption devices (slowly obsoleting the laptop),
and cloud offerings becoming more and more varied (slowly obsoleting the server),
there's just no room for companies that sell desktops--or the various Mom-and-Pop
shops that put them together for you. In fact, I'm starting to wonder if all those
parts I used to buy at Fry's Electronics and swap meets will start to disappear, too.
Gamers keep desktops alive, and I don't know if there's enough money in that world
to keep lots of those vendors alive. (I hope so, but I don't know for sure.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home servers will start to grow in interest.&lt;/strong&gt; This may seem paradoxical
to the previous point, but I think techno-geek leader-types are going to start looking
into "servers-in-a-box" that they can set up at home and have all their devices sync
to and store to. Sure, all the media will come through there, and the key here will
be "turnkey", since most folks are getting used to machines that "just work". Lots
of friends, for example, seem to be using Mac Minis for exactly this purpose, and
there's a vendor here in Redmond that sells a &lt;a href="http://www.usmicro.com/hot-offers.php"&gt;ridiculously-powered
server in a box&lt;/a&gt; for a couple thousand. (This is on my birthday list, right after
I get my maxed-out 13" MacBook Air and iPad 3.) This is also going to be fueled by...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private cloud is going to start getting hot.&lt;/strong&gt; The great advantage
of cloud is that you don't have to have an IT department; the great disadvantage of
cloud is that when things go bad, you don't have an IT department. Too many well-publicized
cloud failures are going to drive corporations to try and find a solution that is
the best-of-both-worlds: the flexibility and resiliency of cloud provisioning, but
staffed by IT resources they can whip and threaten and cajole when things fail. (And,
by the way, I fully understand that most cloud providers have better uptimes than
most private IT organizations--this is about perception and control and the feelings
of powerlessness and helplessness when things go south, not reality.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oracle will release Java8, and while several Java pundits will decry "it's
not the Java I love!", most will actually come to like it.&lt;/strong&gt; Let's be blunt,
Java has long since moved past being the flower of fancy and a critic's darling, and
it's moved squarely into the battleship-gray of slogging out code and getting line-of-business
apps done. Java8 adopting function literals (aka "closures") and retrofitting the
Collection library to use them will be a subtle, but powerful, extension to the lifetime
of the Java language, but it's never going to be sexy again. Fortunately, it doesn't
need to be.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft will start courting the .NET developers again.&lt;/strong&gt; Windows8
left a bad impression in the minds of many .NET developers, with the emphasis on HTML/JavaScript
apps and C++ apps, leaving many .NET developers to wonder if they were somehow rendered
obsolete by the new platform. Despite numerous attempts in numerous ways to tell them
no, developers still seem to have that opinion--and Microsoft needs to go on the offensive
to show them that .NET and Windows8 (and WinRT) do, in fact, go very well together.
Microsoft can't afford for their loyal developer community to feel left out or abandoned.
They know that, and they'll start working on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Samsung will start pushing themselves further and further into the consumer
market.&lt;/strong&gt; They already have started gathering more and more of a consumer name
for themselves, they just need to solidify their tablet offerings and get closer in
line with either Google (for Android tablets) or even Microsoft (for Windows8 tablets
and/or Surface competitors) to compete with Apple. They may even start looking into
writing their own tablet OS, which would be something of a mistake, but an understandable
one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple's next release cycle will, again, be "more of the same".&lt;/strong&gt; iPhone
6, iPad 4, iPad Mini 2, MacBooks, MacBook Airs, none of them are going to get much
in the way of innovation or new features. Apple is going to run squarely into the
Innovator's Dilemma soon, and their products are going to be "more of the same" for
a while. Incremental improvements along a couple of lines, perhaps, but nothing Earth-shattering.
(Hey, Apple, how about opening up Siri to us to program against, for example, so we
can hook into her command structure and hook our own apps up? I can do that with Android
today, why not her?)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Studio 2014 features will start being discussed at the end of the year.&lt;/strong&gt; If
Microsoft is going to hit their every-two-year-cycle with Visual Studio, then they'll
start talking/whispering/rumoring some of the v.Next features towards the middle to
end of 2013. I fully expect C# 6 will get some form of type providers, Visual Basic
will be a close carbon copy of C# again, and F# 4 will have something completely revolutionary
that anyone who sees it will be like, "Oh, cool! Now, when can I get that in C#?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scala interest wanes.&lt;/strong&gt; As much as I don't want it to happen, I think
interest in Scala is going to slow down, and possibly regress. This will be the year
that Typesafe needs to make a major splash if they want to show the world that they're
serious, and I don't know that the JVM world is really all that interested in seeing
a new player. Instead, I think Scala will be seen as what "the 1%" of the Java community
uses, and the rest will take some ideas from there and apply them (poorly, perhaps)
to Java.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interest in native languages will rise.&lt;/strong&gt; Just for kicks, developers
will start experimenting with some of the new compile-to-native-code languages (Go,
Rust, Slate, Haskell, whatever) and start finding some of the joys (and heartaches)
that come with running "on the metal". More importantly, they'll start looking at
ways to use these languages with platforms where running "on the metal" is more important,
like mobile devices and tablets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
As always, folks, thanks for reading. See you next year.
&lt;/p&gt;
&lt;b&gt;UPDATE:&lt;/b&gt; Two things happened this week (7 Jan 2013) that made me want to add
to this list: 
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware is the new platform.&lt;/strong&gt; A buddy of mine (Scott Davis) pointed
out on a mailing list we share that "hardware is the new platform", and with Microsoft's
Surface out now, there's three major players (Apple, Google, Microsoft) in this game.
It's becoming apparent that more and more companies are starting to see opportunities
in going the Apple route of owning not just the OS and the store, but the hardware
underneath it. More and more companies are going to start playing this game, too,
I think, and we're going to see Amazon take some shots here, and probably a few others.
Of course, already announced is the Ubuntu Phone, and a new Android-like player, &lt;a href="http://www.tizen.org"&gt;Tizen&lt;/a&gt;,
but I'm not thinking about new players--there's always new players--but about some
of the big standouts. And look for companies like Dell and HP to start looking for
ways to play in this game, too, either through partnerships or acquisitions. (Hello,
Oracle, I'm looking at you.... And Adobe, too.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APIs for lots of things are going to come out.&lt;/strong&gt; Ford &lt;a href="http://techcrunch.com/2013/01/07/ford-launches-open-developer-program-to-let-mobile-apps-interface-with-its-cars/"&gt;just&lt;/a&gt; did &lt;a href="http://developer.ford.com"&gt;this&lt;/a&gt;.
This is not going away--this is going to proliferate. And the startup community is
going to lap it up like kittens attacking a bowl of cream. If you're looking for a
play in the startup world, pursue this.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=345c85f3-4b46-4757-b204-eb2f63d59eb7" /&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,345c85f3-4b46-4757-b204-eb2f63d59eb7.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>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
      <category>XNA</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=b5b18e2a-df88-41ef-bc8b-69b46307e908</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,b5b18e2a-df88-41ef-bc8b-69b46307e908.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,b5b18e2a-df88-41ef-bc8b-69b46307e908.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b5b18e2a-df88-41ef-bc8b-69b46307e908</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There's an interesting legal interpretation coming out of the Electronic Freedom Foundation
(EFF) around the <a href="https://www.eff.org/deeplinks/2012/10/governments-attack-cloud-computing">Megaupload
case</a>, and the EFF has said this: 
</p>
        <blockquote> "The government maintains that Mr. Goodwin lost his property rights
in his data by storing it on a cloud computing service. Specifically, the government
argues that both the contract between Megaupload and Mr. Goodwin (a standard cloud
computing contract) and the contract between Megaupload and the server host, Carpathia
(also a standard agreement), "likely limit any property interest he may have" in his
data. (Page 4). If the government is right, no provider can both protect itself against
sudden losses (like those due to a hurricane) and also promise its customers that
their property rights will be maintained when they use the service. Nor can they promise
that their property might not suddenly disappear, with no reasonable way to get it
back if the government comes in with a warrant. Apparently your property rights "become
severely limited" if you allow someone else to host your data under standard cloud
computing arrangements. This argument isn't limited in any way to Megaupload -- it
would apply if the third party host was Amazon's S3 or Google Apps or or Apple iCloud." </blockquote> Now,
one of the participants on the Seattle Tech Startup list, Jonathan Shapiro, wrote
this as an interpretation of the government's brief and the EFF filing: <blockquote><p>
What the government actually says is that the state of Mr. Goodwin's property rights
depends on his agreement with the cloud provider and their agreement with the infrastructure
provider. The question ultimately comes down to: if I upload data onto a machine that
you own, who owns the copy of the data that ends up on your machine? The answer to
that question depends on the agreements involved, which is what the government is
saying. Without reviewing the agreements, it isn't clear if the upload should be thought
of as a loan, a gift, a transfer, or something else.
</p><p>
Lacking any physical embodiment, it is not clear whether the bits comprising these
uploaded digital artifacts constitute property in the traditional sense at all. Even
if they do, the government is arguing that who owns the bits may have nothing to do
with who controls the use of the bits; that the two are separate matters. That's quite
standard: your decision to buy a book from the bookstore conveys ownership to you,
but does not give you the right to make further copies of the book. Once a copy of
the data leaves the possession of Mr. Goodwin, the constraints on its use are determined
by copyright law and license terms. The agreement between Goodwin and the cloud provider
clearly narrows the copyright-driven constraints, because the cloud provider has to
be able to make copies to provide their services, and has surely placed terms that
permit this in their user agreement. The consequences for ownership are unclear. In
particular: if the cloud provider (as opposed to Mr. Goodwin) makes an authorized
copy of Goodwin's data in the course of their operations, using only the resources
of the cloud provider, the ownership of that copy doesn't seem obvious at all. A license
may exist requiring that copy to be destroyed under certain circumstances (e.g. if
Mr. Goodwin terminates his contract), but that doesn't speak to ownership of the copy.
</p><p>
Because no sale has occurred, and there was clearly no intent to cede ownership, the
Government's challenge concerning ownership has the feel of violating common sense.
If you share that feeling, welcome to the world of intellectual property law. But
while everyone is looking at the negative side of this argument, it's worth considering
that there may be positive consequences of the Government's argument. In Germany,
for example, software is property. It is illegal (or at least unenforceable) to write
a software license in Germany that stops me from selling my copy of a piece of software
to my friend, so long as I remove it from my machine. A copy of a work of software
can be resold in the same way that a book can be resold because it is property. At
present, the provisions of UCITA in the U.S. have the effect that you do not own a
work of software that you buy. If the district court in Virginia determines that a
recipient has property rights in a copy of software that they receive, that could
have far-reaching consequences, possibly including a consequent right of resale in
the United States.
</p></blockquote><p>
Now, whether or not Jon's interpretation is correct, there are some huge legal implications
of this interpretation of the cloud, because data "ownership" is going to be the defining
legal issue of the next century.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b5b18e2a-df88-41ef-bc8b-69b46307e908" /><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>Cloud legal</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,b5b18e2a-df88-41ef-bc8b-69b46307e908.aspx</guid>
      <link>http://blogs.tedneward.com/2012/11/03/Cloud+Legal.aspx</link>
      <pubDate>Sat, 03 Nov 2012 07:14:40 GMT</pubDate>
      <description>&lt;p&gt;
There's an interesting legal interpretation coming out of the Electronic Freedom Foundation
(EFF) around the &lt;a href="https://www.eff.org/deeplinks/2012/10/governments-attack-cloud-computing"&gt;Megaupload
case&lt;/a&gt;, and the EFF has said this: &lt;blockquote&gt; "The government maintains that Mr.
Goodwin lost his property rights in his data by storing it on a cloud computing service.
Specifically, the government argues that both the contract between Megaupload and
Mr. Goodwin (a standard cloud computing contract) and the contract between Megaupload
and the server host, Carpathia (also a standard agreement), "likely limit any property
interest he may have" in his data. (Page 4). If the government is right, no provider
can both protect itself against sudden losses (like those due to a hurricane) and
also promise its customers that their property rights will be maintained when they
use the service. Nor can they promise that their property might not suddenly disappear,
with no reasonable way to get it back if the government comes in with a warrant. Apparently
your property rights "become severely limited" if you allow someone else to host your
data under standard cloud computing arrangements. This argument isn't limited in any
way to Megaupload -- it would apply if the third party host was Amazon's S3 or Google
Apps or or Apple iCloud." &lt;/blockquote&gt; Now, one of the participants on the Seattle
Tech Startup list, Jonathan Shapiro, wrote this as an interpretation of the government's
brief and the EFF filing: &lt;blockquote&gt; 
&lt;p&gt;
What the government actually says is that the state of Mr. Goodwin's property rights
depends on his agreement with the cloud provider and their agreement with the infrastructure
provider. The question ultimately comes down to: if I upload data onto a machine that
you own, who owns the copy of the data that ends up on your machine? The answer to
that question depends on the agreements involved, which is what the government is
saying. Without reviewing the agreements, it isn't clear if the upload should be thought
of as a loan, a gift, a transfer, or something else.
&lt;/p&gt;
&lt;p&gt;
Lacking any physical embodiment, it is not clear whether the bits comprising these
uploaded digital artifacts constitute property in the traditional sense at all. Even
if they do, the government is arguing that who owns the bits may have nothing to do
with who controls the use of the bits; that the two are separate matters. That's quite
standard: your decision to buy a book from the bookstore conveys ownership to you,
but does not give you the right to make further copies of the book. Once a copy of
the data leaves the possession of Mr. Goodwin, the constraints on its use are determined
by copyright law and license terms. The agreement between Goodwin and the cloud provider
clearly narrows the copyright-driven constraints, because the cloud provider has to
be able to make copies to provide their services, and has surely placed terms that
permit this in their user agreement. The consequences for ownership are unclear. In
particular: if the cloud provider (as opposed to Mr. Goodwin) makes an authorized
copy of Goodwin's data in the course of their operations, using only the resources
of the cloud provider, the ownership of that copy doesn't seem obvious at all. A license
may exist requiring that copy to be destroyed under certain circumstances (e.g. if
Mr. Goodwin terminates his contract), but that doesn't speak to ownership of the copy.
&lt;/p&gt;
&lt;p&gt;
Because no sale has occurred, and there was clearly no intent to cede ownership, the
Government's challenge concerning ownership has the feel of violating common sense.
If you share that feeling, welcome to the world of intellectual property law. But
while everyone is looking at the negative side of this argument, it's worth considering
that there may be positive consequences of the Government's argument. In Germany,
for example, software is property. It is illegal (or at least unenforceable) to write
a software license in Germany that stops me from selling my copy of a piece of software
to my friend, so long as I remove it from my machine. A copy of a work of software
can be resold in the same way that a book can be resold because it is property. At
present, the provisions of UCITA in the U.S. have the effect that you do not own a
work of software that you buy. If the district court in Virginia determines that a
recipient has property rights in a copy of software that they receive, that could
have far-reaching consequences, possibly including a consequent right of resale in
the United States.
&lt;/p&gt;
&lt;/blockquote&gt; &gt;
&lt;p&gt;
Now, whether or not Jon's interpretation is correct, there are some huge legal implications
of this interpretation of the cloud, because data "ownership" is going to be the defining
legal issue of the next century.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b5b18e2a-df88-41ef-bc8b-69b46307e908" /&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,b5b18e2a-df88-41ef-bc8b-69b46307e908.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>Flash</category>
      <category>Industry</category>
      <category>iPhone</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Personal</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
      <category>XNA</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=8ba92902-6b49-43fb-b558-e1e46bce565e</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,8ba92902-6b49-43fb-b558-e1e46bce565e.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,8ba92902-6b49-43fb-b558-e1e46bce565e.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8ba92902-6b49-43fb-b558-e1e46bce565e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As the calendar year comes to a close, it's time (it's well past time, in fact) that
I comment publicly on my obvious absence from the No Fluff, Just Stuff tour.
</p>
        <p>
In January, when I emailed Jay Zimmerman, the organizer of the conference, to talk
about topics for the coming year, I got no response. This is pretty typical Jay--he
is notoriously difficult to reach over email, unless he has something he wants from
you. In his defense, that's not an uncommon <i>modus operandi</i> for a lot of people,
and it's pretty common to have to email him several times to get his attention. It's
something I wish he were a little more professional about, but... *shrug* The point
is, when I emailed him and got no response, I didn't think much of it.
</p>
        <p>
However, as soon as the early years' schedule came out, a friend of mine on the tour
emailed me to ask why I wasn't scheduled for any of the shows--I responded with a
rather shocked "Wat?" and checked for myself--sure enough, nowhere on the tour. I
emailed Jay, and... cue the "Sounds of Silence" melody.
</p>
        <p>
Apparently, my participation was no longer desired.
</p>
        <p>
Now, in all fairness, last year I joined <a href="http://www.neudesic.com">Neudesic,
LLC</a> as a full-time employee, working as an Architectural Consultant and I mentioned
to Jay that I was interested in scaling back my participation from all the shows (25
or so across the year) to maybe 15 or so, but at no point did I ever intend to give
him the impression that I wanted to pull off the tour entirely. Granted, the travel
schedule is brutal--last year (calendar year 2011) it wasn't uncommon for me to be
doing three talks each day (Friday, Saturday and Sunday), and living in Seattle usually
meant that I had to use all day Thursday to fly out to wherever the show was being
held, and could sometimes return on Sunday night but more often had to fly back on
Monday, making for a pretty long weekend. But I enjoyed hanging with my speaker buddies,
I enjoyed engaging with the crowds, and I definitely enjoyed the "aha" moments that
would fire off inside my head while speaking. (I'm an "external processor", so talking
out loud is actually a very effective way for me to think about things.)
</p>
        <p>
Across the year, I got a few emails and Tweets from people asking about my absence,
and I always tried to respond to those as fairly and politely as I could without hiding
the fact that I wished I was still there. In truth, folks, I have to admit, I enjoy
having my weekends back. I miss the tour, but being off of it has made me realize
just how much family time I was missing when I was off gallavanting across the country
to various hotel conference rooms to talk about JVMs or languages or APIs. I miss
hanging with my speaker friends, but friends remain friends regardless of circumstance,
and I'm happy to say that holds true here as well. I miss the chance to hone my ideas
and talks, but that in of itself isn't enough to justify missing out on my 13-year-old's
football games or just enjoying a quiet Saturday with my wife on the back porch.
</p>
        <p>
All in all, though I didn't ask for it, my rather unceremonious "boot" to the backside
off the tour has worked out quite well. Yes, I'd love to come back to the tour and
talk again, but that's up to Jay, not me. I wouldn't mind coming back, but I don't
mind not being there, either. And, quite honestly, I think there's probably more than
a few attendees who are a bit relieved that I'm not there, since sitting in on my
sessions was always running the risk that they'd be singled out publicly, which I've
been told is something of a "character-building experience". *grin*
</p>
        <p>
Long story short, if enough NFJS attendee alumni make the noise to Jay to bring me
back, and he offers it, I'd take it. But it's not something I need to do, so if the
crowds at NFJS are happy without me, then I'm happy to stay home, sip my Diet Coke,
blog a little more, and just bask in the memories of almost a full decade of the NFJS
experience. It was a hell of a run, and I'm very content with having been there from
almost the very beginning and helping to make that into one of the best conference
experiences anyone's ever had.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8ba92902-6b49-43fb-b558-e1e46bce565e" />
        <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 NFJS</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,8ba92902-6b49-43fb-b558-e1e46bce565e.aspx</guid>
      <link>http://blogs.tedneward.com/2012/10/16/On+NFJS.aspx</link>
      <pubDate>Tue, 16 Oct 2012 10:11:31 GMT</pubDate>
      <description>&lt;p&gt;
As the calendar year comes to a close, it's time (it's well past time, in fact) that
I comment publicly on my obvious absence from the No Fluff, Just Stuff tour.
&lt;/p&gt;
&lt;p&gt;
In January, when I emailed Jay Zimmerman, the organizer of the conference, to talk
about topics for the coming year, I got no response. This is pretty typical Jay--he
is notoriously difficult to reach over email, unless he has something he wants from
you. In his defense, that's not an uncommon &lt;i&gt;modus operandi&lt;/i&gt; for a lot of people,
and it's pretty common to have to email him several times to get his attention. It's
something I wish he were a little more professional about, but... *shrug* The point
is, when I emailed him and got no response, I didn't think much of it.
&lt;/p&gt;
&lt;p&gt;
However, as soon as the early years' schedule came out, a friend of mine on the tour
emailed me to ask why I wasn't scheduled for any of the shows--I responded with a
rather shocked "Wat?" and checked for myself--sure enough, nowhere on the tour. I
emailed Jay, and... cue the "Sounds of Silence" melody.
&lt;/p&gt;
&lt;p&gt;
Apparently, my participation was no longer desired.
&lt;/p&gt;
&lt;p&gt;
Now, in all fairness, last year I joined &lt;a href="http://www.neudesic.com"&gt;Neudesic,
LLC&lt;/a&gt; as a full-time employee, working as an Architectural Consultant and I mentioned
to Jay that I was interested in scaling back my participation from all the shows (25
or so across the year) to maybe 15 or so, but at no point did I ever intend to give
him the impression that I wanted to pull off the tour entirely. Granted, the travel
schedule is brutal--last year (calendar year 2011) it wasn't uncommon for me to be
doing three talks each day (Friday, Saturday and Sunday), and living in Seattle usually
meant that I had to use all day Thursday to fly out to wherever the show was being
held, and could sometimes return on Sunday night but more often had to fly back on
Monday, making for a pretty long weekend. But I enjoyed hanging with my speaker buddies,
I enjoyed engaging with the crowds, and I definitely enjoyed the "aha" moments that
would fire off inside my head while speaking. (I'm an "external processor", so talking
out loud is actually a very effective way for me to think about things.)
&lt;/p&gt;
&lt;p&gt;
Across the year, I got a few emails and Tweets from people asking about my absence,
and I always tried to respond to those as fairly and politely as I could without hiding
the fact that I wished I was still there. In truth, folks, I have to admit, I enjoy
having my weekends back. I miss the tour, but being off of it has made me realize
just how much family time I was missing when I was off gallavanting across the country
to various hotel conference rooms to talk about JVMs or languages or APIs. I miss
hanging with my speaker friends, but friends remain friends regardless of circumstance,
and I'm happy to say that holds true here as well. I miss the chance to hone my ideas
and talks, but that in of itself isn't enough to justify missing out on my 13-year-old's
football games or just enjoying a quiet Saturday with my wife on the back porch.
&lt;/p&gt;
&lt;p&gt;
All in all, though I didn't ask for it, my rather unceremonious "boot" to the backside
off the tour has worked out quite well. Yes, I'd love to come back to the tour and
talk again, but that's up to Jay, not me. I wouldn't mind coming back, but I don't
mind not being there, either. And, quite honestly, I think there's probably more than
a few attendees who are a bit relieved that I'm not there, since sitting in on my
sessions was always running the risk that they'd be singled out publicly, which I've
been told is something of a "character-building experience". *grin*
&lt;/p&gt;
&lt;p&gt;
Long story short, if enough NFJS attendee alumni make the noise to Jay to bring me
back, and he offers it, I'd take it. But it's not something I need to do, so if the
crowds at NFJS are happy without me, then I'm happy to stay home, sip my Diet Coke,
blog a little more, and just bask in the memories of almost a full decade of the NFJS
experience. It was a hell of a run, and I'm very content with having been there from
almost the very beginning and helping to make that into one of the best conference
experiences anyone's ever had.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8ba92902-6b49-43fb-b558-e1e46bce565e" /&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,8ba92902-6b49-43fb-b558-e1e46bce565e.aspx</comments>
      <category>Android</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>Scala</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Windows</category>
    </item>
  </channel>
</rss>