<?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 - Development Processes</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>Thu, 09 Sep 2010 03:53:01 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=bd7339e6-fdd5-4f2a-b711-de9a38f6c743</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bd7339e6-fdd5-4f2a-b711-de9a38f6c743</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hey, anybody who’s got significant VMWare mojo, help out a bro?
</p>
        <p>
I’ve got a Win7 VM (one of many) that appears to be exhibiting weird disk behavior—the
vmdk, a growable single-file VMDK, is almost precisely twice the used space. It’s
a 120GB growable disk, and the Win7 guest reports about 35GB used, but the VMDK takes
about 70GB on host disk. CHKDSK inside Windows says everything’s good, and the VMWare
“Disk Cleanup” doesn’t change anything, either. It doesn’t seem to be a Windows7 thing,
because I’ve got a half-dozen other Win7 VMs that operate… well, normally (by which
I mean, 30GB used in the VMDK means 30GB used on disk). It’s a VMWare Fusion host,
if that makes any difference. Any other details that might be relevant, let me know
and I’ll post.
</p>
        <p>
Anybody got any ideas what the heck is going on inside this disk?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=bd7339e6-fdd5-4f2a-b711-de9a38f6c743" />
        <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>VMWare help</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.aspx</guid>
      <link>http://blogs.tedneward.com/2010/09/09/VMWare+Help.aspx</link>
      <pubDate>Thu, 09 Sep 2010 03:53:01 GMT</pubDate>
      <description>&lt;p&gt;
Hey, anybody who’s got significant VMWare mojo, help out a bro?
&lt;/p&gt;
&lt;p&gt;
I’ve got a Win7 VM (one of many) that appears to be exhibiting weird disk behavior—the
vmdk, a growable single-file VMDK, is almost precisely twice the used space. It’s
a 120GB growable disk, and the Win7 guest reports about 35GB used, but the VMDK takes
about 70GB on host disk. CHKDSK inside Windows says everything’s good, and the VMWare
“Disk Cleanup” doesn’t change anything, either. It doesn’t seem to be a Windows7 thing,
because I’ve got a half-dozen other Win7 VMs that operate… well, normally (by which
I mean, 30GB used in the VMDK means 30GB used on disk). It’s a VMWare Fusion host,
if that makes any difference. Any other details that might be relevant, let me know
and I’ll post.
&lt;/p&gt;
&lt;p&gt;
Anybody got any ideas what the heck is going on inside this disk?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=bd7339e6-fdd5-4f2a-b711-de9a38f6c743" /&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,bd7339e6-fdd5-4f2a-b711-de9a38f6c743.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>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>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=479e3371-5ecf-4379-b9d4-f7cf070aae82</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,479e3371-5ecf-4379-b9d4-f7cf070aae82.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,479e3371-5ecf-4379-b9d4-f7cf070aae82.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=479e3371-5ecf-4379-b9d4-f7cf070aae82</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
By now, the Twitter messages have spread, and the word is out: at Uberconf this year,
I did a session ("Pragmatic Architecture"), which I've done at other venues
before, but this time we made it into a 180-minute workshop instead of a 90-minute
session, and the workshop included breaking the room up into small (10-ish, which
was still a teensy bit too big) groups and giving each one an "architectural
kata" to work on.
</p>
        <p>
The architectural kata is a take on PragDave's coding kata, except taken to a higher
level: the architectural kata is an exercise in which the group seeks to create an
architecture to solve the problem presented. The inspiration for this came from Frederick
Brooks' latest book, <em>The Design of Design</em>, in which he points out that the
only way to get great designers is to get them to design. The corollary, of course,
is that in order to create great architects, we have to get them to architect. But
few architects get a chance to architect a system more than a half-dozen times or
so over the lifetime of a career, and that's only for those who are fortunate to be
given the opportunity to architect in the first place. Of course, the problem here
is, you have to be an architect in order to get hired as an architect, but if you're
not an architect, then how can you architect in order to become an architect?
</p>
        <p>
Um... hang on, let me make sure I wrote that right.
</p>
        <p>
Anyway, the "rules" around the kata (which makes it more difficult to consume
the kata but makes the scenario more realistic, IMHO):
</p>
        <ul>
          <li>
you may ask the instructor questions about the project</li>
          <li>
you must be prepared to present a rough architectural vision of the project and defend
questions about it</li>
          <li>
you must be prepared to ask questions of other participants' presentations</li>
          <li>
you may safely make assumptions about technologies you don't know well as long as
those assumptions are clearly defined and spelled out</li>
          <li>
you may not assume you have hiring/firing authority over the development team</li>
          <li>
any technology is fair game (but you must justify its use)</li>
          <li>
any other rules, you may ask about</li>
        </ul>
        <p>
The groups were given 30 minutes in which to formulate some ideas, and then three
of them were given a few minutes to present their ideas and defend it against some
questions from the crowd.
</p>
        <p>
An example kata is below:
</p>
        <blockquote>
          <p>
            <strong>Architectural Kata #5: I'll have the BLT</strong>
          </p>
          <p>
a national sandwich shop wants to enable "fax in your order" but over the
Internet instead
</p>
          <p>
users: millions+
</p>
          <p>
requirements: users will place their order, then be given a time to pick up their
sandwich and directions to the shop (which must integrate with Google Maps); if the
shop offers a delivery service, dispatch the driver with the sandwich to the user;
mobile-device accessibility; offer national daily promotionals/specials; offer local
daily promotionals/specials; accept payment online or in person/on delivery
</p>
        </blockquote>
        <p>
As you can tell, it's vague in some ways, and this is somewhat deliberate—as one group
discovered, part of the architect's job is to ask questions of the project champion
(me), and they didn't, and felt like they failed pretty miserably. (In their defense,
the kata they drew—randomly—was pretty much universally thought to be the hardest
of the lot.) But overall, the exercise was well-received, lots of people found it
a great opportunity to try being an architect, and even the team that failed felt
that it was a valuable exercise.
</p>
        <p>
I'm definitely going to do more of these, and refine the whole thing a little. (Thanks
to everyone who participated and gave me great feedback on how to make it better.)
If you're interested in having it done as a practice exercise for your development
team before the start of a big project, ping me. I think this would be a *great* exercise
to do during a user group meeting, too.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=479e3371-5ecf-4379-b9d4-f7cf070aae82" />
        <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>Architectural Katas</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,479e3371-5ecf-4379-b9d4-f7cf070aae82.aspx</guid>
      <link>http://blogs.tedneward.com/2010/06/17/Architectural+Katas.aspx</link>
      <pubDate>Thu, 17 Jun 2010 08:42:47 GMT</pubDate>
      <description>&lt;p&gt;
By now, the Twitter messages have spread, and the word is out: at Uberconf this year,
I did a session (&amp;quot;Pragmatic Architecture&amp;quot;), which I've done at other venues
before, but this time we made it into a 180-minute workshop instead of a 90-minute
session, and the workshop included breaking the room up into small (10-ish, which
was still a teensy bit too big) groups and giving each one an &amp;quot;architectural
kata&amp;quot; to work on.
&lt;/p&gt;
&lt;p&gt;
The architectural kata is a take on PragDave's coding kata, except taken to a higher
level: the architectural kata is an exercise in which the group seeks to create an
architecture to solve the problem presented. The inspiration for this came from Frederick
Brooks' latest book, &lt;em&gt;The Design of Design&lt;/em&gt;, in which he points out that the
only way to get great designers is to get them to design. The corollary, of course,
is that in order to create great architects, we have to get them to architect. But
few architects get a chance to architect a system more than a half-dozen times or
so over the lifetime of a career, and that's only for those who are fortunate to be
given the opportunity to architect in the first place. Of course, the problem here
is, you have to be an architect in order to get hired as an architect, but if you're
not an architect, then how can you architect in order to become an architect?
&lt;/p&gt;
&lt;p&gt;
Um... hang on, let me make sure I wrote that right.
&lt;/p&gt;
&lt;p&gt;
Anyway, the &amp;quot;rules&amp;quot; around the kata (which makes it more difficult to consume
the kata but makes the scenario more realistic, IMHO):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
you may ask the instructor questions about the project&lt;/li&gt;
&lt;li&gt;
you must be prepared to present a rough architectural vision of the project and defend
questions about it&lt;/li&gt;
&lt;li&gt;
you must be prepared to ask questions of other participants' presentations&lt;/li&gt;
&lt;li&gt;
you may safely make assumptions about technologies you don't know well as long as
those assumptions are clearly defined and spelled out&lt;/li&gt;
&lt;li&gt;
you may not assume you have hiring/firing authority over the development team&lt;/li&gt;
&lt;li&gt;
any technology is fair game (but you must justify its use)&lt;/li&gt;
&lt;li&gt;
any other rules, you may ask about&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The groups were given 30 minutes in which to formulate some ideas, and then three
of them were given a few minutes to present their ideas and defend it against some
questions from the crowd.
&lt;/p&gt;
&lt;p&gt;
An example kata is below:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Architectural Kata #5: I'll have the BLT&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
a national sandwich shop wants to enable &amp;quot;fax in your order&amp;quot; but over the
Internet instead
&lt;/p&gt;
&lt;p&gt;
users: millions+
&lt;/p&gt;
&lt;p&gt;
requirements: users will place their order, then be given a time to pick up their
sandwich and directions to the shop (which must integrate with Google Maps); if the
shop offers a delivery service, dispatch the driver with the sandwich to the user;
mobile-device accessibility; offer national daily promotionals/specials; offer local
daily promotionals/specials; accept payment online or in person/on delivery
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As you can tell, it's vague in some ways, and this is somewhat deliberate—as one group
discovered, part of the architect's job is to ask questions of the project champion
(me), and they didn't, and felt like they failed pretty miserably. (In their defense,
the kata they drew—randomly—was pretty much universally thought to be the hardest
of the lot.) But overall, the exercise was well-received, lots of people found it
a great opportunity to try being an architect, and even the team that failed felt
that it was a valuable exercise.
&lt;/p&gt;
&lt;p&gt;
I'm definitely going to do more of these, and refine the whole thing a little. (Thanks
to everyone who participated and gave me great feedback on how to make it better.)
If you're interested in having it done as a practice exercise for your development
team before the start of a big project, ping me. I think this would be a *great* exercise
to do during a user group meeting, too.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=479e3371-5ecf-4379-b9d4-f7cf070aae82" /&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,479e3371-5ecf-4379-b9d4-f7cf070aae82.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>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>Ruby</category>
      <category>Scala</category>
      <category>Security</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>WCF</category>
      <category>XML Services</category>
      <category>XNA</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=a2b21a39-22ae-4ba7-88a4-1bcb10e8429b</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,a2b21a39-22ae-4ba7-88a4-1bcb10e8429b.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,a2b21a39-22ae-4ba7-88a4-1bcb10e8429b.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a2b21a39-22ae-4ba7-88a4-1bcb10e8429b</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As a part of my program to learn how to use the Mac OS more effectively (mostly to
counteract my lack of Mac-command-line kung fu, but partly to get Neal Ford off my
back ;-) ), I set the home page in Firefox to point to the <a href="http://osxdaily.com/" target="_blank">OSX
Daily</a> website. This morning, <a href="http://osxdaily.com/2010/05/13/print-screen-mac/" target="_blank">this
particular page</a> popped up as the "tip of the day", and a particular
thing about it struck my fancy. Go ahead and glance at it before you continue on.
</p>
        <p>
On its own merits, there's nothing particularly interesting about it—it's a tip about
how to do a screen-capture in OS X, which is hardly a breakthrough feature. But something
about the tenor struck me: "You’ve probably noticed there is no ‘Print Screen’
button on a Mac keyboard, this is to both simplify the keyboard and also because it’s
unnecessary. Instead of hitting a “Print Screen” button, you’ll hit one of several
keyboard combination shortcuts, depending on the exact screen capture action you want
taken. ... Command+Shift+3 takes a screenshot of the full screen ... Command+Shift+4
brings up a selection box .... Command+Shift+4, then spacebar, then click a window
takes a screenshot of the window...."
</p>
        <p>
Wait a second. This is <em>simpler</em>?
</p>
        <p>
If "you're a PC", you're probably rolling on the floor with laughter at
this moment, determined to go find a Mac fanboi and Lord it over him that it requires
the use of no less than three keystrokes to take a friggin' screenshot.
</p>
        <p>
If, on the other hand, you love the Mac, you're probably chuckling at the idiocy of
PC manufacturers who continue to keep a key on the keyboard dating back from the terminal
days (right next to "Scroll Lock") that rarely, if ever, gets used.
</p>
        <p>
Who's right? Who's the idiot?
</p>
        <p>
You both are.
</p>
        <p>
See, the fact is, your perceptions of a particular element of the different platforms
(the menubar at the top of the screen vs. in the main window of the app, the one-button
vs. two-button mouse, and so on) colors your response. If you have emotionally committed
to the Mac, then anything it does is naturally right and obvious; if you've emotionally
committed to Windows, then ditto. This is a natural psychological response—it happens
to everybody, to some degree or another. We need, at a subconscious level, to know
that our decisions were the right ones to have made, so we look for those facts which
confirm the decision, and avoid the facts that question it. (It's this same psychological
drive that causes battered wives to defend their battering husbands to the police
and intervening friends/family, and for people who've already committed to one political
party or the other to see huge gaping holes in logic in the opponents' debate responses,
but to gloss over their own candidates'.)
</p>
        <p>
Why bring it up? Because this also is what drives developers to justify the decisions
they've made in developing software—when a user or another developer questions a particular
decision, the temptation is to defend it to the dying breath, because it was a decision
we made. We start looking for justifications to back it, we start aggressively questioning
the challenger's competency or right to question the decision, you name it. It's a
hard thing, to admit we might have been wrong, and even harder to admit that even
though we might have been right, we were for the wrong reasons, or the decision still
was the wrong one, or—perhaps hardest of all—the users simply like it the other way,
even though this way is vastly more efficient and sane.
</p>
        <p>
Have you admitted you were wrong lately?
</p>
        <p>
(Check out <em><a href="http://www.amazon.com/Predictably-Irrational-Hidden-Forces-Decisions/dp/006135323X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1273833371&amp;sr=8-1" target="_blank">Predictably
Irrational</a></em>, <em><a href="http://www.amazon.com/How-We-Decide-Jonah-Lehrer/dp/0547247990/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1273833400&amp;sr=8-1" target="_blank">How
We Decide</a></em>, and <em><a href="http://www.amazon.com/Why-We-Make-Mistakes-Without/dp/0767928067/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1273833436&amp;sr=8-1" target="_blank">Why
We Make Mistakes</a></em> for more details on the psychology of decision-making.)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a2b21a39-22ae-4ba7-88a4-1bcb10e8429b" />
        <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>Emotional commitment colors everything</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,a2b21a39-22ae-4ba7-88a4-1bcb10e8429b.aspx</guid>
      <link>http://blogs.tedneward.com/2010/05/14/Emotional+Commitment+Colors+Everything.aspx</link>
      <pubDate>Fri, 14 May 2010 10:40:33 GMT</pubDate>
      <description>&lt;p&gt;
As a part of my program to learn how to use the Mac OS more effectively (mostly to
counteract my lack of Mac-command-line kung fu, but partly to get Neal Ford off my
back ;-) ), I set the home page in Firefox to point to the &lt;a href="http://osxdaily.com/" target="_blank"&gt;OSX
Daily&lt;/a&gt; website. This morning, &lt;a href="http://osxdaily.com/2010/05/13/print-screen-mac/" target="_blank"&gt;this
particular page&lt;/a&gt; popped up as the &amp;quot;tip of the day&amp;quot;, and a particular
thing about it struck my fancy. Go ahead and glance at it before you continue on.
&lt;/p&gt;
&lt;p&gt;
On its own merits, there's nothing particularly interesting about it—it's a tip about
how to do a screen-capture in OS X, which is hardly a breakthrough feature. But something
about the tenor struck me: &amp;quot;You’ve probably noticed there is no ‘Print Screen’
button on a Mac keyboard, this is to both simplify the keyboard and also because it’s
unnecessary. Instead of hitting a “Print Screen” button, you’ll hit one of several
keyboard combination shortcuts, depending on the exact screen capture action you want
taken. ... Command+Shift+3 takes a screenshot of the full screen ... Command+Shift+4
brings up a selection box .... Command+Shift+4, then spacebar, then click a window
takes a screenshot of the window....&amp;quot;
&lt;/p&gt;
&lt;p&gt;
Wait a second. This is &lt;em&gt;simpler&lt;/em&gt;?
&lt;/p&gt;
&lt;p&gt;
If &amp;quot;you're a PC&amp;quot;, you're probably rolling on the floor with laughter at
this moment, determined to go find a Mac fanboi and Lord it over him that it requires
the use of no less than three keystrokes to take a friggin' screenshot.
&lt;/p&gt;
&lt;p&gt;
If, on the other hand, you love the Mac, you're probably chuckling at the idiocy of
PC manufacturers who continue to keep a key on the keyboard dating back from the terminal
days (right next to &amp;quot;Scroll Lock&amp;quot;) that rarely, if ever, gets used.
&lt;/p&gt;
&lt;p&gt;
Who's right? Who's the idiot?
&lt;/p&gt;
&lt;p&gt;
You both are.
&lt;/p&gt;
&lt;p&gt;
See, the fact is, your perceptions of a particular element of the different platforms
(the menubar at the top of the screen vs. in the main window of the app, the one-button
vs. two-button mouse, and so on) colors your response. If you have emotionally committed
to the Mac, then anything it does is naturally right and obvious; if you've emotionally
committed to Windows, then ditto. This is a natural psychological response—it happens
to everybody, to some degree or another. We need, at a subconscious level, to know
that our decisions were the right ones to have made, so we look for those facts which
confirm the decision, and avoid the facts that question it. (It's this same psychological
drive that causes battered wives to defend their battering husbands to the police
and intervening friends/family, and for people who've already committed to one political
party or the other to see huge gaping holes in logic in the opponents' debate responses,
but to gloss over their own candidates'.)
&lt;/p&gt;
&lt;p&gt;
Why bring it up? Because this also is what drives developers to justify the decisions
they've made in developing software—when a user or another developer questions a particular
decision, the temptation is to defend it to the dying breath, because it was a decision
we made. We start looking for justifications to back it, we start aggressively questioning
the challenger's competency or right to question the decision, you name it. It's a
hard thing, to admit we might have been wrong, and even harder to admit that even
though we might have been right, we were for the wrong reasons, or the decision still
was the wrong one, or—perhaps hardest of all—the users simply like it the other way,
even though this way is vastly more efficient and sane.
&lt;/p&gt;
&lt;p&gt;
Have you admitted you were wrong lately?
&lt;/p&gt;
&lt;p&gt;
(Check out &lt;em&gt;&lt;a href="http://www.amazon.com/Predictably-Irrational-Hidden-Forces-Decisions/dp/006135323X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1273833371&amp;amp;sr=8-1" target="_blank"&gt;Predictably
Irrational&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://www.amazon.com/How-We-Decide-Jonah-Lehrer/dp/0547247990/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1273833400&amp;amp;sr=8-1" target="_blank"&gt;How
We Decide&lt;/a&gt;&lt;/em&gt;, and &lt;em&gt;&lt;a href="http://www.amazon.com/Why-We-Make-Mistakes-Without/dp/0767928067/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1273833436&amp;amp;sr=8-1" target="_blank"&gt;Why
We Make Mistakes&lt;/a&gt;&lt;/em&gt; for more details on the psychology of decision-making.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a2b21a39-22ae-4ba7-88a4-1bcb10e8429b" /&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,a2b21a39-22ae-4ba7-88a4-1bcb10e8429b.aspx</comments>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Industry</category>
      <category>Mac OS</category>
      <category>Reading</category>
      <category>Solaris</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=0e4f9c86-b602-42d7-8729-662d855fd69f</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0e4f9c86-b602-42d7-8729-662d855fd69f</wfw:commentRss>
      <slash:comments>13</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://codekata.pragprog.com/2007/01/code_katahow_it.html" target="_blank">Code
Katas</a> are small, relatively simple exercises designed to give you a problem to
try and solve. I like to use them as a way to get my feet wet and help write something
more interesting than "Hello World" but less complicated than "The
Internet's Next Killer App".
</p>
        <p>
 
</p>
        <p>
          <a href="http://richardminerich.com/2010/04/the-ted-neward-f-folding-challenge/" target="_blank">Rick
Minerich</a> mentioned this one on his blog already, but here is the original "problem"/challenge
as it was presented to me and which I in turn shot to him over a Twitter DM:
</p>
        <p>
 
</p>
        <p>
I have a list, say something like [4, 4, 4, 4, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, 1,
5, 5], which consists of varying repetitions of integers. (We can assume that it's
always numbers, and the use of the term "list" here is generic—it could
be a list, array, or some other collection class, your choice.) The goal is to take
this list of numbers, and "compress" it down into a (theoretically smaller)
list of numbers in pairs, where the first of the pair is the occurrence number of
the value, which is the second number. So, since the list above has four 4's, followed
by three 2's, two 3's, four 2's, three 1's and two 5's, it should compress into [4,
4, 3, 2, 2, 3, 3, 1, 2, 5]. 
</p>
        <blockquote>
          <p>
            <strong>Update:</strong> Typo! It should compress into [4, 4, 3, 2, 2, 3, 4, 2, 3,
1, 2, 5], not [4, 4, 3, 2, 2, 3, 3, 1, 2, 5]. Sorry!
</p>
        </blockquote>
        <p>
Using your functional language of choice, implement a solution. (No looking at Rick's
solution first, by the way—that's cheating!) Feel free to post proposed solutions
here as comments, by the way.
</p>
        <p>
 
</p>
        <p>
This is a pretty easy challenge, but I wanted to try and solve it in a functional
mindset, which the challenger had never seen before. I also thought it made for an
interesting challenge for people who've never programming in functional languages
before, because it requires a very different approach than the imperative solution.
</p>
        <p>
 
</p>
        <p>
Extensions to the kata (a.k.a. "extra credit"):
</p>
        <ul>
          <li>
How does the implementation change (if any) to generalize it to a list of any particular
type? (Assume the list is of homogenous type—always strings, always ints, always whatever.)</li>
          <li>
How does the implementation change (if any) to generalize it to a list of any type?
(In other words, a list of strings, ints, Dates, whatever, mixed together within the
list: [1, 1, "one", "one", "one", ...] .)</li>
          <li>
How does the implementation change (if any) to generate a list of two-item tuples
(the first being the occurence, the second being the value) as the result instead?
Are there significant advantages to this?</li>
          <li>
How does the implementation change (if any) to parallelize/multi-thread it? For your
particular language how many elements have to be in the list before doing so yields
a significant payoff?</li>
        </ul>
        <p>
By the way, some of the extension questions make the Kata somewhat interesting even
for the imperative/O-O developer; have at, and let me know what you think.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0e4f9c86-b602-42d7-8729-662d855fd69f" />
        <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>Code Kata: Compressing Lists</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</guid>
      <link>http://blogs.tedneward.com/2010/05/06/Code+Kata+Compressing+Lists.aspx</link>
      <pubDate>Thu, 06 May 2010 21:42:09 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://codekata.pragprog.com/2007/01/code_katahow_it.html" target="_blank"&gt;Code
Katas&lt;/a&gt; are small, relatively simple exercises designed to give you a problem to
try and solve. I like to use them as a way to get my feet wet and help write something
more interesting than &amp;quot;Hello World&amp;quot; but less complicated than &amp;quot;The
Internet's Next Killer App&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://richardminerich.com/2010/04/the-ted-neward-f-folding-challenge/" target="_blank"&gt;Rick
Minerich&lt;/a&gt; mentioned this one on his blog already, but here is the original &amp;quot;problem&amp;quot;/challenge
as it was presented to me and which I in turn shot to him over a Twitter DM:
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
I have a list, say something like [4, 4, 4, 4, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, 1,
5, 5], which consists of varying repetitions of integers. (We can assume that it's
always numbers, and the use of the term &amp;quot;list&amp;quot; here is generic—it could
be a list, array, or some other collection class, your choice.) The goal is to take
this list of numbers, and &amp;quot;compress&amp;quot; it down into a (theoretically smaller)
list of numbers in pairs, where the first of the pair is the occurrence number of
the value, which is the second number. So, since the list above has four 4's, followed
by three 2's, two 3's, four 2's, three 1's and two 5's, it should compress into [4,
4, 3, 2, 2, 3, 3, 1, 2, 5]. 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; Typo! It should compress into [4, 4, 3, 2, 2, 3, 4, 2, 3,
1, 2, 5], not [4, 4, 3, 2, 2, 3, 3, 1, 2, 5]. Sorry!
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Using your functional language of choice, implement a solution. (No looking at Rick's
solution first, by the way—that's cheating!) Feel free to post proposed solutions
here as comments, by the way.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
This is a pretty easy challenge, but I wanted to try and solve it in a functional
mindset, which the challenger had never seen before. I also thought it made for an
interesting challenge for people who've never programming in functional languages
before, because it requires a very different approach than the imperative solution.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Extensions to the kata (a.k.a. &amp;quot;extra credit&amp;quot;):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
How does the implementation change (if any) to generalize it to a list of any particular
type? (Assume the list is of homogenous type—always strings, always ints, always whatever.)&lt;/li&gt;
&lt;li&gt;
How does the implementation change (if any) to generalize it to a list of any type?
(In other words, a list of strings, ints, Dates, whatever, mixed together within the
list: [1, 1, &amp;quot;one&amp;quot;, &amp;quot;one&amp;quot;, &amp;quot;one&amp;quot;, ...] .)&lt;/li&gt;
&lt;li&gt;
How does the implementation change (if any) to generate a list of two-item tuples
(the first being the occurence, the second being the value) as the result instead?
Are there significant advantages to this?&lt;/li&gt;
&lt;li&gt;
How does the implementation change (if any) to parallelize/multi-thread it? For your
particular language how many elements have to be in the list before doing so yields
a significant payoff?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
By the way, some of the extension questions make the Kata somewhat interesting even
for the imperative/O-O developer; have at, and let me know what you think.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0e4f9c86-b602-42d7-8729-662d855fd69f" /&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,0e4f9c86-b602-42d7-8729-662d855fd69f.aspx</comments>
      <category>.NET</category>
      <category>Android</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>Parrot</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Visual Basic</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=4b2137dd-11cc-4ad5-8771-5906f2759273</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4b2137dd-11cc-4ad5-8771-5906f2759273</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Cruising the Web late last night, I ran across <a href="http://blogs.techrepublic.com.com/10things/?p=1297" target="_blank">"10
things you can do to advance your career as a developer"</a>, summarized below:
</p>
        <ol>
          <li>
Build a PC 
</li>
          <li>
Participate in an online forum and help others 
</li>
          <li>
Man the help desk 
</li>
          <li>
Perform field service 
</li>
          <li>
Perform DBA functions 
</li>
          <li>
Perform all phases of the project lifecycle 
</li>
          <li>
Recognize and learn the latest technologies 
</li>
          <li>
Be an independent contractor 
</li>
          <li>
Lead a project, supervise, or manage 
</li>
          <li>
Seek additional education 
</li>
        </ol>
        <p>
I agreed with some of them, I disagreed with others, and in general felt like they
were a little too high-level to be of real use. For example, "Seek additional
education" seems entirely too vague: In what? How much? How often? And "Recognize
and learn the latest technologies" is something like offering advice to the Olympic
fencing silver medalist and saying, "You should have tried harder".
</p>
        <p>
So, in the great spirit of "Not Invented Here", I present my own list; as
usual, I welcome comment and argument. And, also as usual, caveats apply, since not
everybody will be in precisely the same place and be looking for the same things.
In general, though, whether you're looking to kick-start your career or just "kick
it up a notch", I believe this list will help, because these ideas have been
of help to me at some point or another in my own career.
</p>
        <h3>
          <strong>
            <em>10: Build a PC.</em>
          </strong>
        </h3>
        <p>
Yes, even developers have to know about hardware. More importantly, a developer at
a small organization or team will find himself in a position where he has to take
on some system administrator roles, and sometimes that means grabbing a screwdriver,
getting a little dusty and dirty, and swapping hardware around. Having said this,
though, once you've done it once or twice, leave it alone—the hardware game is an
ever-shifting and ever-changing game (much like software is, surprise surprise), and
it's been my experience that most of us only really have the time to pursue one or
the other.
</p>
        <p>
By the way, "PC" there is something of a generic term—build a Linux box,
build a Windows box, or "build" a Mac OS box (meaning, buy a Mac Pro and
trick it out a little—add more memory, add another hard drive, and so on), they all
get you comfortable with snapping parts together, and discovering just how ridiculously
simple the whole thing really is.
</p>
        <p>
And for the record, once you've done it, go ahead and go back to buying pre-built
systems or laptops—I've never found building a PC to be any cheaper than buying one
pre-built. Particularly for PC systems, I prefer to use smaller local vendors where
I can customize and trick out the box. If you're a Mac, that's not really an option
unless you're into the "Hackintosh" thing, which is quite possibly the logical
equivalent to "Build a PC". Having never done it myself, though, I can't
say how useful that is as an educational action.
</p>
        <h3>
        </h3>
        <h3>
        </h3>
        <h3>
        </h3>
        <h3>
          <strong>
            <em>9: Pick a destination</em>
          </strong>
        </h3>
        <p>
Do you want to run a team of your own? Become an independent contractor? Teach programming
classes? Speak at conferences? Move up into higher management and get out of the programming
game altogether? Everybody's got a different idea of what they consider to be the
"ideal" career, but it's amazing how many people don't really think about
what they want their career path to be.
</p>
        <p>
A wise man once said, "The journey of a thousand miles begins with a single step."
I disagree: The journey of a thousand miles begins with the damn map. You have to
know where you want to go, and a rough idea of how to get there, before you can really
start with that single step. Otherwise, you're just wandering, which in itself isn't
a bad thing, but isn't going to get you to a destination except by random chance.
(Sometimes that's not a bad result, but at least then you're openly admitting that
you're leaving your career in the hands of chance. If you're OK with that, skip to
the next item. If you're not, read on.)
</p>
        <p>
Lay out explicitly (as in, write it down someplace) what kind of job you're wanting
to grow into, and then lay out a couple of scenarios that move you closer towards
that goal. Can you grow within the company you're in? (Have others been able to?)
Do you need to quit and strike out on your own? Do you want to lead a team of your
own? (Are there new projects coming in to the company that you could put yourself
forward as a potential tech lead?) And so on.
</p>
        <p>
Once you've identified the destination, now you can start thinking about steps to
get there. 
</p>
        <p>
If you want to become a speaker, put your name forward to give some presentations
at the local technology user group, or volunteer to hold a "brown bag" session
at the company. Sign up with Toastmasters to hone your speaking technique. Watch other
speakers give technical talks, and see what they do that you don't, and vice versa. 
</p>
        <p>
If you want to be a tech lead, start by quietly assisting other members of the team
get their work done. Help them debug thorny problems. Answer questions they have.
Offer yourself up as a resource for dealing with hard problems.
</p>
        <p>
If you want to slowly move up the management chain, look to get into the project management
side of things. Offer to be a point of contact for the users. Learn the business better.
Sit down next to one of your users and watch their interaction with the existing software,
and try to see the system from their point of view.
</p>
        <p>
And so on.
</p>
        <h3>
          <strong>
            <em>8: Be a bell curve</em>
          </strong>
        </h3>
        <p>
Frequently, at conferences, attendees ask me how I got to know so much on so many
things. In some ways, I'm reminded of the story of a world-famous concert pianist
giving a concert at Carnegie Hall—when a gushing fan said, "I'd give my life
to be able to play like that", the pianist responded quietly, "I did".
But as much as I'd like to leave you with the impression that I've dedicated my entire
life to knowing everything I could about this industry, that would be something of
a lie. The truth is, I don't know anywhere near as much as I'd like, and I'm always
poking my head into new areas. Thank God for my ADD, that's all I can say on that
one.
</p>
        <p>
For the rest of you, though, that's not feasible, and not really practical, particularly
since I have an advantage that the "working" programmer doesn't—I have set
aside weeks or months in which to do nothing more than study a new technology or language.
</p>
        <p>
Back in the early days of my career, though, when I was holding down the 9-to-5, I
was a Windows/C++ programmer. I was working with the Borland C++ compiler and its
associated framework, the ObjectWindows Library (OWL), extending and maintaining applications
written in it. One contracting client wanted me to work with Microsoft MFC instead
of OWL. Another one was storing data into a relational database using ODBC. And so
on. Slowly, over time, I built up a "bell curve"-looking collection of skills
that sort of "hovered" around the central position of C++/Windows.
</p>
        <p>
Then, one day, a buddy of mine mentioned the team on which he was a project manager
was looking for new blood. They were doing web applications, something with which
I had zero experience—this was completely outside of my bell curve. HTML, HTTP, Cold
Fusion, NetDynamics (an early Java app server), this was way out of my range, though
at least NetDynamics was a <em>little</em> similar, since it was basically a server-side
application framework, and I had some experience with app frameworks from my C++ days.
So, resting on my C++ experience, I started flirting with Java, and so on.
</p>
        <p>
Before long, my "bell curve" had been readjusted to have Java more or less
at its center, and I found that experience in C++ still worked out here—what I knew
about ODBC turned out to be incredibly useful in understanding JDBC, what I knew about
DLLs from Windows turned out to be helpful in understanding Java's dynamic loading
model, and of course syntactically Java looked a lot like C++ even though it behaved
a little bit differently under the hood. (One article author suggested that Java was
closer to Smalltalk than C++, and that prompted me to briefly flirt with Smalltalk
before I concluded said author was out of his frakking mind.)
</p>
        <p>
All of this happened over roughly a three-year period, by the way.
</p>
        <p>
The point here is that you won't be able to assimilate the entire industry in a single
sitting, so pick something that's relatively close to what you already know, and use
your experience as a springboard to learn something that's new, yet possibly-if-not-probably
useful to your current job. You don't have to be a deep expert in it, and the further
away it is from what you do, the less you really need to know about it (hence the
bell curve metaphor), but you're still exposing yourself to new ideas and new concepts
and new tools/technologies that still could be applicable to what you do on a daily
basis. Over time the "center" of your bell curve may drift away from what
you've done to include new things, and that's OK.
</p>
        <h3>
          <strong>
            <em>7: Learn one new thing every year</em>
          </strong>
        </h3>
        <p>
In the last tip, I told you to branch out slowly from what you know. In this tip,
I'm telling you to go throw a dart at something entirely unfamiliar to you and learn
it. Yes, I realize this sounds contradictory. It's because those who stick to only
what they know end up missing the radical shifts of direction that the industry hits
every half-decade or so until it's mainstream and commonplace and "everybody's
doing it".
</p>
        <p>
In their amazing book "The Pragmatic Programmer", Dave Thomas and Andy Hunt
suggest that you learn one new programming language every year. I'm going to amend
that somewhat—not because there aren't enough languages in the world to keep you on
that pace for the rest of your life—far from it, if that's what you want, go learn
Ruby, F#, Scala, Groovy, Clojure, Icon, Io, Erlang, Haskell and Smalltalk, then come
back to me for the list for 2020—but because languages aren't the only thing that
we as developers need to explore. There's a lot of movement going on in areas beyond
languages, and you don't want to be the last kid on the block to know they're happening.
</p>
        <p>
Consider this list: object databases (<a href="http://www.db4o.com" target="_blank">db4o</a>)
and/or the "NoSQL" movement (<a href="http://www.mongodb.org/display/DOCS/Tutorial" target="_blank">MongoDB</a>).
Dependency injection and composable architectures (<a href="http://www.springframework.org" target="_blank">Spring</a>, <a href="http://mef.codeplex.com" target="_blank">MEF</a>).
A dynamic language (<a href="http://www.rubyforge.org" target="_blank">Ruby</a>, <a href="http://www.python.org" target="_blank">Python</a>, <a href="http://www.ecmascript.org" target="_blank">ECMAScript</a>).
A functional language (<a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx" target="_blank">F#</a>, <a href="http://www.scala-lang.org" target="_blank">Scala</a>, <a href="http://www.haskell.org" target="_blank">Haskell</a>).
A Lisp (Common Lisp, <a href="http://clojure.org" target="_blank">Clojure</a>, Scheme,
Nu). A mobile platform (iPhone, Android). "Space"-based architecture (<a href="http://www.gigaspaces.com" target="_blank">Gigaspaces</a>,
Terracotta). Rich UI platforms (Flash/Flex, Silverlight). Browser enhancements (AJAX,
jQuery, HTML 5) and how they're different from the rich UI platforms. And this is
without adding any of the "obvious" stuff, like Cloud, to the list.
</p>
        <p>
(I'm not convinced Cloud is something worth learning this year, anyway.)
</p>
        <p>
You get through that list, you're operating outside of your comfort zone, and chances
are, your boss' comfort zone, which puts you into the enviable position of being somebody
who can advise him around those technologies. <em>DO NOT TAKE THIS TO MEAN YOU MUST
KNOW THEM DEEPLY.</em> Just having a passing familiarity with them can be enough. <em>DO
NOT TAKE THIS TO MEAN YOU SHOULD PROPOSE USING THEM ON THE NEXT PROJECT.</em> In fact,
sometimes the most compelling evidence that you really know where and when they should
be used is when you suggest stealing ideas from the thing, rather than trying to force-fit
the thing onto the project as a whole.
</p>
        <h3>
          <strong>
            <em>6: Practice, practice, practice</em>
          </strong>
        </h3>
        <p>
Speaking of the concert pianist, somebody once asked him how to get to Carnegie Hall.
HIs answer: "Practice, my boy, practice."
</p>
        <p>
The same is true here. You're not going to get to be a better developer without practice.
Volunteer some time—even if it's just an hour a week—on an open-source project, or
start one of your own. Heck, it doesn't even have to be an "open source"
project—just create some requirements of your own, solve a problem that a family member
is having, or rewrite the project you're on as an interesting side-project. Do the
Nike thing and "Just do it". Write some Scala code. Write some F# code.
Once you're past "hello world", write the Scala code to use db4o as a persistent
storage. Wire it up behind Tapestry. Or write straight servlets in Scala. And so on.
</p>
        <h3>
          <strong>
            <em>5: Turn off the TV</em>
          </strong>
        </h3>
        <p>
Speaking of marketing slogans, if you're like most Americans, surveys have shown that
you watch about four hours of TV a day, or 28 hours of TV a week. In that same amount
of time (28 hours over 1 week), you could read the entire set of poems by Maya Angelou,
one F. Scott Fitzgerald novel, all poems by T.S.Eliot, 2 plays by Thornton Wilder,
or all 150 Psalms of the Bible. An average reader, reading just one hour a day, can
finish an "average-sized" book (let's assume about the size of a novel)
in a week, which translates to 52 books a year.
</p>
        <p>
Let's assume a technical book is going to take slightly longer, since it's a bit deeper
in concept and requires you to spend some time experimenting and typing in code; let's
assume that reading and going through the exercises of an average technical book will
require 4 weeks (a month) instead of just one week. That's 12 new tools/languages/frameworks/ideas
you'd be learning per year.
</p>
        <p>
All because you stopped watching David Caruso turn to the camera, whip his sunglasses
off and say something stupid. (I guess it's not his fault; <em>CSI:Miami</em> is a
crap show. The other two are actually not bad, but <em>Miami</em> just makes me retch.) 
</p>
        <p>
After all, when's the last time that David Caruso or the rest of that show did anything
that was even remotely realistic from a computer perspective? (I always laugh out
loud every time they run a database search against some national database on a completely
non-indexable criteria—like a partial license plate number—and it comes back in seconds.
What the hell database are THEY using? I want it!) Soon as you hear The Who break
into that riff, flip off the TV (or set it to mute) and pick up the book on the nightstand
and boost your career. (And hopefully sink Caruso's.)
</p>
        <p>
Or, if you just can't give up your weekly dose of Caruso, then put the book in the
bathroom. Think about it—how much time do you spend in there a week?
</p>
        <p>
And this gets even better when you get a Kindle or other e-reader that accepts PDFs,
or the book you're interested in is natively supported in the e-readers' format. Now
you have it with you for lunch, waiting at dinner for your food to arrive, or while
you're sitting guard on your 10-year-old so he doesn't sneak out of his room after
his bedtime to play more XBox.
</p>
        <h3>
          <strong>
            <em>4: Have a life</em>
          </strong>
        </h3>
        <p>
Speaking of XBox, don't slave your life to work. Pursue other things. Scientists have
repeatedly discovered that exercise helps keep the mind in shape, so take a couple
of hours a week (buh-bye, <em>American Idol</em>) and go get some exercise. Pick up
a new sport you've never played before, or just go work out at the gym. (This year
I'm doing Hopkido and fencing.) Read some nontechnical books. (I recommend anything
by Malcolm Gladwell as a starting point.) Spend time with your family, if you have
one—mine spends at least six or seven hours a week playing "family games"
like <a href="http://www.realitycheckgames.com/Products/127-the-settlers-of-catan.aspx" target="_blank">Settlers
of Catan</a>, <a href="http://www.realitycheckgames.com/Products/113-dominion.aspx" target="_blank">Dominion</a>, <a href="http://www.realitycheckgames.com/Products/88-to-court-the-king.aspx" target="_blank">To
Court The King</a>, <a href="http://www.realitycheckgames.com/Products/98-munchkin.aspx" target="_blank">Munchkin</a>,
and other non-traditional games, usually over lunch or dinner. I also belong to an
informal "Game Night club" in Redmond consisting of several Microsoft employees
and their families, as well as outsiders. And so on. Heck, go to a local bar and watch
the game, and you'll meet some really interesting people. And some boring people,
too, but you don't have to talk to them during the next game if you don't want.
</p>
        <p>
This isn't just about maintaining a healthy work-life balance—it's also about having
interests that other people can latch on to, qualities that will make you more "human"
and more interesting as a person, and make you more attractive and "connectable"
and stand out better in their mind when they hear that somebody they know is looking
for a software developer. This will also help you connect better with your users,
because like it or not, they do <em>not</em> get your puns involving Klingon. (Besides,
the geek stereotype is SO 90's, and it's time we let the world know that.)
</p>
        <p>
Besides, you never know when having some depth in other areas—philosophy, music, art,
physics, sports, whatever—will help you create an analogy that will explain some thorny
computer science concept to a non-technical person and get past a communication roadblock.
</p>
        <h3>
          <strong>
            <em>3: Practice on a cadaver</em>
          </strong>
        </h3>
        <p>
Long before they scrub up for their first surgery on a human, medical students practice
on dead bodies. It's grisly, it's not something we really want to think about, but
when you're the one going under the general anesthesia, would you rather see the surgeon
flipping through the "How-To" manual, "just to refresh himself"?
</p>
        <p>
Diagnosing and debugging a software system can be a hugely puzzling trial, largely
because there are so many possible "moving parts" that are creating the
problem. Compound that with certain bugs that only appear when multiple users are
interacting at the same time, and you've got a recipe for disaster when a production
bug suddenly threatens to jeopardize the company's online revenue stream. Do you really
want to be sitting in the production center, flipping through "How-To"'s
and FAQs online while your boss looks on and your CEO is counting every minute by
the thousands of dollars?
</p>
        <p>
Take a tip from the med student: long before the thing goes into production, introduce
a bug, deploy the code into a virtual machine, then hand it over to a buddy and let
him try to track it down. Have him do the same for you. Or if you can't find a buddy
to help you, do it to yourself (but try not to cheat or let your knowledge of where
the bug is color your reactions). How do you know the bug is there? Once you know
it's there, how do you determine what kind of bug it is? Where do you start looking
for it? How would you track it down without attaching a debugger or otherwise disrupting
the system's operations? (Remember, we can't always just attach an IDE and step through
the code on a production server.) How do you patch the running system? And so on.
</p>
        <p>
Remember, you can either learn these things under controlled circumstances, learn
them while you're in the "hot seat", so to speak, or not learn them at all
and see how long the company keeps you around.
</p>
        <h3>
          <strong>
            <em>2: Administer the system</em>
          </strong>
        </h3>
        <p>
Take off your developer hat for a while—a week, a month, a quarter, whatever—and be
one of those thankless folks who have to keep the system running. Wear the pager that
goes off at 3AM when a server goes down. Stay all night doing one of those "server
upgrades" that have to be done in the middle of the night because the system
can't be upgraded while users are using it. Answer the phones or chat requests of
those hapless users who can't figure out why they can't find the record they just
entered into the system, and after a half-hour of thinking it must be a bug, ask them
if they remembered to check the "Save this record" checkbox on the UI (which
had to be there because the developers were told it had to be there) before submitting
the form. Try adding a user. Try removing a user. Try changing the user's password.
Learn what a real joy having seven different properties/XML/configuration files scattered
all over the system really is.
</p>
        <p>
Once you've done that, particularly on a system that you built and tossed over the
fence into production and thought that was the end of it, you'll understand just why
it's so important to keep the system administrators in mind when you're building a
system for production. And why it's critical to be able to have a system that tells
you when it's down, instead of having to go hunting up the answer when a VP tells
you it is (usually because he's just gotten an outage message from a customer or client).
</p>
        <h3>
          <strong>
            <em>1: Cultivate a peer group</em>
          </strong>
        </h3>
        <p>
Yes, you can join an online forum, ask questions, answer questions, and learn that
way, but that's a poor substitute for physical human contact once in a while. Like
it or not, various sociological and psychological studies confirm that a "connection"
is really still best made when eyeballs meet flesh. (The "disassociative"
nature of email is what makes it so easy to be rude or flamboyant or downright violent
in email when we would never say such things in person.) Go to conferences, join a
user group, even start one of your own if you can't find one. Yes, the online avenues
are still open to you—read blogs, join mailing lists or newsgroups—but don't lose
sight of human-to-human contact.
</p>
        <p>
While we're at it, don't create a peer group of people that all look to you for answers—as
flattering as that feels, and as much as we do learn by providing answers, frequently
we rise (or fall) to the level of our peers—have at least one peer group that's overwhelmingly
smarter than you, and as scary as it might be, venture to offer an answer or two to
that group when a question comes up. You don't have to be right—in fact, it's often
vastly more educational to be wrong. Just maintain an attitude that says "I have
no ego wrapped up in being right or wrong", and take the entire experience as
a learning opportunity.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4b2137dd-11cc-4ad5-8771-5906f2759273" />
        <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>10 Things To Improve Your Development Career</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</guid>
      <link>http://blogs.tedneward.com/2010/01/19/10+Things+To+Improve+Your+Development+Career.aspx</link>
      <pubDate>Tue, 19 Jan 2010 10:02:01 GMT</pubDate>
      <description>&lt;p&gt;
Cruising the Web late last night, I ran across &lt;a href="http://blogs.techrepublic.com.com/10things/?p=1297" target="_blank"&gt;&amp;quot;10
things you can do to advance your career as a developer&amp;quot;&lt;/a&gt;, summarized below:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Build a PC 
&lt;/li&gt;
&lt;li&gt;
Participate in an online forum and help others 
&lt;/li&gt;
&lt;li&gt;
Man the help desk 
&lt;/li&gt;
&lt;li&gt;
Perform field service 
&lt;/li&gt;
&lt;li&gt;
Perform DBA functions 
&lt;/li&gt;
&lt;li&gt;
Perform all phases of the project lifecycle 
&lt;/li&gt;
&lt;li&gt;
Recognize and learn the latest technologies 
&lt;/li&gt;
&lt;li&gt;
Be an independent contractor 
&lt;/li&gt;
&lt;li&gt;
Lead a project, supervise, or manage 
&lt;/li&gt;
&lt;li&gt;
Seek additional education 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I agreed with some of them, I disagreed with others, and in general felt like they
were a little too high-level to be of real use. For example, &amp;quot;Seek additional
education&amp;quot; seems entirely too vague: In what? How much? How often? And &amp;quot;Recognize
and learn the latest technologies&amp;quot; is something like offering advice to the Olympic
fencing silver medalist and saying, &amp;quot;You should have tried harder&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
So, in the great spirit of &amp;quot;Not Invented Here&amp;quot;, I present my own list; as
usual, I welcome comment and argument. And, also as usual, caveats apply, since not
everybody will be in precisely the same place and be looking for the same things.
In general, though, whether you're looking to kick-start your career or just &amp;quot;kick
it up a notch&amp;quot;, I believe this list will help, because these ideas have been
of help to me at some point or another in my own career.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;10: Build a PC.&lt;/em&gt;&lt;/strong&gt; 
&lt;/h3&gt;
&lt;p&gt;
Yes, even developers have to know about hardware. More importantly, a developer at
a small organization or team will find himself in a position where he has to take
on some system administrator roles, and sometimes that means grabbing a screwdriver,
getting a little dusty and dirty, and swapping hardware around. Having said this,
though, once you've done it once or twice, leave it alone—the hardware game is an
ever-shifting and ever-changing game (much like software is, surprise surprise), and
it's been my experience that most of us only really have the time to pursue one or
the other.
&lt;/p&gt;
&lt;p&gt;
By the way, &amp;quot;PC&amp;quot; there is something of a generic term—build a Linux box,
build a Windows box, or &amp;quot;build&amp;quot; a Mac OS box (meaning, buy a Mac Pro and
trick it out a little—add more memory, add another hard drive, and so on), they all
get you comfortable with snapping parts together, and discovering just how ridiculously
simple the whole thing really is.
&lt;/p&gt;
&lt;p&gt;
And for the record, once you've done it, go ahead and go back to buying pre-built
systems or laptops—I've never found building a PC to be any cheaper than buying one
pre-built. Particularly for PC systems, I prefer to use smaller local vendors where
I can customize and trick out the box. If you're a Mac, that's not really an option
unless you're into the &amp;quot;Hackintosh&amp;quot; thing, which is quite possibly the logical
equivalent to &amp;quot;Build a PC&amp;quot;. Having never done it myself, though, I can't
say how useful that is as an educational action.
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;9: Pick a destination&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Do you want to run a team of your own? Become an independent contractor? Teach programming
classes? Speak at conferences? Move up into higher management and get out of the programming
game altogether? Everybody's got a different idea of what they consider to be the
&amp;quot;ideal&amp;quot; career, but it's amazing how many people don't really think about
what they want their career path to be.
&lt;/p&gt;
&lt;p&gt;
A wise man once said, &amp;quot;The journey of a thousand miles begins with a single step.&amp;quot;
I disagree: The journey of a thousand miles begins with the damn map. You have to
know where you want to go, and a rough idea of how to get there, before you can really
start with that single step. Otherwise, you're just wandering, which in itself isn't
a bad thing, but isn't going to get you to a destination except by random chance.
(Sometimes that's not a bad result, but at least then you're openly admitting that
you're leaving your career in the hands of chance. If you're OK with that, skip to
the next item. If you're not, read on.)
&lt;/p&gt;
&lt;p&gt;
Lay out explicitly (as in, write it down someplace) what kind of job you're wanting
to grow into, and then lay out a couple of scenarios that move you closer towards
that goal. Can you grow within the company you're in? (Have others been able to?)
Do you need to quit and strike out on your own? Do you want to lead a team of your
own? (Are there new projects coming in to the company that you could put yourself
forward as a potential tech lead?) And so on.
&lt;/p&gt;
&lt;p&gt;
Once you've identified the destination, now you can start thinking about steps to
get there. 
&lt;/p&gt;
&lt;p&gt;
If you want to become a speaker, put your name forward to give some presentations
at the local technology user group, or volunteer to hold a &amp;quot;brown bag&amp;quot; session
at the company. Sign up with Toastmasters to hone your speaking technique. Watch other
speakers give technical talks, and see what they do that you don't, and vice versa. 
&lt;/p&gt;
&lt;p&gt;
If you want to be a tech lead, start by quietly assisting other members of the team
get their work done. Help them debug thorny problems. Answer questions they have.
Offer yourself up as a resource for dealing with hard problems.
&lt;/p&gt;
&lt;p&gt;
If you want to slowly move up the management chain, look to get into the project management
side of things. Offer to be a point of contact for the users. Learn the business better.
Sit down next to one of your users and watch their interaction with the existing software,
and try to see the system from their point of view.
&lt;/p&gt;
&lt;p&gt;
And so on.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;8: Be a bell curve&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Frequently, at conferences, attendees ask me how I got to know so much on so many
things. In some ways, I'm reminded of the story of a world-famous concert pianist
giving a concert at Carnegie Hall—when a gushing fan said, &amp;quot;I'd give my life
to be able to play like that&amp;quot;, the pianist responded quietly, &amp;quot;I did&amp;quot;.
But as much as I'd like to leave you with the impression that I've dedicated my entire
life to knowing everything I could about this industry, that would be something of
a lie. The truth is, I don't know anywhere near as much as I'd like, and I'm always
poking my head into new areas. Thank God for my ADD, that's all I can say on that
one.
&lt;/p&gt;
&lt;p&gt;
For the rest of you, though, that's not feasible, and not really practical, particularly
since I have an advantage that the &amp;quot;working&amp;quot; programmer doesn't—I have set
aside weeks or months in which to do nothing more than study a new technology or language.
&lt;/p&gt;
&lt;p&gt;
Back in the early days of my career, though, when I was holding down the 9-to-5, I
was a Windows/C++ programmer. I was working with the Borland C++ compiler and its
associated framework, the ObjectWindows Library (OWL), extending and maintaining applications
written in it. One contracting client wanted me to work with Microsoft MFC instead
of OWL. Another one was storing data into a relational database using ODBC. And so
on. Slowly, over time, I built up a &amp;quot;bell curve&amp;quot;-looking collection of skills
that sort of &amp;quot;hovered&amp;quot; around the central position of C++/Windows.
&lt;/p&gt;
&lt;p&gt;
Then, one day, a buddy of mine mentioned the team on which he was a project manager
was looking for new blood. They were doing web applications, something with which
I had zero experience—this was completely outside of my bell curve. HTML, HTTP, Cold
Fusion, NetDynamics (an early Java app server), this was way out of my range, though
at least NetDynamics was a &lt;em&gt;little&lt;/em&gt; similar, since it was basically a server-side
application framework, and I had some experience with app frameworks from my C++ days.
So, resting on my C++ experience, I started flirting with Java, and so on.
&lt;/p&gt;
&lt;p&gt;
Before long, my &amp;quot;bell curve&amp;quot; had been readjusted to have Java more or less
at its center, and I found that experience in C++ still worked out here—what I knew
about ODBC turned out to be incredibly useful in understanding JDBC, what I knew about
DLLs from Windows turned out to be helpful in understanding Java's dynamic loading
model, and of course syntactically Java looked a lot like C++ even though it behaved
a little bit differently under the hood. (One article author suggested that Java was
closer to Smalltalk than C++, and that prompted me to briefly flirt with Smalltalk
before I concluded said author was out of his frakking mind.)
&lt;/p&gt;
&lt;p&gt;
All of this happened over roughly a three-year period, by the way.
&lt;/p&gt;
&lt;p&gt;
The point here is that you won't be able to assimilate the entire industry in a single
sitting, so pick something that's relatively close to what you already know, and use
your experience as a springboard to learn something that's new, yet possibly-if-not-probably
useful to your current job. You don't have to be a deep expert in it, and the further
away it is from what you do, the less you really need to know about it (hence the
bell curve metaphor), but you're still exposing yourself to new ideas and new concepts
and new tools/technologies that still could be applicable to what you do on a daily
basis. Over time the &amp;quot;center&amp;quot; of your bell curve may drift away from what
you've done to include new things, and that's OK.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;7: Learn one new thing every year&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
In the last tip, I told you to branch out slowly from what you know. In this tip,
I'm telling you to go throw a dart at something entirely unfamiliar to you and learn
it. Yes, I realize this sounds contradictory. It's because those who stick to only
what they know end up missing the radical shifts of direction that the industry hits
every half-decade or so until it's mainstream and commonplace and &amp;quot;everybody's
doing it&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
In their amazing book &amp;quot;The Pragmatic Programmer&amp;quot;, Dave Thomas and Andy Hunt
suggest that you learn one new programming language every year. I'm going to amend
that somewhat—not because there aren't enough languages in the world to keep you on
that pace for the rest of your life—far from it, if that's what you want, go learn
Ruby, F#, Scala, Groovy, Clojure, Icon, Io, Erlang, Haskell and Smalltalk, then come
back to me for the list for 2020—but because languages aren't the only thing that
we as developers need to explore. There's a lot of movement going on in areas beyond
languages, and you don't want to be the last kid on the block to know they're happening.
&lt;/p&gt;
&lt;p&gt;
Consider this list: object databases (&lt;a href="http://www.db4o.com" target="_blank"&gt;db4o&lt;/a&gt;)
and/or the &amp;quot;NoSQL&amp;quot; movement (&lt;a href="http://www.mongodb.org/display/DOCS/Tutorial" target="_blank"&gt;MongoDB&lt;/a&gt;).
Dependency injection and composable architectures (&lt;a href="http://www.springframework.org" target="_blank"&gt;Spring&lt;/a&gt;, &lt;a href="http://mef.codeplex.com" target="_blank"&gt;MEF&lt;/a&gt;).
A dynamic language (&lt;a href="http://www.rubyforge.org" target="_blank"&gt;Ruby&lt;/a&gt;, &lt;a href="http://www.python.org" target="_blank"&gt;Python&lt;/a&gt;, &lt;a href="http://www.ecmascript.org" target="_blank"&gt;ECMAScript&lt;/a&gt;).
A functional language (&lt;a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx" target="_blank"&gt;F#&lt;/a&gt;, &lt;a href="http://www.scala-lang.org" target="_blank"&gt;Scala&lt;/a&gt;, &lt;a href="http://www.haskell.org" target="_blank"&gt;Haskell&lt;/a&gt;).
A Lisp (Common Lisp, &lt;a href="http://clojure.org" target="_blank"&gt;Clojure&lt;/a&gt;, Scheme,
Nu). A mobile platform (iPhone, Android). &amp;quot;Space&amp;quot;-based architecture (&lt;a href="http://www.gigaspaces.com" target="_blank"&gt;Gigaspaces&lt;/a&gt;,
Terracotta). Rich UI platforms (Flash/Flex, Silverlight). Browser enhancements (AJAX,
jQuery, HTML 5) and how they're different from the rich UI platforms. And this is
without adding any of the &amp;quot;obvious&amp;quot; stuff, like Cloud, to the list.
&lt;/p&gt;
&lt;p&gt;
(I'm not convinced Cloud is something worth learning this year, anyway.)
&lt;/p&gt;
&lt;p&gt;
You get through that list, you're operating outside of your comfort zone, and chances
are, your boss' comfort zone, which puts you into the enviable position of being somebody
who can advise him around those technologies. &lt;em&gt;DO NOT TAKE THIS TO MEAN YOU MUST
KNOW THEM DEEPLY.&lt;/em&gt; Just having a passing familiarity with them can be enough. &lt;em&gt;DO
NOT TAKE THIS TO MEAN YOU SHOULD PROPOSE USING THEM ON THE NEXT PROJECT.&lt;/em&gt; In fact,
sometimes the most compelling evidence that you really know where and when they should
be used is when you suggest stealing ideas from the thing, rather than trying to force-fit
the thing onto the project as a whole.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;6: Practice, practice, practice&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Speaking of the concert pianist, somebody once asked him how to get to Carnegie Hall.
HIs answer: &amp;quot;Practice, my boy, practice.&amp;quot;
&lt;/p&gt;
&lt;p&gt;
The same is true here. You're not going to get to be a better developer without practice.
Volunteer some time—even if it's just an hour a week—on an open-source project, or
start one of your own. Heck, it doesn't even have to be an &amp;quot;open source&amp;quot;
project—just create some requirements of your own, solve a problem that a family member
is having, or rewrite the project you're on as an interesting side-project. Do the
Nike thing and &amp;quot;Just do it&amp;quot;. Write some Scala code. Write some F# code.
Once you're past &amp;quot;hello world&amp;quot;, write the Scala code to use db4o as a persistent
storage. Wire it up behind Tapestry. Or write straight servlets in Scala. And so on.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;5: Turn off the TV&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Speaking of marketing slogans, if you're like most Americans, surveys have shown that
you watch about four hours of TV a day, or 28 hours of TV a week. In that same amount
of time (28 hours over 1 week), you could read the entire set of poems by Maya Angelou,
one F. Scott Fitzgerald novel, all poems by T.S.Eliot, 2 plays by Thornton Wilder,
or all 150 Psalms of the Bible. An average reader, reading just one hour a day, can
finish an &amp;quot;average-sized&amp;quot; book (let's assume about the size of a novel)
in a week, which translates to 52 books a year.
&lt;/p&gt;
&lt;p&gt;
Let's assume a technical book is going to take slightly longer, since it's a bit deeper
in concept and requires you to spend some time experimenting and typing in code; let's
assume that reading and going through the exercises of an average technical book will
require 4 weeks (a month) instead of just one week. That's 12 new tools/languages/frameworks/ideas
you'd be learning per year.
&lt;/p&gt;
&lt;p&gt;
All because you stopped watching David Caruso turn to the camera, whip his sunglasses
off and say something stupid. (I guess it's not his fault; &lt;em&gt;CSI:Miami&lt;/em&gt; is a
crap show. The other two are actually not bad, but &lt;em&gt;Miami&lt;/em&gt; just makes me retch.) 
&lt;/p&gt;
&lt;p&gt;
After all, when's the last time that David Caruso or the rest of that show did anything
that was even remotely realistic from a computer perspective? (I always laugh out
loud every time they run a database search against some national database on a completely
non-indexable criteria—like a partial license plate number—and it comes back in seconds.
What the hell database are THEY using? I want it!) Soon as you hear The Who break
into that riff, flip off the TV (or set it to mute) and pick up the book on the nightstand
and boost your career. (And hopefully sink Caruso's.)
&lt;/p&gt;
&lt;p&gt;
Or, if you just can't give up your weekly dose of Caruso, then put the book in the
bathroom. Think about it—how much time do you spend in there a week?
&lt;/p&gt;
&lt;p&gt;
And this gets even better when you get a Kindle or other e-reader that accepts PDFs,
or the book you're interested in is natively supported in the e-readers' format. Now
you have it with you for lunch, waiting at dinner for your food to arrive, or while
you're sitting guard on your 10-year-old so he doesn't sneak out of his room after
his bedtime to play more XBox.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;4: Have a life&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Speaking of XBox, don't slave your life to work. Pursue other things. Scientists have
repeatedly discovered that exercise helps keep the mind in shape, so take a couple
of hours a week (buh-bye, &lt;em&gt;American Idol&lt;/em&gt;) and go get some exercise. Pick up
a new sport you've never played before, or just go work out at the gym. (This year
I'm doing Hopkido and fencing.) Read some nontechnical books. (I recommend anything
by Malcolm Gladwell as a starting point.) Spend time with your family, if you have
one—mine spends at least six or seven hours a week playing &amp;quot;family games&amp;quot;
like &lt;a href="http://www.realitycheckgames.com/Products/127-the-settlers-of-catan.aspx" target="_blank"&gt;Settlers
of Catan&lt;/a&gt;, &lt;a href="http://www.realitycheckgames.com/Products/113-dominion.aspx" target="_blank"&gt;Dominion&lt;/a&gt;, &lt;a href="http://www.realitycheckgames.com/Products/88-to-court-the-king.aspx" target="_blank"&gt;To
Court The King&lt;/a&gt;, &lt;a href="http://www.realitycheckgames.com/Products/98-munchkin.aspx" target="_blank"&gt;Munchkin&lt;/a&gt;,
and other non-traditional games, usually over lunch or dinner. I also belong to an
informal &amp;quot;Game Night club&amp;quot; in Redmond consisting of several Microsoft employees
and their families, as well as outsiders. And so on. Heck, go to a local bar and watch
the game, and you'll meet some really interesting people. And some boring people,
too, but you don't have to talk to them during the next game if you don't want.
&lt;/p&gt;
&lt;p&gt;
This isn't just about maintaining a healthy work-life balance—it's also about having
interests that other people can latch on to, qualities that will make you more &amp;quot;human&amp;quot;
and more interesting as a person, and make you more attractive and &amp;quot;connectable&amp;quot;
and stand out better in their mind when they hear that somebody they know is looking
for a software developer. This will also help you connect better with your users,
because like it or not, they do &lt;em&gt;not&lt;/em&gt; get your puns involving Klingon. (Besides,
the geek stereotype is SO 90's, and it's time we let the world know that.)
&lt;/p&gt;
&lt;p&gt;
Besides, you never know when having some depth in other areas—philosophy, music, art,
physics, sports, whatever—will help you create an analogy that will explain some thorny
computer science concept to a non-technical person and get past a communication roadblock.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;3: Practice on a cadaver&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Long before they scrub up for their first surgery on a human, medical students practice
on dead bodies. It's grisly, it's not something we really want to think about, but
when you're the one going under the general anesthesia, would you rather see the surgeon
flipping through the &amp;quot;How-To&amp;quot; manual, &amp;quot;just to refresh himself&amp;quot;?
&lt;/p&gt;
&lt;p&gt;
Diagnosing and debugging a software system can be a hugely puzzling trial, largely
because there are so many possible &amp;quot;moving parts&amp;quot; that are creating the
problem. Compound that with certain bugs that only appear when multiple users are
interacting at the same time, and you've got a recipe for disaster when a production
bug suddenly threatens to jeopardize the company's online revenue stream. Do you really
want to be sitting in the production center, flipping through &amp;quot;How-To&amp;quot;'s
and FAQs online while your boss looks on and your CEO is counting every minute by
the thousands of dollars?
&lt;/p&gt;
&lt;p&gt;
Take a tip from the med student: long before the thing goes into production, introduce
a bug, deploy the code into a virtual machine, then hand it over to a buddy and let
him try to track it down. Have him do the same for you. Or if you can't find a buddy
to help you, do it to yourself (but try not to cheat or let your knowledge of where
the bug is color your reactions). How do you know the bug is there? Once you know
it's there, how do you determine what kind of bug it is? Where do you start looking
for it? How would you track it down without attaching a debugger or otherwise disrupting
the system's operations? (Remember, we can't always just attach an IDE and step through
the code on a production server.) How do you patch the running system? And so on.
&lt;/p&gt;
&lt;p&gt;
Remember, you can either learn these things under controlled circumstances, learn
them while you're in the &amp;quot;hot seat&amp;quot;, so to speak, or not learn them at all
and see how long the company keeps you around.
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;2: Administer the system&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Take off your developer hat for a while—a week, a month, a quarter, whatever—and be
one of those thankless folks who have to keep the system running. Wear the pager that
goes off at 3AM when a server goes down. Stay all night doing one of those &amp;quot;server
upgrades&amp;quot; that have to be done in the middle of the night because the system
can't be upgraded while users are using it. Answer the phones or chat requests of
those hapless users who can't figure out why they can't find the record they just
entered into the system, and after a half-hour of thinking it must be a bug, ask them
if they remembered to check the &amp;quot;Save this record&amp;quot; checkbox on the UI (which
had to be there because the developers were told it had to be there) before submitting
the form. Try adding a user. Try removing a user. Try changing the user's password.
Learn what a real joy having seven different properties/XML/configuration files scattered
all over the system really is.
&lt;/p&gt;
&lt;p&gt;
Once you've done that, particularly on a system that you built and tossed over the
fence into production and thought that was the end of it, you'll understand just why
it's so important to keep the system administrators in mind when you're building a
system for production. And why it's critical to be able to have a system that tells
you when it's down, instead of having to go hunting up the answer when a VP tells
you it is (usually because he's just gotten an outage message from a customer or client).
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;1: Cultivate a peer group&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
Yes, you can join an online forum, ask questions, answer questions, and learn that
way, but that's a poor substitute for physical human contact once in a while. Like
it or not, various sociological and psychological studies confirm that a &amp;quot;connection&amp;quot;
is really still best made when eyeballs meet flesh. (The &amp;quot;disassociative&amp;quot;
nature of email is what makes it so easy to be rude or flamboyant or downright violent
in email when we would never say such things in person.) Go to conferences, join a
user group, even start one of your own if you can't find one. Yes, the online avenues
are still open to you—read blogs, join mailing lists or newsgroups—but don't lose
sight of human-to-human contact.
&lt;/p&gt;
&lt;p&gt;
While we're at it, don't create a peer group of people that all look to you for answers—as
flattering as that feels, and as much as we do learn by providing answers, frequently
we rise (or fall) to the level of our peers—have at least one peer group that's overwhelmingly
smarter than you, and as scary as it might be, venture to offer an answer or two to
that group when a question comes up. You don't have to be right—in fact, it's often
vastly more educational to be wrong. Just maintain an attitude that says &amp;quot;I have
no ego wrapped up in being right or wrong&amp;quot;, and take the entire experience as
a learning opportunity.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4b2137dd-11cc-4ad5-8771-5906f2759273" /&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,4b2137dd-11cc-4ad5-8771-5906f2759273.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</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>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=680b8296-ba07-4230-b067-edceaf04e84b</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,680b8296-ba07-4230-b067-edceaf04e84b.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,680b8296-ba07-4230-b067-edceaf04e84b.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=680b8296-ba07-4230-b067-edceaf04e84b</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Here we go again—another year, another set of predictions revisited and offered up
for the next 12 months. And maybe, if I'm feeling really ambitious, I'll take that
shot I thought about last year and try predicting for the decade. Without further
ado, I'll go back and revisit, unedited, my predictions for 2009 ("<strong>THEN</strong>"),
and pontificate on those subjects for 2010 before adding any new material/topics.
Just for convenience, <a href="http://blogs.tedneward.com/2009/01/01/2009+Predictions+2008+Predictions+Revisited.aspx" target="_blank">here's
a link back to last years' predictions</a>.
</p>
        <p>
Last year's predictions went something like this (complete with basketball-scoring):
</p>
        <ul>
          <li>
            <strong>THEN: </strong>"Cloud" will become the next "ESB" or "SOA",
in that it will be something that everybody will talk about, but few will understand
and even fewer will do anything with. (Considering the widespread disparity in the
definition of the term, this seems like a no-brainer.) <strong>NOW:</strong> Oh, yeah.
Straight up. I get two points for this one. Does <em>anyone</em> have a working definition
of "cloud" that applies to all of the major vendors' implementations? <em>Ted,
2; Wrongness, 0</em>.</li>
          <li>
            <strong>THEN: </strong>Interest in Scala will continue to rise, as will the number
of detractors who point out that Scala is too hard to learn. <strong>NOW:</strong> Two
points for this one, too. Not a hard one, mind you, but one of those "pass-and-shoot"
jumpers from twelve feet out. James Strachan even tweeted about this earlier today,
pointing out this comparison. As more Java developers who think of themselves as smart
people try to pick up Scala and fail, the numbers of sour grapes responses like "Scala's
too complex, and who needs that functional stuff anyway?" will continue to rise
in 2010. <em>Ted, 4; Wrongness, 0</em>.</li>
          <li>
            <strong>THEN</strong>: Interest in F# will continue to rise, as will the number of
detractors who point out that F# is too hard to learn. (Hey, the two really are cousins,
and the fortunes of one will serve as a pretty good indication of the fortunes of
the other, and both really seem to be on the same arc right now.) <strong>NOW:</strong> Interestingly
enough, I haven't heard as many F# detractors as Scala detractors, possibly because
I think F# hasn't really reached the masses of .NET developers the way that Scala
has managed to find its way in front of Java developers. I think that'll change mighty
quickly in 2010, though, once VS 2010 hits the streets. <em>Ted, 4; Wrongness 2</em>.</li>
          <li>
            <strong>THEN</strong>
            <em>:</em> Interest in all kinds of functional languages will
continue to rise, and more than one person will take a hint from Bob "crazybob"
Lee and liken functional programming to AOP, for good and for ill. People who took
classes on Haskell in college will find themselves reaching for their old college
textbooks again. <strong>NOW:</strong> Yep, I'm claiming two points on this one, if
only because a bunch of Haskell books shipped this year, and they'll be the last to
do so for about five years after this. (By the way, does anybody still remember aspects?)
But I'm going the opposite way with this one now; yes, there's Haskell, and yes, there's
Erlang, and yes, there's a lot of other functional languages out there, but who cares?
They're hard to learn, they don't always translate well to other languages, and developers
want languages that work on the platform they use on a daily basis, and that means
F# and Scala or Clojure, or its simply not an option. <em>Ted 6; Wrongness 2</em>.</li>
          <li>
            <strong>THEN</strong>
            <em>:</em> The iPhone is going to be hailed as "the enterprise
development platform of the future", and companies will be rolling out apps to
it. Look for Quicken iPhone edition, PowerPoint and/or Keynote iPhone edition, along
with connectors to hook the iPhone up to a presentation device, and (I'll bet) a World
of Warcraft iPhone client (legit or otherwise). iPhone is the new hotness in the mobile
space, and people will flock to it madly. <strong>NOW:</strong> Two more points, but
let's be honest—this was a fast-break layup, no work required on my part. <em>Ted
8; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code. <strong>NOW:</strong> If you've worked at all with Oslo,
you might argue with me, but I'm still taking my two points. The two CTPs were pretty
different in a number of ways. <em>Ted 10; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe). <strong>NOW:</strong> Pressure is still building.
Let's see what happens by the time VS 2010 ships, and then see what the IPy/IRb teams
start to do to adjust to the versioning issues that arise. <em>Ted 8; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: The death of JSR-277 will spark an uprising among the two leading
groups hoping to foist it off on the Java community--OSGi and Maven--while the rest
of the Java world will breathe a huge sigh of relief and look to see what "modularity"
means in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased. <strong>NOW:</strong> Ah, Ted, you really should never
underestimate the community's willingness to take a bad idea, strip all the goodness
out of it, and then cycle it back into the mix as something completely different yet
somehow just as dangerous and crazy. I give you Project Jigsaw. <em>Ted 10; Wrongness
2;</em></li>
          <li>
            <strong>THEN</strong>: The invokedynamic JSR will leapfrog in importance to the top
of the list. <strong>NOW:</strong> The invokedynamic JSR begat interest in other languages
on the JVM. The interest in other languages on the JVM begat the need to start thinking
about how to support them in the Java libraries. The need to start thinking about
supporting those languages begat a "Holy sh*t moment" somewhere inside Sun
and led them to (re-)propose closures for JDK 7. And in local sports news, Ted notched
up two more points on the scoreboard. <em>Ted 12; Wrongness 2.</em></li>
          <li>
            <strong>THEN</strong>: Another Windows 7 CTP will come out, and it will spawn huge
media interest that will eventually be remembered as Microsoft promises, that will
eventually be remembered as Microsoft guarantees, that will eventually be remembered
as Microsoft FUD and "promising much, delivering little". Microsoft ain't
always at fault for the inflated expectations people have--sometimes, yes, perhaps
even a lot of times, but not always. <strong>NOW:</strong> And then, just when the
game started to turn into a runaway, airballs started to fly. The Windows7 release
shipped, and contrary to what I expected, the general response to it was pretty warm.
Yes, there were a few issues that emerged, but overall the media liked it, the masses
liked it, and Microsoft seemed to have dodged a bullet. <em>Ted 12; Wrongness 5.</em></li>
          <li>
            <strong>THEN</strong>: Apple will begin to legally threaten the clone market again,
except this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.) <strong>NOW:</strong> What
clones? The only people trying to clone Macs are those who are building Hackintosh
machines, and Apple can't sue them so long as they're using licensed copies of Mac
OS X (as far as I know). Which has never stopped them from trying, mind you, and I
still think Steve has some part of his brain whispering to him at night, calculating
all the hardware sales lost to Hackintosh netbooks out there. But in any event, that's
another shot missed. <em>Ted 12; Wrongness 7.</em></li>
          <li>
            <strong>THEN</strong>: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build. <strong>NOW:</strong> I
give you Ioke. If I'd extended this to include outdated CPU interpreters, I'd have
made that three-pointer from half-court instead of just the top of the key. <em>Ted
14; Wrongness 7.</em></li>
          <li>
            <strong>THEN</strong>: Roy Fielding will officially disown most of the "REST"ful
authors and software packages available. Nobody will care--or worse, somebody looking
to make a name for themselves will proclaim that Roy "doesn't really understand
REST". And they'll be right--Roy doesn't understand what <em>they</em> consider
to be REST, and the fact that he created the term will be of no importance anymore.
Being "REST"ful will equate to "I did it myself!", complete with
expectations of a gold star and a lollipop. <strong>NOW:</strong> Does anybody in
the REST community care what Roy Fielding wrote way back when? I keep seeing "REST"ful
systems that seem to have designers who've never heard of Roy, or his thesis. Roy
hasn't officially disowned them, but damn if he doesn't seem close to it. Still....
No points. <em>Ted 14; Wrongness 9.</em></li>
          <li>
            <strong>THEN</strong>: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice. <strong>NOW:</strong> Does
anybody still follow Perl 6 development? Has the spec even been written yet? Google
on "Perl 6 release", and you get varying reports: "It'll ship 'when
it's ready'", "There are no such dates because this isn't a commericially-backed
effort", and "Spring 2010". Swish—nothin' but net. <em>Ted 16; Wrongness
9.</em></li>
          <li>
            <strong>THEN</strong>: The debate around "Scrum Certification" will rise
to a fever pitch as short-sighted money-tight companies start looking for reasons
to cut costs and either buy into agile at a superficial level and watch it fail, or
start looking to cut the agilists from their company in order to replace them with
cheaper labor. <strong>NOW:</strong> Agile has become another adjective meaning "best
practices", and as such, has essentially lost its meaning. Just ask Scott Bellware. <em>Ted
18; Wrongness 9.</em></li>
          <li>
            <strong>THEN</strong>: Adobe will continue to make Flex and AIR look more like C#
and the CLR even as Microsoft tries to make Silverlight look more like Flash and AIR.
Web designers will now get to experience the same fun that back-end web developers
have enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either "Flash" shops or "Silverlight" shops. <strong>NOW:</strong> Not
sure how to score this one—I haven't seen the explicit partitioning happen yet, but
the two environments definitely still seem to be looking to start tromping on each
others' turf, particularly when we look at the rapid releases coming from the Silverlight
team. <em>Ted 16; Wrongness 11.</em></li>
          <li>
            <strong>THEN</strong>: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic. <strong>NOW:</strong> Still
no job offers. Damn. Ah, well. <em>Ted 16; Wrongness 13.</em></li>
        </ul>
        <p>
A close game. Could've gone either way. *shrug* Ah, well. It was silly to try and
score it in basketball metaphor, anyway—that's the last time I watch ESPN before writing
this.
</p>
        <p>
For 2010, I predict....
</p>
        <ul>
          <li>
            <em>... I will offer 3- and 4-day training classes on F# and Scala, among other things.</em> OK,
that's not fair—yes, I have the materials, I just need to work out locations and times.
Contact me if you're interested in a private class, by the way.</li>
          <li>
            <em>... I will publish two books, one on F# and one on Scala.</em> OK, OK, another
plug. Or, rather, more of a resolution. One will be the "Professional F#"
I'm doing for Wiley/Wrox, the other isn't yet finalized. But it'll either be published
through a publisher, or self-published, by JavaOne 2010.</li>
          <li>
            <em>... DSLs will either "succeed" this year, or begin the short slide into
the dustbin of obscure programming ideas.</em> Domain-specific language advocates
have to put up some kind of strawman for developers to learn from and poke at, or
the whole concept will just fade away. Martin's book will help, if it ships this year,
but even that might not be enough to generate interest if it doesn't have some kind
of large-scale applicability in it. Patterns and refactoring and enterprise containers
all had a huge advantage in that developers could see pretty easily what the problem
was they solved; DSLs haven't made that clear yet.</li>
          <li>
            <em>... functional languages will start to see a backlash.</em> I hate to say it,
but "getting" the functional mindset is hard, and there's precious few resources
that are making it easy for mainstream (read: O-O) developers make that adjustment,
far fewer than there was during the procedural-to-object shift. If the functional
community doesn't want to become mainstream, then mainstream developers will find
ways to take functional's most compelling gateway use-case (parallel/concurrent programming)
and find a way to "git 'er done" in the traditional O-O approach, probably
through software transactional memory, and functional languages like Haskell and Erlang
will be relegated to the "What Might Have Been" of computer science history.
Not sure what I mean? Try this: walk into a functional language forum, and ask what
a monad is. Nobody yet has been able to produce an answer that doesn't involve math
theory, or that does involve a practical domain-object-based example. In fact, nobody
has really said why (or if) monads are even still useful. Or catamorphisms. Or any
of the other dime-store words that the functional community likes to toss around.</li>
          <li>
            <em>... Visual Studio 2010 will ship on time, and be one of the buggiest and/or slowest
releases in its history.</em> I hate to make this prediction, because I really don't
want to be right, but there's just so much happening in the Visual Studio refactoring
effort that it makes me incredibly nervous. Widespread adoption of VS2010 will wait
until SP1 at the earliest. In fact....</li>
          <li>
            <em>... Visual Studio 2010 SP 1 will ship within three months of the final product.</em> Microsoft
knows that people wait until SP 1 to think about upgrading, so they'll just plan for
an eager SP 1 release, and hope that managers will be too hung over from the New Year
(still) to notice that the necessary shakeout time hasn't happened.</li>
          <li>
            <em>... Apple will ship a tablet with multi-touch on it, and it will flop horribly.</em> Not
sure why I think this, but I just don't think the multi-touch paradigm that Apple
has cooked up for the iPhone will carry over to a tablet/laptop device. That won't
stop them from shipping it, and it won't stop Apple fan-boiz from buying it, but that's
about where the interest will end.</li>
          <li>
            <em>... JDK 7 closures will be debated for a few weeks, then become a fait accompli
as the Java community shrugs its collective shoulders.</em> Frankly, I think the Java
community has exhausted its interest in debating new language features for Java. Recent
college grads and open-source groups with an axe to grind will continue to try and
make an issue out of this, but I think the overall Java community just... doesn't...
care. They just want to see JDK 7 ship someday.</li>
          <li>
            <em>... Scala either "pops" in 2010, or begins to fall apart.</em> By "pops",
I mean reaches a critical mass of developers interested in using it, enough to convince
somebody to create a company around it, a la G2One.</li>
          <li>
            <em>... Oracle is going to make a serious "cloud" play, probably by offering
an Oracle-hosted version of Azure or AppEngine.</em> Oracle loves the enterprise space
too much, and derives too much money from it, to not at least appear to have some
kind of offering here. Now that they own Java, they'll marry it up against OpenSolaris,
the Oracle database, and throw the whole thing into a series of server centers all
over the continent, and call it "Oracle 12c" (c for Cloud, of course) or
something.</li>
          <li>
            <em>... Spring development will slow to a crawl and start to take a left turn toward
cloud ideas.</em> VMWare bought SpringSource for a reason, and I believe it's entirely
centered around VMWare's movement into the cloud space—they want to be more than "just"
a virtualization tool. Spring + Groovy makes a compelling development stack, particularly
if VMWare does some interesting hooks-n-hacks to make Spring a virtualization environment
in its own right somehow. But from a practical perspective, any community-driven development
against Spring is all but basically dead. The source may be downloadable later, like
the VMWare Player code is, but making contributions back? Fuhgeddabowdit.</li>
          <li>
            <em>... the explosion of e-book readers brings the Kindle 2009 edition way down to
size.</em> The era of the e-book reader is here, and honestly, while I'm glad I have
a Kindle, I'm expecting that I'll be dusting it off a shelf in a few years. Kinda
like I do with my iPods from a few years ago.</li>
          <li>
            <em>... "social networking" becomes the "Web 2.0" of 2010.</em> In
other words, using the term will basically identify you as a tech wannabe and clearly
out of touch with the bleeding edge.</li>
          <li>
            <em>... Facebook becomes a developer platform requirement.</em> I don't pretend to
know anything about Facebook—I'm not even on it, which amazes my family to no end—but
clearly Facebook is one of those mechanisms by which people reach each other, and
before long, it'll start showing up as a developer requirement for companies looking
to hire. If you're looking to build out your resume to make yourself attractive to
companies in 2010, mad Facebook skillz might not be a bad investment.</li>
          <li>
            <em>... Nintendo releases an open SDK for building games for its next-gen DS-based
device.</em> With the spectacular success of games on the iPhone, Nintendo clearly
must see that they're missing a huge opportunity every day developers can't write
games for the Nintendo DS that are easily downloadable to the device for playing.
Nintendo is not stupid—if they don't open up the SDK and promote "casual"
games like those on the iPhone and those that can now be downloaded to the Zune or
the XBox, they risk being marginalized out of existence.</li>
        </ul>
        <p>
And for the next decade, I predict....
</p>
        <ul>
          <li>
            <em>... colleges and unversities will begin issuing e-book reader devices to students.</em> It's
a helluvalot cheaper than issuing laptops or netbooks, and besides....</li>
          <li>
            <em>... netbooks and e-book readers will merge before the decade is out.</em> Let's
be honest—if the e-book reader could do email and browse the web, you have almost
the perfect paperback-sized mobile device. As for the credit-card sized mobile device....</li>
          <li>
            <em>... mobile phones will all but disappear as they turn into what PDAs tried to
be.</em> "The iPhone makes calls? Really? You mean Voice-over-IP, right? No,
wait, over cell signal? It can <em>do </em>that? Wow, there's really an app for everything,
isn't there?"</li>
          <li>
            <em>... wireless formats will skyrocket in importance all around the office and home.</em> Combine
the iPhone's Bluetooth (or something similar yet lower-power-consuming) with an equally-capable
(Bluetooth or otherwise) projector, and suddenly many executives can leave their netbook
or laptop at home for a business presentation. Throw in the Whispersync-aware e-book
reader/netbook-thing, and now most executives have absolutely zero reason to carry
anything but their e-book/netbook and their phone/PDA. The day somebody figures out
an easy way to combine Bluetooth with PayPal on the iPhone or Android phone, we will
have more or less made pocket change irrelevant. And believe me, that day will happen
before the end of the decade.</li>
          <li>
            <em>... either Android or Windows Mobile will gain some serious market share against
the iPhone the day they figure out how to support an open and unrestricted AppStore-like
app acquisition model.</em> Let's be honest, the attraction of iTunes and AppStore
is that I can see an "Oh, cool!" app on a buddy's iPhone, and have it on
mine less than 30 seconds later. If Android or WinMo can figure out how to offer that
same kind of experience without the draconian AppStore policies to go with it, they'll
start making up lost ground on iPhone in a hurry.</li>
          <li>
            <em>... Apple becomes the DOJ target of the decade.</em> Microsoft was it in the 2000's,
and Apple's stunning rising success is going to put it squarely in the sights of monopolist
accusations before long. Coupled with the unfortunate health distractions that Steve
Jobs has to deal with, Apple's going to get hammered pretty hard by the end of the
decade, but it will have mastered enough market share and mindshare to weather it
as Microsoft has.</li>
          <li>
            <em>... Google becomes the next Microsoft.</em> It won't be anything the founders
do, but Google will do "something evil", and it will be loudly and screechingly
pointed out by all of Google's corporate opponents, and the star will have fallen.</li>
          <li>
... <em>Microsoft finds its way again.</em> Microsoft, as a company, has lost its
way. This is a company that's not used to losing, and like Bill Belichick's Patriots,
they will find ways to adapt and adjust to the changed circumstances of their position
to find a way to win again. What that'll be, I have no idea, but historically, the
last decade notwithstanding, betting against Microsoft has historically been a bad
idea. My gut tells me they'll figure something new to get that mojo back.</li>
          <li>
            <em>... a politician will make himself or herself famous by standing up to the TSA.</em> The
scene will play out like this: during a Congressional hearing on airline security,
after some nut/terrorist tries to blow up another plane through nitroglycerine-soaked
underwear, the TSA director will suggest all passengers should fly naked in order
to preserve safety, the congressman/woman will stare open-mouthed at this suggestion,
proclaim, "Have you no sense of decency, sir?" and immediately get a standing
ovation and never have to worry about re-election again. Folks, if we want to prevent
any chance of loss of life from a terrorist act on an airplane, we have to prevent
passengers from getting on them. Otherwise, just accept that it might happen, do a
reasonable job of preventing it from happening, and let private insurance start offering
flight insurance against the possibility to reassure the paranoid.</li>
        </ul>
        <p>
See you all next year.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=680b8296-ba07-4230-b067-edceaf04e84b" />
        <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>2010 Predictions, 2009 Predictions Revisited</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,680b8296-ba07-4230-b067-edceaf04e84b.aspx</guid>
      <link>http://blogs.tedneward.com/2010/01/05/2010+Predictions+2009+Predictions+Revisited.aspx</link>
      <pubDate>Tue, 05 Jan 2010 09:45:59 GMT</pubDate>
      <description>&lt;p&gt;
Here we go again—another year, another set of predictions revisited and offered up
for the next 12 months. And maybe, if I'm feeling really ambitious, I'll take that
shot I thought about last year and try predicting for the decade. Without further
ado, I'll go back and revisit, unedited, my predictions for 2009 (&amp;quot;&lt;strong&gt;THEN&lt;/strong&gt;&amp;quot;),
and pontificate on those subjects for 2010 before adding any new material/topics.
Just for convenience, &lt;a href="http://blogs.tedneward.com/2009/01/01/2009+Predictions+2008+Predictions+Revisited.aspx" target="_blank"&gt;here's
a link back to last years' predictions&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Last year's predictions went something like this (complete with basketball-scoring):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&amp;quot;Cloud&amp;quot; will become the next &amp;quot;ESB&amp;quot; or &amp;quot;SOA&amp;quot;,
in that it will be something that everybody will talk about, but few will understand
and even fewer will do anything with. (Considering the widespread disparity in the
definition of the term, this seems like a no-brainer.) &lt;strong&gt;NOW:&lt;/strong&gt; Oh, yeah.
Straight up. I get two points for this one. Does &lt;em&gt;anyone&lt;/em&gt; have a working definition
of &amp;quot;cloud&amp;quot; that applies to all of the major vendors' implementations? &lt;em&gt;Ted,
2; Wrongness, 0&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;Interest in Scala will continue to rise, as will the number
of detractors who point out that Scala is too hard to learn. &lt;strong&gt;NOW:&lt;/strong&gt; Two
points for this one, too. Not a hard one, mind you, but one of those &amp;quot;pass-and-shoot&amp;quot;
jumpers from twelve feet out. James Strachan even tweeted about this earlier today,
pointing out this comparison. As more Java developers who think of themselves as smart
people try to pick up Scala and fail, the numbers of sour grapes responses like &amp;quot;Scala's
too complex, and who needs that functional stuff anyway?&amp;quot; will continue to rise
in 2010. &lt;em&gt;Ted, 4; Wrongness, 0&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Interest in F# will continue to rise, as will the number of
detractors who point out that F# is too hard to learn. (Hey, the two really are cousins,
and the fortunes of one will serve as a pretty good indication of the fortunes of
the other, and both really seem to be on the same arc right now.) &lt;strong&gt;NOW:&lt;/strong&gt; Interestingly
enough, I haven't heard as many F# detractors as Scala detractors, possibly because
I think F# hasn't really reached the masses of .NET developers the way that Scala
has managed to find its way in front of Java developers. I think that'll change mighty
quickly in 2010, though, once VS 2010 hits the streets. &lt;em&gt;Ted, 4; Wrongness 2&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;&lt;em&gt;:&lt;/em&gt; Interest in all kinds of functional languages will
continue to rise, and more than one person will take a hint from Bob &amp;quot;crazybob&amp;quot;
Lee and liken functional programming to AOP, for good and for ill. People who took
classes on Haskell in college will find themselves reaching for their old college
textbooks again. &lt;strong&gt;NOW:&lt;/strong&gt; Yep, I'm claiming two points on this one, if
only because a bunch of Haskell books shipped this year, and they'll be the last to
do so for about five years after this. (By the way, does anybody still remember aspects?)
But I'm going the opposite way with this one now; yes, there's Haskell, and yes, there's
Erlang, and yes, there's a lot of other functional languages out there, but who cares?
They're hard to learn, they don't always translate well to other languages, and developers
want languages that work on the platform they use on a daily basis, and that means
F# and Scala or Clojure, or its simply not an option. &lt;em&gt;Ted 6; Wrongness 2&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;&lt;em&gt;:&lt;/em&gt; The iPhone is going to be hailed as &amp;quot;the enterprise
development platform of the future&amp;quot;, and companies will be rolling out apps to
it. Look for Quicken iPhone edition, PowerPoint and/or Keynote iPhone edition, along
with connectors to hook the iPhone up to a presentation device, and (I'll bet) a World
of Warcraft iPhone client (legit or otherwise). iPhone is the new hotness in the mobile
space, and people will flock to it madly. &lt;strong&gt;NOW:&lt;/strong&gt; Two more points, but
let's be honest—this was a fast-break layup, no work required on my part. &lt;em&gt;Ted
8; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code. &lt;strong&gt;NOW:&lt;/strong&gt; If you've worked at all with Oslo,
you might argue with me, but I'm still taking my two points. The two CTPs were pretty
different in a number of ways. &lt;em&gt;Ted 10; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe). &lt;strong&gt;NOW:&lt;/strong&gt; Pressure is still building.
Let's see what happens by the time VS 2010 ships, and then see what the IPy/IRb teams
start to do to adjust to the versioning issues that arise. &lt;em&gt;Ted 8; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The death of JSR-277 will spark an uprising among the two leading
groups hoping to foist it off on the Java community--OSGi and Maven--while the rest
of the Java world will breathe a huge sigh of relief and look to see what &amp;quot;modularity&amp;quot;
means in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased. &lt;strong&gt;NOW:&lt;/strong&gt; Ah, Ted, you really should never
underestimate the community's willingness to take a bad idea, strip all the goodness
out of it, and then cycle it back into the mix as something completely different yet
somehow just as dangerous and crazy. I give you Project Jigsaw. &lt;em&gt;Ted 10; Wrongness
2;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The invokedynamic JSR will leapfrog in importance to the top
of the list. &lt;strong&gt;NOW:&lt;/strong&gt; The invokedynamic JSR begat interest in other languages
on the JVM. The interest in other languages on the JVM begat the need to start thinking
about how to support them in the Java libraries. The need to start thinking about
supporting those languages begat a &amp;quot;Holy sh*t moment&amp;quot; somewhere inside Sun
and led them to (re-)propose closures for JDK 7. And in local sports news, Ted notched
up two more points on the scoreboard. &lt;em&gt;Ted 12; Wrongness 2.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Another Windows 7 CTP will come out, and it will spawn huge
media interest that will eventually be remembered as Microsoft promises, that will
eventually be remembered as Microsoft guarantees, that will eventually be remembered
as Microsoft FUD and &amp;quot;promising much, delivering little&amp;quot;. Microsoft ain't
always at fault for the inflated expectations people have--sometimes, yes, perhaps
even a lot of times, but not always. &lt;strong&gt;NOW:&lt;/strong&gt; And then, just when the
game started to turn into a runaway, airballs started to fly. The Windows7 release
shipped, and contrary to what I expected, the general response to it was pretty warm.
Yes, there were a few issues that emerged, but overall the media liked it, the masses
liked it, and Microsoft seemed to have dodged a bullet. &lt;em&gt;Ted 12; Wrongness 5.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Apple will begin to legally threaten the clone market again,
except this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.) &lt;strong&gt;NOW:&lt;/strong&gt; What
clones? The only people trying to clone Macs are those who are building Hackintosh
machines, and Apple can't sue them so long as they're using licensed copies of Mac
OS X (as far as I know). Which has never stopped them from trying, mind you, and I
still think Steve has some part of his brain whispering to him at night, calculating
all the hardware sales lost to Hackintosh netbooks out there. But in any event, that's
another shot missed. &lt;em&gt;Ted 12; Wrongness 7.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build. &lt;strong&gt;NOW:&lt;/strong&gt; I
give you Ioke. If I'd extended this to include outdated CPU interpreters, I'd have
made that three-pointer from half-court instead of just the top of the key. &lt;em&gt;Ted
14; Wrongness 7.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Roy Fielding will officially disown most of the &amp;quot;REST&amp;quot;ful
authors and software packages available. Nobody will care--or worse, somebody looking
to make a name for themselves will proclaim that Roy &amp;quot;doesn't really understand
REST&amp;quot;. And they'll be right--Roy doesn't understand what &lt;em&gt;they&lt;/em&gt; consider
to be REST, and the fact that he created the term will be of no importance anymore.
Being &amp;quot;REST&amp;quot;ful will equate to &amp;quot;I did it myself!&amp;quot;, complete with
expectations of a gold star and a lollipop. &lt;strong&gt;NOW:&lt;/strong&gt; Does anybody in
the REST community care what Roy Fielding wrote way back when? I keep seeing &amp;quot;REST&amp;quot;ful
systems that seem to have designers who've never heard of Roy, or his thesis. Roy
hasn't officially disowned them, but damn if he doesn't seem close to it. Still....
No points. &lt;em&gt;Ted 14; Wrongness 9.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice. &lt;strong&gt;NOW:&lt;/strong&gt; Does
anybody still follow Perl 6 development? Has the spec even been written yet? Google
on &amp;quot;Perl 6 release&amp;quot;, and you get varying reports: &amp;quot;It'll ship 'when
it's ready'&amp;quot;, &amp;quot;There are no such dates because this isn't a commericially-backed
effort&amp;quot;, and &amp;quot;Spring 2010&amp;quot;. Swish—nothin' but net. &lt;em&gt;Ted 16; Wrongness
9.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: The debate around &amp;quot;Scrum Certification&amp;quot; will rise
to a fever pitch as short-sighted money-tight companies start looking for reasons
to cut costs and either buy into agile at a superficial level and watch it fail, or
start looking to cut the agilists from their company in order to replace them with
cheaper labor. &lt;strong&gt;NOW:&lt;/strong&gt; Agile has become another adjective meaning &amp;quot;best
practices&amp;quot;, and as such, has essentially lost its meaning. Just ask Scott Bellware. &lt;em&gt;Ted
18; Wrongness 9.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Adobe will continue to make Flex and AIR look more like C#
and the CLR even as Microsoft tries to make Silverlight look more like Flash and AIR.
Web designers will now get to experience the same fun that back-end web developers
have enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either &amp;quot;Flash&amp;quot; shops or &amp;quot;Silverlight&amp;quot; shops. &lt;strong&gt;NOW:&lt;/strong&gt; Not
sure how to score this one—I haven't seen the explicit partitioning happen yet, but
the two environments definitely still seem to be looking to start tromping on each
others' turf, particularly when we look at the rapid releases coming from the Silverlight
team. &lt;em&gt;Ted 16; Wrongness 11.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN&lt;/strong&gt;: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic. &lt;strong&gt;NOW:&lt;/strong&gt; Still
no job offers. Damn. Ah, well. &lt;em&gt;Ted 16; Wrongness 13.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
A close game. Could've gone either way. *shrug* Ah, well. It was silly to try and
score it in basketball metaphor, anyway—that's the last time I watch ESPN before writing
this.
&lt;/p&gt;
&lt;p&gt;
For 2010, I predict....
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;... I will offer 3- and 4-day training classes on F# and Scala, among other things.&lt;/em&gt; OK,
that's not fair—yes, I have the materials, I just need to work out locations and times.
Contact me if you're interested in a private class, by the way.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... I will publish two books, one on F# and one on Scala.&lt;/em&gt; OK, OK, another
plug. Or, rather, more of a resolution. One will be the &amp;quot;Professional F#&amp;quot;
I'm doing for Wiley/Wrox, the other isn't yet finalized. But it'll either be published
through a publisher, or self-published, by JavaOne 2010.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... DSLs will either &amp;quot;succeed&amp;quot; this year, or begin the short slide into
the dustbin of obscure programming ideas.&lt;/em&gt; Domain-specific language advocates
have to put up some kind of strawman for developers to learn from and poke at, or
the whole concept will just fade away. Martin's book will help, if it ships this year,
but even that might not be enough to generate interest if it doesn't have some kind
of large-scale applicability in it. Patterns and refactoring and enterprise containers
all had a huge advantage in that developers could see pretty easily what the problem
was they solved; DSLs haven't made that clear yet.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... functional languages will start to see a backlash.&lt;/em&gt; I hate to say it,
but &amp;quot;getting&amp;quot; the functional mindset is hard, and there's precious few resources
that are making it easy for mainstream (read: O-O) developers make that adjustment,
far fewer than there was during the procedural-to-object shift. If the functional
community doesn't want to become mainstream, then mainstream developers will find
ways to take functional's most compelling gateway use-case (parallel/concurrent programming)
and find a way to &amp;quot;git 'er done&amp;quot; in the traditional O-O approach, probably
through software transactional memory, and functional languages like Haskell and Erlang
will be relegated to the &amp;quot;What Might Have Been&amp;quot; of computer science history.
Not sure what I mean? Try this: walk into a functional language forum, and ask what
a monad is. Nobody yet has been able to produce an answer that doesn't involve math
theory, or that does involve a practical domain-object-based example. In fact, nobody
has really said why (or if) monads are even still useful. Or catamorphisms. Or any
of the other dime-store words that the functional community likes to toss around.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Visual Studio 2010 will ship on time, and be one of the buggiest and/or slowest
releases in its history.&lt;/em&gt; I hate to make this prediction, because I really don't
want to be right, but there's just so much happening in the Visual Studio refactoring
effort that it makes me incredibly nervous. Widespread adoption of VS2010 will wait
until SP1 at the earliest. In fact....&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Visual Studio 2010 SP 1 will ship within three months of the final product.&lt;/em&gt; Microsoft
knows that people wait until SP 1 to think about upgrading, so they'll just plan for
an eager SP 1 release, and hope that managers will be too hung over from the New Year
(still) to notice that the necessary shakeout time hasn't happened.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Apple will ship a tablet with multi-touch on it, and it will flop horribly.&lt;/em&gt; Not
sure why I think this, but I just don't think the multi-touch paradigm that Apple
has cooked up for the iPhone will carry over to a tablet/laptop device. That won't
stop them from shipping it, and it won't stop Apple fan-boiz from buying it, but that's
about where the interest will end.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... JDK 7 closures will be debated for a few weeks, then become a fait accompli
as the Java community shrugs its collective shoulders.&lt;/em&gt; Frankly, I think the Java
community has exhausted its interest in debating new language features for Java. Recent
college grads and open-source groups with an axe to grind will continue to try and
make an issue out of this, but I think the overall Java community just... doesn't...
care. They just want to see JDK 7 ship someday.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Scala either &amp;quot;pops&amp;quot; in 2010, or begins to fall apart.&lt;/em&gt; By &amp;quot;pops&amp;quot;,
I mean reaches a critical mass of developers interested in using it, enough to convince
somebody to create a company around it, a la G2One.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Oracle is going to make a serious &amp;quot;cloud&amp;quot; play, probably by offering
an Oracle-hosted version of Azure or AppEngine.&lt;/em&gt; Oracle loves the enterprise space
too much, and derives too much money from it, to not at least appear to have some
kind of offering here. Now that they own Java, they'll marry it up against OpenSolaris,
the Oracle database, and throw the whole thing into a series of server centers all
over the continent, and call it &amp;quot;Oracle 12c&amp;quot; (c for Cloud, of course) or
something.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Spring development will slow to a crawl and start to take a left turn toward
cloud ideas.&lt;/em&gt; VMWare bought SpringSource for a reason, and I believe it's entirely
centered around VMWare's movement into the cloud space—they want to be more than &amp;quot;just&amp;quot;
a virtualization tool. Spring + Groovy makes a compelling development stack, particularly
if VMWare does some interesting hooks-n-hacks to make Spring a virtualization environment
in its own right somehow. But from a practical perspective, any community-driven development
against Spring is all but basically dead. The source may be downloadable later, like
the VMWare Player code is, but making contributions back? Fuhgeddabowdit.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... the explosion of e-book readers brings the Kindle 2009 edition way down to
size.&lt;/em&gt; The era of the e-book reader is here, and honestly, while I'm glad I have
a Kindle, I'm expecting that I'll be dusting it off a shelf in a few years. Kinda
like I do with my iPods from a few years ago.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... &amp;quot;social networking&amp;quot; becomes the &amp;quot;Web 2.0&amp;quot; of 2010.&lt;/em&gt; In
other words, using the term will basically identify you as a tech wannabe and clearly
out of touch with the bleeding edge.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Facebook becomes a developer platform requirement.&lt;/em&gt; I don't pretend to
know anything about Facebook—I'm not even on it, which amazes my family to no end—but
clearly Facebook is one of those mechanisms by which people reach each other, and
before long, it'll start showing up as a developer requirement for companies looking
to hire. If you're looking to build out your resume to make yourself attractive to
companies in 2010, mad Facebook skillz might not be a bad investment.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Nintendo releases an open SDK for building games for its next-gen DS-based
device.&lt;/em&gt; With the spectacular success of games on the iPhone, Nintendo clearly
must see that they're missing a huge opportunity every day developers can't write
games for the Nintendo DS that are easily downloadable to the device for playing.
Nintendo is not stupid—if they don't open up the SDK and promote &amp;quot;casual&amp;quot;
games like those on the iPhone and those that can now be downloaded to the Zune or
the XBox, they risk being marginalized out of existence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
And for the next decade, I predict....
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;... colleges and unversities will begin issuing e-book reader devices to students.&lt;/em&gt; It's
a helluvalot cheaper than issuing laptops or netbooks, and besides....&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... netbooks and e-book readers will merge before the decade is out.&lt;/em&gt; Let's
be honest—if the e-book reader could do email and browse the web, you have almost
the perfect paperback-sized mobile device. As for the credit-card sized mobile device....&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... mobile phones will all but disappear as they turn into what PDAs tried to
be.&lt;/em&gt; &amp;quot;The iPhone makes calls? Really? You mean Voice-over-IP, right? No,
wait, over cell signal? It can &lt;em&gt;do &lt;/em&gt;that? Wow, there's really an app for everything,
isn't there?&amp;quot;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... wireless formats will skyrocket in importance all around the office and home.&lt;/em&gt; Combine
the iPhone's Bluetooth (or something similar yet lower-power-consuming) with an equally-capable
(Bluetooth or otherwise) projector, and suddenly many executives can leave their netbook
or laptop at home for a business presentation. Throw in the Whispersync-aware e-book
reader/netbook-thing, and now most executives have absolutely zero reason to carry
anything but their e-book/netbook and their phone/PDA. The day somebody figures out
an easy way to combine Bluetooth with PayPal on the iPhone or Android phone, we will
have more or less made pocket change irrelevant. And believe me, that day will happen
before the end of the decade.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... either Android or Windows Mobile will gain some serious market share against
the iPhone the day they figure out how to support an open and unrestricted AppStore-like
app acquisition model.&lt;/em&gt; Let's be honest, the attraction of iTunes and AppStore
is that I can see an &amp;quot;Oh, cool!&amp;quot; app on a buddy's iPhone, and have it on
mine less than 30 seconds later. If Android or WinMo can figure out how to offer that
same kind of experience without the draconian AppStore policies to go with it, they'll
start making up lost ground on iPhone in a hurry.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Apple becomes the DOJ target of the decade.&lt;/em&gt; Microsoft was it in the 2000's,
and Apple's stunning rising success is going to put it squarely in the sights of monopolist
accusations before long. Coupled with the unfortunate health distractions that Steve
Jobs has to deal with, Apple's going to get hammered pretty hard by the end of the
decade, but it will have mastered enough market share and mindshare to weather it
as Microsoft has.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... Google becomes the next Microsoft.&lt;/em&gt; It won't be anything the founders
do, but Google will do &amp;quot;something evil&amp;quot;, and it will be loudly and screechingly
pointed out by all of Google's corporate opponents, and the star will have fallen.&lt;/li&gt;
&lt;li&gt;
... &lt;em&gt;Microsoft finds its way again.&lt;/em&gt; Microsoft, as a company, has lost its
way. This is a company that's not used to losing, and like Bill Belichick's Patriots,
they will find ways to adapt and adjust to the changed circumstances of their position
to find a way to win again. What that'll be, I have no idea, but historically, the
last decade notwithstanding, betting against Microsoft has historically been a bad
idea. My gut tells me they'll figure something new to get that mojo back.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;... a politician will make himself or herself famous by standing up to the TSA.&lt;/em&gt; The
scene will play out like this: during a Congressional hearing on airline security,
after some nut/terrorist tries to blow up another plane through nitroglycerine-soaked
underwear, the TSA director will suggest all passengers should fly naked in order
to preserve safety, the congressman/woman will stare open-mouthed at this suggestion,
proclaim, &amp;quot;Have you no sense of decency, sir?&amp;quot; and immediately get a standing
ovation and never have to worry about re-election again. Folks, if we want to prevent
any chance of loss of life from a terrorist act on an airplane, we have to prevent
passengers from getting on them. Otherwise, just accept that it might happen, do a
reasonable job of preventing it from happening, and let private insurance start offering
flight insurance against the possibility to reassure the paranoid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
See you all next year.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=680b8296-ba07-4230-b067-edceaf04e84b" /&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,680b8296-ba07-4230-b067-edceaf04e84b.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</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>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=d3b4c5aa-2964-492c-9af3-523cb403b444</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d3b4c5aa-2964-492c-9af3-523cb403b444</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Paul asked me to review this, his first book, and my comment to him was that he had
a pretty high bar to match; being of the same "series" as <em>Release It!</em>,
Mike Nygard's take on building software ready for production (and, in my repeatedly
stated opinion, the most important-to-read book of the decade), <em>Debug It!</em> had
some pretty impressive shoes to fill. Paul's comment was pretty predictable: "Thanks
for keeping the pressure to a minimum."
</p>
        <p>
My copy arrived in the mail while I was at the NFJS show in Denver this past weekend,
and with a certain amount of dread and excitement, I opened the envelope and sat down
to read for a few minutes. I managed to get halfway through it before deciding I had
to post a review before I get too caught up in my next trip and forget.
</p>
        <h4>
          <em>Short version</em>
        </h4>
        <p>
          <em>Debug It!</em> is a great resource for anyone looking to learn the science of
good debugging. It is entirely language- and platform-agnostic, preferring to focus
entirely on the <em>process</em> and <em>mindset</em> of debugging, rather than on
edge cases or command-line switches in a tool or language. Overall, the writing is
clear and straightforward without being preachy or judgmental, and is liberally annotated
with real-life case stories from both the authors' and the Pragmatic Programmers'
own history, which keeps the tone lighter and yet still proving the point of the text.
Highly recommended for the junior developers on the team; senior developers will likely
find some good tidbits in here as well. 
</p>
        <h4>
          <em>Long version</em>
        </h4>
        <p>
          <em>Debug It!</em> is an excellently-written and to-the-point description of the process
of not only identifying and fixing defects in software, but also of the attitudes
required to keep software from failing. Rather than simply tossing off old maxims
or warming them over with new terminology ("You should always verify the parameters
to your procedure calls" replaced with "You should always verify the parameters
entering a method and ensure the fields follow the invariants established in the specification"),
Paul ensures that when making a point, his prose is clear, the rationale carefully
explained, and the consequences of not following this advice are clearly spelled out.
His advice is pragmatic, and takes into account that developers can't always follow
the absolute rules we'd like to—he talks about some of his experiences with "bug
priorities" and how users pretty quickly figured out to always set the bug's
priority at the highest level in order to get developer attention, for example, and
some ways to try and address that all-too-human failing of bug-tracking systems.
</p>
        <p>
It needs to be said, right from the beginning, that <em>Debug It!</em> will not teach
you how to use the debugging features of your favorite IDE, however. This is because
Paul (deliberately, it seems) takes a platform- and language-agnostic approach to
the book—there are no examples of how to set breakpoints in gdb, or how to attach
the Visual Studio IDE to a running Windows service, for example. This will likely
weed out those readers who are looking for "Google-able" answers to their
common debugging problems, and that's a shame, because those are probably the very
readers that need to read this book. Having said that, however, I like this agnostic
approach, because these ideas and thought processes, the ones that are entirely independent
of the language or platform, are exactly the kinds of things that senior developers
carry over with them from one platform to the next. Still, the junior developer who
picks this book up is going to still need a reference manual or the user manual for
their IDE or toolchain, and will need to practice some with both books in hand if
they want to maximize the effectiveness of what's in here.
</p>
        <p>
One of the things I like most about this book is that it is liberally adorned with
real-life discussions of various scenarios the author team has experienced; the reason
I say "author team" here is because although the stories (for the most part)
remain unattributed, there are obvious references to "Dave" and "Andy",
which I assume pretty obviously refer to Dave Thomas and Andy Hunt, the Pragmatic
Programmers and the owners of Pragmatic Bookshelf. Some of the stories are humorous,
and some of them probably would be humorous if they didn't strike so close to my own
bitterly-remembered experiences. All of them do a good job of reinforcing the point,
however, thus rendering the prose more effective in communicating the idea without
getting to be too preachy or bombastic.
</p>
        <p>
The book obviously intends to target a junior developer audience, because most senior
developers have already intuitively (or experientially) figured out many of the processes
described in here. But, quite frankly, I think it would be a shame for senior developers
to pass on this one; though the temptation will be to simply toss it aside and say,
"I already do all this stuff", senior developers should resist that urge
and read it through cover to cover. If nothing else, it'll help reinforce certain
ideas, bring some of the intuitive process more to light and allow us to analyze what
we do right and what we do wrong, and perhaps most importantly, give us a common backdrop
against which we can mentor junior developers in the science of debugging.
</p>
        <p>
One of the chapters I like in particular, "Chapter 7: Pragmatic Zero Tolerance",
is particularly good reading for those shops that currently suffer from a deficit
of management support for writing good software. In it, Paul talks specifically about
some of the triage process about bugs ("When to fix bugs"), the mental approach
developers should have to fixing bugs ("The debugging mind-set") and how
to get started on creating good software out of bad ("How to dig yourself out
of a quality hole"). These are techniques that a senior developer can bring to
the team and implement at a grass-roots level, in many cases without management even
being aware of what's going on. (It's a sad state of affairs that we sometimes have
to work behind management's back to write good-quality code, but I know that some
developers out there are in exactly that situation, and simply saying, "Quit
and find a new job", although pithy and good for a laugh on a panel, doesn't
really offer much in the way of help. Paul doesn't take that route here, and that
alone makes this book worth reading.)
</p>
        <p>
Another of the chapters that resonates well with me is the first one in Part III ("Debug
Fu"), Chapter 8, entitled "Special Cases", in which he tackles a number
of "advanced" debugging topics, such as "Patching Existing Releases"
and "Hesenbugs" (Concurrency-related bugs). I won't spoil the punchline
for you, but suffice it to say that I wish I'd had that chapter on hand to give out
to teammates on a few projects I've worked on in the past.
</p>
        <p>
Overall, this book is going to be a huge win, and I think it's a worthy successor
to the <em>Release It!</em> reputation. Development managers and team leads should
get a copy for the junior developers on their team as a Christmas gift, but only after
the senior developers have read through it as well. (Senior devs, don't despair—at
190 pages, you can rip through this in a single night, and I can almost guarantee
that you'll learn a few ideas you can put into practice the next morning to boot.)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d3b4c5aa-2964-492c-9af3-523cb403b444" />
        <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>Book Review: Debug It! (Paul Butcher, Pragmatic Bookshelf)</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</guid>
      <link>http://blogs.tedneward.com/2009/11/23/Book+Review+Debug+It+Paul+Butcher+Pragmatic+Bookshelf.aspx</link>
      <pubDate>Mon, 23 Nov 2009 07:24:41 GMT</pubDate>
      <description>&lt;p&gt;
Paul asked me to review this, his first book, and my comment to him was that he had
a pretty high bar to match; being of the same &amp;quot;series&amp;quot; as &lt;em&gt;Release It!&lt;/em&gt;,
Mike Nygard's take on building software ready for production (and, in my repeatedly
stated opinion, the most important-to-read book of the decade), &lt;em&gt;Debug It!&lt;/em&gt; had
some pretty impressive shoes to fill. Paul's comment was pretty predictable: &amp;quot;Thanks
for keeping the pressure to a minimum.&amp;quot;
&lt;/p&gt;
&lt;p&gt;
My copy arrived in the mail while I was at the NFJS show in Denver this past weekend,
and with a certain amount of dread and excitement, I opened the envelope and sat down
to read for a few minutes. I managed to get halfway through it before deciding I had
to post a review before I get too caught up in my next trip and forget.
&lt;/p&gt;
&lt;h4&gt;&lt;em&gt;Short version&lt;/em&gt;
&lt;/h4&gt;
&lt;p&gt;
&lt;em&gt;Debug It!&lt;/em&gt; is a great resource for anyone looking to learn the science of
good debugging. It is entirely language- and platform-agnostic, preferring to focus
entirely on the &lt;em&gt;process&lt;/em&gt; and &lt;em&gt;mindset&lt;/em&gt; of debugging, rather than on
edge cases or command-line switches in a tool or language. Overall, the writing is
clear and straightforward without being preachy or judgmental, and is liberally annotated
with real-life case stories from both the authors' and the Pragmatic Programmers'
own history, which keeps the tone lighter and yet still proving the point of the text.
Highly recommended for the junior developers on the team; senior developers will likely
find some good tidbits in here as well. 
&lt;/p&gt;
&lt;h4&gt;&lt;em&gt;Long version&lt;/em&gt;
&lt;/h4&gt;
&lt;p&gt;
&lt;em&gt;Debug It!&lt;/em&gt; is an excellently-written and to-the-point description of the process
of not only identifying and fixing defects in software, but also of the attitudes
required to keep software from failing. Rather than simply tossing off old maxims
or warming them over with new terminology (&amp;quot;You should always verify the parameters
to your procedure calls&amp;quot; replaced with &amp;quot;You should always verify the parameters
entering a method and ensure the fields follow the invariants established in the specification&amp;quot;),
Paul ensures that when making a point, his prose is clear, the rationale carefully
explained, and the consequences of not following this advice are clearly spelled out.
His advice is pragmatic, and takes into account that developers can't always follow
the absolute rules we'd like to—he talks about some of his experiences with &amp;quot;bug
priorities&amp;quot; and how users pretty quickly figured out to always set the bug's
priority at the highest level in order to get developer attention, for example, and
some ways to try and address that all-too-human failing of bug-tracking systems.
&lt;/p&gt;
&lt;p&gt;
It needs to be said, right from the beginning, that &lt;em&gt;Debug It!&lt;/em&gt; will not teach
you how to use the debugging features of your favorite IDE, however. This is because
Paul (deliberately, it seems) takes a platform- and language-agnostic approach to
the book—there are no examples of how to set breakpoints in gdb, or how to attach
the Visual Studio IDE to a running Windows service, for example. This will likely
weed out those readers who are looking for &amp;quot;Google-able&amp;quot; answers to their
common debugging problems, and that's a shame, because those are probably the very
readers that need to read this book. Having said that, however, I like this agnostic
approach, because these ideas and thought processes, the ones that are entirely independent
of the language or platform, are exactly the kinds of things that senior developers
carry over with them from one platform to the next. Still, the junior developer who
picks this book up is going to still need a reference manual or the user manual for
their IDE or toolchain, and will need to practice some with both books in hand if
they want to maximize the effectiveness of what's in here.
&lt;/p&gt;
&lt;p&gt;
One of the things I like most about this book is that it is liberally adorned with
real-life discussions of various scenarios the author team has experienced; the reason
I say &amp;quot;author team&amp;quot; here is because although the stories (for the most part)
remain unattributed, there are obvious references to &amp;quot;Dave&amp;quot; and &amp;quot;Andy&amp;quot;,
which I assume pretty obviously refer to Dave Thomas and Andy Hunt, the Pragmatic
Programmers and the owners of Pragmatic Bookshelf. Some of the stories are humorous,
and some of them probably would be humorous if they didn't strike so close to my own
bitterly-remembered experiences. All of them do a good job of reinforcing the point,
however, thus rendering the prose more effective in communicating the idea without
getting to be too preachy or bombastic.
&lt;/p&gt;
&lt;p&gt;
The book obviously intends to target a junior developer audience, because most senior
developers have already intuitively (or experientially) figured out many of the processes
described in here. But, quite frankly, I think it would be a shame for senior developers
to pass on this one; though the temptation will be to simply toss it aside and say,
&amp;quot;I already do all this stuff&amp;quot;, senior developers should resist that urge
and read it through cover to cover. If nothing else, it'll help reinforce certain
ideas, bring some of the intuitive process more to light and allow us to analyze what
we do right and what we do wrong, and perhaps most importantly, give us a common backdrop
against which we can mentor junior developers in the science of debugging.
&lt;/p&gt;
&lt;p&gt;
One of the chapters I like in particular, &amp;quot;Chapter 7: Pragmatic Zero Tolerance&amp;quot;,
is particularly good reading for those shops that currently suffer from a deficit
of management support for writing good software. In it, Paul talks specifically about
some of the triage process about bugs (&amp;quot;When to fix bugs&amp;quot;), the mental approach
developers should have to fixing bugs (&amp;quot;The debugging mind-set&amp;quot;) and how
to get started on creating good software out of bad (&amp;quot;How to dig yourself out
of a quality hole&amp;quot;). These are techniques that a senior developer can bring to
the team and implement at a grass-roots level, in many cases without management even
being aware of what's going on. (It's a sad state of affairs that we sometimes have
to work behind management's back to write good-quality code, but I know that some
developers out there are in exactly that situation, and simply saying, &amp;quot;Quit
and find a new job&amp;quot;, although pithy and good for a laugh on a panel, doesn't
really offer much in the way of help. Paul doesn't take that route here, and that
alone makes this book worth reading.)
&lt;/p&gt;
&lt;p&gt;
Another of the chapters that resonates well with me is the first one in Part III (&amp;quot;Debug
Fu&amp;quot;), Chapter 8, entitled &amp;quot;Special Cases&amp;quot;, in which he tackles a number
of &amp;quot;advanced&amp;quot; debugging topics, such as &amp;quot;Patching Existing Releases&amp;quot;
and &amp;quot;Hesenbugs&amp;quot; (Concurrency-related bugs). I won't spoil the punchline
for you, but suffice it to say that I wish I'd had that chapter on hand to give out
to teammates on a few projects I've worked on in the past.
&lt;/p&gt;
&lt;p&gt;
Overall, this book is going to be a huge win, and I think it's a worthy successor
to the &lt;em&gt;Release It!&lt;/em&gt; reputation. Development managers and team leads should
get a copy for the junior developers on their team as a Christmas gift, but only after
the senior developers have read through it as well. (Senior devs, don't despair—at
190 pages, you can rip through this in a single night, and I can almost guarantee
that you'll learn a few ideas you can put into practice the next morning to boot.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d3b4c5aa-2964-492c-9af3-523cb403b444" /&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,d3b4c5aa-2964-492c-9af3-523cb403b444.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da</wfw:commentRss>
      <slash:comments>12</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Phil Haack wrote <a href="http://haacked.com/archive/2009/10/13/software-externalities.aspx" target="_blank">a
thoughtful, insightful and absolutely correct response</a> to <a href="http://blogs.tedneward.com/2009/10/12/quotAgile+Is+Treating+The+Symptoms+Not+The+Diseasequot.aspx" target="_blank">my
earlier blog post</a>. But he's still missing the point.
</p>
        <p>
The short version: Phil's right when he says, "<strong>Agile is less about managing
the complexity of an application itself and more about managing the complexity of
building an application</strong>." Agile is by far the best approach to take
when building complex software. 
</p>
        <p>
But that's not where I'm going with this. 
</p>
        <p>
As a starting point in the discussion, I'd like to call attention to one of Phil's
sidebars: I find it curious (and indicative of the larger point) his earlier comment
about "<em>I have to wonder, why is that little school district in western Pennsylvania
engaging in custom software development in the first place?</em>" At what point
does standing a small Access database up qualify as "custom software development"?
And I take <em>huge</em> issue with Phil's comment immediately thereafter: ""
That's totally untrue, Phil—you are, in fact, creating custom educational curricula,
for your children at home. Not for popular usage, not for commercial use, but clearly
you're educating your children at home, because you'd be a pretty crappy parent if
you didn't. You also practice an informal form of medicine ("Let me kiss the
boo-boo"), psychology ("Now, come on, share the truck"), culinary arts
("Would you like mac and cheese tonight?"), acting ("Aaar! I'm the
Tickle Monster!") and a vastly larger array of "professional" skills
that any of the "professionals" will do vastly better than you.
</p>
        <p>
In other words, you're not a professional actor/chef/shrink/doctor, you're an amateur
one, and you want tools that let you practice your amateur "professions"
as you wish, without requiring the skills and trappings (and overhead) of a professional
in the same arena.
</p>
        <p>
Consider this, Phil: your child decides it's time to have a puppy. (We all know the
kids are the ones who make these choices, not us, right?) So, being the conscientious
parent that you are, you decide to build a doghouse for the new puppy to use to sleep
outdoors (forgetting, as all parents do, that the puppy will actually end up sleeping
in the bed with your child, but that's another discussion for another day). So immediately
you head on down to Home Depot, grab some lumber, some nails, maybe a hammer and a
screwdriver, some paint, and head on home.
</p>
        <p>
Whoa, there, turbo. Aren't you forgetting a few things? For starters, you need to
get the concrete for the foundation, rebar to support the concrete in the event of
a bad earthquake, drywall, fire extinguishers, sirens for the emergency exit doors...
And of course, you'll need a foreman to coordinate all the work, to make sure the
foundation is poured before the carpenters show up to put up the trusses, which in
turn has to happen before the drywall can go up...
</p>
        <p>
We in this industry have a jealous and irrational attitude towards the amateur software
developer. This was even apparent in the Twitter comments that accompanied the conversation
around my blog post: "@<a href="http://twitter.com/tedneward">tedneward</a> treating
the disease would mean... have the client have all their ideas correct from the start"
(from <a href="http://twitter.com/kelps/statuses/4839762645" target="_blank">@kelps</a>).
In other words, "bad client! No biscuit!"?
</p>
        <p>
Why is it that we, IT professionals, consider anything that involves doing something
other than simply putting content into an application to be "custom software
development"? Why can't end-users create tools of their own to solve their own
problems at a scale appropriate to their local problem?
</p>
        <p>
Phil offers a few examples of why end-users creating their own tools is a Bad Idea:
</p>
        <blockquote>
          <p>
I remember one rescue operation for a company drowning in the complexity of a “simple”
Access application they used to run their business. It was simple until they started
adding new business processes they needed to track. It was simple until they started <em>emailing
copies around </em>and were unsure which was the “master copy”. Not to mention all
the data integrity issues and difficulty in changing the monolithic procedural application
code.
</p>
        </blockquote>
        <blockquote>
          <p>
I also remember helping a teachers union who started off with a simple attendance
tracker style app (to use an example Ted mentions) and just scaled it up to an atrociously
complex Access database with stranded data and manual processes where they printed
excel spreadsheets to paper, then manually entered it into another application.
</p>
        </blockquote>
        <p>
And you know what? 
</p>
        <p>
This is not a bad state of affairs. 
</p>
        <p>
Oh, of course, we, the IT professionals, will immediately pounce on all the things
wrong with their attempts to extend the once-simple application/solution in ways beyond
its capabilities, and we will scoff at their solutions, but you know what? That just
speaks to our insecurities, not the effort expended. You think Wolfgang Puck isn't
going to throw back his head and roar at my lame attempts at culinary experimentation?
You think Frank Lloyd Wright wouldn't cringe in horror at my cobbled-together doghouse?
And I'll bet Maya Angelou will be so shocked at the ugliness of my poetry that she'll
post it somewhere on the "So You Think You're A Poet" website.
</p>
        <p>
Does that mean I need to abandon my efforts to all of these things?
</p>
        <p>
The agilists' community reaction to my post would seem to imply so. "If you aren't
a professional, don't even attempt this?" Really? Is that the message we're preaching
these days?
</p>
        <p>
End users have just as much a desire and right to be amateur software developers as
we do at being amateur cooks, photographers, poets, construction foremen, and musicians.
And what do you do when you want to add an addition to your house instead of just
building a doghouse? Or when you want to cook for several hundred people instead of
just your family?
</p>
        <p>
You hire a professional, and let them do the project professionally.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da" />
        <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>Haacked, but not content; agile still treats the disease</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</guid>
      <link>http://blogs.tedneward.com/2009/10/13/Haacked+But+Not+Content+Agile+Still+Treats+The+Disease.aspx</link>
      <pubDate>Tue, 13 Oct 2009 20:42:22 GMT</pubDate>
      <description>&lt;p&gt;
Phil Haack wrote &lt;a href="http://haacked.com/archive/2009/10/13/software-externalities.aspx" target="_blank"&gt;a
thoughtful, insightful and absolutely correct response&lt;/a&gt; to &lt;a href="http://blogs.tedneward.com/2009/10/12/quotAgile+Is+Treating+The+Symptoms+Not+The+Diseasequot.aspx" target="_blank"&gt;my
earlier blog post&lt;/a&gt;. But he's still missing the point.
&lt;/p&gt;
&lt;p&gt;
The short version: Phil's right when he says, &amp;quot;&lt;strong&gt;Agile is less about managing
the complexity of an application itself and more about managing the complexity of
building an application&lt;/strong&gt;.&amp;quot; Agile is by far the best approach to take
when building complex software. 
&lt;/p&gt;
&lt;p&gt;
But that's not where I'm going with this. 
&lt;/p&gt;
&lt;p&gt;
As a starting point in the discussion, I'd like to call attention to one of Phil's
sidebars: I find it curious (and indicative of the larger point) his earlier comment
about &amp;quot;&lt;em&gt;I have to wonder, why is that little school district in western Pennsylvania
engaging in custom software development in the first place?&lt;/em&gt;&amp;quot; At what point
does standing a small Access database up qualify as &amp;quot;custom software development&amp;quot;?
And I take &lt;em&gt;huge&lt;/em&gt; issue with Phil's comment immediately thereafter: &amp;quot;&amp;quot;
That's totally untrue, Phil—you are, in fact, creating custom educational curricula,
for your children at home. Not for popular usage, not for commercial use, but clearly
you're educating your children at home, because you'd be a pretty crappy parent if
you didn't. You also practice an informal form of medicine (&amp;quot;Let me kiss the
boo-boo&amp;quot;), psychology (&amp;quot;Now, come on, share the truck&amp;quot;), culinary arts
(&amp;quot;Would you like mac and cheese tonight?&amp;quot;), acting (&amp;quot;Aaar! I'm the
Tickle Monster!&amp;quot;) and a vastly larger array of &amp;quot;professional&amp;quot; skills
that any of the &amp;quot;professionals&amp;quot; will do vastly better than you.
&lt;/p&gt;
&lt;p&gt;
In other words, you're not a professional actor/chef/shrink/doctor, you're an amateur
one, and you want tools that let you practice your amateur &amp;quot;professions&amp;quot;
as you wish, without requiring the skills and trappings (and overhead) of a professional
in the same arena.
&lt;/p&gt;
&lt;p&gt;
Consider this, Phil: your child decides it's time to have a puppy. (We all know the
kids are the ones who make these choices, not us, right?) So, being the conscientious
parent that you are, you decide to build a doghouse for the new puppy to use to sleep
outdoors (forgetting, as all parents do, that the puppy will actually end up sleeping
in the bed with your child, but that's another discussion for another day). So immediately
you head on down to Home Depot, grab some lumber, some nails, maybe a hammer and a
screwdriver, some paint, and head on home.
&lt;/p&gt;
&lt;p&gt;
Whoa, there, turbo. Aren't you forgetting a few things? For starters, you need to
get the concrete for the foundation, rebar to support the concrete in the event of
a bad earthquake, drywall, fire extinguishers, sirens for the emergency exit doors...
And of course, you'll need a foreman to coordinate all the work, to make sure the
foundation is poured before the carpenters show up to put up the trusses, which in
turn has to happen before the drywall can go up...
&lt;/p&gt;
&lt;p&gt;
We in this industry have a jealous and irrational attitude towards the amateur software
developer. This was even apparent in the Twitter comments that accompanied the conversation
around my blog post: &amp;quot;@&lt;a href="http://twitter.com/tedneward"&gt;tedneward&lt;/a&gt; treating
the disease would mean... have the client have all their ideas correct from the start&amp;quot;
(from &lt;a href="http://twitter.com/kelps/statuses/4839762645" target="_blank"&gt;@kelps&lt;/a&gt;).
In other words, &amp;quot;bad client! No biscuit!&amp;quot;?
&lt;/p&gt;
&lt;p&gt;
Why is it that we, IT professionals, consider anything that involves doing something
other than simply putting content into an application to be &amp;quot;custom software
development&amp;quot;? Why can't end-users create tools of their own to solve their own
problems at a scale appropriate to their local problem?
&lt;/p&gt;
&lt;p&gt;
Phil offers a few examples of why end-users creating their own tools is a Bad Idea:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I remember one rescue operation for a company drowning in the complexity of a “simple”
Access application they used to run their business. It was simple until they started
adding new business processes they needed to track. It was simple until they started &lt;em&gt;emailing
copies around &lt;/em&gt;and were unsure which was the “master copy”. Not to mention all
the data integrity issues and difficulty in changing the monolithic procedural application
code.
&lt;/p&gt;
&lt;/blockquote&gt; &lt;blockquote&gt; 
&lt;p&gt;
I also remember helping a teachers union who started off with a simple attendance
tracker style app (to use an example Ted mentions) and just scaled it up to an atrociously
complex Access database with stranded data and manual processes where they printed
excel spreadsheets to paper, then manually entered it into another application.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
And you know what? 
&lt;/p&gt;
&lt;p&gt;
This is not a bad state of affairs. 
&lt;/p&gt;
&lt;p&gt;
Oh, of course, we, the IT professionals, will immediately pounce on all the things
wrong with their attempts to extend the once-simple application/solution in ways beyond
its capabilities, and we will scoff at their solutions, but you know what? That just
speaks to our insecurities, not the effort expended. You think Wolfgang Puck isn't
going to throw back his head and roar at my lame attempts at culinary experimentation?
You think Frank Lloyd Wright wouldn't cringe in horror at my cobbled-together doghouse?
And I'll bet Maya Angelou will be so shocked at the ugliness of my poetry that she'll
post it somewhere on the &amp;quot;So You Think You're A Poet&amp;quot; website.
&lt;/p&gt;
&lt;p&gt;
Does that mean I need to abandon my efforts to all of these things?
&lt;/p&gt;
&lt;p&gt;
The agilists' community reaction to my post would seem to imply so. &amp;quot;If you aren't
a professional, don't even attempt this?&amp;quot; Really? Is that the message we're preaching
these days?
&lt;/p&gt;
&lt;p&gt;
End users have just as much a desire and right to be amateur software developers as
we do at being amateur cooks, photographers, poets, construction foremen, and musicians.
And what do you do when you want to add an addition to your house instead of just
building a doghouse? Or when you want to cook for several hundred people instead of
just your family?
&lt;/p&gt;
&lt;p&gt;
You hire a professional, and let them do the project professionally.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da" /&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,f9d4f3dc-bf96-4f4b-8794-6a053ab2d7da.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Social</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=236aa3a3-83db-4c81-bb14-3085d551dad3</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,236aa3a3-83db-4c81-bb14-3085d551dad3.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,236aa3a3-83db-4c81-bb14-3085d551dad3.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=236aa3a3-83db-4c81-bb14-3085d551dad3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This email crossed my Inbox last week while I was on the road:
</p>
        <blockquote>
          <p>
Due to the current economic situation, TechWeb has made the difficult decision to
discontinue the Software Development events, including SD West, SD Best Practices
and Architecture &amp; Design World. We are grateful for your support during SD's
twenty-four year history and are disappointed to see the events end.
</p>
        </blockquote>
        <p>
This really bums me out, because the SD shows were some of the best shows I’ve been
to, particularly SD West, which always had a great cross-cutting collection of experts
from all across the industry’s big technical areas: C++, Java, .NET, security, agile,
and more. It was also where I got to meet and interview Bjarne Stroustrup, a personal
hero of mine from back in my days as a C++ developer, where I got to hang out each
year with Scott Meyers, another personal hero (and now a good friend) as well as editor
on <em>Effective Enterprise Java</em>, and Mike Cohn, another good friend as well
as a great guy to work for. It was where I first met Gary McGraw, in a rather embarrassing
fashion—in the middle of his presentation on security, my cell phone went off with
a klaxon alarm ring tone loud enough to be heard throughout the entire room, and as
every head turned to look at me, he commented dryly, “That’s the buffer overrun alarm—somewhere
in the world, a buffer overrun attack is taking place.”
</p>
        <p>
On a positive note, however, the email goes on to say that “<a href="http://TIG.cmptechnetwork.com/cgi-bin4/DM/y/nBP5n0JjIlP0ZFX0HEjd0Eu">Cloud
Connect</a> [will] take over SD West's dates in March 2010 at the Santa Clara Convention
Center”, which is good news, since it means (hopefully) that I’ll still get a chance
to make my yearly pilgrimage to In-N-Out....
</p>
        <p>
Rest in peace, SD. You will be missed.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=236aa3a3-83db-4c81-bb14-3085d551dad3" />
        <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>SDWest, SDBestPractices, SDArch&amp;amp;Design: RIP, 1975 - 2009</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,236aa3a3-83db-4c81-bb14-3085d551dad3.aspx</guid>
      <link>http://blogs.tedneward.com/2009/03/24/SDWest+SDBestPractices+SDArchampDesign+RIP+1975+2009.aspx</link>
      <pubDate>Tue, 24 Mar 2009 00:22:43 GMT</pubDate>
      <description>&lt;p&gt;
This email crossed my Inbox last week while I was on the road:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Due to the current economic situation, TechWeb has made the difficult decision to
discontinue the Software Development events, including SD West, SD Best Practices
and Architecture &amp;amp; Design World. We are grateful for your support during SD's
twenty-four year history and are disappointed to see the events end.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This really bums me out, because the SD shows were some of the best shows I’ve been
to, particularly SD West, which always had a great cross-cutting collection of experts
from all across the industry’s big technical areas: C++, Java, .NET, security, agile,
and more. It was also where I got to meet and interview Bjarne Stroustrup, a personal
hero of mine from back in my days as a C++ developer, where I got to hang out each
year with Scott Meyers, another personal hero (and now a good friend) as well as editor
on &lt;em&gt;Effective Enterprise Java&lt;/em&gt;, and Mike Cohn, another good friend as well
as a great guy to work for. It was where I first met Gary McGraw, in a rather embarrassing
fashion—in the middle of his presentation on security, my cell phone went off with
a klaxon alarm ring tone loud enough to be heard throughout the entire room, and as
every head turned to look at me, he commented dryly, “That’s the buffer overrun alarm—somewhere
in the world, a buffer overrun attack is taking place.”
&lt;/p&gt;
&lt;p&gt;
On a positive note, however, the email goes on to say that “&lt;a href="http://TIG.cmptechnetwork.com/cgi-bin4/DM/y/nBP5n0JjIlP0ZFX0HEjd0Eu"&gt;Cloud
Connect&lt;/a&gt; [will] take over SD West's dates in March 2010 at the Santa Clara Convention
Center”, which is good news, since it means (hopefully) that I’ll still get a chance
to make my yearly pilgrimage to In-N-Out....
&lt;/p&gt;
&lt;p&gt;
Rest in peace, SD. You will be missed.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=236aa3a3-83db-4c81-bb14-3085d551dad3" /&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,236aa3a3-83db-4c81-bb14-3085d551dad3.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Visual Basic</category>
      <category>WCF</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=b002a7e5-4308-4d6d-aab5-076011e6adcf</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,b002a7e5-4308-4d6d-aab5-076011e6adcf.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,b002a7e5-4308-4d6d-aab5-076011e6adcf.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b002a7e5-4308-4d6d-aab5-076011e6adcf</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Interesting little tidbit crossed my Inbox today...
</p>
        <blockquote>
          <p>
Only 8% members of the Scientific Research Society agreed that "peer review works
well as it is". (Chubin and Hackett, 1990; p.192). 
</p>
          <p>
"A recent U.S. Supreme Court decision and an analysis of the peer review system substantiate
complaints about this fundamental aspect of scientific research." (Horrobin, 2001) 
</p>
          <p>
Horrobin concludes that peer review "is a non-validated charade whose processes generate
results little better than does chance." (Horrobin, 2001). This has been statistically
proven and reported by an increasing number of journal editors. 
</p>
          <p>
But, "Peer Review is one of the sacred pillars of the scientific edifice" (Goodstein,
2000), it is a necessary condition in quality assurance for Scientific/Engineering
publications, and "Peer Review is central to the organization of modern science…why
not apply scientific [and engineering] methods to the peer review process" (Horrobin,
2001). 
</p>
          <p>
... 
</p>
          <p>
Chubin, D. R. and Hackett E. J., 1990, Peerless Science, Peer Review and U.S. Science
Policy; New York, State University of New York Press. 
</p>
          <p>
Horrobin, D., 2001, "Something Rotten at the Core of Science?" Trends in Pharmacological
Sciences, Vol. 22, No. 2, February 2001. Also at <a href="http://www.whale.to/vaccine/sci.html">http://www.whale.to/vaccine/sci.html</a> and <a href="http://post.queensu.ca/~forsdyke/peerrev4.htm">http://post.queensu.ca/~forsdyke/peerrev4.htm</a> (both
pages were accessed on February 1, 2009) 
</p>
          <p>
Goodstein, D., 2000, "How Science Works", U.S. Federal Judiciary Reference Manual
on Evidence, pp. 66-72 (referenced in Hoorobin, 2000)
</p>
        </blockquote>
        <p>
I know that we don't generally cite the scientific process as part of the rationale
for justifying code reviews, but it seems to have a distinct relationship. If the
peer review process is similar in concept to the code review process, and the scientific
types are starting to doubt the efficacy of peer reviews, what does that say about
the code review? 
</p>
        <p>
          <em>(Note: I'm not a scientist, so my familiarity with peer review is third-hand at
best; I'm wide open to education here. How are the code review and peer review processes
different, if in fact, they are different?)</em>
        </p>
        <p>
The Horrobin "sacred pillars" quote, in particular, makes me curious: Don't we already
apply "scientific [and engineering] methods" to the peer review process? And can we
honestly say that we in the software industry apply "scientific [and engineering]"
methods to the code review process? Can we iterate the list? Or do we just trust that
intuition and "more eyeballs" will help spot any obvious defects?
</p>
        <p>
The implications here, when tied up next to the open source fundamental principle
that states that "more eyeballs is better", are interesting to consider. <em>If</em> review
is not a scientifically-proven or "engineeringly-sound" principle, then the open source
folks are kidding themselves in thinking they're more secure or better-engineered. <em>If</em> we
conduct a scientific measurement of code-reviewed code and find that it is "a non-validated
charade whose processes generate results little better than does chance", we've at
least conducted the study, and can start thinking about ways to make it better. (I
do wish the email author had cited sources that provide the background to the statement,
"This has been statistically proven", though.)
</p>
        <p>
I know this is going to seem like a trolling post, but I'm genuinely curious--do we,
in the software industry, have any scientifically-conducted studies with quantifiable
metrics that imply that code-reviewed code is better than non-reviewed code? Or are
we just taking it as another article of faith?
</p>
        <p>
(For those who are curious, the email that triggered all this was an invitation to
a conference on peer review.
</p>
        <blockquote>
          <p>
This is the purpose of the International Symposium on Peer Reviewing: ISPR (<a href="http://www.ICTconfer.org/ispr">http://www.ICTconfer.org/ispr</a>)
being organized in the context of The 3rd International Conference on Knowledge Generation,
Communication and Management: KGCM 2009 (<a href="http://www.ICTconfer.org/kgcm">http://www.ICTconfer.org/kgcm</a>),
which will be held on July 10-13, 2009, in Orlando, Florida, USA.
</p>
        </blockquote>
        <p>
I doubt it has any direct relevance to software, but I could be wrong. If you go,
let me know of your adventures and conclusions. ;-) )
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b002a7e5-4308-4d6d-aab5-076011e6adcf" />
        <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>As for Peer Review, Code Review?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,b002a7e5-4308-4d6d-aab5-076011e6adcf.aspx</guid>
      <link>http://blogs.tedneward.com/2009/02/22/As+For+Peer+Review+Code+Review.aspx</link>
      <pubDate>Sun, 22 Feb 2009 18:36:43 GMT</pubDate>
      <description>&lt;p&gt;
Interesting little tidbit crossed my Inbox today...
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Only 8% members of the Scientific Research Society agreed that "peer review works
well as it is". (Chubin and Hackett, 1990; p.192). 
&lt;p&gt;
"A recent U.S. Supreme Court decision and an analysis of the peer review system substantiate
complaints about this fundamental aspect of scientific research." (Horrobin, 2001) 
&lt;p&gt;
Horrobin concludes that peer review "is a non-validated charade whose processes generate
results little better than does chance." (Horrobin, 2001). This has been statistically
proven and reported by an increasing number of journal editors. 
&lt;p&gt;
But, "Peer Review is one of the sacred pillars of the scientific edifice" (Goodstein,
2000), it is a necessary condition in quality assurance for Scientific/Engineering
publications, and "Peer Review is central to the organization of modern science…why
not apply scientific [and engineering] methods to the peer review process" (Horrobin,
2001). 
&lt;p&gt;
... 
&lt;p&gt;
Chubin, D. R. and Hackett E. J., 1990, Peerless Science, Peer Review and U.S. Science
Policy; New York, State University of New York Press. 
&lt;p&gt;
Horrobin, D., 2001, "Something Rotten at the Core of Science?" Trends in Pharmacological
Sciences, Vol. 22, No. 2, February 2001. Also at &lt;a href="http://www.whale.to/vaccine/sci.html"&gt;http://www.whale.to/vaccine/sci.html&lt;/a&gt; and &lt;a href="http://post.queensu.ca/~forsdyke/peerrev4.htm"&gt;http://post.queensu.ca/~forsdyke/peerrev4.htm&lt;/a&gt; (both
pages were accessed on February 1, 2009) 
&lt;p&gt;
Goodstein, D., 2000, "How Science Works", U.S. Federal Judiciary Reference Manual
on Evidence, pp. 66-72 (referenced in Hoorobin, 2000)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I know that we don't generally cite the scientific process as part of the rationale
for justifying code reviews, but it seems to have a distinct relationship. If the
peer review process is similar in concept to the code review process, and the scientific
types are starting to doubt the efficacy of peer reviews, what does that say about
the code review? 
&lt;p&gt;
&lt;em&gt;(Note: I'm not a scientist, so my familiarity with peer review is third-hand at
best; I'm wide open to education here. How are the code review and peer review processes
different, if in fact, they are different?)&lt;/em&gt; 
&lt;p&gt;
The Horrobin "sacred pillars" quote, in particular, makes me curious: Don't we already
apply "scientific [and engineering] methods" to the peer review process? And can we
honestly say that we in the software industry apply "scientific [and engineering]"
methods to the code review process? Can we iterate the list? Or do we just trust that
intuition and "more eyeballs" will help spot any obvious defects?
&lt;/p&gt;
&lt;p&gt;
The implications here, when tied up next to the open source fundamental principle
that states that "more eyeballs is better", are interesting to consider. &lt;em&gt;If&lt;/em&gt; review
is not a scientifically-proven or "engineeringly-sound" principle, then the open source
folks are kidding themselves in thinking they're more secure or better-engineered. &lt;em&gt;If&lt;/em&gt; we
conduct a scientific measurement of code-reviewed code and find that it is "a non-validated
charade whose processes generate results little better than does chance", we've at
least conducted the study, and can start thinking about ways to make it better. (I
do wish the email author had cited sources that provide the background to the statement,
"This has been statistically proven", though.)
&lt;/p&gt;
&lt;p&gt;
I know this is going to seem like a trolling post, but I'm genuinely curious--do we,
in the software industry, have any scientifically-conducted studies with quantifiable
metrics that imply that code-reviewed code is better than non-reviewed code? Or are
we just taking it as another article of faith?
&lt;/p&gt;
&lt;p&gt;
(For those who are curious, the email that triggered all this was an invitation to
a conference on peer review.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
This is the purpose of the International Symposium on Peer Reviewing: ISPR (&lt;a href="http://www.ICTconfer.org/ispr"&gt;http://www.ICTconfer.org/ispr&lt;/a&gt;)
being organized in the context of The 3rd International Conference on Knowledge Generation,
Communication and Management: KGCM 2009 (&lt;a href="http://www.ICTconfer.org/kgcm"&gt;http://www.ICTconfer.org/kgcm&lt;/a&gt;),
which will be held on July 10-13, 2009, in Orlando, Florida, USA.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I doubt it has any direct relevance to software, but I could be wrong. If you go,
let me know of your adventures and conclusions. ;-) )
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b002a7e5-4308-4d6d-aab5-076011e6adcf" /&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,b002a7e5-4308-4d6d-aab5-076011e6adcf.aspx</comments>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Security</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=4fb4ac8a-859b-4a26-bdb7-b7f851e27e60</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,4fb4ac8a-859b-4a26-bdb7-b7f851e27e60.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,4fb4ac8a-859b-4a26-bdb7-b7f851e27e60.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4fb4ac8a-859b-4a26-bdb7-b7f851e27e60</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
People are used to the idea of phishing attacks showing up in their email, but in
glowing testament to the creativity of potential attackers, Twitter recently has seen
a rash of phishing attacks through Twitter's "direct messaging" feature.
</p>
        <p>
The attack plays out like this: someone on your Twitter followers list sends you a
direct message saying, "hey! check out this funny blog about you... " with a hyperlink
to a website, "http://jannawalitax.blogspot.com/" . Clicking on the hyperlink takes
you to a website that redirects to a webpage containing what <em>looks</em> like the
Twitter login page. This is an attempt to get you to fill in your username, and more
importantly, your password.
</p>
        <p>
Needless to say, I'd avoid it. If you do get suckered in (hey, I admit it, I did),
make sure to change your password immediately after.
</p>
        <p>
What I find fascinating about this attack is that the direct messages come from people
that are on my followers list--unless Twitter somehow has a hole in it that allows
non-followers to direct-message you, it means that this is a classic security Ponzi
scheme: I use the attack to gather the credentials for the people that I'm following
directly, then log in and use those credentials to attack their followers, then use
those gathered credentials to attack their followers, and so on. Fixing this is also
going to be a pain--literally, everybody on Twitter has to change their password,
or the scheme can continue with the credentials of those who didn't. (Assuming Twitter
doesn't somehow lop the attack off at the knees, for example, by disallowing hyperlinks
or something equally draconian.)
</p>
        <p>
We won't even stop to consider what damage might be done if a Twitter-user uses the
same password and login name for their Twitter account as they do for other accounts
(such as email, banking websites, and so on). If you're one of those folks, you seriously
might want to reconsider the strategy of using the same password for all your websites,
unless you don't care if they get spoofed.
</p>
        <p>
There's two lessons to be learned here. 
</p>
        <p>
One, that as a user of a service--<em>any</em> service--you have to be careful about
when and how you're entering your credentials. It's easy to simply get into the habit
of offering them up every time you see something that looks familiar, and if supposed
"computer experts" (as most of the Twitterverse can be described) can be fooled, then
how about the casual user? 
</p>
        <p>
Two, and perhaps the more important lesson for those of us who build software, that
any time you build a system that enables people to communicate, even when you put
a lot of energy into making sure that the system is secure, there's always an angle
that attackers will find that will expose a vulnerability, even if it's just a partial
one (such as the gathering of credentials here). If you don't need to allow hyperlinks,
don't. If you don't need to allow Javascript, don't. Start from the bare minimum that
people need to make your system work, and only add new capabilities after they've
been scrutinized in a variety of ways. (YAGNI sometimes works to our advantage in
more ways than one, it turns out.)
</p>
        <p>
Kudos, by the way, to the Twitter-keepers, who had a message describing the direct-message
phishing attack on the Twitter Home page within hours.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4fb4ac8a-859b-4a26-bdb7-b7f851e27e60" />
        <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>Phishing attacks know no boundaries... or limits</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,4fb4ac8a-859b-4a26-bdb7-b7f851e27e60.aspx</guid>
      <link>http://blogs.tedneward.com/2009/01/04/Phishing+Attacks+Know+No+Boundaries+Or+Limits.aspx</link>
      <pubDate>Sun, 04 Jan 2009 01:22:38 GMT</pubDate>
      <description>&lt;p&gt;
People are used to the idea of phishing attacks showing up in their email, but in
glowing testament to the creativity of potential attackers, Twitter recently has seen
a rash of phishing attacks through Twitter's "direct messaging" feature.
&lt;/p&gt;
&lt;p&gt;
The attack plays out like this: someone on your Twitter followers list sends you a
direct message saying, "hey! check out this funny blog about you... " with a hyperlink
to a website, "http://jannawalitax.blogspot.com/" . Clicking on the hyperlink takes
you to a website that redirects to a webpage containing what &lt;em&gt;looks&lt;/em&gt; like the
Twitter login page. This is an attempt to get you to fill in your username, and more
importantly, your password.
&lt;/p&gt;
&lt;p&gt;
Needless to say, I'd avoid it. If you do get suckered in (hey, I admit it, I did),
make sure to change your password immediately after.
&lt;/p&gt;
&lt;p&gt;
What I find fascinating about this attack is that the direct messages come from people
that are on my followers list--unless Twitter somehow has a hole in it that allows
non-followers to direct-message you, it means that this is a classic security Ponzi
scheme: I use the attack to gather the credentials for the people that I'm following
directly, then log in and use those credentials to attack their followers, then use
those gathered credentials to attack their followers, and so on. Fixing this is also
going to be a pain--literally, everybody on Twitter has to change their password,
or the scheme can continue with the credentials of those who didn't. (Assuming Twitter
doesn't somehow lop the attack off at the knees, for example, by disallowing hyperlinks
or something equally draconian.)
&lt;/p&gt;
&lt;p&gt;
We won't even stop to consider what damage might be done if a Twitter-user uses the
same password and login name for their Twitter account as they do for other accounts
(such as email, banking websites, and so on). If you're one of those folks, you seriously
might want to reconsider the strategy of using the same password for all your websites,
unless you don't care if they get spoofed.
&lt;/p&gt;
&lt;p&gt;
There's two lessons to be learned here. 
&lt;/p&gt;
&lt;p&gt;
One, that as a user of a service--&lt;em&gt;any&lt;/em&gt; service--you have to be careful about
when and how you're entering your credentials. It's easy to simply get into the habit
of offering them up every time you see something that looks familiar, and if supposed
"computer experts" (as most of the Twitterverse can be described) can be fooled, then
how about the casual user? 
&lt;/p&gt;
&lt;p&gt;
Two, and perhaps the more important lesson for those of us who build software, that
any time you build a system that enables people to communicate, even when you put
a lot of energy into making sure that the system is secure, there's always an angle
that attackers will find that will expose a vulnerability, even if it's just a partial
one (such as the gathering of credentials here). If you don't need to allow hyperlinks,
don't. If you don't need to allow Javascript, don't. Start from the bare minimum that
people need to make your system work, and only add new capabilities after they've
been scrutinized in a variety of ways. (YAGNI sometimes works to our advantage in
more ways than one, it turns out.)
&lt;/p&gt;
&lt;p&gt;
Kudos, by the way, to the Twitter-keepers, who had a message describing the direct-message
phishing attack on the Twitter Home page within hours.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4fb4ac8a-859b-4a26-bdb7-b7f851e27e60" /&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,4fb4ac8a-859b-4a26-bdb7-b7f851e27e60.aspx</comments>
      <category>.NET</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=5394a334-8042-40ca-b80b-748b50ce9253</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,5394a334-8042-40ca-b80b-748b50ce9253.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,5394a334-8042-40ca-b80b-748b50ce9253.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5394a334-8042-40ca-b80b-748b50ce9253</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It's once again that time of year, and in keeping with my tradition, I'll revisit
the 2008 predictions to see how close I came before I start waxing prophetic on the
coming year. (I'm thinking that maybe the next year--2010's edition--I should actually
take a shot at predicting the next decade, but I'm not sure if I'd remember to go
back and revisit it in 2020 to see how I did. Anybody want to set a calendar reminder
for Dec 31 2019 and remind me, complete with URL? ;-) )
</p>
        <p>
Without further preamble, here's what I said for 2008:
</p>
        <ul>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: The buzz around building custom languages
will only continue to build. More and more tools are emerging to support the creation
of custom programming languages, like Microsoft's Phoenix, Scala's parser combinators,
the Microsoft DLR, SOOT, Javassist, JParsec/NParsec, and so on. Suddenly, the whole
"write your own lexer and parser and AST from scratch" idea seems about as outmoded
as the idea of building your own String class. Granted, there are cases where a from-hand
scanner/lexer/parser/AST/etc is the Right Thing To Do, but there are times when building
your own String class is the Right Thing To Do, too. Between the rich ecosystem of
dynamic languages that could be ported to the JVM/CLR, and the interesting strides
being made on both platforms (JVM and CLR) to make them more "dynamic-friendly" (such
as being able to reify classes or access the call stack directly), the probability
that your company will find a need that is best answered by building a custom language
are only going to rise. <strong>NOW: </strong>The buzz has definitely continued to
build, but buzz can only take us so far. There's been some scattershot use of custom
languages in a few scattershot situations, but it's certainly not "taken the world
by storm" in any meaningful way yet.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: The hype surrounding "domain-specific languages"
will peak in 2008, and start to generate a backlash. Let's be honest: when somebody
looks you straight in the eye and suggests that "scattered, smothered and covered"
is a domain-specific language, the term has lost all meaning. A lexicon unique to
an industry is not a domain-specific language; it's a lexicon. Period. If you can
incorporate said lexicon into your software, thus making it accessible to non-technical
professionals, that's a good thing. But simply using the lexicon doesn't make it a
domain-specific language. Or, alternatively, if you like, every single API designed
for a particular purpose is itself a domain-specific language. This means that Spring
configuration files are a DSL. Deployment descriptors are a DSL. The Java language
is a DSL (since the domain is that of programmers familiar with the Java language).
See how nonsensical this can get? Until somebody comes up with a workable definition
of the term "domain" in "domain-specific language", it's a nonsensical term. The idea
is a powerful one, mind you--creating something that's more "in tune" with what users
understand and can use easily is a technique that's been proven for decades now. Anybody
who's ever watched an accountant rip an entirely new set of predictions for the new
fiscal outlook based entirely on a few seed numbers and a deeply-nested set of Excel
macros knows this already. Whether you call them domain-specific languages or "little
languages" or "user-centric languages" or "macro language" is really up to you. <strong>NOW:</strong> The
backlash hasn't begun, but only because the DSL buzz hasn't materialized in much way
yet--see previous note. It generally takes a year or two of deployments (and hard-earned
experience) before a backlash begins, and we haven't hit that "deployments" stage
yet in anything yet resembling "critical mass" yet. But the DSL/custom language buzz
continues to grow, and the more the buzz grows, the more the backlash is likey.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: Functional languages will begin to make their
presence felt. Between Microsoft's productization plans for F# and the growing community
of Scala programmers, not to mention the inherently functional concepts buried inside
of LINQ and the concurrency-friendly capabilities of side-effect-free programming,
the world is going to find itself working its way into functional thinking either
directly or indirectly. And when programmers start to see the inherent capabilities
inside of Scala (such as Actors) and/or F# (such as asynchronous workflows), they're
going to embrace the strange new world of functional/object hybrid and never look
back. <strong>NOW:</strong> Several books on F# and Scala (and even one or two on
Haskell!) were published in 2008, and several more (including one of my own) are on
the way. The functional buzz is building, and lots of disparate groups are each evaluating
it (functional programming) independently.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: MacOS is going to start posting some serious
market share numbers, leading lots of analysts to predict that Microsoft Windows has
peaked and is due to collapse sometime within the remainder of the decade. Mac's not
only a wonderful OS, but it's some of the best hardware to run Vista on. That will
lead not a few customers to buy Mac hardware, wipe the machine, and install Vista,
as many of the uber-geeks in the Windows world are already doing. This will in turn
lead Gartner (always on the lookout for an established trend they can "predict" on)
to suggest that Mac is going to end up with 115% market share by 2012 (.8 probability),
then sell you this wisdom for a mere price of $1.5 million (per copy). <strong>NOW:</strong> Can't
speak to the Gartner report--I didn't have $1.5 million handy--but certainly the MacOS
is growing in popularity. More on that later.</li>
          <li>
            <strong>THEN:</strong>
            <em>General</em>: Ted will be hired by Gartner... if only to
keep him from smacking them around so much. .0001 probability, with probability going
up exponentially as my salary offer goes up exponentially. (Hey, I've got kids headed
for college in a few years.) <strong>NOW:</strong> Well, Gartner appears to have lost
my email address and phone number, but I'm sure they were planning to make me that
offer.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: MacOS is going to start creaking in a few
places. The Mac OS is a wonderful OS, but it's got its own creaky parts, and the more
users that come to Mac OS, the more that software packages are going to exploit some
of those creaky parts, leading to some instability in the Mac OS. It won't be widespread,
but for those who are interested in finding it, they're there. Assuming current trends
(of customers adopting Mac OS) hold, the Mac OS 10.6 upgrade is going to be a very
interesting process, indeed. <strong>NOW:</strong> Shhh. Don't tell anybody, but I've
been seeing it starting to happen. Don't get me wrong, Apple still does a pretty good
job with the OS, but the law of numbers has started to create some bad upgrade scenarios
for some people.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: Somebody is going to realize that iTunes
is the world's biggest monopoly on music, and Apple will be forced to defend itself
in the court of law, the court of public opinion, or both. Let's be frank: if this
were Microsoft, offering music that can only be played on Microsoft music players,
the world would be through the roof. All UI goodness to one side, the iPod represents
just as much of a monopoly in the music player business as Internet Explorer did in
the operating system business, and if the world doesn't start taking Apple to task
over this, then "justice" is a word that only applies when losers in an industry want
to drag down the market leader (which I firmly believe to be the case--nobody likes
more than to pile on the successful guy). <strong>NOW:</strong> Nothing this year.</li>
          <li>
            <strong>THEN: </strong>
            <em>General</em>: Somebody is going to realize that the iPhone's
"nothing we didn't write will survive the next upgrade process" policy is nothing
short of draconian. As my father, who gets it right every once in a while, says, "If
I put a third-party stereo in my car, the dealer doesn't get to rip it out and replace
it with one of their own (or nothing at all!) the next time I take it in for an oil
change". Fact is, if I buy the phone, I own the phone, and I own what's on it. Unfortunately,
this takes us squarely into the realm of DRM and IP ownership, and we all know how
clear-cut that is... But once the general public starts to understand some of these
issues--and I think the iPhone and iTunes may just be the vehicle that will teach
them--look out, folks, because the backlash will be huge. As in, "Move over, Mr. Gates,
you're about to be joined in infamy by your other buddy Steve...." <strong>NOW:</strong> Apple
released iPhone 2.0, and with it, the iPhone SDK, so at least Apple has opened the
dashboard to third-party stereos. But the deployment model (AppStore) is still a bit
draconian, and Apple still jealously holds the reins over which apps can be deployed
there and which ones can't, so maybe they haven't learned their lesson yet, after
all....</li>
          <li>
            <strong>THEN: </strong>
            <em>Java</em>: The OpenJDK in Mercurial will slowly start to
see some external contributions. The whole point of Mercurial is to allow for deeper
control over which changes you incorporate into your build tree, so once people figure
out how to build the JDK and how to hack on it, the local modifications will start
to seep across the Internet.... <strong>NOW:</strong> OpenJDK has started to collect
contributions from external (to Sun) sources, but still in relatively small doses,
it seems. None of the local modifications I envisioned creeping across the 'Net have
begun, that I can see, so maybe it's still waiting to happen. Or maybe the OpenJDK
is too complicated to really allow for that kind of customization, and it never will.</li>
          <li>
            <strong>THEN:</strong>
            <em>Java</em>: SpringSource will soon be seen as a vendor like
BEA or IBM or Sun. Perhaps with a bit better reputation to begin, but a vendor all
the same. <strong>NOW:</strong> SpringSource's acquisition of G2One (the company behind
Groovy just as SpringSource backs Spring) only reinforced this image, but it seems
it's still something that some fail to realize or acknowledge due to Spring's open-source
(?) nature. (I'm not a Spring expert by any means, but apparently Spring 3 was pulled
back inside the SpringSource borders, leading some people to wonder what SpringSource
is up to, and whether or not Spring will continue to be open source after all.)</li>
          <li>
            <strong>THEN:</strong>
            <em>.NET</em>: Interest in OpenJDK will bootstrap similar interest
in Rotor/SSCLI. After all, they're both VMs, with lots of interesting ideas and information
about how the managed platforms work. <strong>NOW:</strong> Nope, hasn't really happened
yet, that I can see. Not even the 2nd edition of the SSCLI book (by Joel Pobar and
yours truly, yes that was a plug) seemed to foster the kind of attention or interest
that I'd expected, or at least, not on the scale I'd thought might happen.</li>
          <li>
            <strong>THEN: </strong>
            <em>C++/Native</em>: If you've not heard of LLVM before this,
you will. It's a compiler and bytecode toolchain aimed at the native platforms, complete
with JIT and GC. <strong>NOW:</strong> Apple sank a lot of investment into LLVM, including
hosting an LLVM conference at the corporate headquarters.</li>
          <li>
            <strong>THEN:</strong>
            <em>Java</em>: Somebody will create Yet Another Rails-Killer
Web Framework. 'Nuff said. <strong>NOW:</strong> You know what? I honestly can't say
whether this happened or not; I was completely not paying attention.</li>
          <li>
            <strong>THEN:</strong>
            <em>Native</em>: Developers looking for a native programming
language will discover D, and be happy. Considering D is from the same mind that was
the core behind the Zortech C++ compiler suite, and that D has great native platform
integration (building DLLs, calling into DLLs easily, and so on), not to mention automatic
memory management (except for those areas where you want manual memory management),
it's definitely worth looking into. <a href="http://www.digitalmars.com">www.digitalmars.com</a><strong>NOW:</strong> D
had its own get-together as well, and appears to still be going strong, among the
group of developers who still work on native apps (and aren't simply maintaining legacy
C/C++ apps).</li>
        </ul>
        <p>
Now, for the 2009 predictions. The last set was a little verbose, so let me see if
I can trim the list down a little and keep it short and sweet:
</p>
        <ul>
          <li>
            <em>General:</em> "Cloud" will become the next "ESB" or "SOA", in that it will be
something that everybody will talk about, but few will understand and even fewer will
do anything with. (Considering the widespread disparity in the definition of the term,
this seems like a no-brainer.)</li>
          <li>
            <em>Java</em>: Interest in Scala will continue to rise, as will the number of detractors
who point out that Scala is too hard to learn.</li>
          <li>
            <em>.NET</em>: Interest in F# will continue to rise, as will the number of detractors
who point out that F# is too hard to learn. (Hey, the two really are cousins, and
the fortunes of one will serve as a pretty good indication of the fortunes of the
other, and both really seem to be on the same arc right now.)</li>
          <li>
            <em>General:</em> Interest in all kinds of functional languages will continue to rise,
and more than one person will take a hint from Bob "crazybob" Lee and liken functional
programming to AOP, for good and for ill. People who took classes on Haskell in college
will find themselves reaching for their old college textbooks again.</li>
          <li>
            <em>General:</em> The iPhone is going to be hailed as "the enterprise development
platform of the future", and companies will be rolling out apps to it. Look for Quicken
iPhone edition, PowerPoint and/or Keynote iPhone edition, along with connectors to
hook the iPhone up to a presentation device, and (I'll bet) a World of Warcraft iPhone
client (legit or otherwise). iPhone is the new hotness in the mobile space, and people
will flock to it madly.</li>
          <li>
            <em>.NET</em>: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code.</li>
          <li>
            <em>.NET</em>: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe).</li>
          <li>
            <em>Java</em>: The death of JSR-277 will spark an uprising among the two leading groups
hoping to foist it off on the Java community--OSGi and Maven--while the rest of the
Java world will breathe a huge sigh of relief and look to see what "modularity" means
in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased.</li>
          <li>
            <em>Java</em>: The invokedynamic JSR will leapfrog in importance to the top of the
list.</li>
          <li>
            <em>Windows</em>: Another Windows 7 CTP will come out, and it will spawn huge media
interest that will eventually be remembered as Microsoft promises, that will eventually
be remembered as Microsoft guarantees, that will eventually be remembered as Microsoft
FUD and "promising much, delivering little". Microsoft ain't always at fault for the
inflated expectations people have--sometimes, yes, perhaps even a lot of times, but
not always.</li>
          <li>
            <em>Mac OS</em>: Apple will begin to legally threaten the clone market again, except
this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.)</li>
          <li>
            <em>Languages</em>: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build.</li>
          <li>
            <em>XML Services</em>: Roy Fielding will officially disown most of the "REST"ful authors
and software packages available. Nobody will care--or worse, somebody looking to make
a name for themselves will proclaim that Roy "doesn't really understand REST". And
they'll be right--Roy doesn't understand what <em>they</em> consider to be REST, and
the fact that he created the term will be of no importance anymore. Being "REST"ful
will equate to "I did it myself!", complete with expectations of a gold star and a
lollipop.</li>
          <li>
            <em>Parrot</em>: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice.</li>
          <li>
            <em>Agile</em>: The debate around "Scrum Certification" will rise to a fever pitch
as short-sighted money-tight companies start looking for reasons to cut costs and
either buy into agile at a superficial level and watch it fail, or start looking to
cut the agilists from their company in order to replace them with cheaper labor.</li>
          <li>
            <em>Flash</em>: Adobe will continue to make Flex and AIR look more like C# and the
CLR even as Microsoft tries to make Silverlight look more like Flash and AIR. Web
designers will now get to experience the same fun that back-end web developers have
enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either "Flash" shops or "Silverlight" shops.</li>
          <li>
            <em>Personal</em>: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic.</li>
        </ul>
        <p>
Well, so much for brief or short. See you all again next year....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5394a334-8042-40ca-b80b-748b50ce9253" />
        <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>2009 Predictions, 2008 Predictions Revisited</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,5394a334-8042-40ca-b80b-748b50ce9253.aspx</guid>
      <link>http://blogs.tedneward.com/2009/01/01/2009+Predictions+2008+Predictions+Revisited.aspx</link>
      <pubDate>Thu, 01 Jan 2009 07:54:29 GMT</pubDate>
      <description>&lt;p&gt;
It's once again that time of year, and in keeping with my tradition, I'll revisit
the 2008 predictions to see how close I came before I start waxing prophetic on the
coming year. (I'm thinking that maybe the next year--2010's edition--I should actually
take a shot at predicting the next decade, but I'm not sure if I'd remember to go
back and revisit it in 2020 to see how I did. Anybody want to set a calendar reminder
for Dec 31 2019 and remind me, complete with URL? ;-) )
&lt;/p&gt;
&lt;p&gt;
Without further preamble, here's what I said for 2008:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: The buzz around building custom languages
will only continue to build. More and more tools are emerging to support the creation
of custom programming languages, like Microsoft's Phoenix, Scala's parser combinators,
the Microsoft DLR, SOOT, Javassist, JParsec/NParsec, and so on. Suddenly, the whole
"write your own lexer and parser and AST from scratch" idea seems about as outmoded
as the idea of building your own String class. Granted, there are cases where a from-hand
scanner/lexer/parser/AST/etc is the Right Thing To Do, but there are times when building
your own String class is the Right Thing To Do, too. Between the rich ecosystem of
dynamic languages that could be ported to the JVM/CLR, and the interesting strides
being made on both platforms (JVM and CLR) to make them more "dynamic-friendly" (such
as being able to reify classes or access the call stack directly), the probability
that your company will find a need that is best answered by building a custom language
are only going to rise. &lt;strong&gt;NOW: &lt;/strong&gt;The buzz has definitely continued to
build, but buzz can only take us so far. There's been some scattershot use of custom
languages in a few scattershot situations, but it's certainly not "taken the world
by storm" in any meaningful way yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: The hype surrounding "domain-specific languages"
will peak in 2008, and start to generate a backlash. Let's be honest: when somebody
looks you straight in the eye and suggests that "scattered, smothered and covered"
is a domain-specific language, the term has lost all meaning. A lexicon unique to
an industry is not a domain-specific language; it's a lexicon. Period. If you can
incorporate said lexicon into your software, thus making it accessible to non-technical
professionals, that's a good thing. But simply using the lexicon doesn't make it a
domain-specific language. Or, alternatively, if you like, every single API designed
for a particular purpose is itself a domain-specific language. This means that Spring
configuration files are a DSL. Deployment descriptors are a DSL. The Java language
is a DSL (since the domain is that of programmers familiar with the Java language).
See how nonsensical this can get? Until somebody comes up with a workable definition
of the term "domain" in "domain-specific language", it's a nonsensical term. The idea
is a powerful one, mind you--creating something that's more "in tune" with what users
understand and can use easily is a technique that's been proven for decades now. Anybody
who's ever watched an accountant rip an entirely new set of predictions for the new
fiscal outlook based entirely on a few seed numbers and a deeply-nested set of Excel
macros knows this already. Whether you call them domain-specific languages or "little
languages" or "user-centric languages" or "macro language" is really up to you. &lt;strong&gt;NOW:&lt;/strong&gt; The
backlash hasn't begun, but only because the DSL buzz hasn't materialized in much way
yet--see previous note. It generally takes a year or two of deployments (and hard-earned
experience) before a backlash begins, and we haven't hit that "deployments" stage
yet in anything yet resembling "critical mass" yet. But the DSL/custom language buzz
continues to grow, and the more the buzz grows, the more the backlash is likey.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: Functional languages will begin to make their
presence felt. Between Microsoft's productization plans for F# and the growing community
of Scala programmers, not to mention the inherently functional concepts buried inside
of LINQ and the concurrency-friendly capabilities of side-effect-free programming,
the world is going to find itself working its way into functional thinking either
directly or indirectly. And when programmers start to see the inherent capabilities
inside of Scala (such as Actors) and/or F# (such as asynchronous workflows), they're
going to embrace the strange new world of functional/object hybrid and never look
back. &lt;strong&gt;NOW:&lt;/strong&gt; Several books on F# and Scala (and even one or two on
Haskell!) were published in 2008, and several more (including one of my own) are on
the way. The functional buzz is building, and lots of disparate groups are each evaluating
it (functional programming) independently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: MacOS is going to start posting some serious
market share numbers, leading lots of analysts to predict that Microsoft Windows has
peaked and is due to collapse sometime within the remainder of the decade. Mac's not
only a wonderful OS, but it's some of the best hardware to run Vista on. That will
lead not a few customers to buy Mac hardware, wipe the machine, and install Vista,
as many of the uber-geeks in the Windows world are already doing. This will in turn
lead Gartner (always on the lookout for an established trend they can "predict" on)
to suggest that Mac is going to end up with 115% market share by 2012 (.8 probability),
then sell you this wisdom for a mere price of $1.5 million (per copy). &lt;strong&gt;NOW:&lt;/strong&gt; Can't
speak to the Gartner report--I didn't have $1.5 million handy--but certainly the MacOS
is growing in popularity. More on that later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;General&lt;/em&gt;: Ted will be hired by Gartner... if only to
keep him from smacking them around so much. .0001 probability, with probability going
up exponentially as my salary offer goes up exponentially. (Hey, I've got kids headed
for college in a few years.) &lt;strong&gt;NOW:&lt;/strong&gt; Well, Gartner appears to have lost
my email address and phone number, but I'm sure they were planning to make me that
offer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: MacOS is going to start creaking in a few
places. The Mac OS is a wonderful OS, but it's got its own creaky parts, and the more
users that come to Mac OS, the more that software packages are going to exploit some
of those creaky parts, leading to some instability in the Mac OS. It won't be widespread,
but for those who are interested in finding it, they're there. Assuming current trends
(of customers adopting Mac OS) hold, the Mac OS 10.6 upgrade is going to be a very
interesting process, indeed. &lt;strong&gt;NOW:&lt;/strong&gt; Shhh. Don't tell anybody, but I've
been seeing it starting to happen. Don't get me wrong, Apple still does a pretty good
job with the OS, but the law of numbers has started to create some bad upgrade scenarios
for some people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: Somebody is going to realize that iTunes
is the world's biggest monopoly on music, and Apple will be forced to defend itself
in the court of law, the court of public opinion, or both. Let's be frank: if this
were Microsoft, offering music that can only be played on Microsoft music players,
the world would be through the roof. All UI goodness to one side, the iPod represents
just as much of a monopoly in the music player business as Internet Explorer did in
the operating system business, and if the world doesn't start taking Apple to task
over this, then "justice" is a word that only applies when losers in an industry want
to drag down the market leader (which I firmly believe to be the case--nobody likes
more than to pile on the successful guy). &lt;strong&gt;NOW:&lt;/strong&gt; Nothing this year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;General&lt;/em&gt;: Somebody is going to realize that the iPhone's
"nothing we didn't write will survive the next upgrade process" policy is nothing
short of draconian. As my father, who gets it right every once in a while, says, "If
I put a third-party stereo in my car, the dealer doesn't get to rip it out and replace
it with one of their own (or nothing at all!) the next time I take it in for an oil
change". Fact is, if I buy the phone, I own the phone, and I own what's on it. Unfortunately,
this takes us squarely into the realm of DRM and IP ownership, and we all know how
clear-cut that is... But once the general public starts to understand some of these
issues--and I think the iPhone and iTunes may just be the vehicle that will teach
them--look out, folks, because the backlash will be huge. As in, "Move over, Mr. Gates,
you're about to be joined in infamy by your other buddy Steve...." &lt;strong&gt;NOW:&lt;/strong&gt; Apple
released iPhone 2.0, and with it, the iPhone SDK, so at least Apple has opened the
dashboard to third-party stereos. But the deployment model (AppStore) is still a bit
draconian, and Apple still jealously holds the reins over which apps can be deployed
there and which ones can't, so maybe they haven't learned their lesson yet, after
all....&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;Java&lt;/em&gt;: The OpenJDK in Mercurial will slowly start to
see some external contributions. The whole point of Mercurial is to allow for deeper
control over which changes you incorporate into your build tree, so once people figure
out how to build the JDK and how to hack on it, the local modifications will start
to seep across the Internet.... &lt;strong&gt;NOW:&lt;/strong&gt; OpenJDK has started to collect
contributions from external (to Sun) sources, but still in relatively small doses,
it seems. None of the local modifications I envisioned creeping across the 'Net have
begun, that I can see, so maybe it's still waiting to happen. Or maybe the OpenJDK
is too complicated to really allow for that kind of customization, and it never will.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;Java&lt;/em&gt;: SpringSource will soon be seen as a vendor like
BEA or IBM or Sun. Perhaps with a bit better reputation to begin, but a vendor all
the same. &lt;strong&gt;NOW:&lt;/strong&gt; SpringSource's acquisition of G2One (the company behind
Groovy just as SpringSource backs Spring) only reinforced this image, but it seems
it's still something that some fail to realize or acknowledge due to Spring's open-source
(?) nature. (I'm not a Spring expert by any means, but apparently Spring 3 was pulled
back inside the SpringSource borders, leading some people to wonder what SpringSource
is up to, and whether or not Spring will continue to be open source after all.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;.NET&lt;/em&gt;: Interest in OpenJDK will bootstrap similar interest
in Rotor/SSCLI. After all, they're both VMs, with lots of interesting ideas and information
about how the managed platforms work. &lt;strong&gt;NOW:&lt;/strong&gt; Nope, hasn't really happened
yet, that I can see. Not even the 2nd edition of the SSCLI book (by Joel Pobar and
yours truly, yes that was a plug) seemed to foster the kind of attention or interest
that I'd expected, or at least, not on the scale I'd thought might happen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN: &lt;/strong&gt;&lt;em&gt;C++/Native&lt;/em&gt;: If you've not heard of LLVM before this,
you will. It's a compiler and bytecode toolchain aimed at the native platforms, complete
with JIT and GC. &lt;strong&gt;NOW:&lt;/strong&gt; Apple sank a lot of investment into LLVM, including
hosting an LLVM conference at the corporate headquarters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;Java&lt;/em&gt;: Somebody will create Yet Another Rails-Killer
Web Framework. 'Nuff said. &lt;strong&gt;NOW:&lt;/strong&gt; You know what? I honestly can't say
whether this happened or not; I was completely not paying attention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; &lt;em&gt;Native&lt;/em&gt;: Developers looking for a native programming
language will discover D, and be happy. Considering D is from the same mind that was
the core behind the Zortech C++ compiler suite, and that D has great native platform
integration (building DLLs, calling into DLLs easily, and so on), not to mention automatic
memory management (except for those areas where you want manual memory management),
it's definitely worth looking into. &lt;a href="http://www.digitalmars.com"&gt;www.digitalmars.com&lt;/a&gt; &lt;strong&gt;NOW:&lt;/strong&gt; D
had its own get-together as well, and appears to still be going strong, among the
group of developers who still work on native apps (and aren't simply maintaining legacy
C/C++ apps).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Now, for the 2009 predictions. The last set was a little verbose, so let me see if
I can trim the list down a little and keep it short and sweet:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;General:&lt;/em&gt; "Cloud" will become the next "ESB" or "SOA", in that it will be
something that everybody will talk about, but few will understand and even fewer will
do anything with. (Considering the widespread disparity in the definition of the term,
this seems like a no-brainer.)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Java&lt;/em&gt;: Interest in Scala will continue to rise, as will the number of detractors
who point out that Scala is too hard to learn.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;.NET&lt;/em&gt;: Interest in F# will continue to rise, as will the number of detractors
who point out that F# is too hard to learn. (Hey, the two really are cousins, and
the fortunes of one will serve as a pretty good indication of the fortunes of the
other, and both really seem to be on the same arc right now.)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;General:&lt;/em&gt; Interest in all kinds of functional languages will continue to rise,
and more than one person will take a hint from Bob "crazybob" Lee and liken functional
programming to AOP, for good and for ill. People who took classes on Haskell in college
will find themselves reaching for their old college textbooks again.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;General:&lt;/em&gt; The iPhone is going to be hailed as "the enterprise development
platform of the future", and companies will be rolling out apps to it. Look for Quicken
iPhone edition, PowerPoint and/or Keynote iPhone edition, along with connectors to
hook the iPhone up to a presentation device, and (I'll bet) a World of Warcraft iPhone
client (legit or otherwise). iPhone is the new hotness in the mobile space, and people
will flock to it madly.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;.NET&lt;/em&gt;: Another Oslo CTP will come out, and it will bear only a superficial
resemblance to the one that came out in October at PDC. Betting on Oslo right now
is a fools' bet, not because of any inherent weakness in the technology, but just
because it's way too early in the cycle to be thinking about for anything vaguely
resembling production code.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;.NET&lt;/em&gt;: The IronPython and IronRuby teams will find some serious versioning
issues as they try to manage the DLR versioning story between themselves and the CLR
as a whole. An initial hack will result, which will be codified into a standard practice
when .NET 4.0 ships. Then the next release of IPy or IRb will have to try and slip
around its restrictions in 2010/2011. By 2012, IPy and IRb will have to be shipping
as part of Visual Studio just to put the releases back into lockstep with one another
(and the rest of the .NET universe).&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Java&lt;/em&gt;: The death of JSR-277 will spark an uprising among the two leading groups
hoping to foist it off on the Java community--OSGi and Maven--while the rest of the
Java world will breathe a huge sigh of relief and look to see what "modularity" means
in Java 7. Some of the alpha geeks in Java will start using--if not building--JDK
7 builds just to get a heads-up on its impact, and be quietly surprised and, I dare
say, perhaps even pleased.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Java&lt;/em&gt;: The invokedynamic JSR will leapfrog in importance to the top of the
list.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Windows&lt;/em&gt;: Another Windows 7 CTP will come out, and it will spawn huge media
interest that will eventually be remembered as Microsoft promises, that will eventually
be remembered as Microsoft guarantees, that will eventually be remembered as Microsoft
FUD and "promising much, delivering little". Microsoft ain't always at fault for the
inflated expectations people have--sometimes, yes, perhaps even a lot of times, but
not always.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mac OS&lt;/em&gt;: Apple will begin to legally threaten the clone market again, except
this time somebody's going to get the DOJ involved. (Yes, this is the iPhone/iTunes
prediction from last year, carrying over. I still expect this to happen.)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Languages&lt;/em&gt;: Alpha-geek developers will start creating their own languages
(even if they're obscure or bizarre ones like Shakespeare or Ook#) just to have that
listed on their resume as the DSL/custom language buzz continues to build.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;XML Services&lt;/em&gt;: Roy Fielding will officially disown most of the "REST"ful authors
and software packages available. Nobody will care--or worse, somebody looking to make
a name for themselves will proclaim that Roy "doesn't really understand REST". And
they'll be right--Roy doesn't understand what &lt;em&gt;they&lt;/em&gt; consider to be REST, and
the fact that he created the term will be of no importance anymore. Being "REST"ful
will equate to "I did it myself!", complete with expectations of a gold star and a
lollipop.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Parrot&lt;/em&gt;: The Parrot guys will make at least one more minor point release.
Nobody will notice or care, except for a few doggedly stubborn Perl hackers. They
will find themselves having nightmares of previous lives carrying around OS/2 books
and Amiga paraphernalia. Perl 6 will celebrate it's seventh... or is it eighth?...
anniversary of being announced, and nobody will notice.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Agile&lt;/em&gt;: The debate around "Scrum Certification" will rise to a fever pitch
as short-sighted money-tight companies start looking for reasons to cut costs and
either buy into agile at a superficial level and watch it fail, or start looking to
cut the agilists from their company in order to replace them with cheaper labor.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Flash&lt;/em&gt;: Adobe will continue to make Flex and AIR look more like C# and the
CLR even as Microsoft tries to make Silverlight look more like Flash and AIR. Web
designers will now get to experience the same fun that back-end web developers have
enjoyed for near-on a decade, as shops begin to artificially partition themselves
up as either "Flash" shops or "Silverlight" shops.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Personal&lt;/em&gt;: Gartner will still come knocking, looking to hire me for outrageous
sums of money to do nothing but blog and wax prophetic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Well, so much for brief or short. See you all again next year....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5394a334-8042-40ca-b80b-748b50ce9253" /&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,5394a334-8042-40ca-b80b-748b50ce9253.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When I was in college, at the University of California, Davis, I lived in the International
Relations building (D Building in the Tercero dorm area, for any other UCD alum out
there), and got my first real glimpse of the feminist movement up front. It seemed
like it was filled with militant, angry members of the female half of the species,
who insisted that their gender was spelled "womyn", so that it wasn't somehow derived
from "man" (wo-man, wo-men, get it?), who blamed most of the world's problems on the
fact that men were running the show, and that therefore, because of my own gender,
I was to share equally in the blame for its ills.
</p>
        <p>
Maybe I was--Lord knows I certainly wasn't an entirely nice guy back then (and some
will chirp from the back of the theater, "back then?!?")--but it still left the whole
"feminist" thing as something I couldn't really be around, much less support.
</p>
        <p>
My sister, it turned out, had a different experience at University of California,
Santa Cruz, and became one.
</p>
        <p>
Needless to say, this made family get-togethers somewhat awkward.
</p>
        <p>
Then, a few years later, she asked my help in purchasing a new computer for herself.
Basically, she just wanted me along to help explain any of the technical terms that
she wasn't entirely familiar with, and to give her some advice on whether they were
important to her needs. Not an unreasonable request, and not something I wouldn't
do for anybody else, male or female alike. (I sometimes wish my father would ask my
help <em>before</em> buying, but that's another story.)
</p>
        <p>
We went to the store, and I got my first lesson in sexual discrimination. 
</p>
        <p>
The entire time we were in the store, despite the fact that it was my sister asking
the questions, despite the fact that I only answered questions that she asked of me
directly (in other words, I was there to help her, not to help the sales guy sell
to her), almost the entire conversation was spent with the sales guy talking to me,
even if he was answering her question. His body language was unquestionably that of,
"She's clearly not capable of making this decision herself", and addressed everything
to me, despite her repeated attempts to catch his eye and have him talk to her, the
actual purchaser with the question.
</p>
        <p>
I was a bit taken aback. I don't think the sales guy even noticed. That bothered me
more than anything.
</p>
        <p>
Ever since that time, I've been curiously and cautiously trying to figure out why
there aren't more women in IT.
</p>
        <p>
Several theories have presented themselves over the years:
</p>
        <ol>
          <li>
Women, aside from a statistical minority, are structurally incapable of mastering
IT. This is the "math is hard" argument, and I think we can all pretty much agree
where this one belongs.</li>
          <li>
Women are encouraged/forced down an educational path that leads them away from IT
until much later in life. I've heard this from a couple of women my age, and while
I think there may be some validity to it, at least back in the day, I don't know if
there still is. I'd love to get some feedback from recent high school or college grads
who can weigh in with some anecdotal evidence one way or the other.</li>
          <li>
Women are entering IT, but not in the areas that I hang out in. This is definitely
possible, and I think is happening, to some degree. At an Adobe "Flex Camp" last night
(I was Chet Haase's roadie for the evening), I noticed a far more even split of gender
than I'd ever seen at a Java or .NET user group, and when I mentioned this to one
of the other speakers, he nodded and said that women were far more prevalent in the
"web design" space, which is clearly not a space I play much in. I've also heard that
the system admin space is much more "female-friendly", too.</li>
          <li>
Women get in to IT, then out of it or stay "hidden" in it. I've heard the theory that
some women choose to get out of IT because they're not willing to put the same kind
of time and energy into it as some men are, or they choose to remain at the software
developer level instead of trying to advance the corporate ladder into management
or other more visible positions. 
</li>
          <li>
There are exactly the number of women in IT that want to be there. Hey, let's face
it, maybe women just don't <em>like</em> software development, and that's OK, because
there's a lot of jobs I don't like, either.</li>
        </ol>
        <p>
My concern is with theories 1 and 2. There should be no reason whatsoever that a woman
cannot succeed every bit as much as a man can. This is one of those (few?) industries
where the principal qualifications are entirely intellectual/mental, and that means
there's absolutely no reason why one gender should be favored over another. (Nursing
and teaching are others, for example.)
</p>
        <p>
So, without further ado, those of you who are interested, check out <a href="http://crazeegeekchick.com/blog/womenbuild-geek-girls-playing-with-legos-at-the-msdn-developer-conference/">Dana
Coffey's link on the Lego Build event</a> at the MSDN events coming up.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f" />
        <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>Ruminations on Women in IT</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f.aspx</guid>
      <link>http://blogs.tedneward.com/2008/12/12/Ruminations+On+Women+In+IT.aspx</link>
      <pubDate>Fri, 12 Dec 2008 19:49:12 GMT</pubDate>
      <description>&lt;p&gt;
When I was in college, at the University of California, Davis, I lived in the International
Relations building (D Building in the Tercero dorm area, for any other UCD alum out
there), and got my first real glimpse of the feminist movement up front. It seemed
like it was filled with militant, angry members of the female half of the species,
who insisted that their gender was spelled "womyn", so that it wasn't somehow derived
from "man" (wo-man, wo-men, get it?), who blamed most of the world's problems on the
fact that men were running the show, and that therefore, because of my own gender,
I was to share equally in the blame for its ills.
&lt;/p&gt;
&lt;p&gt;
Maybe I was--Lord knows I certainly wasn't an entirely nice guy back then (and some
will chirp from the back of the theater, "back then?!?")--but it still left the whole
"feminist" thing as something I couldn't really be around, much less support.
&lt;/p&gt;
&lt;p&gt;
My sister, it turned out, had a different experience at University of California,
Santa Cruz, and became one.
&lt;/p&gt;
&lt;p&gt;
Needless to say, this made family get-togethers somewhat awkward.
&lt;/p&gt;
&lt;p&gt;
Then, a few years later, she asked my help in purchasing a new computer for herself.
Basically, she just wanted me along to help explain any of the technical terms that
she wasn't entirely familiar with, and to give her some advice on whether they were
important to her needs. Not an unreasonable request, and not something I wouldn't
do for anybody else, male or female alike. (I sometimes wish my father would ask my
help &lt;em&gt;before&lt;/em&gt; buying, but that's another story.)
&lt;/p&gt;
&lt;p&gt;
We went to the store, and I got my first lesson in sexual discrimination. 
&lt;/p&gt;
&lt;p&gt;
The entire time we were in the store, despite the fact that it was my sister asking
the questions, despite the fact that I only answered questions that she asked of me
directly (in other words, I was there to help her, not to help the sales guy sell
to her), almost the entire conversation was spent with the sales guy talking to me,
even if he was answering her question. His body language was unquestionably that of,
"She's clearly not capable of making this decision herself", and addressed everything
to me, despite her repeated attempts to catch his eye and have him talk to her, the
actual purchaser with the question.
&lt;/p&gt;
&lt;p&gt;
I was a bit taken aback. I don't think the sales guy even noticed. That bothered me
more than anything.
&lt;/p&gt;
&lt;p&gt;
Ever since that time, I've been curiously and cautiously trying to figure out why
there aren't more women in IT.
&lt;/p&gt;
&lt;p&gt;
Several theories have presented themselves over the years:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Women, aside from a statistical minority, are structurally incapable of mastering
IT. This is the "math is hard" argument, and I think we can all pretty much agree
where this one belongs.&lt;/li&gt;
&lt;li&gt;
Women are encouraged/forced down an educational path that leads them away from IT
until much later in life. I've heard this from a couple of women my age, and while
I think there may be some validity to it, at least back in the day, I don't know if
there still is. I'd love to get some feedback from recent high school or college grads
who can weigh in with some anecdotal evidence one way or the other.&lt;/li&gt;
&lt;li&gt;
Women are entering IT, but not in the areas that I hang out in. This is definitely
possible, and I think is happening, to some degree. At an Adobe "Flex Camp" last night
(I was Chet Haase's roadie for the evening), I noticed a far more even split of gender
than I'd ever seen at a Java or .NET user group, and when I mentioned this to one
of the other speakers, he nodded and said that women were far more prevalent in the
"web design" space, which is clearly not a space I play much in. I've also heard that
the system admin space is much more "female-friendly", too.&lt;/li&gt;
&lt;li&gt;
Women get in to IT, then out of it or stay "hidden" in it. I've heard the theory that
some women choose to get out of IT because they're not willing to put the same kind
of time and energy into it as some men are, or they choose to remain at the software
developer level instead of trying to advance the corporate ladder into management
or other more visible positions. 
&lt;/li&gt;
&lt;li&gt;
There are exactly the number of women in IT that want to be there. Hey, let's face
it, maybe women just don't &lt;em&gt;like&lt;/em&gt; software development, and that's OK, because
there's a lot of jobs I don't like, either.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
My concern is with theories 1 and 2. There should be no reason whatsoever that a woman
cannot succeed every bit as much as a man can. This is one of those (few?) industries
where the principal qualifications are entirely intellectual/mental, and that means
there's absolutely no reason why one gender should be favored over another. (Nursing
and teaching are others, for example.)
&lt;/p&gt;
&lt;p&gt;
So, without further ado, those of you who are interested, check out &lt;a href="http://crazeegeekchick.com/blog/womenbuild-geek-girls-playing-with-legos-at-the-msdn-developer-conference/"&gt;Dana
Coffey's link on the Lego Build event&lt;/a&gt; at the MSDN events coming up.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f" /&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,06f9bcf8-76ed-4bfc-ae6c-7a80aa840c3f.aspx</comments>
      <category>Conferences</category>
      <category>Development Processes</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=502a7f84-98f0-40d6-95aa-87513a7c35c6</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=502a7f84-98f0-40d6-95aa-87513a7c35c6</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It amazes me how insular and inward-facing the software industry is. And how the "agile"
movement is reaping the benefits of a very simple characteristic.
</p>
        <p>
For example, consider Jeff Palermo's essay on <a href="http://jeffreypalermo.com/blog/the-myth-of-self-organizing-teams/">"The
Myth of Self-Organizing Teams"</a>. Now, nothing against Jeff, or his post, <em>per
se</em>, but it amazes me how our industry believes that they are somehow inventing
new concepts, such as, in this case the "self-organizing team". Team dynamics have
been a subject of study for decades, and anyone with a background in psychology, business,
or sales has probably already been through much of the material on it. The best teams
are those that find their own sense of identity, that grow from within, but still
accept some leadership from the outside--the classic example here being the championship
sports team. Most often, that sense of identity is born of a string of successes,
which is why teams without a winning tradition have such a hard time creating the <em>esprit
de corps</em> that so often defines the difference between success and failure. 
</p>
        <blockquote>
          <p>
            <em>(Editor's note: Here's a free lesson to all of you out there who want to help
your team grow its own sense of identity: give them a chance to win a few successes,
and they'll start coming together pretty quickly. It's not always that easy, but it
works more often than not.)</em>
          </p>
        </blockquote>
        <p>
How many software development managers--much less technical leads or project managers--have
actually gone and looked through the management aisle at the local bookstore?
</p>
        <p>
Tom and Mary Poppendieck have been spending years now talking about "lean" software
development, which itself (at a casual glance) seems to be a refinement of the concepts
Toyota and other Japanese manufacturers were pursuing close to two decades ago. "Total
quality management" was a concept introduced in those days, the idea that anyone on
the production line was empowered to stop the line if they found something that wasn't
right. (My father was one of those "lean" manufacturing advocates back in the 80's,
in fact, and has some great stories he can tell to its successes, and failures.)
</p>
        <p>
How many software development managers or project leads give their developers the
chance to say, "No, it's not right yet, we can't ship", and back them on it? Wouldn't
you, as a developer, feel far more involved in the project if you knew you had that
power--and that responsibility?
</p>
        <p>
Or consider the "agile" notion of customer involvement, the classic XP "On-Site Customer"
principle. Sales people have known for years, even decades (if not centuries), that
if you involve the customer in the process, they are much more likely to feel an ownership
stake sooner than if they just take what's on the lot or the shelf. Skilled salespeople
have done the "let's walk through what you <em>might</em> buy, if you were buying,
of course" trick countless numbers of times, and ended up with a sale where the customer
didn't even intend to buy.
</p>
        <p>
How many software development managers or project leads have read a book on basic
salesmanship? And yet, isn't that notion of extracting what the customer wants endemic
to both software development and basic sales (of anything)?
</p>
        <p>
What is it about the software industry that just collectively refuses to accept that
there might be lots of interesting research on topics that aren't technical yet still
something that we can use? Why do we feel so compelled to trumpet our own "innovations"
to ourselves, when in fact, they've been long-known in dozens of other contexts? When
will we wake up and realize that we can learn a lot more if we cross-train in other
areas... like, for example, getting your MBA?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=502a7f84-98f0-40d6-95aa-87513a7c35c6" />
        <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>The Myth of Discovery</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</guid>
      <link>http://blogs.tedneward.com/2008/12/10/The+Myth+Of+Discovery.aspx</link>
      <pubDate>Wed, 10 Dec 2008 15:48:45 GMT</pubDate>
      <description>&lt;p&gt;
It amazes me how insular and inward-facing the software industry is. And how the "agile"
movement is reaping the benefits of a very simple characteristic.
&lt;/p&gt;
&lt;p&gt;
For example, consider Jeff Palermo's essay on &lt;a href="http://jeffreypalermo.com/blog/the-myth-of-self-organizing-teams/"&gt;"The
Myth of Self-Organizing Teams"&lt;/a&gt;. Now, nothing against Jeff, or his post, &lt;em&gt;per
se&lt;/em&gt;, but it amazes me how our industry believes that they are somehow inventing
new concepts, such as, in this case the "self-organizing team". Team dynamics have
been a subject of study for decades, and anyone with a background in psychology, business,
or sales has probably already been through much of the material on it. The best teams
are those that find their own sense of identity, that grow from within, but still
accept some leadership from the outside--the classic example here being the championship
sports team. Most often, that sense of identity is born of a string of successes,
which is why teams without a winning tradition have such a hard time creating the &lt;em&gt;esprit
de corps&lt;/em&gt; that so often defines the difference between success and failure. 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;(Editor's note: Here's a free lesson to all of you out there who want to help
your team grow its own sense of identity: give them a chance to win a few successes,
and they'll start coming together pretty quickly. It's not always that easy, but it
works more often than not.)&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
How many software development managers--much less technical leads or project managers--have
actually gone and looked through the management aisle at the local bookstore?
&lt;/p&gt;
&lt;p&gt;
Tom and Mary Poppendieck have been spending years now talking about "lean" software
development, which itself (at a casual glance) seems to be a refinement of the concepts
Toyota and other Japanese manufacturers were pursuing close to two decades ago. "Total
quality management" was a concept introduced in those days, the idea that anyone on
the production line was empowered to stop the line if they found something that wasn't
right. (My father was one of those "lean" manufacturing advocates back in the 80's,
in fact, and has some great stories he can tell to its successes, and failures.)
&lt;/p&gt;
&lt;p&gt;
How many software development managers or project leads give their developers the
chance to say, "No, it's not right yet, we can't ship", and back them on it? Wouldn't
you, as a developer, feel far more involved in the project if you knew you had that
power--and that responsibility?
&lt;/p&gt;
&lt;p&gt;
Or consider the "agile" notion of customer involvement, the classic XP "On-Site Customer"
principle. Sales people have known for years, even decades (if not centuries), that
if you involve the customer in the process, they are much more likely to feel an ownership
stake sooner than if they just take what's on the lot or the shelf. Skilled salespeople
have done the "let's walk through what you &lt;em&gt;might&lt;/em&gt; buy, if you were buying,
of course" trick countless numbers of times, and ended up with a sale where the customer
didn't even intend to buy.
&lt;/p&gt;
&lt;p&gt;
How many software development managers or project leads have read a book on basic
salesmanship? And yet, isn't that notion of extracting what the customer wants endemic
to both software development and basic sales (of anything)?
&lt;/p&gt;
&lt;p&gt;
What is it about the software industry that just collectively refuses to accept that
there might be lots of interesting research on topics that aren't technical yet still
something that we can use? Why do we feel so compelled to trumpet our own "innovations"
to ourselves, when in fact, they've been long-known in dozens of other contexts? When
will we wake up and realize that we can learn a lot more if we cross-train in other
areas... like, for example, getting your MBA?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=502a7f84-98f0-40d6-95aa-87513a7c35c6" /&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,502a7f84-98f0-40d6-95aa-87513a7c35c6.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=277a29cb-c011-45a3-82f9-6e702d5ad5df</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=277a29cb-c011-45a3-82f9-6e702d5ad5df</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The full list is <a href="http://www.noop.nl/2008/09/top-100-blogs-for-development-managers-q3-2008.html">here</a>.
It's a pretty prestigious group--and I'm totally floored that I'm there next to some
pretty big names.
</p>
        <p>
In homage to Ms. Sally Fields, of so many years ago... "You like me, you really like
me". Having somebody come up to me at a conference and tell me how much they like
my blog is second on my list of "fun things to happen to me at a conference", right
behind having somebody come up to me at a conference and tell me how much they like
my blog, except for that one entry, where I said something <em>totally</em> ridiculous
(and here's why) ....
</p>
        <p>
What I find most fascinating about the list was the means by which it was constructed--the
various calculations behind page rank, technorati rating, and so on. Very cool stuff.
</p>
        <p>
Perhaps it's trite to say it, but it's still true: readers are what make writing blogs
worthwhile. Thanks to all of you.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=277a29cb-c011-45a3-82f9-6e702d5ad5df" />
        <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>Apparently I'm #25 on the Top 100 Blogs for Development Managers</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</guid>
      <link>http://blogs.tedneward.com/2008/09/15/Apparently+Im+25+On+The+Top+100+Blogs+For+Development+Managers.aspx</link>
      <pubDate>Mon, 15 Sep 2008 11:29:19 GMT</pubDate>
      <description>&lt;p&gt;
The full list is &lt;a href="http://www.noop.nl/2008/09/top-100-blogs-for-development-managers-q3-2008.html"&gt;here&lt;/a&gt;.
It's a pretty prestigious group--and I'm totally floored that I'm there next to some
pretty big names.
&lt;/p&gt;
&lt;p&gt;
In homage to Ms. Sally Fields, of so many years ago... "You like me, you really like
me". Having somebody come up to me at a conference and tell me how much they like
my blog is second on my list of "fun things to happen to me at a conference", right
behind having somebody come up to me at a conference and tell me how much they like
my blog, except for that one entry, where I said something &lt;em&gt;totally&lt;/em&gt; ridiculous
(and here's why) ....
&lt;/p&gt;
&lt;p&gt;
What I find most fascinating about the list was the means by which it was constructed--the
various calculations behind page rank, technorati rating, and so on. Very cool stuff.
&lt;/p&gt;
&lt;p&gt;
Perhaps it's trite to say it, but it's still true: readers are what make writing blogs
worthwhile. Thanks to all of you.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=277a29cb-c011-45a3-82f9-6e702d5ad5df" /&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,277a29cb-c011-45a3-82f9-6e702d5ad5df.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=363d5058-a4ab-48ef-9b5b-8b8df2069ef8</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,363d5058-a4ab-48ef-9b5b-8b8df2069ef8.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,363d5058-a4ab-48ef-9b5b-8b8df2069ef8.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=363d5058-a4ab-48ef-9b5b-8b8df2069ef8</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For those of you who were at the Cinncinnati NFJS show, please continue on to the
next blog entry in your reader--you've already heard this. For those of you who weren't,
then allow me to make the announcement:
</p>
        <p>
Hi. My name's Ted Neward, and I am now a <a href="http://www.thoughtworks.com">ThoughtWorker</a>.
</p>
        <p>
After four months of discussions, interviews, more discussions and more interviews,
I can finally say that ThoughtWorks and I have come to a meeting of the minds, and
starting 3 September I will be a Principal Consultant at ThoughtWorks. My role there
will be to consult, write, mentor, architect and speak on Java, .NET, XML Services
(and maybe even a little Ruby), not to mention help ThoughtWorks' clients achieve
IT success in other general ways.
</p>
        <p>
Yep, I'm basically doing the same thing I've been doing for the last five years. Except
now I'm doing it with a TW logo attached to my name.
</p>
        <blockquote>
          <p>
            <em>By the way, ThoughtWorkers get to choose their own titles, and I'm curious to
know what readers think my title should be. Send me your suggestions, and if one really
strikes home, I'll use it and update this entry to reflect the choice. I have a few
ideas, but I'm finding that other people can be vastly more creative than I, and I'd
love to have a title that rivals Neal's "Meme Wrangler" in coolness. </em>
          </p>
          <p>
            <em>Oh, and for those of you who were thinking this, "Seat Warmer" has already been
taken, from what I understand.</em>
          </p>
        </blockquote>
        <p>
Honestly, this is a connection that's been hovering at the forefront of my mind for
several years. I like ThoughtWorks' focus on success, their willingness to explore
new ideas (both methodologies and technologies), their commitment to the community,
their corporate values, and their overall attitude of "work hard, play hard". There
have definitely been people who came away from ThoughtWorks with a negative impression
of the company, but they're the minority. Any company that encourages T-shirts and
jeans, XBoxes in the office, and wants to promote good corporate values is a winner
in my book. In short, ThoughtWorks is, in many ways, the consulting company that I
would want to build, if I were going to build a consulting firm. I'm not a wild fan
of the travel commitments, mind you, but I am definitely no stranger to travel, we've
got some ideas about how I can stay at home a bit more, and frankly I've been champing
at the bit to get injected into more agile and team projects, so it feels like a good
tradeoff. Plus, I get to think about languages and platforms in a more competitive
and hostile way--not that TW is a competitive and hostile place, mind you, but in
that my new fellow ThoughtWorkers will not let stupid thoughts stand for long, and
will quickly find the holes in my arguments even faster, thus making the arguments
as a whole that much stronger... or shooting them down because they really are stupid.
(Either outcome works pretty well for me.)
</p>
        <p>
What does this mean to the rest of you? Not much change, really--I'm still logging
lots of hours at conferences, I'm still writing (and blogging, when the muse strikes),
and I'm still available for consulting/mentoring/speaking; the big difference is that
now I come with a thousand-strong developers of proven capability at my back, not
to mention two of the more profound and articulate speakers in the industry (in <a href="http://memeagora.blogspot.com/">Neal</a> and <a href="http://www.martinfowler.com/bliki/">Martin</a>)
as peers. So if you've got some .NET, Java, or Ruby projects you're thinking about,
and you want a team to come in and make it happen, you know how to reach me.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=363d5058-a4ab-48ef-9b5b-8b8df2069ef8" />
        <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>An Announcement</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,363d5058-a4ab-48ef-9b5b-8b8df2069ef8.aspx</guid>
      <link>http://blogs.tedneward.com/2008/08/19/An+Announcement.aspx</link>
      <pubDate>Tue, 19 Aug 2008 18:24:39 GMT</pubDate>
      <description>&lt;p&gt;
For those of you who were at the Cinncinnati NFJS show, please continue on to the
next blog entry in your reader--you've already heard this. For those of you who weren't,
then allow me to make the announcement:
&lt;/p&gt;
&lt;p&gt;
Hi. My name's Ted Neward, and I am now a &lt;a href="http://www.thoughtworks.com"&gt;ThoughtWorker&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
After four months of discussions, interviews, more discussions and more interviews,
I can finally say that ThoughtWorks and I have come to a meeting of the minds, and
starting 3 September I will be a Principal Consultant at ThoughtWorks. My role there
will be to consult, write, mentor, architect and speak on Java, .NET, XML Services
(and maybe even a little Ruby), not to mention help ThoughtWorks' clients achieve
IT success in other general ways.
&lt;/p&gt;
&lt;p&gt;
Yep, I'm basically doing the same thing I've been doing for the last five years. Except
now I'm doing it with a TW logo attached to my name.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;By the way, ThoughtWorkers get to choose their own titles, and I'm curious to
know what readers think my title should be. Send me your suggestions, and if one really
strikes home, I'll use it and update this entry to reflect the choice. I have a few
ideas, but I'm finding that other people can be vastly more creative than I, and I'd
love to have a title that rivals Neal's "Meme Wrangler" in coolness. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Oh, and for those of you who were thinking this, "Seat Warmer" has already been
taken, from what I understand.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Honestly, this is a connection that's been hovering at the forefront of my mind for
several years. I like ThoughtWorks' focus on success, their willingness to explore
new ideas (both methodologies and technologies), their commitment to the community,
their corporate values, and their overall attitude of "work hard, play hard". There
have definitely been people who came away from ThoughtWorks with a negative impression
of the company, but they're the minority. Any company that encourages T-shirts and
jeans, XBoxes in the office, and wants to promote good corporate values is a winner
in my book. In short, ThoughtWorks is, in many ways, the consulting company that I
would want to build, if I were going to build a consulting firm. I'm not a wild fan
of the travel commitments, mind you, but I am definitely no stranger to travel, we've
got some ideas about how I can stay at home a bit more, and frankly I've been champing
at the bit to get injected into more agile and team projects, so it feels like a good
tradeoff. Plus, I get to think about languages and platforms in a more competitive
and hostile way--not that TW is a competitive and hostile place, mind you, but in
that my new fellow ThoughtWorkers will not let stupid thoughts stand for long, and
will quickly find the holes in my arguments even faster, thus making the arguments
as a whole that much stronger... or shooting them down because they really are stupid.
(Either outcome works pretty well for me.)
&lt;/p&gt;
&lt;p&gt;
What does this mean to the rest of you? Not much change, really--I'm still logging
lots of hours at conferences, I'm still writing (and blogging, when the muse strikes),
and I'm still available for consulting/mentoring/speaking; the big difference is that
now I come with a thousand-strong developers of proven capability at my back, not
to mention two of the more profound and articulate speakers in the industry (in &lt;a href="http://memeagora.blogspot.com/"&gt;Neal&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/bliki/"&gt;Martin&lt;/a&gt;)
as peers. So if you've got some .NET, Java, or Ruby projects you're thinking about,
and you want a team to come in and make it happen, you know how to reach me.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=363d5058-a4ab-48ef-9b5b-8b8df2069ef8" /&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,363d5058-a4ab-48ef-9b5b-8b8df2069ef8.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=b63b60d2-4c68-4bc4-8d7a-d4c82cde958d</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,b63b60d2-4c68-4bc4-8d7a-d4c82cde958d.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,b63b60d2-4c68-4bc4-8d7a-d4c82cde958d.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b63b60d2-4c68-4bc4-8d7a-d4c82cde958d</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Another DZone newsletter crosses my Inbox, and again I feel compelled to comment.
Not so much in the uber-aggressive style of my previous attempt, since I find myself
more on the fence on this one, but because I think it's a worthwhile debate and worth
calling out.
</p>
        <p>
The article in question is "5 Reasons Why You Don't Want A Jack-of-all-Trades Developer",
by Rebecca Murphey. In it, she talks about the all-too-common want-ad description
that appears on job sites and mailing lists:
</p>
        <blockquote>
          <p>
I've spent the last couple of weeks trolling Craigslist and have been shocked at the
number of ads I've found that seem to be looking for an entire engineering team rolled
up into a single person. Descriptions like this aren't at all uncommon: 
</p>
          <blockquote>
            <p>
Candidates must have 5 years experience defining and developing data driven web sites
and have solid experience with ASP.NET, HTML, XML, JavaScript, CSS, Flash, SQL, and
optimizing graphics for web use. The candidate must also have project management skills
and be able to balance multiple, dynamic, and sometimes conflicting priorities. This
position is an integral part of executing our web strategy and must have excellent
interpersonal and communication skills.
</p>
          </blockquote>
        </blockquote>
        <p>
Her disdain for this practice is the focus of the rest of the article:
</p>
        <blockquote>
          <p>
Now I don't know about you, but if I were building a house, I wouldn't want an architect
doing the work of a carpenter, or the foundation guy doing the work of an electrician.
But ads like the one above are suggesting that a single person can actually do all
of these things, and the simple fact is that these are fundamentally different skills.
The foundation guy may build a solid base, but put him in charge of wiring the house
and the whole thing could, well, burn down. When it comes to staffing a web project
or product, the principle isn't all that different -- nor is the consequence.
</p>
        </blockquote>
        <p>
I'll admit, when I got to this point in the article, I was fully ready to start the
argument right here and now--developers <em>have</em> to have a well-rounded collection
of skills, since anecdotal evidence suggests that trying to go the route of programming
specialization (along the lines of medical specialization) isn't going to work out,
particularly given the shortage of programmers in the industry right now to begin
with. But she goes on to make an interesting point:
</p>
        <blockquote>
          <p>
The thing is, the more you know, the more you find out you don't know. A year ago
I'd have told you I could write PHP/MySQL applications, and do the front-end too;
now that I've seen what it means to be truly skilled at the back-end side of things,
I realize the most accurate thing I can say is that I understand PHP applications
and how they relate to my front-end development efforts. To say that I can write them
myself is to diminish the good work that truly skilled PHP/MySQL developers are doing,
just as I get a little bent when a back-end developer thinks they can do my job.
</p>
        </blockquote>
        <p>
She really caught me eye (and interest) with that first statement, because it echoes
something Bjarne Stroustrup told me almost 15 years ago, in an email reply sent back
to me (in response to my rather audacious cold-contact email inquiry about the costs
and benefits of writing a book): "The more you know, the more you know you don't know".
What I think also caught my eye--and, I admit it, earned respect--was her admission
that she maybe isn't as good at something as she thought she was before. This kind
of reflective admission is a good thing (and missing far too much from our industry,
IMHO), because it leads not only to better job placements for us as well as the companies
that want to hire us, but also because the more honest we can be about our own skills,
the more we can focus efforts on learning what needs to be learned in order to grow.
</p>
        <p>
She then turns to her list of 5 reasons, phrased more as a list of suggestions to
companies seeking to hire programming talent; my comments are in italics:
</p>
        <blockquote>
          <p>
So to all of those companies who are writing ads seeking one magical person to fill
all of their needs, I offer a few caveats before you post your next Craigslist ad: 
</p>
          <p>
1. If you're seeking a single person with all of these skills, make sure you have
the technical expertise to determine whether a person's skills match their resume.
Outsource a tech interview if you need to. Any developer can tell horror stories about
inept predecessors, but when a front-end developer like myself can read PHP and think
it's appalling, that tells me someone didn't do a very good job of vetting and got
stuck with a programmer who couldn't deliver on his stated skills. 
</p>
          <p>
            <em>(T: I cannot stress this enough--the technical interview process practiced at
most companies is a complete sham and travesty, and usually only succeeds in making
sure the company doesn't hire a serial killer, would-be terrorist, or financially
destitute freeway-underpass resident. I seriously think most companies should outsource
the technical interview process entirely.)</em>
          </p>
          <p>
2. A single source for all of these skills is a single point of failure on multiple
fronts. Think long and hard about what it will mean to your project if the person
you hire falls short in some aspect(s), and about the mistakes that will have to be
cleaned up when you get around to hiring specialized people. I have spent countless
days cleaning up after back-end developers who didn't understand the nuances and power
of CSS, or the difference between a div, a paragraph, a list item, and a span. Really. 
</p>
          <p>
            <em>(T: I'm not as much concerned about the single point of failure argument here,
to be honest. Developers will always have "edges" to what they know, and companies
will constantly push developers to that edge for various reasons, most of which seem
to be financial--"Why pay two people to do what one person can do?" is a really compelling
argument to the CFO, particularly when measured against an unquantifiable, namely
the quality of the project.)</em>
          </p>
          <p>
3. Writing efficient SQL is different from efficiently producing web-optimized graphics.
Administering a server is different from troubleshooting cross-browser issues. Trust
me. All are integral to the performance and growth of your site, and so you're right
to want them all -- just not from the same person. Expecting quality results in every
area from the same person goes back to the foundation guy doing the wiring. You're
playing with fire. 
</p>
          <p>
            <em>(T: True, but let's be honest about something here. It's not so much that the
company wants to play with fire, or that the company has a manual entitled "Running
a Dilbert Company" that says somewhere inside it, "Thou shouldst never hire more than
one person to run the IT department", but that the company is dealing with limited
budgets and headcount. If you only have room for one head under the budget, you want
the maximum for that one head. And please don't tell me how wrong that practice of
headcount really is--you're preaching to the choir on that one. The people you want
to preach to are the Jack Welches of the world, who apparently aren't listening to
us very much.)</em>
          </p>
          <p>
4. Asking for a laundry list of skills may end up deterring the candidates who will
be best able to fill your actual need. Be precise in your ad: about the position's
title and description, about the level of skill you're expecting in the various areas,
about what's nice to have and what's imperative. If you're looking to fill more than
one position, write more than one ad; if you don't know exactly what you want, try
harder to figure it out before you click the publish button. 
</p>
          <p>
            <em>(T: Asking people to think before publishing? Heresy! Truthfully, I don't think
it's a question of not knowing what they want, it's more trying to find what they
want. I've seen how some of these same job ads get generated, and it's usually because
a programmer on the team has left, and they had some degree of skill in all of those
areas. What the company wants, then, is somebody who can step into exactly what that
individual was doing before they handed in their resignation, but ads like, "Candidate
should look at Joe Smith's resume on Dice.com (http://...) and have exactly that same
skill set. Being named Joe Smith a desirable 'plus', since then we won't have to have
the sysadmins create a new login handle for you." won't attract much attention. Frankly,
what I've found most companies want is to just not lose the programmer in the first
place.)</em>
          </p>
          <p>
5. If you really do think you want one person to do the task of an entire engineering
team, prepare yourself to get someone who is OK at a bunch of things and not particularly
good at any of them. Again: the more you know, the more you find out you don't know.
I regularly team with a talented back-end developer who knows better than to try to
do my job, and I know better than to try to do his. Anyone who represents themselves
as being a master of front-to-back web development may very well have no idea just
how much they don't know, and could end up imperiling your product or project -- front
to back -- as a result. 
</p>
          <p>
            <em>(T: Or be prepared to pay a lot of money for somebody who is an expert at all
of those things, or be prepared to spend a lot of time and money growing somebody
into that role. Sometimes the exact right thing to do is have one person do it all,
but usually it's cheaper to have a small team work together.)</em>
          </p>
        </blockquote>
        <p>
(On a side note, I find it amusing that she seems to consider PHP a back-end skill,
but I don't want to sound harsh doing so--that's just a matter of perspective, I suppose.
(I can just imagine the guffaws from the mainframe guys when I talk about EJB, message-queue
and Spring systems being "back-end", too.) To me, the whole "web" thing is front-end
stuff, whether you're the one generating the HTML from your PHP or servlet/JSP or
ASP.NET server-side engine, or you're the one generating the CSS and graphics images
that are sent back to the browser by said server-side engine. If a user sees something
I did, it's probably because something bad happened and they're looking at a stack
trace on the screen.)
</p>
        <p>
The thing I find interesting is that HR hiring practices and job-writing skills haven't
gotten any better in the near-to-two-decades I've been in this industry. I can still
remember a fresh-faced wet-behind-the-ears Stroustrup-2nd-Edition-toting job candidate
named Neward looking at job placement listings and finding much the same kind of laundry
list of skills, including those with the impossible number of years of experience.
(In 1995, I saw an ad looking for somebody who had "10 years of C++ experience", and
wondering, "Gosh, I guess they're looking to hire Stroustrup or Lippmann", since those
two are the only people who could possibly have filled that requirement at the time.
This was right before reading the ad that was looking for 5 years of Java experience,
or the ad below it looking for 15 years of Delphi....)
</p>
        <p>
Given that it doesn't seem likely that HR departments are going to "get a clue" any
time soon, it leaves us with an interesting question: if you're a developer, and you're
looking at these laundry lists of requirements, how do you respond?
</p>
        <p>
Here's my own list of things for programmers/developers to consider over the next
five to ten years:
</p>
        <ol>
          <li>
            <em>These "laundry list" ads are not going away any time soon.</em> We can rant and
rail about the stupidity of HR departments and hiring managers all we want, but the
basic fact is, this is the way things are going to work for the forseeable future,
it seems. Changing this would require a "sea change" across the industry, and sea
change doesn't happen overnight, or even within the span of a few years. So, to me,
the right question to ask isn't, "How do I change the industry to make it easier for
me to find a job I can do?", but "How do I change what I do when looking for a job
to better respond to what the industry is doing?" 
</li>
          <li>
            <em>Exclusively focusing on a single area of technology is the Kiss of Death.</em> If
all you know is PHP, then your days are numbered. I mean no disrespect to the PHP
developers of the world--in fact, were it not too ambiguous to say it, I would rephrase
that as "If all you know is <em>X</em>, your days are numbered." There is no one technical
skill that will be as much in demand in ten years as it is now. Technologies age.
Industry evolves. Innovations come along that completely change the game and leave
our predictions of a few years ago in the dust. Bill Gates (he of the "640K comment")
has said, and I think he's spot on with this, "We routinely overestimate where we
will be in five years, and vastly underestimate where we will be in ten." If you put
all your eggs in the PHP basket, then when PHP gets phased out in favor of <em>(insert
new "hotness" here)</em>, you're screwed. Unless, of course, you want to wait until
you're the last man standing, which seems to have paid off well for the few COBOL
developers still alive.... but not so much for the Algol, Simula, or RPG folks.... 
</li>
          <li>
            <em>Assuming that you can stop learning is the Kiss of Death.</em> Look, if you want
to stop learning at some point and coast on what you know, be prepared to switch industries.
This one, for the forseeable future, is one that's predicated on radical innovation
and constant change. This means we have to accept that everything is in a constant
state of flux--you can either rant and rave against it, or roll with it. This doesn't
mean that you don't have to look back, though--anybody who's been in this industry
for more than 10 years has seen how we keep reinventing the wheel, particularly now
that the relationship between Ruby and Smalltalk has been put up on the big stage,
so to speak. Do yourself a favor: learn stuff that's already "done", too, because
it turns out there's a lot of lessons we can learn from those who came before us.
"Those who cannot remember the past are condemned to repeat it" (George Santanyana).
Case in point: if you're trying to get into XML services, spend some time learning
CORBA and DCOM, and compare how they do things against WSDL and SOAP. What's similar?
What's different? Do some Googling and see if you can find comparison articles between
the two, and what XML services were supposed to "fix" from the previous two. You don't
have to write a ton of CORBA or DCOM code to see those differences (though writing
at least a little CORBA/DCOM code will probably help.) 
</li>
          <li>
            <em>Find a collection of people smarter than you.</em> Chad Fowler calls this "Being
the worst player in any band you're in" (<em>My Job Went to India (and All I Got Was
This Lousy Book)</em>, Pragmatic Press<em>)</em>. The more you surround yourself with
smart people, the more of these kinds of things (tools, languages, etc) you will pick
up merely by osmosis, and find yourself more attractive to those kind of "laundry
list" job reqs. If nothing else, it speaks well to you as an employee/consultant if
you can say, "I don't know the answer to that question, but I know people who do,
and I can get them to help me". 
</li>
          <li>
            <em>Learn to be at least self-sufficient in related, complementary technologies.</em> We
see laundry list ads in "clusters". Case in point: if the company is looking for somebody
to work on their website, they're going to rattle off a list of five or so things
they want he/she to know--HTML, CSS, XML, JavaScript and sometimes Flash (or maybe
now Silverlight), in addition to whatever server-side technology they're using (ASP.NET,
servlets, PHP, whatever). This is a pretty reasonable request, depending on the depth
of each that they want you to know. Here's the thing: the company does <em>not</em> want
the guy who says he knows ASP.NET (and nothing but ASP.NET), when asked to make a
small HTML or CSS change, to turn to them and say, "I'm sorry, that's not in my job
description. I only know ASP.NET. You'll have to get your HTML guy to make that change."
You should at least be comfortable with the basic syntax of all of the above (again,
with possible exception for Flash, which is the odd man out in that job ad that started
this piece), so that you can at least make sure the site isn't going to break when
you push your changes live. In the case of the ad above, learn the things that "surround"
website development: HTML, CSS, JavaScript, Flash, Java applets, HTTP (!!), TCP/IP,
server operating systems, IIS or Apache or Tomcat or some other server engine (including
the necessary admin skills to get them installed and up and running), XML (since it's
so often used for configuration), and so on. These are all "complementary" skills
to being an ASP.NET developer (or a servlet/JSP developer). If you're a C# or Java
programmer, learn different programming languages, a la F# (.NET) or Scala (Java),
IronRuby (.NET) or JRuby (Java), and so on. If you're a Ruby developer, learn either
a JVM language or a CLR language, so you can "plug in" more easily to the large corporate
enterprise when that call comes. 
</li>
          <li>
            <em>Learn to "read" the ad at a higher level.</em> It's often possible to "read between
the lines" and get an idea of what they're looking for, even before talking to anybody
at the company about the job. For example, I read the ad that started this piece,
and the internal dialogue that went on went something like this: <blockquote>Candidates
must have 5 years experience <em>(No entry-level developers wanted, they want somebody
who can get stuff done without having their hand held through the process) </em>defining
and developing data driven <em>(they want somebody who's comfortable with SQL and
databases) </em>web sites <em>(wait for it, the "web cluster" list is coming) </em>and
have solid experience with ASP.NET <em>(OK, they're at least marginally a Microsoft
shop, that means they probably also want some Windows Server and IIS experience)</em>,
HTML, XML, JavaScript, CSS <em>(the "web cluster", knew that was coming)</em>, Flash <em>(OK,
I wonder if this is because they're building rich internet/intranet apps already,
or just flirting with the idea?)</em>, SQL <em>(knew that was coming)</em>, and optimizing
graphics for web use <em>(OK, this is another wrinkle--this smells of "we don't want
our graphics-heavy website to suck")</em>. The candidate must also have project management
skills <em>(in other words, "You're on your own, sucka!"--you're not part of a project
team) </em>and be able to balance multiple, dynamic, and sometimes conflicting priorities <em>(in
other words, "You're own your own trying to balance between the CTO's demands and
the CEO's demands, sucka!", since you're not part of a project team; this also probably
means you're not moving into an existing project, but doing more maintenance work
on an existing site)</em>. This position is an integral part of executing our web
strategy <em>(in other words, this project has public visibility and you can't let
stupid errors show up on the website and make us all look bad) </em>and must have
excellent interpersonal and communication skills <em>(what job </em>doesn't<em> need
excellent interpersonal and communication skills?)</em>.</blockquote>See what I mean?
They want an ASP.NET dev. My guess is that they're thinking a lot about Silverlight,
since Silverlight's closest competitor is Flash, and so theoretically an ASP.NET-and-Flash
dev would know how to use Silverlight well. Thus, I'm guessing that the HTML, CSS,
and JavaScript don't need to be "Adept" level, nor even "Master" level, but "Journeyman"
is probably necessary, and maybe you could get away with "Apprentice" at those levels,
if you're working as part of a team. The SQL part will probably have to be "Journeyman"
level, the XML could probably be just "Apprentice", since I'm guessing it's only necessary
for the web.config files to control the ASP.NET configuration, and the "optimizing
web graphics", push-come-to-shove, could probably be forgiven if you've had some experience
at doing some performance tuning of a website. 
</li>
          <li>
            <em>Be insightful.</em> I know, every interview book ever written says you should
"ask questions", but what they're really getting at is "Demonstrate that you've thought
about this company and this position". Demonstrating insight about the position and
the company and technology as a whole is a good way to prove that you're a neck above
the other candidates, and will help keep the job once you've got it. 
</li>
          <li>
            <em>Be honest about what you know.</em> Let's be honest--we've all met developers
who claimed they were "experts" in a particular tool or technology, and then painfully
demonstrated how far from "expert" status they really were. Be honest about yourself:
claim your skills on a simple four-point scale. "Apprentice" means "I read a book
on it" or "I've looked at it", but "there's no way I could do it on my own without
some serious help, and ideally with a Master looking over my shoulder". "Journeyman"
means "I'm competent at it, I know the tools/technology"; or, put another way, "I
can do 80% of what anybody can ask me to do, and I know how to find the other 20%
when those situations arise". "Master" means "I not only claim that I can do what
you ask me to do with it, I can optimize systems built with it, I can make it do things
others wouldn't attempt, and I can help others learn it better". Masters are routinely
paired with Apprentices as mentors or coaches, and should expect to have this as a
major part of their responsibilities. (Ideally, anybody claiming "architect" in their
title should be a Master at one or two of the core tools/technologies used in their
system; or, put another way, architects should be <em>very</em> dubious about architecting
with something they can't reasonably claim at least Journeyman status in.) "Adept",
shortly put, means you are not only fully capable of pulling off anything a Master
can do, but you routinely take the tool/technology way beyond what anybody else thinks
possible, or you know the depth of the system so well that you can fix bugs just by
thinking about them. With your eyes closed. While drinking a glass of water. Seriously,
Adept status is not something to claim lightly--not only had you better know the guys
who created the thing personally, but you should have offered up suggestions on how
to make it better and had one or more of them accepted. 
</li>
          <li>
            <em>Demonstrate that you have relevant skills beyond what they asked for.</em> Look
at the ad in question: they want an ASP.NET dev, so any familiarity with IIS, Windows
Server, SQL Server, MSMQ, COM/DCOM/COM+, WCF/Web services, SharePoint, the CLR, IronPython,
or IronRuby should be listed prominently on your resume, and brought up at least twice
during your interview. These are (again) complementary technologies, and even if the
company doesn't have a need for those things right now, it's probably because Joe
didn't know any of those, and so they couldn't use them without sending Joe to a training
class. If you bring it up during the interview, it can also show some insight on your
part: "So, any questions for us?" "Yes, are you guys using Windows Server 2008, or
2003, for your back end?" "Um, we're using 2003, why do you ask?" "Oh, well, when
I was working as an ASP.NET dev for my previous company, we moved up to 2008 because
it had the Froobinger Enhancement, which let us...., and I was just curious if you
guys had a similar need." Or something like that. Again, be entirely honest about
what you know--if you helped the server upgrade by just putting the CDs into the drive
and punching the power button, then say as much. 
</li>
          <li>
            <em>Demonstrate that you can talk to project stakeholders and users.</em> Communication
is huge. The era of the one-developer team is long since over--you have to be able
to meet with project champions, users, other developers, and so on. If you can't do
that without somebody being offended at your lack of tact and subtlety (or your lack
of personal hygiene), then don't expect to get hired too often. 
</li>
          <li>
            <em>Demonstrate that you understand the company, its business model, and what would
help it move forward.</em> Developers who actually understand business are surprisingly
and unfortunately rare. Be one of the rare ones, and you'll find companies highly
reluctant to let you go.</li>
        </ol>
        <p>
Is this an exhaustive list? Hardly. Is this list guaranteed to keep you employed forever?
Nope. But this seems to be working for a lot of the people I run into at conferences
and client consulting gigs, so I humbly submit it for your consideration.
</p>
        <p>
But in no way do I consider this conversation completely over, either--feel free to
post your own suggestions, or tell me why I'm full of crap on any (or all) of these.
:-)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b63b60d2-4c68-4bc4-8d7a-d4c82cde958d" />
        <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>The Never-Ending Debate of Specialist v. Generalist</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,b63b60d2-4c68-4bc4-8d7a-d4c82cde958d.aspx</guid>
      <link>http://blogs.tedneward.com/2008/08/14/The+NeverEnding+Debate+Of+Specialist+V+Generalist.aspx</link>
      <pubDate>Thu, 14 Aug 2008 22:38:42 GMT</pubDate>
      <description>&lt;p&gt;
Another DZone newsletter crosses my Inbox, and again I feel compelled to comment.
Not so much in the uber-aggressive style of my previous attempt, since I find myself
more on the fence on this one, but because I think it's a worthwhile debate and worth
calling out.
&lt;/p&gt;
&lt;p&gt;
The article in question is "5 Reasons Why You Don't Want A Jack-of-all-Trades Developer",
by Rebecca Murphey. In it, she talks about the all-too-common want-ad description
that appears on job sites and mailing lists:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I've spent the last couple of weeks trolling Craigslist and have been shocked at the
number of ads I've found that seem to be looking for an entire engineering team rolled
up into a single person. Descriptions like this aren't at all uncommon: &lt;blockquote&gt; 
&lt;p&gt;
Candidates must have 5 years experience defining and developing data driven web sites
and have solid experience with ASP.NET, HTML, XML, JavaScript, CSS, Flash, SQL, and
optimizing graphics for web use. The candidate must also have project management skills
and be able to balance multiple, dynamic, and sometimes conflicting priorities. This
position is an integral part of executing our web strategy and must have excellent
interpersonal and communication skills.
&lt;/p&gt;
&lt;/blockquote&gt;&lt;/blockquote&gt; 
&lt;p&gt;
Her disdain for this practice is the focus of the rest of the article:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Now I don't know about you, but if I were building a house, I wouldn't want an architect
doing the work of a carpenter, or the foundation guy doing the work of an electrician.
But ads like the one above are suggesting that a single person can actually do all
of these things, and the simple fact is that these are fundamentally different skills.
The foundation guy may build a solid base, but put him in charge of wiring the house
and the whole thing could, well, burn down. When it comes to staffing a web project
or product, the principle isn't all that different -- nor is the consequence.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I'll admit, when I got to this point in the article, I was fully ready to start the
argument right here and now--developers &lt;em&gt;have&lt;/em&gt; to have a well-rounded collection
of skills, since anecdotal evidence suggests that trying to go the route of programming
specialization (along the lines of medical specialization) isn't going to work out,
particularly given the shortage of programmers in the industry right now to begin
with. But she goes on to make an interesting point:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The thing is, the more you know, the more you find out you don't know. A year ago
I'd have told you I could write PHP/MySQL applications, and do the front-end too;
now that I've seen what it means to be truly skilled at the back-end side of things,
I realize the most accurate thing I can say is that I understand PHP applications
and how they relate to my front-end development efforts. To say that I can write them
myself is to diminish the good work that truly skilled PHP/MySQL developers are doing,
just as I get a little bent when a back-end developer thinks they can do my job.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
She really caught me eye (and interest) with that first statement, because it echoes
something Bjarne Stroustrup told me almost 15 years ago, in an email reply sent back
to me (in response to my rather audacious cold-contact email inquiry about the costs
and benefits of writing a book): "The more you know, the more you know you don't know".
What I think also caught my eye--and, I admit it, earned respect--was her admission
that she maybe isn't as good at something as she thought she was before. This kind
of reflective admission is a good thing (and missing far too much from our industry,
IMHO), because it leads not only to better job placements for us as well as the companies
that want to hire us, but also because the more honest we can be about our own skills,
the more we can focus efforts on learning what needs to be learned in order to grow.
&lt;/p&gt;
&lt;p&gt;
She then turns to her list of 5 reasons, phrased more as a list of suggestions to
companies seeking to hire programming talent; my comments are in italics:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
So to all of those companies who are writing ads seeking one magical person to fill
all of their needs, I offer a few caveats before you post your next Craigslist ad: 
&lt;p&gt;
1. If you're seeking a single person with all of these skills, make sure you have
the technical expertise to determine whether a person's skills match their resume.
Outsource a tech interview if you need to. Any developer can tell horror stories about
inept predecessors, but when a front-end developer like myself can read PHP and think
it's appalling, that tells me someone didn't do a very good job of vetting and got
stuck with a programmer who couldn't deliver on his stated skills. 
&lt;p&gt;
&lt;em&gt;(T: I cannot stress this enough--the technical interview process practiced at
most companies is a complete sham and travesty, and usually only succeeds in making
sure the company doesn't hire a serial killer, would-be terrorist, or financially
destitute freeway-underpass resident. I seriously think most companies should outsource
the technical interview process entirely.)&lt;/em&gt; 
&lt;p&gt;
2. A single source for all of these skills is a single point of failure on multiple
fronts. Think long and hard about what it will mean to your project if the person
you hire falls short in some aspect(s), and about the mistakes that will have to be
cleaned up when you get around to hiring specialized people. I have spent countless
days cleaning up after back-end developers who didn't understand the nuances and power
of CSS, or the difference between a div, a paragraph, a list item, and a span. Really. 
&lt;p&gt;
&lt;em&gt;(T: I'm not as much concerned about the single point of failure argument here,
to be honest. Developers will always have "edges" to what they know, and companies
will constantly push developers to that edge for various reasons, most of which seem
to be financial--"Why pay two people to do what one person can do?" is a really compelling
argument to the CFO, particularly when measured against an unquantifiable, namely
the quality of the project.)&lt;/em&gt; 
&lt;p&gt;
3. Writing efficient SQL is different from efficiently producing web-optimized graphics.
Administering a server is different from troubleshooting cross-browser issues. Trust
me. All are integral to the performance and growth of your site, and so you're right
to want them all -- just not from the same person. Expecting quality results in every
area from the same person goes back to the foundation guy doing the wiring. You're
playing with fire. 
&lt;p&gt;
&lt;em&gt;(T: True, but let's be honest about something here. It's not so much that the
company wants to play with fire, or that the company has a manual entitled "Running
a Dilbert Company" that says somewhere inside it, "Thou shouldst never hire more than
one person to run the IT department", but that the company is dealing with limited
budgets and headcount. If you only have room for one head under the budget, you want
the maximum for that one head. And please don't tell me how wrong that practice of
headcount really is--you're preaching to the choir on that one. The people you want
to preach to are the Jack Welches of the world, who apparently aren't listening to
us very much.)&lt;/em&gt; 
&lt;p&gt;
4. Asking for a laundry list of skills may end up deterring the candidates who will
be best able to fill your actual need. Be precise in your ad: about the position's
title and description, about the level of skill you're expecting in the various areas,
about what's nice to have and what's imperative. If you're looking to fill more than
one position, write more than one ad; if you don't know exactly what you want, try
harder to figure it out before you click the publish button. 
&lt;p&gt;
&lt;em&gt;(T: Asking people to think before publishing? Heresy! Truthfully, I don't think
it's a question of not knowing what they want, it's more trying to find what they
want. I've seen how some of these same job ads get generated, and it's usually because
a programmer on the team has left, and they had some degree of skill in all of those
areas. What the company wants, then, is somebody who can step into exactly what that
individual was doing before they handed in their resignation, but ads like, "Candidate
should look at Joe Smith's resume on Dice.com (http://...) and have exactly that same
skill set. Being named Joe Smith a desirable 'plus', since then we won't have to have
the sysadmins create a new login handle for you." won't attract much attention. Frankly,
what I've found most companies want is to just not lose the programmer in the first
place.)&lt;/em&gt; 
&lt;p&gt;
5. If you really do think you want one person to do the task of an entire engineering
team, prepare yourself to get someone who is OK at a bunch of things and not particularly
good at any of them. Again: the more you know, the more you find out you don't know.
I regularly team with a talented back-end developer who knows better than to try to
do my job, and I know better than to try to do his. Anyone who represents themselves
as being a master of front-to-back web development may very well have no idea just
how much they don't know, and could end up imperiling your product or project -- front
to back -- as a result. 
&lt;p&gt;
&lt;em&gt;(T: Or be prepared to pay a lot of money for somebody who is an expert at all
of those things, or be prepared to spend a lot of time and money growing somebody
into that role. Sometimes the exact right thing to do is have one person do it all,
but usually it's cheaper to have a small team work together.)&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
(On a side note, I find it amusing that she seems to consider PHP a back-end skill,
but I don't want to sound harsh doing so--that's just a matter of perspective, I suppose.
(I can just imagine the guffaws from the mainframe guys when I talk about EJB, message-queue
and Spring systems being "back-end", too.) To me, the whole "web" thing is front-end
stuff, whether you're the one generating the HTML from your PHP or servlet/JSP or
ASP.NET server-side engine, or you're the one generating the CSS and graphics images
that are sent back to the browser by said server-side engine. If a user sees something
I did, it's probably because something bad happened and they're looking at a stack
trace on the screen.)
&lt;/p&gt;
&lt;p&gt;
The thing I find interesting is that HR hiring practices and job-writing skills haven't
gotten any better in the near-to-two-decades I've been in this industry. I can still
remember a fresh-faced wet-behind-the-ears Stroustrup-2nd-Edition-toting job candidate
named Neward looking at job placement listings and finding much the same kind of laundry
list of skills, including those with the impossible number of years of experience.
(In 1995, I saw an ad looking for somebody who had "10 years of C++ experience", and
wondering, "Gosh, I guess they're looking to hire Stroustrup or Lippmann", since those
two are the only people who could possibly have filled that requirement at the time.
This was right before reading the ad that was looking for 5 years of Java experience,
or the ad below it looking for 15 years of Delphi....)
&lt;/p&gt;
&lt;p&gt;
Given that it doesn't seem likely that HR departments are going to "get a clue" any
time soon, it leaves us with an interesting question: if you're a developer, and you're
looking at these laundry lists of requirements, how do you respond?
&lt;/p&gt;
&lt;p&gt;
Here's my own list of things for programmers/developers to consider over the next
five to ten years:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;These "laundry list" ads are not going away any time soon.&lt;/em&gt; We can rant and
rail about the stupidity of HR departments and hiring managers all we want, but the
basic fact is, this is the way things are going to work for the forseeable future,
it seems. Changing this would require a "sea change" across the industry, and sea
change doesn't happen overnight, or even within the span of a few years. So, to me,
the right question to ask isn't, "How do I change the industry to make it easier for
me to find a job I can do?", but "How do I change what I do when looking for a job
to better respond to what the industry is doing?" 
&lt;li&gt;
&lt;em&gt;Exclusively focusing on a single area of technology is the Kiss of Death.&lt;/em&gt; If
all you know is PHP, then your days are numbered. I mean no disrespect to the PHP
developers of the world--in fact, were it not too ambiguous to say it, I would rephrase
that as "If all you know is &lt;em&gt;X&lt;/em&gt;, your days are numbered." There is no one technical
skill that will be as much in demand in ten years as it is now. Technologies age.
Industry evolves. Innovations come along that completely change the game and leave
our predictions of a few years ago in the dust. Bill Gates (he of the "640K comment")
has said, and I think he's spot on with this, "We routinely overestimate where we
will be in five years, and vastly underestimate where we will be in ten." If you put
all your eggs in the PHP basket, then when PHP gets phased out in favor of &lt;em&gt;(insert
new "hotness" here)&lt;/em&gt;, you're screwed. Unless, of course, you want to wait until
you're the last man standing, which seems to have paid off well for the few COBOL
developers still alive.... but not so much for the Algol, Simula, or RPG folks.... 
&lt;li&gt;
&lt;em&gt;Assuming that you can stop learning is the Kiss of Death.&lt;/em&gt; Look, if you want
to stop learning at some point and coast on what you know, be prepared to switch industries.
This one, for the forseeable future, is one that's predicated on radical innovation
and constant change. This means we have to accept that everything is in a constant
state of flux--you can either rant and rave against it, or roll with it. This doesn't
mean that you don't have to look back, though--anybody who's been in this industry
for more than 10 years has seen how we keep reinventing the wheel, particularly now
that the relationship between Ruby and Smalltalk has been put up on the big stage,
so to speak. Do yourself a favor: learn stuff that's already "done", too, because
it turns out there's a lot of lessons we can learn from those who came before us.
"Those who cannot remember the past are condemned to repeat it" (George Santanyana).
Case in point: if you're trying to get into XML services, spend some time learning
CORBA and DCOM, and compare how they do things against WSDL and SOAP. What's similar?
What's different? Do some Googling and see if you can find comparison articles between
the two, and what XML services were supposed to "fix" from the previous two. You don't
have to write a ton of CORBA or DCOM code to see those differences (though writing
at least a little CORBA/DCOM code will probably help.) 
&lt;li&gt;
&lt;em&gt;Find a collection of people smarter than you.&lt;/em&gt; Chad Fowler calls this "Being
the worst player in any band you're in" (&lt;em&gt;My Job Went to India (and All I Got Was
This Lousy Book)&lt;/em&gt;, Pragmatic Press&lt;em&gt;)&lt;/em&gt;. The more you surround yourself with
smart people, the more of these kinds of things (tools, languages, etc) you will pick
up merely by osmosis, and find yourself more attractive to those kind of "laundry
list" job reqs. If nothing else, it speaks well to you as an employee/consultant if
you can say, "I don't know the answer to that question, but I know people who do,
and I can get them to help me". 
&lt;li&gt;
&lt;em&gt;Learn to be at least self-sufficient in related, complementary technologies.&lt;/em&gt; We
see laundry list ads in "clusters". Case in point: if the company is looking for somebody
to work on their website, they're going to rattle off a list of five or so things
they want he/she to know--HTML, CSS, XML, JavaScript and sometimes Flash (or maybe
now Silverlight), in addition to whatever server-side technology they're using (ASP.NET,
servlets, PHP, whatever). This is a pretty reasonable request, depending on the depth
of each that they want you to know. Here's the thing: the company does &lt;em&gt;not&lt;/em&gt; want
the guy who says he knows ASP.NET (and nothing but ASP.NET), when asked to make a
small HTML or CSS change, to turn to them and say, "I'm sorry, that's not in my job
description. I only know ASP.NET. You'll have to get your HTML guy to make that change."
You should at least be comfortable with the basic syntax of all of the above (again,
with possible exception for Flash, which is the odd man out in that job ad that started
this piece), so that you can at least make sure the site isn't going to break when
you push your changes live. In the case of the ad above, learn the things that "surround"
website development: HTML, CSS, JavaScript, Flash, Java applets, HTTP (!!), TCP/IP,
server operating systems, IIS or Apache or Tomcat or some other server engine (including
the necessary admin skills to get them installed and up and running), XML (since it's
so often used for configuration), and so on. These are all "complementary" skills
to being an ASP.NET developer (or a servlet/JSP developer). If you're a C# or Java
programmer, learn different programming languages, a la F# (.NET) or Scala (Java),
IronRuby (.NET) or JRuby (Java), and so on. If you're a Ruby developer, learn either
a JVM language or a CLR language, so you can "plug in" more easily to the large corporate
enterprise when that call comes. 
&lt;li&gt;
&lt;em&gt;Learn to "read" the ad at a higher level.&lt;/em&gt; It's often possible to "read between
the lines" and get an idea of what they're looking for, even before talking to anybody
at the company about the job. For example, I read the ad that started this piece,
and the internal dialogue that went on went something like this: &lt;blockquote&gt;Candidates
must have 5 years experience &lt;em&gt;(No entry-level developers wanted, they want somebody
who can get stuff done without having their hand held through the process) &lt;/em&gt;defining
and developing data driven &lt;em&gt;(they want somebody who's comfortable with SQL and
databases) &lt;/em&gt;web sites &lt;em&gt;(wait for it, the "web cluster" list is coming) &lt;/em&gt;and
have solid experience with ASP.NET &lt;em&gt;(OK, they're at least marginally a Microsoft
shop, that means they probably also want some Windows Server and IIS experience)&lt;/em&gt;,
HTML, XML, JavaScript, CSS &lt;em&gt;(the "web cluster", knew that was coming)&lt;/em&gt;, Flash &lt;em&gt;(OK,
I wonder if this is because they're building rich internet/intranet apps already,
or just flirting with the idea?)&lt;/em&gt;, SQL &lt;em&gt;(knew that was coming)&lt;/em&gt;, and optimizing
graphics for web use &lt;em&gt;(OK, this is another wrinkle--this smells of "we don't want
our graphics-heavy website to suck")&lt;/em&gt;. The candidate must also have project management
skills &lt;em&gt;(in other words, "You're on your own, sucka!"--you're not part of a project
team) &lt;/em&gt;and be able to balance multiple, dynamic, and sometimes conflicting priorities &lt;em&gt;(in
other words, "You're own your own trying to balance between the CTO's demands and
the CEO's demands, sucka!", since you're not part of a project team; this also probably
means you're not moving into an existing project, but doing more maintenance work
on an existing site)&lt;/em&gt;. This position is an integral part of executing our web
strategy &lt;em&gt;(in other words, this project has public visibility and you can't let
stupid errors show up on the website and make us all look bad) &lt;/em&gt;and must have
excellent interpersonal and communication skills &lt;em&gt;(what job &lt;/em&gt;doesn't&lt;em&gt; need
excellent interpersonal and communication skills?)&lt;/em&gt;.&lt;/blockquote&gt;See what I mean?
They want an ASP.NET dev. My guess is that they're thinking a lot about Silverlight,
since Silverlight's closest competitor is Flash, and so theoretically an ASP.NET-and-Flash
dev would know how to use Silverlight well. Thus, I'm guessing that the HTML, CSS,
and JavaScript don't need to be "Adept" level, nor even "Master" level, but "Journeyman"
is probably necessary, and maybe you could get away with "Apprentice" at those levels,
if you're working as part of a team. The SQL part will probably have to be "Journeyman"
level, the XML could probably be just "Apprentice", since I'm guessing it's only necessary
for the web.config files to control the ASP.NET configuration, and the "optimizing
web graphics", push-come-to-shove, could probably be forgiven if you've had some experience
at doing some performance tuning of a website. 
&lt;li&gt;
&lt;em&gt;Be insightful.&lt;/em&gt; I know, every interview book ever written says you should
"ask questions", but what they're really getting at is "Demonstrate that you've thought
about this company and this position". Demonstrating insight about the position and
the company and technology as a whole is a good way to prove that you're a neck above
the other candidates, and will help keep the job once you've got it. 
&lt;li&gt;
&lt;em&gt;Be honest about what you know.&lt;/em&gt; Let's be honest--we've all met developers
who claimed they were "experts" in a particular tool or technology, and then painfully
demonstrated how far from "expert" status they really were. Be honest about yourself:
claim your skills on a simple four-point scale. "Apprentice" means "I read a book
on it" or "I've looked at it", but "there's no way I could do it on my own without
some serious help, and ideally with a Master looking over my shoulder". "Journeyman"
means "I'm competent at it, I know the tools/technology"; or, put another way, "I
can do 80% of what anybody can ask me to do, and I know how to find the other 20%
when those situations arise". "Master" means "I not only claim that I can do what
you ask me to do with it, I can optimize systems built with it, I can make it do things
others wouldn't attempt, and I can help others learn it better". Masters are routinely
paired with Apprentices as mentors or coaches, and should expect to have this as a
major part of their responsibilities. (Ideally, anybody claiming "architect" in their
title should be a Master at one or two of the core tools/technologies used in their
system; or, put another way, architects should be &lt;em&gt;very&lt;/em&gt; dubious about architecting
with something they can't reasonably claim at least Journeyman status in.) "Adept",
shortly put, means you are not only fully capable of pulling off anything a Master
can do, but you routinely take the tool/technology way beyond what anybody else thinks
possible, or you know the depth of the system so well that you can fix bugs just by
thinking about them. With your eyes closed. While drinking a glass of water. Seriously,
Adept status is not something to claim lightly--not only had you better know the guys
who created the thing personally, but you should have offered up suggestions on how
to make it better and had one or more of them accepted. 
&lt;li&gt;
&lt;em&gt;Demonstrate that you have relevant skills beyond what they asked for.&lt;/em&gt; Look
at the ad in question: they want an ASP.NET dev, so any familiarity with IIS, Windows
Server, SQL Server, MSMQ, COM/DCOM/COM+, WCF/Web services, SharePoint, the CLR, IronPython,
or IronRuby should be listed prominently on your resume, and brought up at least twice
during your interview. These are (again) complementary technologies, and even if the
company doesn't have a need for those things right now, it's probably because Joe
didn't know any of those, and so they couldn't use them without sending Joe to a training
class. If you bring it up during the interview, it can also show some insight on your
part: "So, any questions for us?" "Yes, are you guys using Windows Server 2008, or
2003, for your back end?" "Um, we're using 2003, why do you ask?" "Oh, well, when
I was working as an ASP.NET dev for my previous company, we moved up to 2008 because
it had the Froobinger Enhancement, which let us...., and I was just curious if you
guys had a similar need." Or something like that. Again, be entirely honest about
what you know--if you helped the server upgrade by just putting the CDs into the drive
and punching the power button, then say as much. 
&lt;li&gt;
&lt;em&gt;Demonstrate that you can talk to project stakeholders and users.&lt;/em&gt; Communication
is huge. The era of the one-developer team is long since over--you have to be able
to meet with project champions, users, other developers, and so on. If you can't do
that without somebody being offended at your lack of tact and subtlety (or your lack
of personal hygiene), then don't expect to get hired too often. 
&lt;li&gt;
&lt;em&gt;Demonstrate that you understand the company, its business model, and what would
help it move forward.&lt;/em&gt; Developers who actually understand business are surprisingly
and unfortunately rare. Be one of the rare ones, and you'll find companies highly
reluctant to let you go.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Is this an exhaustive list? Hardly. Is this list guaranteed to keep you employed forever?
Nope. But this seems to be working for a lot of the people I run into at conferences
and client consulting gigs, so I humbly submit it for your consideration.
&lt;/p&gt;
&lt;p&gt;
But in no way do I consider this conversation completely over, either--feel free to
post your own suggestions, or tell me why I'm full of crap on any (or all) of these.
:-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=b63b60d2-4c68-4bc4-8d7a-d4c82cde958d" /&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,b63b60d2-4c68-4bc4-8d7a-d4c82cde958d.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=4797eb04-09d0-48c1-8888-64f061555908</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,4797eb04-09d0-48c1-8888-64f061555908.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,4797eb04-09d0-48c1-8888-64f061555908.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4797eb04-09d0-48c1-8888-64f061555908</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This crossed my Inbox, and I have to say, I'm stunned at this incredible display of
teamwork. Frankly... well, <a href="http://tv.devexpress.com/DevExpressEarthquake.movie">see
for yourself</a>.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4797eb04-09d0-48c1-8888-64f061555908" />
        <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>From the &amp;quot;Team-Building Exercise&amp;quot; Department</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,4797eb04-09d0-48c1-8888-64f061555908.aspx</guid>
      <link>http://blogs.tedneward.com/2008/08/01/From+The+QuotTeamBuilding+Exercisequot+Department.aspx</link>
      <pubDate>Fri, 01 Aug 2008 07:23:11 GMT</pubDate>
      <description>&lt;p&gt;
This crossed my Inbox, and I have to say, I'm stunned at this incredible display of
teamwork. Frankly... well, &lt;a href="http://tv.devexpress.com/DevExpressEarthquake.movie"&gt;see
for yourself&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=4797eb04-09d0-48c1-8888-64f061555908" /&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,4797eb04-09d0-48c1-8888-64f061555908.aspx</comments>
      <category>.NET</category>
      <category>Development Processes</category>
      <category>Review</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c3ad9bf0-39cd-4985-981e-dabc0342dbf2</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c3ad9bf0-39cd-4985-981e-dabc0342dbf2</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This comment deserves response:
</p>
        <blockquote>
          <p>
First of all, if you're quoting my post, blocking out my name, and attacking me behind
my back by calling me "our intrepid troll", you could have shown the decency of linking
back to my original post. Here it is, for those interested in the real discussion: 
</p>
          <p>
            <a href="http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first">http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first</a>
          </p>
        </blockquote>
        <p>
Well, frankly, I didn't get your post from your blog, I got it from an email 'zine
(as indicated by the comment "This crossed my Inbox..."), and I didn't really think
that anybody would have any difficulty tracking down where it came from, at least
in terms of the email blast that put it into my Inbox. Coupled with the fact that,
quite honestly, I don't generally make a practice of using peoples' names without
their permission (and my email to the author asking if I could quote the post with
his name attached generated no response), so I blocked out the name. Having said that,
I'm pleased to offer full credit as to its source. 
</p>
        <blockquote>
          <p>
Now, let's review some of your remarks: 
</p>
          <p>
"COBOL is (at least) twenty years old, so therefore any use of COBOL must clearly
be as idiotic." 
</p>
          <p>
I never talked about COBOL, or any other programming language. I was talking about
old practices that are nowadays considered harmful and seriously damaging. (Like practising
waterfall project management, instead of agile project management.) I don't see how
programming in COBOL could seriously damage a business. Why do you compare COBOL with
lobotomies? I don't understand. I couldn't care less about programming languages.
I care about management practices.
</p>
        </blockquote>
        <p>
Frankly, the distinction isn't very clear in your post, and even more frankly, to
draw a distinction here is a bit specious. "I didn't mean we should throw away the <em>good</em> stuff
that's twenty years old, only the <em>bad</em> stuff!" doesn't seem much like a defense
to me. There are cases where waterfall style development is <em>exactly</em> the right
thing to do a more agile approach is <em>exactly</em> the wrong thing to do--the difference,
as I'm fond of saying, lies entirely in the context of the problem. Analogously, there
are cases where keeping an existing COBOL system up and running is the wrong thing
to do, and replacing it with a new system is the right thing to do. It all depends
on context, and for that reason, any dogmatic suggestion otherwise is flawed. 
</p>
        <blockquote>
          <p>
"How can a developer honestly claim to know "what it can be good for", without some
kind of experience to back it?" 
</p>
          <p>
I'm talking about gaining knowledge from the experience of others. If I hear 10 experts
advising the same best practice, then I still don't have any experience in that best
practice. I only have knowledge about it. That's how you can apply your knowledge
without your experience.
</p>
        </blockquote>
        <p>
Leaving aside the notion that there is no such thing as best practices (another favorite
rant of mine), what you're suggesting is that you, the individual, don't necessarily
have to have experience in the topic but others have to, before we can put faith into
it. That's a very different scenario than saying "We don't need no stinkin' experience",
and is still vastly more dangerous than saying, "I have used this, it works." I (and
lots of IT shops, I've found) will vastly prefer the latter to the former. 
</p>
        <blockquote>
          <p>
"Knowledge, apparently, isn't enough--experience still matters" 
</p>
          <p>
Yes, I never said experience doesn't matter. I only said it has no value when you
don't have gained the appropriate knowledge (from other sources) on when to apply
it, and when not.
</p>
        </blockquote>
        <p>
You said it when you offered up the title, "Knowledge, not Experience". 
</p>
        <blockquote>
          <p>
"buried under all the ludicrous hyperbole, he has a point" 
</p>
          <p>
Thanks for agreeing with me.
</p>
        </blockquote>
        <p>
You're welcome! :-) Seriously, I think I understand better what you were trying to
say, and it's not the horrendously dangerous comments that I thought you were saying,
so I will apologize here and now for believing you to be a wet-behind-the-ears/lets-let-technology-solve-all-our-problems/dangerous-to-the-extreme
developer that I've run across far too often, particularly in startups. So, please,
will you accept my apology? 
</p>
        <blockquote>
          <p>
"developers, like medical professionals, must ensure they are on top of their game
and spend some time investing in themselves and their knowledge portfolio" 
</p>
          <p>
Exactly.
</p>
        </blockquote>
        <p>
Exactly. :-) 
</p>
        <blockquote>
          <p>
"this doesn't mean that everything you learn is immediately applicable, or even appropriate,
to the situation at hand" 
</p>
          <p>
I never said that. You're putting words into my mouth. 
</p>
          <p>
My only claim is that you need to KNOW both new and old practices and understand which
ones are good and which ones can be seriously damaging. I simply don't trust people
who are bragging about their experience. What if a manager tells me he's got 15 years
of experience managing developers? If he's a micro-manager I still don't want him.
Because micro-management is considered harmful these days. A manager should KNOW that.
</p>
        </blockquote>
        <p>
Again, this was precisely the read I picked up out of the post, and my apologies for
the misinterpretation. But I stand by the idea that this is one of those posts that <em>could</em> be
read in a highly dangerous fashion, and used to promote evil, in the form of "Well,
he runs a company, so therefore he must know what he's doing, and therefore having
any kind of experience isn't really necessary to use something new, so... see, Mr.
CEO boss-of-mine? We're safe! Now get out of my way and let me use Software Factories
to build our next-generation mission-critical core-of-the-company software system,
even though nobody's ever done it before." 
</p>
        <p>
To speak to your example for a second, for example: Frankly, there are situations
where a micro-manager is a <em>good</em> thing. Young, inexperienced developers, for
example, need more hand-holding and mentoring than older, more senior, more experienced
developers do (speaking stereotypically, of course). And, quite honestly, the guy
with 15 years managing developers is <em>far</em> more likely to know how to manage
developers than the guy who's never managed developers before at all. The former is
the safer bet; not a guarantee, certainly, but often the safer bet, and that's sometimes
the best we can do in this industry. 
</p>
        <blockquote>
          <p>
"And we definitely shouldn't look at anything older than five years ago and equate
it to lobotomies." 
</p>
          <p>
I never said that either. Why do you claim that I said this? I don't have a problem
with old techniques. The daily standup meeting is a 80-year old best practice. It
was already used by pilots in the second world war. How could I be against that? It's
fine as it is.
</p>
        </blockquote>
        <p>
Um... because you used the term "lobotomies" first? And because your title pretty
clearly implies the statement, perhaps? (And let's lose the term "best practice" entirely,
please? There is no such thing--not even the daily standup.) 
</p>
        <blockquote>
          <p>
It's ok you didn't like my article. Sure it's meant to be provocative, and food for
thought. The article got twice as many positive votes than negative votes from DZone
readers. So I guess I'm adding value. But by taking the discussion away from its original
context (both physically and conceptually), and calling me names, you're not adding
any value for anyone.
</p>
        </blockquote>
        <p>
I took it in exactly the context it was given--a DZone email blast. I can't help it
if it was taken out of context, because that's how it was handed to me. What's worse,
I can see a development team citing this as an "expert opinion" to their management
as a justification to try untested approaches or technologies, or as inspiration to
a young developer, who reads "knowledge, not experience", and thinks, "Wow, if I know
all the cutting-edge latest stuff, I don't need to have those 10 years of experience
to get that job as a senior application architect." If your article was aimed more
clearly at the development process side of things, then I would wish it had appeared
more clearly in the arena of development processes, and made it more clear that your
aim was to suggest that managers (who aren't real big on reading blogs anyway, I've
sadly found) should be a bit more pragmatic and open-minded about who they hire.
</p>
        <p>
Look, I understand the desire for a provocative title--for me, the author of "The
Vietnam of Computer Science", to cast stones at another author for choosing an eye-catching
title is so far beyond hypocrisy as to move into sheer wild-eyed audacity. But I have
seen, first-hand, how that article has been used to justify the most incredibly asinine
technology decisions, and it moves me now to say "Be careful what you wish for" when
choosing titles that meant to be provocative and food for thought. Sure, your piece
got more positive votes than negative ones. So too, in their day, did articles on
client-server, on CORBA, on Six-Sigma, on the necessity for big up-front design....
</p>
        <p>
 
</p>
        <p>
Let me put it to you this way. Assume your child or your wife is sick, and as you
reach the hospital, the admittance nurse offers you a choice of the two doctors on
call. Who do you want more: the doctor who just graduated fresh from medical school
and knows all the latest in holistic and unconventional medicine, or the doctor with
30 years' experience and a solid track record of healthy patients?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c3ad9bf0-39cd-4985-981e-dabc0342dbf2" />
        <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>From the &amp;quot;Gosh, You Wanted Me to Quote You?&amp;quot; Department...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</guid>
      <link>http://blogs.tedneward.com/2008/07/25/From+The+QuotGosh+You+Wanted+Me+To+Quote+Youquot+Department.aspx</link>
      <pubDate>Fri, 25 Jul 2008 07:03:40 GMT</pubDate>
      <description>&lt;p&gt;
This comment deserves response:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
First of all, if you're quoting my post, blocking out my name, and attacking me behind
my back by calling me "our intrepid troll", you could have shown the decency of linking
back to my original post. Here it is, for those interested in the real discussion: 
&lt;p&gt;
&lt;a href="http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first"&gt;http://www.agilesoftwaredevelopment.com/blog/jurgenappelo/professionalism-knowledge-first&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Well, frankly, I didn't get your post from your blog, I got it from an email 'zine
(as indicated by the comment "This crossed my Inbox..."), and I didn't really think
that anybody would have any difficulty tracking down where it came from, at least
in terms of the email blast that put it into my Inbox. Coupled with the fact that,
quite honestly, I don't generally make a practice of using peoples' names without
their permission (and my email to the author asking if I could quote the post with
his name attached generated no response), so I blocked out the name. Having said that,
I'm pleased to offer full credit as to its source. &lt;blockquote&gt; 
&lt;p&gt;
Now, let's review some of your remarks: 
&lt;p&gt;
"COBOL is (at least) twenty years old, so therefore any use of COBOL must clearly
be as idiotic." 
&lt;p&gt;
I never talked about COBOL, or any other programming language. I was talking about
old practices that are nowadays considered harmful and seriously damaging. (Like practising
waterfall project management, instead of agile project management.) I don't see how
programming in COBOL could seriously damage a business. Why do you compare COBOL with
lobotomies? I don't understand. I couldn't care less about programming languages.
I care about management practices.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Frankly, the distinction isn't very clear in your post, and even more frankly, to
draw a distinction here is a bit specious. "I didn't mean we should throw away the &lt;em&gt;good&lt;/em&gt; stuff
that's twenty years old, only the &lt;em&gt;bad&lt;/em&gt; stuff!" doesn't seem much like a defense
to me. There are cases where waterfall style development is &lt;em&gt;exactly&lt;/em&gt; the right
thing to do a more agile approach is &lt;em&gt;exactly&lt;/em&gt; the wrong thing to do--the difference,
as I'm fond of saying, lies entirely in the context of the problem. Analogously, there
are cases where keeping an existing COBOL system up and running is the wrong thing
to do, and replacing it with a new system is the right thing to do. It all depends
on context, and for that reason, any dogmatic suggestion otherwise is flawed. &lt;blockquote&gt; 
&lt;p&gt;
"How can a developer honestly claim to know "what it can be good for", without some
kind of experience to back it?" 
&lt;p&gt;
I'm talking about gaining knowledge from the experience of others. If I hear 10 experts
advising the same best practice, then I still don't have any experience in that best
practice. I only have knowledge about it. That's how you can apply your knowledge
without your experience.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Leaving aside the notion that there is no such thing as best practices (another favorite
rant of mine), what you're suggesting is that you, the individual, don't necessarily
have to have experience in the topic but others have to, before we can put faith into
it. That's a very different scenario than saying "We don't need no stinkin' experience",
and is still vastly more dangerous than saying, "I have used this, it works." I (and
lots of IT shops, I've found) will vastly prefer the latter to the former. &lt;blockquote&gt; 
&lt;p&gt;
"Knowledge, apparently, isn't enough--experience still matters" 
&lt;p&gt;
Yes, I never said experience doesn't matter. I only said it has no value when you
don't have gained the appropriate knowledge (from other sources) on when to apply
it, and when not.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You said it when you offered up the title, "Knowledge, not Experience". &lt;blockquote&gt; 
&lt;p&gt;
"buried under all the ludicrous hyperbole, he has a point" 
&lt;p&gt;
Thanks for agreeing with me.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You're welcome! :-) Seriously, I think I understand better what you were trying to
say, and it's not the horrendously dangerous comments that I thought you were saying,
so I will apologize here and now for believing you to be a wet-behind-the-ears/lets-let-technology-solve-all-our-problems/dangerous-to-the-extreme
developer that I've run across far too often, particularly in startups. So, please,
will you accept my apology? &lt;blockquote&gt; 
&lt;p&gt;
"developers, like medical professionals, must ensure they are on top of their game
and spend some time investing in themselves and their knowledge portfolio" 
&lt;p&gt;
Exactly.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Exactly. :-) &lt;blockquote&gt; 
&lt;p&gt;
"this doesn't mean that everything you learn is immediately applicable, or even appropriate,
to the situation at hand" 
&lt;p&gt;
I never said that. You're putting words into my mouth. 
&lt;p&gt;
My only claim is that you need to KNOW both new and old practices and understand which
ones are good and which ones can be seriously damaging. I simply don't trust people
who are bragging about their experience. What if a manager tells me he's got 15 years
of experience managing developers? If he's a micro-manager I still don't want him.
Because micro-management is considered harmful these days. A manager should KNOW that.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Again, this was precisely the read I picked up out of the post, and my apologies for
the misinterpretation. But I stand by the idea that this is one of those posts that &lt;em&gt;could&lt;/em&gt; be
read in a highly dangerous fashion, and used to promote evil, in the form of "Well,
he runs a company, so therefore he must know what he's doing, and therefore having
any kind of experience isn't really necessary to use something new, so... see, Mr.
CEO boss-of-mine? We're safe! Now get out of my way and let me use Software Factories
to build our next-generation mission-critical core-of-the-company software system,
even though nobody's ever done it before." 
&lt;p&gt;
To speak to your example for a second, for example: Frankly, there are situations
where a micro-manager is a &lt;em&gt;good&lt;/em&gt; thing. Young, inexperienced developers, for
example, need more hand-holding and mentoring than older, more senior, more experienced
developers do (speaking stereotypically, of course). And, quite honestly, the guy
with 15 years managing developers is &lt;em&gt;far&lt;/em&gt; more likely to know how to manage
developers than the guy who's never managed developers before at all. The former is
the safer bet; not a guarantee, certainly, but often the safer bet, and that's sometimes
the best we can do in this industry. &lt;blockquote&gt; 
&lt;p&gt;
"And we definitely shouldn't look at anything older than five years ago and equate
it to lobotomies." 
&lt;p&gt;
I never said that either. Why do you claim that I said this? I don't have a problem
with old techniques. The daily standup meeting is a 80-year old best practice. It
was already used by pilots in the second world war. How could I be against that? It's
fine as it is.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Um... because you used the term "lobotomies" first? And because your title pretty
clearly implies the statement, perhaps? (And let's lose the term "best practice" entirely,
please? There is no such thing--not even the daily standup.) &lt;blockquote&gt; 
&lt;p&gt;
It's ok you didn't like my article. Sure it's meant to be provocative, and food for
thought. The article got twice as many positive votes than negative votes from DZone
readers. So I guess I'm adding value. But by taking the discussion away from its original
context (both physically and conceptually), and calling me names, you're not adding
any value for anyone.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I took it in exactly the context it was given--a DZone email blast. I can't help it
if it was taken out of context, because that's how it was handed to me. What's worse,
I can see a development team citing this as an "expert opinion" to their management
as a justification to try untested approaches or technologies, or as inspiration to
a young developer, who reads "knowledge, not experience", and thinks, "Wow, if I know
all the cutting-edge latest stuff, I don't need to have those 10 years of experience
to get that job as a senior application architect." If your article was aimed more
clearly at the development process side of things, then I would wish it had appeared
more clearly in the arena of development processes, and made it more clear that your
aim was to suggest that managers (who aren't real big on reading blogs anyway, I've
sadly found) should be a bit more pragmatic and open-minded about who they hire.
&lt;/p&gt;
&lt;p&gt;
Look, I understand the desire for a provocative title--for me, the author of "The
Vietnam of Computer Science", to cast stones at another author for choosing an eye-catching
title is so far beyond hypocrisy as to move into sheer wild-eyed audacity. But I have
seen, first-hand, how that article has been used to justify the most incredibly asinine
technology decisions, and it moves me now to say "Be careful what you wish for" when
choosing titles that meant to be provocative and food for thought. Sure, your piece
got more positive votes than negative ones. So too, in their day, did articles on
client-server, on CORBA, on Six-Sigma, on the necessity for big up-front design....
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Let me put it to you this way. Assume your child or your wife is sick, and as you
reach the hospital, the admittance nurse offers you a choice of the two doctors on
call. Who do you want more: the doctor who just graduated fresh from medical school
and knows all the latest in holistic and unconventional medicine, or the doctor with
30 years' experience and a solid track record of healthy patients?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c3ad9bf0-39cd-4985-981e-dabc0342dbf2" /&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,c3ad9bf0-39cd-4985-981e-dabc0342dbf2.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=7ea05023-cdc1-439d-910d-bcff5f4ff309</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7ea05023-cdc1-439d-910d-bcff5f4ff309</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently this little gem crossed my Inbox....
</p>
        <blockquote>
          <p>
            <strong>Professionalism = Knowledge First, Experience Last</strong>
            <br />
By J----- A-----
</p>
          <p>
            <br />
Do you trust a doctor with diagnosing your mental problems if the doctor tells you
he's got 20 years of experience? Do you still trust that doctor when he picks up his
tools, and asks you to prepare for a lobotomy?
</p>
          <p>
Would you still be impressed if the doctor had 20 years of experience in carrying
out lobotomies?
</p>
          <p>
I am always skeptic when people tell me they have X years of experience in a certain
field or discipline, like "5 years of experience as a .NET developer", "8 years of
experience as a project manager" or "12 years of experience as a development manager".
It is as if people's professional levels need to be measured in years of practice.
</p>
          <p>
This, of course, is nonsense.
</p>
          <p>
            <strong>Professionalism is measured by what you are going to do <em>now</em>...</strong>
          </p>
          <p>
Are you going to use some discredited technique from half a century ago?<br />
•    Are you, as a .NET developer, going to use Response.Write, because
you've got 5 years of experience doing exactly that?<br />
•    Are you, as a project manager, going to create Gantt charts, because
that's what you've been doing for 8 years?<br />
•    Are you, as a development manager, going to micro-manage your
team members, as you did in the 12 years before now?
</p>
          <p>
If so, allow me to illustrate the value of your experience...
</p>
          <p>
(Photo of "Zero" signs)
</p>
          <p>
Here's an example of what it means to be a professional:
</p>
          <p>
There's a concept called Kanban making headlines these days in some parts of the agile
community. I honestly and proudly admit that I have no experience at all in applying
Kanban. But that's just a minor inconvenience. Because I have attained the knowledge
of what it is and what it can be good for. And now there are some planning issues
in our organization for which this Kanban-stuff might be the perfect solution. I'm
sure we're going to give it a shot, in a controlled setting, with time allocated for
a pilot and proper evaluations afterwards. That's the way a professional tries to
solve a problem.
</p>
          <p>
            <strong>Professionals don't match problems with their experiences. They match them
with their knowledge.</strong>
          </p>
          <p>
Sure, experience is useful. But only when you already have the knowledge in place.
Experience has no value when there's no knowledge to verify that you are applying
the right experience.
</p>
          <p>
            <strong>Knowledge Comes First, Experience Comes Last</strong>
          </p>
          <p>
This is my message to anyone who wants to be a professional software developer, a
professional project manager, or a professional development manager. 
</p>
          <p>
You must gain and apply knowledge first, and experience will help you after that.
Professionals need to know about the latest developments and techniques. 
</p>
          <p>
They certainly don't bother measuring years of experience.
</p>
          <p>
Are you still practicing lobotomies?
</p>
        </blockquote>
        <p>
Um....
</p>
        <p>
Wow.
</p>
        <p>
Let's start with the logical fallacy in the first section. Do I trust a doctor with
diagnosing my mental problems if he tells me he's got 20 years of experience? Generally,
yes, unless I have reasons to doubt this. If the guy picks up a skull-drill and starts
looking for a place to start boring into my skull, sure, I'll start to question his
judgement.... But what does this have to do with anything? I wouldn't trust the guy
if he picked up a chainsaw and started firing <em>it</em> up, either.
</p>
        <p>
Look, I get the analogy: "Doctor has 20 years of experience using outdated skills",
har har. Very funny, very memorable, and totally inappropriate metaphor for the situation.
To stand here and suggest that developers who aren't using the latest-and-greatest,
so-bleeding-edge-even-saying-the-name-cuts-your-skin tools or languages or technologies
are somehow practicing lobotomies (which, by the way, are still a recommended practice
in certain mental disorder cases, I understand) in order to solve any and all mental-health
issues, is a gross mischaracterization--and the worst form of negligence--I've ever
heard suggested.
</p>
        <p>
And it comes as no surprise that it's coming from the CIO of a consulting company.
(Note to self: here's one more company I don't want anywhere <em>near </em>my clients'
IT infrastructure.)
</p>
        <p>
Let's take this analogy to its logical next step, shall we?
</p>
        <p>
COBOL is (at least) twenty years old, so therefore any use of COBOL must <em>clearly</em> be
as idiotic as drilling holes in your skull to let the demons out. So any company currently
using COBOL has no real option other than to immediately upgrade <em>all</em> of their
currently-running COBOL infrastructure (despite the fact that it's tested, works,
and cashes most of the US banking industry's checks on a daily basis) with something
vastly superior and totally untested (since we don't need experience, just knowlege),
like... oh, I dunno.... how about Ruby? Oh, no, wait, that's at least 10 years old.
Ditto for Java. And let's not even <em>think</em> about C, Perl, Python....
</p>
        <p>
I know; let's rewrite the entire financial industry's core backbone in Groovy, since
it's only, what, 6 years old at this point? I mean, sure, we'll have to do all this
over again in just four years, since that's when Groovy will turn 10 and thus obviously
begin it's long slide into mediocrity, alongside the "four humors" of medicine and
Aristotle's (completely inaccurate) anatomical depictions, but hey, that's progress,
right? Forget experience, it has <em>no value</em> compared to the "knowledge" that
comes from reading the documentation on a brand-new language, tool, library, or platform....
</p>
        <p>
What I find most appalling is this part right here:
</p>
        <blockquote>
          <p>
I honestly and proudly admit that I have no experience at all in applying Kanban. <em>But
that's just a minor inconvenience. Because I have attained the knowledge of what it
is and what it can be good for.</em></p>
        </blockquote>
        <p>
How can a developer honestly claim to <em>know</em> "what it can be good for", without
some kind of experience to back it? (Hell, I'll even accept that you have familiarity
and experience with something vaguely <em>relating</em> to the thing at hand, if you've
got it--after all, experience in Java makes you a pretty damn good C# developer, in
my mind, and vice versa.) 
</p>
        <p>
And, to make things even <em>more</em> interesting, our intrepid troll, having established
the attention-gathering headline, then proceeds to step away from the chasm, by backing
away from this "knowledge-not-experience" position in the same paragraph, just one
sentence later:
</p>
        <blockquote>
          <p>
I'm sure we're going to give it a shot, in a controlled setting, with time allocated
for a pilot and proper evaluations afterwards.
</p>
        </blockquote>
        <p>
Ah... In other words, he and his company are going to experiment with this new technique,
"in a controlled setting, with time allocated for a pilot and proper evaluations afterwards",
in order to gain <em>experience</em> with the technique and see how it works and how
it doesn't. 
</p>
        <p>
In other words....
</p>
        <p>
.... experience matters. 
</p>
        <p>
Knowledge, apparently, isn't enough--experience still matters, and it matters a lot
earlier than his "knowledge first, experience last" mantra seems to imply. Otherwise,
once you "know" something, why not apply it immediately to your mission-critical core?
</p>
        <p>
At the end of the day, buried under all the ludicrous hyperbole, he has a point: developers,
like medical professionals, must ensure they are on top of their game and spend some
time investing in themselves and their knowledge portfolio. Jay Zimmerman takes great
pains to point this out at every No Fluff Just Stuff show, and he's right: those who
spend the time to invest in their own knowledge portfolio, find themselves the last
to be fired and the first to be hired. But this doesn't mean that everything you learn
is immediately applicable, or even appropriate, to the situation at hand. Just because
you learned Groovy last weekend in Austin doesn't mean you have the right--or the
responsibility--to immediately start slipping Groovy in to the production servers.
Groovy has its share of good things, yes, but it's got its share of negative consequences,
too, and you'd better <em>damn</em> well know what they are before you start betting
the company's future on it. (No, I will not tell you what those negative consequences
are--that's <em>your</em> job, because what if it turns out I'm wrong, or they don't
apply to your particular situation?) <em>Every</em> technology, language, library
or tool has a positive/negative profile to it, and if you can't point out the pros
as well as the cons, then you don't understand the technology and you have <em>no</em> business
using it on anything except maybe a prototype that never leaves your local hard disk.
Too many projects were built with "flavor-of-the-year" tools and technologies, and
a few years later, long after the original "bleeding-edge" developer has gone on to
do a new project with a new "bleeding-edge" technology, the IT guys left to admin
and upkeep the project are struggling to find ways to keep this thing afloat.
</p>
        <p>
If you're languishing at a company that seems to resist anything and everything new,
try this exercise on: go down to the IT guys, and <em>ask</em> them why they resist.
Ask them to show you a data flow diagram of how information feeds from one system
to another (assuming they even have one). Ask them how many different operating systems
they have, how many different languages were used to create the various software programs
currently running, what tools they have to know when one of those programs fails,
and how many different data formats are currently in use. Then go find the guys currently
maintaining and updating and bug-fixing those current programs, and ask to see the
code. Figure out how long it would take you to rewrite the whole thing, and keep the
company in business while you're at it.
</p>
        <p>
There is a reason "legacy code" exists, and while we shouldn't be afraid to replace
it, we shouldn't be cavalier about tossing it out, either.
</p>
        <p>
And we <em>definitely</em> shouldn't look at anything older than five years ago and
equate it to lobotomies. COBOL had some good ideas that still echo through the industry
today, and Groovy and Scala and Ruby and F# undoubtedly have some buried mines that
we will, with benefit of ten years' hindsight, look back at in 2018 and say, "Wow,
how dumb were we to think that this was the last language we'd ever have to use!".
</p>
        <p>
That's experience talking. 
</p>
        <p>
And the funny thing is, it seems to have served us pretty well. When we don't listen
to the guys claiming to know how to use something effectively that they've never actually
used before, of course.
</p>
        <p>
          <em>Caveat emptor.</em>
        </p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7ea05023-cdc1-439d-910d-bcff5f4ff309" />
        <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>From the &amp;quot;You Must Be Trolling for Hits&amp;quot; Department...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</guid>
      <link>http://blogs.tedneward.com/2008/07/24/From+The+QuotYou+Must+Be+Trolling+For+Hitsquot+Department.aspx</link>
      <pubDate>Thu, 24 Jul 2008 07:53:02 GMT</pubDate>
      <description>&lt;p&gt;
Recently this little gem crossed my Inbox....
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Professionalism = Knowledge First, Experience Last&lt;/strong&gt;
&lt;br&gt;
By J----- A-----
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Do you trust a doctor with diagnosing your mental problems if the doctor tells you
he's got 20 years of experience? Do you still trust that doctor when he picks up his
tools, and asks you to prepare for a lobotomy?
&lt;/p&gt;
&lt;p&gt;
Would you still be impressed if the doctor had 20 years of experience in carrying
out lobotomies?
&lt;/p&gt;
&lt;p&gt;
I am always skeptic when people tell me they have X years of experience in a certain
field or discipline, like "5 years of experience as a .NET developer", "8 years of
experience as a project manager" or "12 years of experience as a development manager".
It is as if people's professional levels need to be measured in years of practice.
&lt;/p&gt;
&lt;p&gt;
This, of course, is nonsense.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Professionalism is measured by what you are going to do &lt;em&gt;now&lt;/em&gt;...&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Are you going to use some discredited technique from half a century ago?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a .NET developer, going to use Response.Write, because
you've got 5 years of experience doing exactly that?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a project manager, going to create Gantt charts, because
that's what you've been doing for 8 years?&lt;br&gt;
•&amp;nbsp;&amp;nbsp;&amp;nbsp; Are you, as a development manager, going to micro-manage your
team members, as you did in the 12 years before now?
&lt;/p&gt;
&lt;p&gt;
If so, allow me to illustrate the value of your experience...
&lt;/p&gt;
&lt;p&gt;
(Photo of "Zero" signs)
&lt;/p&gt;
&lt;p&gt;
Here's an example of what it means to be a professional:
&lt;/p&gt;
&lt;p&gt;
There's a concept called Kanban making headlines these days in some parts of the agile
community. I honestly and proudly admit that I have no experience at all in applying
Kanban. But that's just a minor inconvenience. Because I have attained the knowledge
of what it is and what it can be good for. And now there are some planning issues
in our organization for which this Kanban-stuff might be the perfect solution. I'm
sure we're going to give it a shot, in a controlled setting, with time allocated for
a pilot and proper evaluations afterwards. That's the way a professional tries to
solve a problem.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Professionals don't match problems with their experiences. They match them
with their knowledge.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Sure, experience is useful. But only when you already have the knowledge in place.
Experience has no value when there's no knowledge to verify that you are applying
the right experience.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Knowledge Comes First, Experience Comes Last&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
This is my message to anyone who wants to be a professional software developer, a
professional project manager, or a professional development manager. 
&lt;/p&gt;
&lt;p&gt;
You must gain and apply knowledge first, and experience will help you after that.
Professionals need to know about the latest developments and techniques. 
&lt;/p&gt;
&lt;p&gt;
They certainly don't bother measuring years of experience.
&lt;/p&gt;
&lt;p&gt;
Are you still practicing lobotomies?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Um....
&lt;/p&gt;
&lt;p&gt;
Wow.
&lt;/p&gt;
&lt;p&gt;
Let's start with the logical fallacy in the first section. Do I trust a doctor with
diagnosing my mental problems if he tells me he's got 20 years of experience? Generally,
yes, unless I have reasons to doubt this. If the guy picks up a skull-drill and starts
looking for a place to start boring into my skull, sure, I'll start to question his
judgement.... But what does this have to do with anything? I wouldn't trust the guy
if he picked up a chainsaw and started firing &lt;em&gt;it&lt;/em&gt; up, either.
&lt;/p&gt;
&lt;p&gt;
Look, I get the analogy: "Doctor has 20 years of experience using outdated skills",
har har. Very funny, very memorable, and totally inappropriate metaphor for the situation.
To stand here and suggest that developers who aren't using the latest-and-greatest,
so-bleeding-edge-even-saying-the-name-cuts-your-skin tools or languages or technologies
are somehow practicing lobotomies (which, by the way, are still a recommended practice
in certain mental disorder cases, I understand) in order to solve any and all mental-health
issues, is a gross mischaracterization--and the worst form of negligence--I've ever
heard suggested.
&lt;/p&gt;
&lt;p&gt;
And it comes as no surprise that it's coming from the CIO of a consulting company.
(Note to self: here's one more company I don't want anywhere &lt;em&gt;near &lt;/em&gt;my clients'
IT infrastructure.)
&lt;/p&gt;
&lt;p&gt;
Let's take this analogy to its logical next step, shall we?
&lt;/p&gt;
&lt;p&gt;
COBOL is (at least) twenty years old, so therefore any use of COBOL must &lt;em&gt;clearly&lt;/em&gt; be
as idiotic as drilling holes in your skull to let the demons out. So any company currently
using COBOL has no real option other than to immediately upgrade &lt;em&gt;all&lt;/em&gt; of their
currently-running COBOL infrastructure (despite the fact that it's tested, works,
and cashes most of the US banking industry's checks on a daily basis) with something
vastly superior and totally untested (since we don't need experience, just knowlege),
like... oh, I dunno.... how about Ruby? Oh, no, wait, that's at least 10 years old.
Ditto for Java. And let's not even &lt;em&gt;think&lt;/em&gt; about C, Perl, Python....
&lt;/p&gt;
&lt;p&gt;
I know; let's rewrite the entire financial industry's core backbone in Groovy, since
it's only, what, 6 years old at this point? I mean, sure, we'll have to do all this
over again in just four years, since that's when Groovy will turn 10 and thus obviously
begin it's long slide into mediocrity, alongside the "four humors" of medicine and
Aristotle's (completely inaccurate) anatomical depictions, but hey, that's progress,
right? Forget experience, it has &lt;em&gt;no value&lt;/em&gt; compared to the "knowledge" that
comes from reading the documentation on a brand-new language, tool, library, or platform....
&lt;/p&gt;
&lt;p&gt;
What I find most appalling is this part right here:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I honestly and proudly admit that I have no experience at all in applying Kanban. &lt;em&gt;But
that's just a minor inconvenience. Because I have attained the knowledge of what it
is and what it can be good for.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
How can a developer honestly claim to &lt;em&gt;know&lt;/em&gt; "what it can be good for", without
some kind of experience to back it? (Hell, I'll even accept that you have familiarity
and experience with something vaguely &lt;em&gt;relating&lt;/em&gt; to the thing at hand, if you've
got it--after all, experience in Java makes you a pretty damn good C# developer, in
my mind, and vice versa.) 
&lt;/p&gt;
&lt;p&gt;
And, to make things even &lt;em&gt;more&lt;/em&gt; interesting, our intrepid troll, having established
the attention-gathering headline, then proceeds to step away from the chasm, by backing
away from this "knowledge-not-experience" position in the same paragraph, just one
sentence later:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I'm sure we're going to give it a shot, in a controlled setting, with time allocated
for a pilot and proper evaluations afterwards.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ah... In other words, he and his company are going to experiment with this new technique,
"in a controlled setting, with time allocated for a pilot and proper evaluations afterwards",
in order to gain &lt;em&gt;experience&lt;/em&gt; with the technique and see how it works and how
it doesn't. 
&lt;/p&gt;
&lt;p&gt;
In other words....
&lt;/p&gt;
&lt;p&gt;
.... experience matters. 
&lt;/p&gt;
&lt;p&gt;
Knowledge, apparently, isn't enough--experience still matters, and it matters a lot
earlier than his "knowledge first, experience last" mantra seems to imply. Otherwise,
once you "know" something, why not apply it immediately to your mission-critical core?
&lt;/p&gt;
&lt;p&gt;
At the end of the day, buried under all the ludicrous hyperbole, he has a point: developers,
like medical professionals, must ensure they are on top of their game and spend some
time investing in themselves and their knowledge portfolio. Jay Zimmerman takes great
pains to point this out at every No Fluff Just Stuff show, and he's right: those who
spend the time to invest in their own knowledge portfolio, find themselves the last
to be fired and the first to be hired. But this doesn't mean that everything you learn
is immediately applicable, or even appropriate, to the situation at hand. Just because
you learned Groovy last weekend in Austin doesn't mean you have the right--or the
responsibility--to immediately start slipping Groovy in to the production servers.
Groovy has its share of good things, yes, but it's got its share of negative consequences,
too, and you'd better &lt;em&gt;damn&lt;/em&gt; well know what they are before you start betting
the company's future on it. (No, I will not tell you what those negative consequences
are--that's &lt;em&gt;your&lt;/em&gt; job, because what if it turns out I'm wrong, or they don't
apply to your particular situation?) &lt;em&gt;Every&lt;/em&gt; technology, language, library
or tool has a positive/negative profile to it, and if you can't point out the pros
as well as the cons, then you don't understand the technology and you have &lt;em&gt;no&lt;/em&gt; business
using it on anything except maybe a prototype that never leaves your local hard disk.
Too many projects were built with "flavor-of-the-year" tools and technologies, and
a few years later, long after the original "bleeding-edge" developer has gone on to
do a new project with a new "bleeding-edge" technology, the IT guys left to admin
and upkeep the project are struggling to find ways to keep this thing afloat.
&lt;/p&gt;
&lt;p&gt;
If you're languishing at a company that seems to resist anything and everything new,
try this exercise on: go down to the IT guys, and &lt;em&gt;ask&lt;/em&gt; them why they resist.
Ask them to show you a data flow diagram of how information feeds from one system
to another (assuming they even have one). Ask them how many different operating systems
they have, how many different languages were used to create the various software programs
currently running, what tools they have to know when one of those programs fails,
and how many different data formats are currently in use. Then go find the guys currently
maintaining and updating and bug-fixing those current programs, and ask to see the
code. Figure out how long it would take you to rewrite the whole thing, and keep the
company in business while you're at it.
&lt;/p&gt;
&lt;p&gt;
There is a reason "legacy code" exists, and while we shouldn't be afraid to replace
it, we shouldn't be cavalier about tossing it out, either.
&lt;/p&gt;
&lt;p&gt;
And we &lt;em&gt;definitely&lt;/em&gt; shouldn't look at anything older than five years ago and
equate it to lobotomies. COBOL had some good ideas that still echo through the industry
today, and Groovy and Scala and Ruby and F# undoubtedly have some buried mines that
we will, with benefit of ten years' hindsight, look back at in 2018 and say, "Wow,
how dumb were we to think that this was the last language we'd ever have to use!".
&lt;/p&gt;
&lt;p&gt;
That's experience talking. 
&lt;/p&gt;
&lt;p&gt;
And the funny thing is, it seems to have served us pretty well. When we don't listen
to the guys claiming to know how to use something effectively that they've never actually
used before, of course.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Caveat emptor.&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7ea05023-cdc1-439d-910d-bcff5f4ff309" /&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,7ea05023-cdc1-439d-910d-bcff5f4ff309.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Ruby</category>
      <category>Visual Basic</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=280ca2d0-3959-4496-bd63-71c4bdb65acc</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,280ca2d0-3959-4496-bd63-71c4bdb65acc.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,280ca2d0-3959-4496-bd63-71c4bdb65acc.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=280ca2d0-3959-4496-bd63-71c4bdb65acc</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of people have commented on the <a href="http://blogs.tedneward.com/CommentView,guid,84a7726e-a8f6-41a2-b9a2-baf0704dc1c9.aspx#commentstart">previous
entry</a>, citing, essentially, that Google needs to do this to be "the best". I understand
the argument completely: Google wants to attract the top talent, or retain the top
talent, or at least entice the top talent, not to mention give them every reason to
be horribly productive, so all of that extravagance is a justifiable--and some might
argue necessary--expense.
</p>
        <p>
Thing is, I don't buy into that argument for a second. Talent wants to be rewarded,
granted, but think about this for a moment: what kind of hours are these employees
buying into by working there? There's an implicit tradeoff here, one that says, "If
you are <em>insanely</em> productive, then the cost of this office is justified",
meaning the pressure is on. Having an off day? Better pull the all-nighter to make
up for it. Got stuck on something you didn't anticipate? Better pull the all-weekender
to compensate. You're not in the bush leagues any more, sonny--you're at Google, and
we paid a <em>lot</em> of money to make this office your home away from home, so snap
to it!
</p>
        <p>
I'm not suggesting that Goole is <em>explicitly demanding</em> this of their employees...
but neither did Microsoft, back in the day.
</p>
        <p>
See, all of this--including the justification arguments--is eerily reminiscent of
Microsoft in their heyday, with the best example being the original Windows NT team.
The hours they pulled over the last few months (some say years) of that project were
nothing short of marathon sprints, and Microsoft laid everything they could at the
feet of these developers (though <em>nothing</em> like what Google has built in Zurich,
mind you) to help them focus on shipping the project.
</p>
        <p>
The Wall Street Journal ran an article about the whole thing, and one quote from that
article stuck with me: that the pressure to work the insanely long hours didn't come
from upper management, but from the other developers on the team. "Are you signed
up for this thing or not?" was a euphemism for "Why the hell are you leaving at 9PM?
And you're not back until 8AM? What are you, some kind of slacker?" (I felt like screaming
back, "Just say no!", and I wasn't even there.) The <em>peer pressure</em> was insane,
and drove several members of the team to get outta Dodge as the first opportunity.
Or some took off for bike rides across the country to recharge. Or some just... broke.
</p>
        <p>
Microsoft doesn't do this anymore. Nobody is expected to put in 60 hour work weeks
as a matter of course; now, the average is around 45, which I believe (though I have
no factual evidence to support this) is about average for the industry as a whole.
(C'mon, admit it, even if you're a strict 9-to-5'er, you still do a little reading
at home or stick around after hours to help with the big rollout. It needs to be done,
and you're professional enough to want to see it done right.)
</p>
        <p>
In college, I learned a lot about startups and established companies. Like most of
the folks I hung out with in college, I used to stay up way too late with friends
hanging out at Woodstock's (the local pizzeria) arguing politics/sex/religion/operating
systems or playing role-playing games*, then come home and bang out a 5-page paper
in a few hours before cracking open my notes to study for the final that morning.
I could do this without any real penalty, but I usually ended up taking the final,
then coming back to my apartment and passing out for a few hours, only to awake to
my roommates chanting "Piz-za! Piz-za! Piz-za!" and starting the whole thing over
again. I was young, I had energy, I was fundamentally stupid, and <em>I can't do that
anymore</em>. I can't sprint like that and still be able to function coherently over
time, and as you get older, you realize that while college can be managed as a series
of sprints, life requires you to have a more marathon attitude, particularly because
you can't know when the sprints are coming, like they do in college.
</p>
        <p>
As companies grow larger, their initial lifecycle is a series of sprints: roll the
first release out, take a breather while the sales guys gather in the customer(s)
and figure out what the next iteration will be, then do the whole thing over again.
This effect is even <em>more</em> pronounced if the company has that one Really Big
Customer, the one that represents some significant (over 50%) of the company's revenue;
it's that company that drives the feature set and its delivery date. Meeting their
needs and challenges becomes the source of the sprints to come.
</p>
        <p>
As time goes on, however, and assuming the company has somehow managed to find success,
they find that the Really Big Customer is actually now just one of several, and the
features and the timing of the releases need to be balanced across the entire customer
set. In other words, while some sprints are still necessary, the frequency and intensity
begins to smooth out and the focus shifts to structure, pace, and consistency.
</p>
        <p>
That is, if the company has successfully transitioned from "startup" to "established".
Some startups never do, and try to sprint themselves from one scenario to the another,
and eventually run themselves into the ground. Managing this transition isn't easy,
and is something that generally only comes from having lived through it once or twice...
or three or four times... Ah, good times.
</p>
        <p>
Remember that whole "work/life balance" thing? We're discovering, over and over again,
that having a good work/life balance is a key part of maintaining a sound outlook
on life, much less your basic sanity. Creating a "home away from home" where employees
can put in insane amount of hours is <em>not</em> healthy "work/life balance"... <em>unless</em> you
presume your company will be staffed with fresh-from-college twenty-something singles
who have nobody to go home to and all their friends in the office. And that, folks,
is not a sustainable model.
</p>
        <p>
Point is, Google's extravagance here smacks of startups, sprints, and fevered intensity.
What's worse, I hear little bits and pieces of rumors that Google <em>reveres</em> the
eleventh-hour developer-god who swoops in, pulls the all-weeker to get the release
out the door, to high praise from management and his/her peers.
</p>
        <p>
That's not sustainable, and the sooner Google--or any other company, for that matter--realizes
that, the better they will be in the long term.
</p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
* - Does this really surprise you? Yes, I am a <em>huge</em> geek.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=280ca2d0-3959-4496-bd63-71c4bdb65acc" />
        <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 Paradise</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,280ca2d0-3959-4496-bd63-71c4bdb65acc.aspx</guid>
      <link>http://blogs.tedneward.com/2008/04/06/More+On+Paradise.aspx</link>
      <pubDate>Sun, 06 Apr 2008 07:49:56 GMT</pubDate>
      <description>&lt;p&gt;
A couple of people have commented on the &lt;a href="http://blogs.tedneward.com/CommentView,guid,84a7726e-a8f6-41a2-b9a2-baf0704dc1c9.aspx#commentstart"&gt;previous
entry&lt;/a&gt;, citing, essentially, that Google needs to do this to be "the best". I understand
the argument completely: Google wants to attract the top talent, or retain the top
talent, or at least entice the top talent, not to mention give them every reason to
be horribly productive, so all of that extravagance is a justifiable--and some might
argue necessary--expense.
&lt;/p&gt;
&lt;p&gt;
Thing is, I don't buy into that argument for a second. Talent wants to be rewarded,
granted, but think about this for a moment: what kind of hours are these employees
buying into by working there? There's an implicit tradeoff here, one that says, "If
you are &lt;em&gt;insanely&lt;/em&gt; productive, then the cost of this office is justified",
meaning the pressure is on. Having an off day? Better pull the all-nighter to make
up for it. Got stuck on something you didn't anticipate? Better pull the all-weekender
to compensate. You're not in the bush leagues any more, sonny--you're at Google, and
we paid a &lt;em&gt;lot&lt;/em&gt; of money to make this office your home away from home, so snap
to it!
&lt;/p&gt;
&lt;p&gt;
I'm not suggesting that Goole is &lt;em&gt;explicitly demanding&lt;/em&gt; this of their employees...
but neither did Microsoft, back in the day.
&lt;/p&gt;
&lt;p&gt;
See, all of this--including the justification arguments--is eerily reminiscent of
Microsoft in their heyday, with the best example being the original Windows NT team.
The hours they pulled over the last few months (some say years) of that project were
nothing short of marathon sprints, and Microsoft laid everything they could at the
feet of these developers (though &lt;em&gt;nothing&lt;/em&gt; like what Google has built in Zurich,
mind you) to help them focus on shipping the project.
&lt;/p&gt;
&lt;p&gt;
The Wall Street Journal ran an article about the whole thing, and one quote from that
article stuck with me: that the pressure to work the insanely long hours didn't come
from upper management, but from the other developers on the team. "Are you signed
up for this thing or not?" was a euphemism for "Why the hell are you leaving at 9PM?
And you're not back until 8AM? What are you, some kind of slacker?" (I felt like screaming
back, "Just say no!", and I wasn't even there.) The &lt;em&gt;peer pressure&lt;/em&gt; was insane,
and drove several members of the team to get outta Dodge as the first opportunity.
Or some took off for bike rides across the country to recharge. Or some just... broke.
&lt;/p&gt;
&lt;p&gt;
Microsoft doesn't do this anymore. Nobody is expected to put in 60 hour work weeks
as a matter of course; now, the average is around 45, which I believe (though I have
no factual evidence to support this) is about average for the industry as a whole.
(C'mon, admit it, even if you're a strict 9-to-5'er, you still do a little reading
at home or stick around after hours to help with the big rollout. It needs to be done,
and you're professional enough to want to see it done right.)
&lt;/p&gt;
&lt;p&gt;
In college, I learned a lot about startups and established companies. Like most of
the folks I hung out with in college, I used to stay up way too late with friends
hanging out at Woodstock's (the local pizzeria) arguing politics/sex/religion/operating
systems or playing role-playing games*, then come home and bang out a 5-page paper
in a few hours before cracking open my notes to study for the final that morning.
I could do this without any real penalty, but I usually ended up taking the final,
then coming back to my apartment and passing out for a few hours, only to awake to
my roommates chanting "Piz-za! Piz-za! Piz-za!" and starting the whole thing over
again. I was young, I had energy, I was fundamentally stupid, and &lt;em&gt;I can't do that
anymore&lt;/em&gt;. I can't sprint like that and still be able to function coherently over
time, and as you get older, you realize that while college can be managed as a series
of sprints, life requires you to have a more marathon attitude, particularly because
you can't know when the sprints are coming, like they do in college.
&lt;/p&gt;
&lt;p&gt;
As companies grow larger, their initial lifecycle is a series of sprints: roll the
first release out, take a breather while the sales guys gather in the customer(s)
and figure out what the next iteration will be, then do the whole thing over again.
This effect is even &lt;em&gt;more&lt;/em&gt; pronounced if the company has that one Really Big
Customer, the one that represents some significant (over 50%) of the company's revenue;
it's that company that drives the feature set and its delivery date. Meeting their
needs and challenges becomes the source of the sprints to come.
&lt;/p&gt;
&lt;p&gt;
As time goes on, however, and assuming the company has somehow managed to find success,
they find that the Really Big Customer is actually now just one of several, and the
features and the timing of the releases need to be balanced across the entire customer
set. In other words, while some sprints are still necessary, the frequency and intensity
begins to smooth out and the focus shifts to structure, pace, and consistency.
&lt;/p&gt;
&lt;p&gt;
That is, if the company has successfully transitioned from "startup" to "established".
Some startups never do, and try to sprint themselves from one scenario to the another,
and eventually run themselves into the ground. Managing this transition isn't easy,
and is something that generally only comes from having lived through it once or twice...
or three or four times... Ah, good times.
&lt;/p&gt;
&lt;p&gt;
Remember that whole "work/life balance" thing? We're discovering, over and over again,
that having a good work/life balance is a key part of maintaining a sound outlook
on life, much less your basic sanity. Creating a "home away from home" where employees
can put in insane amount of hours is &lt;em&gt;not&lt;/em&gt; healthy "work/life balance"... &lt;em&gt;unless&lt;/em&gt; you
presume your company will be staffed with fresh-from-college twenty-something singles
who have nobody to go home to and all their friends in the office. And that, folks,
is not a sustainable model.
&lt;/p&gt;
&lt;p&gt;
Point is, Google's extravagance here smacks of startups, sprints, and fevered intensity.
What's worse, I hear little bits and pieces of rumors that Google &lt;em&gt;reveres&lt;/em&gt; the
eleventh-hour developer-god who swoops in, pulls the all-weeker to get the release
out the door, to high praise from management and his/her peers.
&lt;/p&gt;
&lt;p&gt;
That's not sustainable, and the sooner Google--or any other company, for that matter--realizes
that, the better they will be in the long term.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
* - Does this really surprise you? Yes, I am a &lt;em&gt;huge&lt;/em&gt; geek.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=280ca2d0-3959-4496-bd63-71c4bdb65acc" /&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,280ca2d0-3959-4496-bd63-71c4bdb65acc.aspx</comments>
      <category>Development Processes</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=84a7726e-a8f6-41a2-b9a2-baf0704dc1c9</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,84a7726e-a8f6-41a2-b9a2-baf0704dc1c9.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,84a7726e-a8f6-41a2-b9a2-baf0704dc1c9.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=84a7726e-a8f6-41a2-b9a2-baf0704dc1c9</wfw:commentRss>
      <slash:comments>11</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Check out <a href="http://news.bbc.co.uk/2/hi/technology/7292600.stm">this video</a>.
No, go on, watch it. The rest of this won't make much sense until you do.
</p>
        <p>
Now that you've seen it, take a moment, do the "WOW" thing in your head, imagine how
cool it would be to work there, all of it. Go on, I know you want to, I did too when
I first saw it. Go ahead, take a moment; you'll be distracted until you do, and you'll
miss the rest of the point of this blog entry, and then I'll be sad. Go on, now. Here,
I'll do it with you, even.
</p>
        <p>
Mmmmmm. Slide to lunch. Ahhhh. Massage chair in front of the fish tank. Wow, just <em>think</em> of
how cool it must be to work at Google. I mean, they work hard and all, but still...
now <em>there's</em> a company that knows how to take care of its engineers, right?
</p>
        <p>
OK, daydreaming done? Let's think about this for a moment.
</p>
        <p>
First, how can anybody get anything <em>done</em> with all that noise surrounding
them? Oh, I don't mean actual audio noise, I know they've created quiet zones and
all that, I mean the myriad distractions that float around that office building. I'll
be honest--I find myself getting work done better in an environment <em>without</em> that
additional stimulus and excitement (legacy of my ADD, I'm sure). Knowing that I could
just nip on over to the video game room to spend some "thinking time" in front of
an all-you-can-play Galaga machine would drive me batty.
</p>
        <p>
Maybe that's just me, and others are just <em>begging</em> to be given the chance
to prove me wrong, and if that's the case, then by all means, please feel free. But
I've heard this same experience from lots of people doing the work-at-home thing,
and I don't think the anecdotal evidence here is widely skewed. Sometimes you want
work to be... just work. Vanilla, boring, and predictable.
</p>
        <p>
Don't get me wrong--I don't exactly look forward to my next engagement that plops
me down in the middle of the cube farm--there's a continuum here, and Google is clearly
far on the opposite end of that spectrum from the Dilbert-esque cubicle prairie as
anyone can get. But had I my personal preference here, it would be a desk, fairly
plain, comfortable, yet focused more on the functional than the "fun".
</p>
        <p>
But second, there's a deeper concern that I have, one which I worry a <em>lot</em> more
about than just peoples' preference in work space.
</p>
        <p>
When's the last time you saw this kind of extravagance being lavished on developers?
For me, it was at a number of different Silicon Valley firms during the dot-com boom
of the late 90's... and <em>all</em> of those firms are dessicated remains of what
they once were, or else dried up completely into dust and have long since blown away
with the coastal breeze. This was classic startup behavior: drop a <em>ton</em> of
money 
</p>
        <p>
I'll call it: If Google sees nothing wrong with this kind of extravagance in setting
up an office, then they have just done their first evil.
</p>
        <p>
Pause for a moment to think about the costs involved in setting up that office. I
submit to you, dear reader, that Google is being financially irresponsible with that
office, all nice perks aside. Google's money machine isn't going to last forever--nobody's
ever does--and the company (desperately, IMHO) needs to find something else to prove
to Wall Street and Developer Street that they're still a company that knows how to
write cool software <em>and</em> make money. (Plenty of companies write cool software,
and close their doors a few years later, and plenty of companies know how to make
money, but having a company who can do both is a real rarity.)
</p>
        <p>
Look at Google's habits right now: they're <em>pouring</em> money out left and right
in an effort to maintain or improve the Google "image"; tons of giveaways at conferences,
tons of offices all across the world, incredible office spaces like the one in the
video, and a ton of projects created by Google engineers just because said engineers
think it's cool. While that's a developer's dream, <em>it doesn't pay the rent</em>.
I want to work for a company that offers me a creative, productive work environment,
true, but more than that, I want to work for a company that knows how to make sure
my checks still cash. (Yes, I remember the late 90's well, <em>and</em> the collapse
that followed.)
</p>
        <p>
I'm worried about Google--they appear to be on a dangerous arc, spending in what would
seem to be far greater excess of what they're taking in, and that's not even considering
some of the companies they would be well-advised to consider buying in order to flush
out more of their corporate profile (which is its own interesting discussion, one
for a later day). What is Google's principal source of income right now? Near as I
can tell, it's AdWords, and I just can't believe that the AdWords gravy train will
run any longer than...
</p>
        <p>
... well, than the DOS gravy train. Granted, that train ran for a long time, but eventually
it ran out, and the company had to find alternative sources of income. Microsoft did,
and now it's Google's turn to prove they can put money back into their corporate coffers.
</p>
        <p>
The parallels between Google and Microsoft are staggering, IMHO.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=84a7726e-a8f6-41a2-b9a2-baf0704dc1c9" />
        <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>Developer paradise?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,84a7726e-a8f6-41a2-b9a2-baf0704dc1c9.aspx</guid>
      <link>http://blogs.tedneward.com/2008/04/03/Developer+Paradise.aspx</link>
      <pubDate>Thu, 03 Apr 2008 10:02:54 GMT</pubDate>
      <description>&lt;p&gt;
Check out &lt;a href="http://news.bbc.co.uk/2/hi/technology/7292600.stm"&gt;this video&lt;/a&gt;.
No, go on, watch it. The rest of this won't make much sense until you do.
&lt;/p&gt;
&lt;p&gt;
Now that you've seen it, take a moment, do the "WOW" thing in your head, imagine how
cool it would be to work there, all of it. Go on, I know you want to, I did too when
I first saw it. Go ahead, take a moment; you'll be distracted until you do, and you'll
miss the rest of the point of this blog entry, and then I'll be sad. Go on, now. Here,
I'll do it with you, even.
&lt;/p&gt;
&lt;p&gt;
Mmmmmm. Slide to lunch. Ahhhh. Massage chair in front of the fish tank. Wow, just &lt;em&gt;think&lt;/em&gt; of
how cool it must be to work at Google. I mean, they work hard and all, but still...
now &lt;em&gt;there's&lt;/em&gt; a company that knows how to take care of its engineers, right?
&lt;/p&gt;
&lt;p&gt;
OK, daydreaming done? Let's think about this for a moment.
&lt;/p&gt;
&lt;p&gt;
First, how can anybody get anything &lt;em&gt;done&lt;/em&gt; with all that noise surrounding
them? Oh, I don't mean actual audio noise, I know they've created quiet zones and
all that, I mean the myriad distractions that float around that office building. I'll
be honest--I find myself getting work done better in an environment &lt;em&gt;without&lt;/em&gt; that
additional stimulus and excitement (legacy of my ADD, I'm sure). Knowing that I could
just nip on over to the video game room to spend some "thinking time" in front of
an all-you-can-play Galaga machine would drive me batty.
&lt;/p&gt;
&lt;p&gt;
Maybe that's just me, and others are just &lt;em&gt;begging&lt;/em&gt; to be given the chance
to prove me wrong, and if that's the case, then by all means, please feel free. But
I've heard this same experience from lots of people doing the work-at-home thing,
and I don't think the anecdotal evidence here is widely skewed. Sometimes you want
work to be... just work. Vanilla, boring, and predictable.
&lt;/p&gt;
&lt;p&gt;
Don't get me wrong--I don't exactly look forward to my next engagement that plops
me down in the middle of the cube farm--there's a continuum here, and Google is clearly
far on the opposite end of that spectrum from the Dilbert-esque cubicle prairie as
anyone can get. But had I my personal preference here, it would be a desk, fairly
plain, comfortable, yet focused more on the functional than the "fun".
&lt;/p&gt;
&lt;p&gt;
But second, there's a deeper concern that I have, one which I worry a &lt;em&gt;lot&lt;/em&gt; more
about than just peoples' preference in work space.
&lt;/p&gt;
&lt;p&gt;
When's the last time you saw this kind of extravagance being lavished on developers?
For me, it was at a number of different Silicon Valley firms during the dot-com boom
of the late 90's... and &lt;em&gt;all&lt;/em&gt; of those firms are dessicated remains of what
they once were, or else dried up completely into dust and have long since blown away
with the coastal breeze. This was classic startup behavior: drop a &lt;em&gt;ton&lt;/em&gt; of
money 
&lt;/p&gt;
&lt;p&gt;
I'll call it: If Google sees nothing wrong with this kind of extravagance in setting
up an office, then they have just done their first evil.
&lt;/p&gt;
&lt;p&gt;
Pause for a moment to think about the costs involved in setting up that office. I
submit to you, dear reader, that Google is being financially irresponsible with that
office, all nice perks aside. Google's money machine isn't going to last forever--nobody's
ever does--and the company (desperately, IMHO) needs to find something else to prove
to Wall Street and Developer Street that they're still a company that knows how to
write cool software &lt;em&gt;and&lt;/em&gt; make money. (Plenty of companies write cool software,
and close their doors a few years later, and plenty of companies know how to make
money, but having a company who can do both is a real rarity.)
&lt;/p&gt;
&lt;p&gt;
Look at Google's habits right now: they're &lt;em&gt;pouring&lt;/em&gt; money out left and right
in an effort to maintain or improve the Google "image"; tons of giveaways at conferences,
tons of offices all across the world, incredible office spaces like the one in the
video, and a ton of projects created by Google engineers just because said engineers
think it's cool. While that's a developer's dream, &lt;em&gt;it doesn't pay the rent&lt;/em&gt;.
I want to work for a company that offers me a creative, productive work environment,
true, but more than that, I want to work for a company that knows how to make sure
my checks still cash. (Yes, I remember the late 90's well, &lt;em&gt;and&lt;/em&gt; the collapse
that followed.)
&lt;/p&gt;
&lt;p&gt;
I'm worried about Google--they appear to be on a dangerous arc, spending in what would
seem to be far greater excess of what they're taking in, and that's not even considering
some of the companies they would be well-advised to consider buying in order to flush
out more of their corporate profile (which is its own interesting discussion, one
for a later day). What is Google's principal source of income right now? Near as I
can tell, it's AdWords, and I just can't believe that the AdWords gravy train will
run any longer than...
&lt;/p&gt;
&lt;p&gt;
... well, than the DOS gravy train. Granted, that train ran for a long time, but eventually
it ran out, and the company had to find alternative sources of income. Microsoft did,
and now it's Google's turn to prove they can put money back into their corporate coffers.
&lt;/p&gt;
&lt;p&gt;
The parallels between Google and Microsoft are staggering, IMHO.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=84a7726e-a8f6-41a2-b9a2-baf0704dc1c9" /&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,84a7726e-a8f6-41a2-b9a2-baf0704dc1c9.aspx</comments>
      <category>Development Processes</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=a5152352-9d77-4bd5-8cc5-31c75443ea90</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a5152352-9d77-4bd5-8cc5-31c75443ea90</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of people have asked me over the last few weeks, so it's probably worth saying
out loud: 
</p>
        <p>
No, I don't work for a large company, so yes, I'm available for consulting and research
projects. If you've got one of those burning questions like, "How would our company/project/department/whatever
make use of JRuby-and-Rails, and what would the impact to the rest of the system be",
or "Could using F# help us write applications faster", or "How would we best integrate
Groovy into our application", or "How does the new Adobe Flex/AIR move help us build
richer client apps", or "How do we improve the performance of our Java/.NET app",
or other questions along those lines, drop me a line and let's talk. Not only will
I cook up a prototype describing the answer, but I'll meet with your management and
explain the consequences of the research, both pro and con, for them to evaluate.
</p>
        <p>
Shameless call for consulting complete, now back to the regularly-scheduled programming.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a5152352-9d77-4bd5-8cc5-31c75443ea90" />
        <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>Reminder</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</guid>
      <link>http://blogs.tedneward.com/2008/03/22/Reminder.aspx</link>
      <pubDate>Sat, 22 Mar 2008 10:43:18 GMT</pubDate>
      <description>&lt;p&gt;
A couple of people have asked me over the last few weeks, so it's probably worth saying
out loud: 
&lt;/p&gt;
&lt;p&gt;
No, I don't work for a large company, so yes, I'm available for consulting and research
projects. If you've got one of those burning questions like, "How would our company/project/department/whatever
make use of JRuby-and-Rails, and what would the impact to the rest of the system be",
or "Could using F# help us write applications faster", or "How would we best integrate
Groovy into our application", or "How does the new Adobe Flex/AIR move help us build
richer client apps", or "How do we improve the performance of our Java/.NET app",
or other questions along those lines, drop me a line and let's talk. Not only will
I cook up a prototype describing the answer, but I'll meet with your management and
explain the consequences of the research, both pro and con, for them to evaluate.
&lt;/p&gt;
&lt;p&gt;
Shameless call for consulting complete, now back to the regularly-scheduled programming.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=a5152352-9d77-4bd5-8cc5-31c75443ea90" /&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,a5152352-9d77-4bd5-8cc5-31c75443ea90.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>LLVM</category>
      <category>Mac OS</category>
      <category>Parrot</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Solaris</category>
      <category>VMWare</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=99693e16-ef27-4281-8b79-e9150493a4f2</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,99693e16-ef27-4281-8b79-e9150493a4f2.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,99693e16-ef27-4281-8b79-e9150493a4f2.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=99693e16-ef27-4281-8b79-e9150493a4f2</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
People have sometimes asked me if it's really worth it to go to a conference these
days, given that so much material is appearing online via blogs, webcasts, online
publications and Google. I think the answer is an unqualified "yes" (what else would
you expect from a guy who spends a significant part of his life speaking at conferences?),
but not necessarily for the reasons you might think.
</p>
        <p>
A long time ago, Billy Hollis said something very profound to me: "Newbies go to conferences
for the technical sessions. Seasoned veterans go to conferences for the people." At
the time, I thought this was Billy's way of saying that the sessions really weren't
"all that" at most conferences (JavaOne and TechEd come to mind, for example--whatever
scheduling gods that think project managers on a particular project make good technical
speakers on that subject really needs to be taken out back and shot), and that you're
far better off spending the time networking to improve your social network. Now I
think it's for a different reason. By way of explanation, allow me to recount a brief
travel anecdote.
</p>
        <p>
I spend a lot of time on airplanes, as you might expect. Periodically, while staring
out the window (trying to rearrange words in my head in order to make them sound coherent
for the current email, blog entry, book chapter or article), I will see another commercial
aircraft traveling in the same air traffic control lane going the other way. Every
time I see it, I'm simply floored at how fast they appear to be going--they usually
don't stay within my visibility for more than a few seconds. "Whoosh" is the first
thought that goes through my easily-amused consciousness, and then, "Damn, they're
really <em>moving</em>." Then I realize, "Wow--somebody on that plane over there is
probably looking at this plane I'm on, and thinking the exact same thing."
</p>
        <p>
This is why you go to conferences.
</p>
        <p>
In the agile communities, they talk about velocity, the amount of work a team can
get done in a particular iteration. But I think teams need to have a sense of their
velocity <em>relative to the rest of the industry</em>, too. It helps put things into
perspective. All too often, I find teams that look at me in meetings and conference
calls and say, "Surely the rest of the industry isn't this bad, right?" or "Surely,
somebody else has found a solution to this problem by now, right?" or "Please, dear
God, <em>tell</em> me this kind of WTF-style of project management is unique to my
company". While I am certainly happy to answer those questions, the fact of the matter
is, at the end of the day they're still left taking my word for it, and let's be blunt:
my answer can really only cover those companies and/or project teams I've had direct
contact with. I can certainly tell you what I've heard from others (usually at conferences),
but even that's now getting into secondhand information, which to you will be third-hand.
(And that, of course, assumes I'm getting it from the source in the first place.)
</p>
        <p>
This isn't just about project management styles--agile or waterfall or WHISCEY (Why
the Hell Isn't Somebody Coding Everything Yet) or what-have-you--but also about technical
trends. Is Ruby taking off? Is Scala becoming more mainstream? Is JRuby worth exploring?
Is C++ making a comeback? What are peoples' experiences with Spring 2.5? Has Grails
reached a solid level of performance and/or stability? Sure, I'm happy to come to
your company, meet with your team, talk about what I've seen and heard and done--but
sending your developers (and managers, though *ahem* preferably to conferences that
aren't in Las Vegas) to a conference like No Fluff Just Stuff or JavaOne or TechEd
or SD West can give them some opportunities to swap stories and gain some important
insights about your team's (and company's) velocity relative to the rest of the industry.
</p>
        <p>
All of which is to say, yes, Billy was right: it's about the people. Which means,
boss, it's OK to let the developers go to the parties and maybe sleep in and miss
a session or two the next morning.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=99693e16-ef27-4281-8b79-e9150493a4f2" />
        <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>The reason for conferences</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,99693e16-ef27-4281-8b79-e9150493a4f2.aspx</guid>
      <link>http://blogs.tedneward.com/2008/03/15/The+Reason+For+Conferences.aspx</link>
      <pubDate>Sat, 15 Mar 2008 15:58:52 GMT</pubDate>
      <description>&lt;p&gt;
People have sometimes asked me if it's really worth it to go to a conference these
days, given that so much material is appearing online via blogs, webcasts, online
publications and Google. I think the answer is an unqualified "yes" (what else would
you expect from a guy who spends a significant part of his life speaking at conferences?),
but not necessarily for the reasons you might think.
&lt;/p&gt;
&lt;p&gt;
A long time ago, Billy Hollis said something very profound to me: "Newbies go to conferences
for the technical sessions. Seasoned veterans go to conferences for the people." At
the time, I thought this was Billy's way of saying that the sessions really weren't
"all that" at most conferences (JavaOne and TechEd come to mind, for example--whatever
scheduling gods that think project managers on a particular project make good technical
speakers on that subject really needs to be taken out back and shot), and that you're
far better off spending the time networking to improve your social network. Now I
think it's for a different reason. By way of explanation, allow me to recount a brief
travel anecdote.
&lt;/p&gt;
&lt;p&gt;
I spend a lot of time on airplanes, as you might expect. Periodically, while staring
out the window (trying to rearrange words in my head in order to make them sound coherent
for the current email, blog entry, book chapter or article), I will see another commercial
aircraft traveling in the same air traffic control lane going the other way. Every
time I see it, I'm simply floored at how fast they appear to be going--they usually
don't stay within my visibility for more than a few seconds. "Whoosh" is the first
thought that goes through my easily-amused consciousness, and then, "Damn, they're
really &lt;em&gt;moving&lt;/em&gt;." Then I realize, "Wow--somebody on that plane over there is
probably looking at this plane I'm on, and thinking the exact same thing."
&lt;/p&gt;
&lt;p&gt;
This is why you go to conferences.
&lt;/p&gt;
&lt;p&gt;
In the agile communities, they talk about velocity, the amount of work a team can
get done in a particular iteration. But I think teams need to have a sense of their
velocity &lt;em&gt;relative to the rest of the industry&lt;/em&gt;, too. It helps put things into
perspective. All too often, I find teams that look at me in meetings and conference
calls and say, "Surely the rest of the industry isn't this bad, right?" or "Surely,
somebody else has found a solution to this problem by now, right?" or "Please, dear
God, &lt;em&gt;tell&lt;/em&gt; me this kind of WTF-style of project management is unique to my
company". While I am certainly happy to answer those questions, the fact of the matter
is, at the end of the day they're still left taking my word for it, and let's be blunt:
my answer can really only cover those companies and/or project teams I've had direct
contact with. I can certainly tell you what I've heard from others (usually at conferences),
but even that's now getting into secondhand information, which to you will be third-hand.
(And that, of course, assumes I'm getting it from the source in the first place.)
&lt;/p&gt;
&lt;p&gt;
This isn't just about project management styles--agile or waterfall or WHISCEY (Why
the Hell Isn't Somebody Coding Everything Yet) or what-have-you--but also about technical
trends. Is Ruby taking off? Is Scala becoming more mainstream? Is JRuby worth exploring?
Is C++ making a comeback? What are peoples' experiences with Spring 2.5? Has Grails
reached a solid level of performance and/or stability? Sure, I'm happy to come to
your company, meet with your team, talk about what I've seen and heard and done--but
sending your developers (and managers, though *ahem* preferably to conferences that
aren't in Las Vegas) to a conference like No Fluff Just Stuff or JavaOne or TechEd
or SD West can give them some opportunities to swap stories and gain some important
insights about your team's (and company's) velocity relative to the rest of the industry.
&lt;/p&gt;
&lt;p&gt;
All of which is to say, yes, Billy was right: it's about the people. Which means,
boss, it's OK to let the developers go to the parties and maybe sleep in and miss
a session or two the next morning.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=99693e16-ef27-4281-8b79-e9150493a4f2" /&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,99693e16-ef27-4281-8b79-e9150493a4f2.aspx</comments>
      <category>Conferences</category>
      <category>Development Processes</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently, a number of folks in the Java space have taken to openly ridiculing Microsoft's
use of the "Mort" persona, latching on to the idea that Mort is somehow equivalent
to "Visual Basic programmer", which is itself somehow equivalent to "stupid idiot
programmer who doesn't understand what's going on and just clicks through the wizards".
This would be a mischaracterization, one which I think <a href="http://www.nikhilk.net/Personas.aspx">Nikhilik's
definition</a> helps to clear up:
</p>
        <blockquote>
          <p>
Mort, the opportunistic developer, likes to create quick-working solutions for immediate
problems and focuses on productivity and learn as needed. Elvis, the pragmatic programmer,
likes to create long-lasting solutions addressing the problem domain, and learn while
working on the solution. Einstein, the paranoid programmer, likes to create the most
efficient solution to a given problem, and typically learn in advance before working
on the solution. .... 
</p>
          <p>
The description above is only rough summarization of several characteristics collected
and documented by our usability folks. During the meeting a program manager on our
team applied these personas in the context of server controls rather well (I think),
and thought I should share it. Mort would be a developer most comfortable and satisfied
if the control could be used as-is and it just worked. Elvis would like to able to
customize the control to get the desired behavior through properties and code, or
be willing to wire up multiple controls together. Einstein would love to be able to
deeply understand the control implementation, and want to be able to extend it to
give it different behavior, or go so far as to re-implement it.
</p>
        </blockquote>
        <p>
Phrased this way, it's fairly easy to recognize that it's possible that these are
more roles than actual categorizations for programmers as individuals--sometimes you
want to know how to create the most efficient solution, and sometimes you just want
the damn thing (whatever it is) to get out of your way and let you move on. 
</p>
        <p>
Don Box called this latter approach (which is a tendency on the part of <em>all</em> developers,
not just the VB guys) the <em>selective ignorance bit</em>: none of us have the time
or energy or intellectual capacity to know how <em>everything</em> works, so for certain
topics, a programmer flips the selective ignorance bit and just learns enough to make
it work. For myself, a lot of the hardware stuff sees that selective ignorance bit
flipped on, as well as a lot of the frou-frou UI stuff like graphics and animation
and what-not. Sure, I'm curious, and I'd love to know how it works, but frankly, that's
way down the priority list.
</p>
        <p>
If trying to find a quick-working solution to a particular problem means labeling
yourself as a Mort, then call me Mort. After all, raise your hand if you didn't watch
a team of C++ guys argue for months over the most efficient way to create a reusable
framework for an application that they ended up not shipping because they couldn't
get the framework done in time to actually start work on the application as a whole....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7" />
        <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>Mort means productivity</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7.aspx</guid>
      <link>http://blogs.tedneward.com/2008/03/15/Mort+Means+Productivity.aspx</link>
      <pubDate>Sat, 15 Mar 2008 15:57:39 GMT</pubDate>
      <description>&lt;p&gt;
Recently, a number of folks in the Java space have taken to openly ridiculing Microsoft's
use of the "Mort" persona, latching on to the idea that Mort is somehow equivalent
to "Visual Basic programmer", which is itself somehow equivalent to "stupid idiot
programmer who doesn't understand what's going on and just clicks through the wizards".
This would be a mischaracterization, one which I think &lt;a href="http://www.nikhilk.net/Personas.aspx"&gt;Nikhilik's
definition&lt;/a&gt; helps to clear up:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Mort, the opportunistic developer, likes to create quick-working solutions for immediate
problems and focuses on productivity and learn as needed. Elvis, the pragmatic programmer,
likes to create long-lasting solutions addressing the problem domain, and learn while
working on the solution. Einstein, the paranoid programmer, likes to create the most
efficient solution to a given problem, and typically learn in advance before working
on the solution. .... 
&lt;p&gt;
The description above is only rough summarization of several characteristics collected
and documented by our usability folks. During the meeting a program manager on our
team applied these personas in the context of server controls rather well (I think),
and thought I should share it. Mort would be a developer most comfortable and satisfied
if the control could be used as-is and it just worked. Elvis would like to able to
customize the control to get the desired behavior through properties and code, or
be willing to wire up multiple controls together. Einstein would love to be able to
deeply understand the control implementation, and want to be able to extend it to
give it different behavior, or go so far as to re-implement it.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Phrased this way, it's fairly easy to recognize that it's possible that these are
more roles than actual categorizations for programmers as individuals--sometimes you
want to know how to create the most efficient solution, and sometimes you just want
the damn thing (whatever it is) to get out of your way and let you move on. 
&lt;/p&gt;
&lt;p&gt;
Don Box called this latter approach (which is a tendency on the part of &lt;em&gt;all&lt;/em&gt; developers,
not just the VB guys) the &lt;em&gt;selective ignorance bit&lt;/em&gt;: none of us have the time
or energy or intellectual capacity to know how &lt;em&gt;everything&lt;/em&gt; works, so for certain
topics, a programmer flips the selective ignorance bit and just learns enough to make
it work. For myself, a lot of the hardware stuff sees that selective ignorance bit
flipped on, as well as a lot of the frou-frou UI stuff like graphics and animation
and what-not. Sure, I'm curious, and I'd love to know how it works, but frankly, that's
way down the priority list.
&lt;/p&gt;
&lt;p&gt;
If trying to find a quick-working solution to a particular problem means labeling
yourself as a Mort, then call me Mort. After all, raise your hand if you didn't watch
a team of C++ guys argue for months over the most efficient way to create a reusable
framework for an application that they ended up not shipping because they couldn't
get the framework done in time to actually start work on the application as a whole....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7" /&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,0a54f1e8-88ad-426f-8603-a0c0d1fbdfa7.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Ruby</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c5b99d49-1e59-4f68-ad0b-1db137f3582e</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c5b99d49-1e59-4f68-ad0b-1db137f3582e.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c5b99d49-1e59-4f68-ad0b-1db137f3582e.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c5b99d49-1e59-4f68-ad0b-1db137f3582e</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just recently, I got this bit in an email from the <a href="http://reddevnews.com">Redmond
Developer News</a> ezine:
</p>
        <blockquote>
          <p>
TWO IF BY SEA 
</p>
          <p>
In the course of just over a week starting on Jan. 30, a total of five undersea data
cables linking Europe, Africa and the Middle East were damaged or disrupted. The first
two cables to be lost link Europe with Egypt and terminate near the Port of Alexandria. 
</p>
          <p>
            <a href="http://reddevnews.com/columns/article.aspx?editorialsid=2502">http://reddevnews.com/columns/article.aspx?editorialsid=2502</a>
          </p>
          <p>
Early speculation placed the blame on ship anchors that might have dragged across
the sea floor during heavy weather. But the subsequent loss of cables in the Persian
Gulf and the Mediterranean has produced a chilling numbers game. Someone, it seems,
may be trying to sabotage the global network. 
</p>
          <p>
It's a conclusion that came up at a recent International Telecommunication Union (ITU)
press conference. According to an Associated Press report, ITU head of development
Sami al-Murshed isn't ready to "rule out that a deliberate act of sabotage caused
the damage to the undersea cables over two weeks ago." 
</p>
          <p>
            <a href="http://tinyurl.com/3bjtdg">http://tinyurl.com/3bjtdg</a>
          </p>
          <p>
You think? 
</p>
          <p>
In just seven or eight days, five undersea cables were disrupted. 
</p>
          <p>
Five. All of them serving or connecting to the Middle East. And thus far, only one
cable cut -- linking Oman and the United Arab Emirates -- has been identified as accidental,
caused by a dragging ship anchor. 
</p>
          <p>
So what does it mean for developers? A lot, actually. Because it means that the coming
wave of service-enabled applications needs to take into account the fact that the
cloud is, literally, under attack. 
</p>
          <p>
This isn't new. For as long as the Internet has been around, concerns about attacks
on the network have centered on threats posed by things like distributed denial of
service (DDOS) and other network-borne attacks. Twice -- once in 2002 and again in
2007 -- DDOS attacks have targeted the 13 DNS root servers, threatening to disrupt
the Internet. 
</p>
          <p>
But assaults on the remote physical infrastructure of the global network are especially
concerning. These cables lie hundreds or even thousands of feet beneath the surface.
This wasn't a script-kiddie kicking off an ill-advised DOS attack on a server. This
was almost certainly a sophisticated, well-planned, well-financed and well-thought-out
effort to cut off an entire section of the world from the global Internet. 
</p>
          <p>
Clearly, efforts need to be made to ensure that the intercontinental cable infrastructure
of the Internet is hardened. Redundant, geographically dispersed links, with plenty
of excess bandwidth, are a good start. 
</p>
          <p>
But development planners need to do their part, as well. Web-based applications shouldn't
be crafted with the expectation of limitless bandwidth. Services and apps must be
crafted so that they can fail gracefully, shift to lower-bandwidth media (such as
satellite) and provide priority to business-critical operations. In short, your critical
cloud-reliant apps must continue to work, when almost nothing else will. 
</p>
          <p>
And all this, I might add, as the industry prepares to welcome the second generation
of rich Internet application tools and frameworks. 
</p>
          <p>
Silverlight 2.0 will debut at MIX08 next month. Adobe is upping the ante with its
latest offerings. Developers will enjoy a major step up in their ability to craft
enriched, Web-entangled applications and environments. 
</p>
          <p>
But as you make your plans and write your code, remember this one thing: The people,
organization or government that most likely sliced those four or five cables in the
Mediterranean and Persian Gulf -- they can do it again.
</p>
        </blockquote>
        <p>
There's a couple of things to consider here, aside from the geopolitical ramifications
of a concerted attack on the global IT infrastructure (which does more to damage corporations
and the economy than it does to disrupt military communications, which to my understanding
are mostly satellite-based).
</p>
        <p>
First, this attack on the global infrastructure raises a <em>huge</em> issue with
respect to outsourcing--if you lose touch with your development staff for a day, a
week, a month (just how long <em>does</em> it take to lay down new trunk cable, anyway?),
what sort of chaos is this going to strike with your project schedule? In <em>The
World is Flat</em>, Friedman mentions that a couple of fast-food restaurants have
outsourced the drive-thru--you drive up to the speaker, and as you place your order,
you're talking to somebody half a world way who's punching it into a computer that's
flashing the data back to the fast-food join in question for harvesting (it's not
like they <em>make</em> the food when you order it, just harvest it from the fields
of pre-cooked burgers ripening under infrared lamps in the back) and disbursement
as you pull forward the remaining fifty feet to the first window.
</p>
        <p>
The ludicrousness of this arrangement notwithstanding, this means that the local fast-food
joint is now dependent on the global IT infrastructure in the same way that your ERP
system is. Aside from the obvious "geek attraction" to a setup like this, I find it
fascinating that at no point did somebody stand up and yell out, "What happened to <em>minimizing</em> the
risks?" Effective project development relies heavily on the ability to touch base
with the customer every so often to ensure things are progressing in the way the customer
was anticipating. When the development team is one ocean and two continents away in
one direction, or one ocean and a whole pile of islands away in the other direction,
or even just a few states over, that vital communication link is now at the mercy
of every single IT node in between them and you.
</p>
        <p>
We can make huge strides, but at the end of the day, the huge distances involved can
only be "fractionalized", never eliminated.
</p>
        <p>
Second, as Desmond points out, this has a huge impact on the design of applications
that are assuming a 100% or 99.9% Internet uptime. Yes, I'm looking at you, GMail
and Google Calendar and the other so-called "next-generation Internet applications"
based on technologies like AJAX. (I categorically refuse to call them "Web 2.0" applications--there
is no such thing as "Web 2.0".) As much as we keep looking to the future for an "always-on"
networking infrastructure, the more we delude ourselves to the practical realities
of life: <em>there is no such thing as "always-on" infrastructure</em>. Networking
or otherwise.
</p>
        <p>
I know this personally, since last year here in Redmond, some stronger-than-normal
winter storms knocked down a whole slew of power lines and left my house without electricity
for a week. To <em>very</em> quickly discover how much of modern Western life depends
on "always-on" assumptions, go without power to the house for a week. We were fortunate--parts
of Redmond and nearby neighborhoods got power back within 24 hours, so if I needed
to recharge the laptop or get online to keep doing business, much less get a hot meal
or just find a place where it was warm, it meant a quick trip down to the local strip
mall where a restaurant with WiFi (Canyon's, for those of you that visit Redmond)
kept me going. For others in Redmond, the power outage meant a brief vacation down
at the Redmond Town Center Marriott, where power was available pretty much within
an hour or two of its disruption.
</p>
        <p>
The First Fallacy of Enterprise Systems states that "The network is reliable". The
network is only as reliable as the infrastructure around it, and not just the infrastructure
that your company lays down from your workstation to the proxy or gateway or cable
modem. Take a "traceroute" reading from your desktop machine to the server on which
your application is running--if it's not physically in the building as you, then you're
probably looking at 20 - 30 "hops" before it reaches the server. Every single one
of those "hops" is a potential point of failure. Granted, the architecture of TCP/IP
suggests that we should be able to route around any localized points of failure, but
how many of those points are, in fact, to your world view, completely unroutable?
If your gateway machine goes down, how does TCP/IP try to route around that? If your
ISP gets hammered by a Denial-of-Service attack, how do clients reach the server?
</p>
        <p>
If we cannot guarantee 100% uptime for electricity, something we've had close to a
century to perfect, then how can you assume similar kinds of guarantees for network
availability? And before any of you point out that "Hey, most of the time, it just
works so why worry about it?", I humbly suggest you walk into your Network Operations
Center and ask the helpful IT people to point out the Uninterruptible Power Supplies
that fuel the servers there "just in case". 
</p>
        <p>
When they in turn ask you to point out the "just in case" infrastructure around the
application, what will you say?
</p>
        <p>
Remember, the Fallacies only bite you when you ignore them:
</p>
        <blockquote>
          <p>
1) The network is reliable 
</p>
          <p>
2) Latency is zero 
</p>
          <p>
3) Bandwidth is infinite 
</p>
          <p>
4) The network is secure 
</p>
          <p>
5) Topology doesn't change 
</p>
          <p>
6) There is one administrator 
</p>
          <p>
7) Transport cost is zero 
</p>
          <p>
8) The network is homogeneous 
</p>
          <p>
9) The system is monolithic 
</p>
          <p>
10) The system is finished
</p>
        </blockquote>
        <p>
Every project needs, at some point, to have somebody stand up in the room and shout
out, "But how do we <em>minimize</em> the risks?" If this is truly a "mission-critical"
application, then somebody needs the responsibility of cooking up "What if?" scenarios
and answers, even if the answer is to say, "There's not much we can reasonably do
in that situation, so we'll just accept that the company shuts its doors in that case".
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c5b99d49-1e59-4f68-ad0b-1db137f3582e" />
        <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>The Fallacies Remain....</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c5b99d49-1e59-4f68-ad0b-1db137f3582e.aspx</guid>
      <link>http://blogs.tedneward.com/2008/02/20/The+Fallacies+Remain.aspx</link>
      <pubDate>Wed, 20 Feb 2008 05:25:03 GMT</pubDate>
      <description>&lt;p&gt;
Just recently, I got this bit in an email from the &lt;a href="http://reddevnews.com"&gt;Redmond
Developer News&lt;/a&gt; ezine:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
TWO IF BY SEA 
&lt;p&gt;
In the course of just over a week starting on Jan. 30, a total of five undersea data
cables linking Europe, Africa and the Middle East were damaged or disrupted. The first
two cables to be lost link Europe with Egypt and terminate near the Port of Alexandria. 
&lt;p&gt;
&lt;a href="http://reddevnews.com/columns/article.aspx?editorialsid=2502"&gt;http://reddevnews.com/columns/article.aspx?editorialsid=2502&lt;/a&gt; 
&lt;p&gt;
Early speculation placed the blame on ship anchors that might have dragged across
the sea floor during heavy weather. But the subsequent loss of cables in the Persian
Gulf and the Mediterranean has produced a chilling numbers game. Someone, it seems,
may be trying to sabotage the global network. 
&lt;p&gt;
It's a conclusion that came up at a recent International Telecommunication Union (ITU)
press conference. According to an Associated Press report, ITU head of development
Sami al-Murshed isn't ready to "rule out that a deliberate act of sabotage caused
the damage to the undersea cables over two weeks ago." 
&lt;p&gt;
&lt;a href="http://tinyurl.com/3bjtdg"&gt;http://tinyurl.com/3bjtdg&lt;/a&gt; 
&lt;p&gt;
You think? 
&lt;p&gt;
In just seven or eight days, five undersea cables were disrupted. 
&lt;p&gt;
Five. All of them serving or connecting to the Middle East. And thus far, only one
cable cut -- linking Oman and the United Arab Emirates -- has been identified as accidental,
caused by a dragging ship anchor. 
&lt;p&gt;
So what does it mean for developers? A lot, actually. Because it means that the coming
wave of service-enabled applications needs to take into account the fact that the
cloud is, literally, under attack. 
&lt;p&gt;
This isn't new. For as long as the Internet has been around, concerns about attacks
on the network have centered on threats posed by things like distributed denial of
service (DDOS) and other network-borne attacks. Twice -- once in 2002 and again in
2007 -- DDOS attacks have targeted the 13 DNS root servers, threatening to disrupt
the Internet. 
&lt;p&gt;
But assaults on the remote physical infrastructure of the global network are especially
concerning. These cables lie hundreds or even thousands of feet beneath the surface.
This wasn't a script-kiddie kicking off an ill-advised DOS attack on a server. This
was almost certainly a sophisticated, well-planned, well-financed and well-thought-out
effort to cut off an entire section of the world from the global Internet. 
&lt;p&gt;
Clearly, efforts need to be made to ensure that the intercontinental cable infrastructure
of the Internet is hardened. Redundant, geographically dispersed links, with plenty
of excess bandwidth, are a good start. 
&lt;p&gt;
But development planners need to do their part, as well. Web-based applications shouldn't
be crafted with the expectation of limitless bandwidth. Services and apps must be
crafted so that they can fail gracefully, shift to lower-bandwidth media (such as
satellite) and provide priority to business-critical operations. In short, your critical
cloud-reliant apps must continue to work, when almost nothing else will. 
&lt;p&gt;
And all this, I might add, as the industry prepares to welcome the second generation
of rich Internet application tools and frameworks. 
&lt;p&gt;
Silverlight 2.0 will debut at MIX08 next month. Adobe is upping the ante with its
latest offerings. Developers will enjoy a major step up in their ability to craft
enriched, Web-entangled applications and environments. 
&lt;p&gt;
But as you make your plans and write your code, remember this one thing: The people,
organization or government that most likely sliced those four or five cables in the
Mediterranean and Persian Gulf -- they can do it again.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
There's a couple of things to consider here, aside from the geopolitical ramifications
of a concerted attack on the global IT infrastructure (which does more to damage corporations
and the economy than it does to disrupt military communications, which to my understanding
are mostly satellite-based).
&lt;/p&gt;
&lt;p&gt;
First, this attack on the global infrastructure raises a &lt;em&gt;huge&lt;/em&gt; issue with
respect to outsourcing--if you lose touch with your development staff for a day, a
week, a month (just how long &lt;em&gt;does&lt;/em&gt; it take to lay down new trunk cable, anyway?),
what sort of chaos is this going to strike with your project schedule? In &lt;em&gt;The
World is Flat&lt;/em&gt;, Friedman mentions that a couple of fast-food restaurants have
outsourced the drive-thru--you drive up to the speaker, and as you place your order,
you're talking to somebody half a world way who's punching it into a computer that's
flashing the data back to the fast-food join in question for harvesting (it's not
like they &lt;em&gt;make&lt;/em&gt; the food when you order it, just harvest it from the fields
of pre-cooked burgers ripening under infrared lamps in the back) and disbursement
as you pull forward the remaining fifty feet to the first window.
&lt;/p&gt;
&lt;p&gt;
The ludicrousness of this arrangement notwithstanding, this means that the local fast-food
joint is now dependent on the global IT infrastructure in the same way that your ERP
system is. Aside from the obvious "geek attraction" to a setup like this, I find it
fascinating that at no point did somebody stand up and yell out, "What happened to &lt;em&gt;minimizing&lt;/em&gt; the
risks?" Effective project development relies heavily on the ability to touch base
with the customer every so often to ensure things are progressing in the way the customer
was anticipating. When the development team is one ocean and two continents away in
one direction, or one ocean and a whole pile of islands away in the other direction,
or even just a few states over, that vital communication link is now at the mercy
of every single IT node in between them and you.
&lt;/p&gt;
&lt;p&gt;
We can make huge strides, but at the end of the day, the huge distances involved can
only be "fractionalized", never eliminated.
&lt;/p&gt;
&lt;p&gt;
Second, as Desmond points out, this has a huge impact on the design of applications
that are assuming a 100% or 99.9% Internet uptime. Yes, I'm looking at you, GMail
and Google Calendar and the other so-called "next-generation Internet applications"
based on technologies like AJAX. (I categorically refuse to call them "Web 2.0" applications--there
is no such thing as "Web 2.0".) As much as we keep looking to the future for an "always-on"
networking infrastructure, the more we delude ourselves to the practical realities
of life: &lt;em&gt;there is no such thing as "always-on" infrastructure&lt;/em&gt;. Networking
or otherwise.
&lt;/p&gt;
&lt;p&gt;
I know this personally, since last year here in Redmond, some stronger-than-normal
winter storms knocked down a whole slew of power lines and left my house without electricity
for a week. To &lt;em&gt;very&lt;/em&gt; quickly discover how much of modern Western life depends
on "always-on" assumptions, go without power to the house for a week. We were fortunate--parts
of Redmond and nearby neighborhoods got power back within 24 hours, so if I needed
to recharge the laptop or get online to keep doing business, much less get a hot meal
or just find a place where it was warm, it meant a quick trip down to the local strip
mall where a restaurant with WiFi (Canyon's, for those of you that visit Redmond)
kept me going. For others in Redmond, the power outage meant a brief vacation down
at the Redmond Town Center Marriott, where power was available pretty much within
an hour or two of its disruption.
&lt;/p&gt;
&lt;p&gt;
The First Fallacy of Enterprise Systems states that "The network is reliable". The
network is only as reliable as the infrastructure around it, and not just the infrastructure
that your company lays down from your workstation to the proxy or gateway or cable
modem. Take a "traceroute" reading from your desktop machine to the server on which
your application is running--if it's not physically in the building as you, then you're
probably looking at 20 - 30 "hops" before it reaches the server. Every single one
of those "hops" is a potential point of failure. Granted, the architecture of TCP/IP
suggests that we should be able to route around any localized points of failure, but
how many of those points are, in fact, to your world view, completely unroutable?
If your gateway machine goes down, how does TCP/IP try to route around that? If your
ISP gets hammered by a Denial-of-Service attack, how do clients reach the server?
&lt;/p&gt;
&lt;p&gt;
If we cannot guarantee 100% uptime for electricity, something we've had close to a
century to perfect, then how can you assume similar kinds of guarantees for network
availability? And before any of you point out that "Hey, most of the time, it just
works so why worry about it?", I humbly suggest you walk into your Network Operations
Center and ask the helpful IT people to point out the Uninterruptible Power Supplies
that fuel the servers there "just in case". 
&lt;/p&gt;
&lt;p&gt;
When they in turn ask you to point out the "just in case" infrastructure around the
application, what will you say?
&lt;/p&gt;
&lt;p&gt;
Remember, the Fallacies only bite you when you ignore them:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
1) The network is reliable 
&lt;p&gt;
2) Latency is zero 
&lt;p&gt;
3) Bandwidth is infinite 
&lt;p&gt;
4) The network is secure 
&lt;p&gt;
5) Topology doesn't change 
&lt;p&gt;
6) There is one administrator 
&lt;p&gt;
7) Transport cost is zero 
&lt;p&gt;
8) The network is homogeneous 
&lt;p&gt;
9) The system is monolithic 
&lt;p&gt;
10) The system is finished
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Every project needs, at some point, to have somebody stand up in the room and shout
out, "But how do we &lt;em&gt;minimize&lt;/em&gt; the risks?" If this is truly a "mission-critical"
application, then somebody needs the responsibility of cooking up "What if?" scenarios
and answers, even if the answer is to say, "There's not much we can reasonably do
in that situation, so we'll just accept that the company shuts its doors in that case".
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c5b99d49-1e59-4f68-ad0b-1db137f3582e" /&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,c5b99d49-1e59-4f68-ad0b-1db137f3582e.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=813ea27d-1f63-4e95-8a7f-053d738b2bf4</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,813ea27d-1f63-4e95-8a7f-053d738b2bf4.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,813ea27d-1f63-4e95-8a7f-053d738b2bf4.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=813ea27d-1f63-4e95-8a7f-053d738b2bf4</wfw:commentRss>
      <slash:comments>15</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The recent <a href="http://blogs.cnet.com/8301-13505_1-9847739-16.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-20">"failure"
of the Chandler PIM project</a> generated the question, <a href="http://www.theserverside.com/news/thread.tss?thread_id=48180">"Can
Dynamic Languages Scale?"</a> on TheServerSide, and, as is all too typical these days,
it turned into a "You suck"/"No you suck" flamefest between a couple of posters to
the site.
</p>
        <p>
I now make the perhaps vain attempt to address the question meaningfully.
</p>
        <h3>What do you mean by "scale"? 
</h3>
        <p>
There's an implicit problem with using the word "scale" here, in that we can think
of a language scaling in one of two very orthogonal directions:
</p>
        <ol>
          <li>
Size of project, as in lines-of-code (LOC) 
</li>
          <li>
Capacity handling, as in "it needs to scale to 100,000 requests per second"</li>
        </ol>
        <p>
Part of the problem I think that appears on the TSS thread is that the posters never
really clearly delineate the differences between these two. Assembly language can
scale(2), but it can't really scale(1) very well. Most people believe that C scales(2)
well, but doesn't scale(1) well. C++ scores better on scale(1), and usually does well
on scale(2), but you get into all that icky memory-management stuff. (Unless, of course,
you're using the Boehm GC implementation, but that's another topic entirely.)
</p>
        <p>
Scale(1) is a measurement of a language's ability to extend or enhance the <em>complexity
budget</em> of a project. For those who've not heard the term "complexity budget",
I heard it first from Mike Clark (though I can't find a citation for it via Google--if
anybody's got one, holler and I'll slip it in here), he of Pragmatic Project Automation
fame, and it's essentially a statement that says "Humans can only deal with a fixed
amount of complexity in their heads. Therefore, every project has a fixed complexity
budget, and the more you spend on infrastructure and tools, the less you have to spend
on the actual business logic." In many ways, this is a reflection of the ability of
a language or tool to raise the level of abstraction--when projects began to exceed
the abstraction level of assembly, for example, we moved to higher-level languages
like C to help hide some of the complexity and let us spend more of the project's
complexity budget on the program, and not with figuring out which register needed
to have the value of the interrupt to be invoked. This same argument can be seen in
the argument against EJB in favor of Spring: too much of the complexity budget was
spent in getting the details of the EJB beans correct, and Spring reduced that amount
and gave us more room to work with. Now, this argument is at the core of the Ruby/Rails-vs-Java/JEE
debate, and implicitly it's obviously there in the middle of the room in the whole
discussion over Chandler.
</p>
        <p>
Scale(2) is an equally important measurement, since a project that cannot handle the
expected user load during peak usage times will have effectively failed just as surely
as if the project had never shipped in the first place. Part of this will be reflected
in not just the language used but also the tools and libraries that are part of the
overall software footprint, but choice of language can obviously have a major impact
here: Erlang is being tossed about as a good choice for high-scale systems because
of its intrinsic Actors-based model for concurrent processing, for example.
</p>
        <p>
Both of these get tossed back and forth rather carelessly during this debate, usually
along the following lines:
</p>
        <ol>
          <li>
Pro-Java (and pro-.NET, though they haven't gotten into this particular debate so
much as the Java guys have) adherents argue that a dynamic language cannot scale(1)
because of the lack of type-safety commonly found in dynamic languages. Since the
compiler is not there to methodically ensure that parameters obey a certain type contract,
that objects are not asked to execute methods they couldn't possibly satisfy, and
so on. In essence, strongly-typed languages are theorem provers, in that they take
the assertion (by the programmer) that this program is type-correct, and validate
that. This means less work for the programmer, as an automated tool now runs through
a series of tests that the programmer doesn't have to write by hand; as one contributor
to the TSS thread <a href="http://www.theserverside.com/news/thread.tss?thread_id=48180#245674">put
it</a>: <blockquote>"With static languages like Java, we get a select subset of code
tests, with 100% code coverage, every time we compile. We get those tests for "free".
The price we pay for those "free" tests is static typing, which certainly has hidden
costs."</blockquote>Note that this argument frequently derails into the world of IDE
support and refactoring (as its witnessed on the TSS thread), pointing out that Eclipse
and IntelliJ provide powerful automated refactoring support that is widely believed
to be impossible on dynamic language platforms. 
</li>
          <li>
Pro-Java adherents also argue that dynamic languages cannot scale(2) as well as Java
can, because those languages are built on top of their own runtimes, which are arguably
vastly inferior to the engineering effort that goes into the garbage collection facilities
found in the JVM Hotspot or CLR implementations. 
</li>
          <li>
Pro-Ruby (and pro-Python, though again they're not in the frame of this argument quite
so much) adherents argue that the dynamic nature of these languages means less work
during the creation and maintenance of the codebase, resulting in a far fewer lines-of-code
count than one would have with a more verbose language like Java, thus implicitly
improving the scale(1) of a dynamic language. 
<p>
On the subject of IDE refactoring, scripting language proponents point out that the
original refactoring browser was an implementation built for (and into) Smalltalk,
one of the world's first dynamic languages.
</p></li>
          <li>
Pro-Ruby adherents also point out that there are plenty of web applications and web
sites that scale(2) "well enough" on top of the MRV (Matz's Ruby VM?) interpreter
that comes "out of the box" with Ruby, despite the widely-described fact that MRV
Ruby Threads are what Java used to call "green threads", where the interpreter manages
thread scheduling and management entirely on its own, effectively using one native
thread underneath. 
</li>
          <li>
Both sides tend to get caught up in "you don't know as much as me about this" kinds
of arguments as well, essentially relying on the idea that the less you've coded in
a language, the less you could possibly know about that language, and the more you've
coded in a language, the more knowledgeable you must be. Both positions are fallacies:
I know a great deal about D, even though I've barely written a thousand lines of code
in it, because D inherits much of its feature set and linguistic expression from both
Java and C++. Am I a certified expert in it? Hardly--there are likely dozens of D
idioms that I don't yet know, and certainly haven't elevated to the state of intuitive
use, and those will come as I write more lines of D code. But that doesn't mean I
don't already have a deep understanding of how to design D programs, since it fundamentally
remains, as its genealogical roots imply, an object-oriented language. Similar rationale
holds for Ruby and Python and ECMAScript, as well as for languages like Haskell, ML,
Prolog, Scala, F#, and so on: the more you know about "neighboring" languages on the
linguistic geography, the more you know about that language in particular. If two
of you are learning Ruby, and you're a Python programmer, you already have a leg up
on the guy who's never left C++. Along the other end of this continuum, the programmer
who's written half a million lines of C++ code and still never uses the "private"
keyword is <em>not</em> an expert C++ programmer, no matter what his checkin metrics
claim. (And believe me, I've met way too many of these guys, in more than just the
C++ domain.)</li>
        </ol>
        <p>
A couple of thoughts come to mind on this whole mess.
</p>
        <h3>Just how refactorable are you?
</h3>
        <p>
First of all, it's a widely debatable point as to the actual refactorability of dynamic
languages. On NFJS speaker panels, Dave Thomas (he of the PickAxe book) would routinely
admit that not all of the refactorings currently supported in Eclipse were possible
on a dynamic language platform given that type information (such as it is in a language
like Ruby) isn't present until runtime. He would also take great pains to point out
that simple search-and-replace across files, something any non-trivial editor supports,
will do many of the same refactorings as Eclipse or IntelliJ provides, since type
is no longer an issue. Having said that, however, it's relatively easy to imagine
that the IDE could be actively "running" the code as it is being typed, in much the
same way that Eclipse is doing constant compiles, tracking type information throughout
the editing process. This is an area I personally expect the various IDE vendors will
explore in depth as they look for ways to capture the dynamic language dynamic (if
you'll pardon the pun) currently taking place.
</p>
        <h3>Who exactly are you for?
</h3>
        <p>
What sometimes gets lost in this discussion is that not all dynamic languages need
be for programmers; a tremendous amount of success has been achieved by creating a
core engine and surrounding it with a scripting engine that non-programmers use to
exercise the engine in meaningful ways. Excel and Word do it, Quake and Unreal (along
with other equally impressively-successful games) do it, UNIX shells do it, and various
enterprise projects I've worked on have done it, all successfully. A model whereby
core components are written in Java/C#/C++ and are manipulated from the UI (or other
"top-of-the-stack" code, such as might be found in nightly batch execution) by these
less-rigorous languages is a powerful and effective architecture to keep in mind,
particularly in combination with the next point....
</p>
        <h3>Where do you run again?
</h3>
        <p>
With the release of JRuby, and the work on projects like IronRuby and Ruby.NET, it's
entirely reasonable to assume that these dynamic languages can and will now run on
top of modern virtual machines like the JVM and the CLR, completely negating arguments
2 and 4. While a dynamic language will usually take some kind of performance and memory
hit when running on top of VMs that were designed for statically-typed languages,
work on the DLR and the MLVM, as well as enhancements to the underlying platform that
will be more beneficial to these dynamic language scenarios, will reduce that. Parrot
may change that in time, but right now it sits at a 0.5 release and doesn't seem to
be making huge inroads into reaching a 1.0 release that will be attractive to anyone
outside of the "bleeding-edge" crowd.
</p>
        <h3>So where does that leave us?
</h3>
        <p>
The allure of the dynamic language is strong on numerous levels. Without having to
worry about type details, the dynamic language programmer can typically slam out more
work-per-line-of-code than his statically-typed compatriot, given that both write
the same set of unit tests to verify the code. However, I think this idea that the
statically-typed developer must produce the same number of unit tests as his dynamically-minded
coworker is a fallacy--a large part of the point of a compiler is to provide those
same tests, so why duplicate its work? Plus we have the guarantee that the compiler
will always execute these tests, regardless of whether the programmer using it remembers
to write those tests or not.
</p>
        <p>
Having said that, by the way, I think today's compilers (C++, Java and C#) are pretty
weak in the type expressions they require and verify. Type-inferencing languages,
like ML or Haskell and their modern descendents, F# and Scala, clearly don't require
the degree of verbosity currently demanded by the traditional O-O compilers. I'm pretty
certain this will get fixed over time, a la how C# has introduced <a href="http://blogs.tedneward.com/2005/09/22/Language+Innovation+C+30+Explained.aspx">implicitly
typed variables</a>.
</p>
        <p>
Meanwhile, why the rancor between these two camps? It's eerily reminiscent of the
ill-will that flowed back and forth between the C++ and Java communities during Java's
early days, leading me to believe that it's more a concern over job market and emplyability
than it is a real technical argument. In the end, there will continue to be a ton
of Java work for the rest of this decade and well into the next, and JRuby (and Groovy)
afford the Java developer lots of opportunities to learn those dynamic languages and
still remain relevant to her employer.
</p>
        <p>
It's as Marx said, lo these many years ago: "From each language, according to its
abilities, to each project, according to its needs."
</p>
        <p>
Oh, except Perl. Perl just sucks, period. :-)
</p>
        <h3>PostScript
</h3>
        <p>
I find it deeply ironic that the news piece TSS cited at the top of the discussion
claims that the Chandler project failed due to mismanagement, not its choice of implementation
language. It doesn't even mention what language was used to build Chandler, leading
me to wonder if anybody even read the piece before choosing up their sides and throwing
dirt at one another.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=813ea27d-1f63-4e95-8a7f-053d738b2bf4" />
        <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>Can Dynamic Languages Scale?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,813ea27d-1f63-4e95-8a7f-053d738b2bf4.aspx</guid>
      <link>http://blogs.tedneward.com/2008/01/24/Can+Dynamic+Languages+Scale.aspx</link>
      <pubDate>Thu, 24 Jan 2008 07:51:02 GMT</pubDate>
      <description>&lt;p&gt;
The recent &lt;a href="http://blogs.cnet.com/8301-13505_1-9847739-16.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20"&gt;"failure"
of the Chandler PIM project&lt;/a&gt; generated the question, &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=48180"&gt;"Can
Dynamic Languages Scale?"&lt;/a&gt; on TheServerSide, and, as is all too typical these days,
it turned into a "You suck"/"No you suck" flamefest between a couple of posters to
the site.
&lt;/p&gt;
&lt;p&gt;
I now make the perhaps vain attempt to address the question meaningfully.
&lt;/p&gt;
&lt;h3&gt;What do you mean by "scale"? 
&lt;/h3&gt;
&lt;p&gt;
There's an implicit problem with using the word "scale" here, in that we can think
of a language scaling in one of two very orthogonal directions:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Size of project, as in lines-of-code (LOC) 
&lt;li&gt;
Capacity handling, as in "it needs to scale to 100,000 requests per second"&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Part of the problem I think that appears on the TSS thread is that the posters never
really clearly delineate the differences between these two. Assembly language can
scale(2), but it can't really scale(1) very well. Most people believe that C scales(2)
well, but doesn't scale(1) well. C++ scores better on scale(1), and usually does well
on scale(2), but you get into all that icky memory-management stuff. (Unless, of course,
you're using the Boehm GC implementation, but that's another topic entirely.)
&lt;/p&gt;
&lt;p&gt;
Scale(1) is a measurement of a language's ability to extend or enhance the &lt;em&gt;complexity
budget&lt;/em&gt; of a project. For those who've not heard the term "complexity budget",
I heard it first from Mike Clark (though I can't find a citation for it via Google--if
anybody's got one, holler and I'll slip it in here), he of Pragmatic Project Automation
fame, and it's essentially a statement that says "Humans can only deal with a fixed
amount of complexity in their heads. Therefore, every project has a fixed complexity
budget, and the more you spend on infrastructure and tools, the less you have to spend
on the actual business logic." In many ways, this is a reflection of the ability of
a language or tool to raise the level of abstraction--when projects began to exceed
the abstraction level of assembly, for example, we moved to higher-level languages
like C to help hide some of the complexity and let us spend more of the project's
complexity budget on the program, and not with figuring out which register needed
to have the value of the interrupt to be invoked. This same argument can be seen in
the argument against EJB in favor of Spring: too much of the complexity budget was
spent in getting the details of the EJB beans correct, and Spring reduced that amount
and gave us more room to work with. Now, this argument is at the core of the Ruby/Rails-vs-Java/JEE
debate, and implicitly it's obviously there in the middle of the room in the whole
discussion over Chandler.
&lt;/p&gt;
&lt;p&gt;
Scale(2) is an equally important measurement, since a project that cannot handle the
expected user load during peak usage times will have effectively failed just as surely
as if the project had never shipped in the first place. Part of this will be reflected
in not just the language used but also the tools and libraries that are part of the
overall software footprint, but choice of language can obviously have a major impact
here: Erlang is being tossed about as a good choice for high-scale systems because
of its intrinsic Actors-based model for concurrent processing, for example.
&lt;/p&gt;
&lt;p&gt;
Both of these get tossed back and forth rather carelessly during this debate, usually
along the following lines:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Pro-Java (and pro-.NET, though they haven't gotten into this particular debate so
much as the Java guys have) adherents argue that a dynamic language cannot scale(1)
because of the lack of type-safety commonly found in dynamic languages. Since the
compiler is not there to methodically ensure that parameters obey a certain type contract,
that objects are not asked to execute methods they couldn't possibly satisfy, and
so on. In essence, strongly-typed languages are theorem provers, in that they take
the assertion (by the programmer) that this program is type-correct, and validate
that. This means less work for the programmer, as an automated tool now runs through
a series of tests that the programmer doesn't have to write by hand; as one contributor
to the TSS thread &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=48180#245674"&gt;put
it&lt;/a&gt;: &lt;blockquote&gt;"With static languages like Java, we get a select subset of code
tests, with 100% code coverage, every time we compile. We get those tests for "free".
The price we pay for those "free" tests is static typing, which certainly has hidden
costs."&lt;/blockquote&gt;Note that this argument frequently derails into the world of IDE
support and refactoring (as its witnessed on the TSS thread), pointing out that Eclipse
and IntelliJ provide powerful automated refactoring support that is widely believed
to be impossible on dynamic language platforms. 
&lt;li&gt;
Pro-Java adherents also argue that dynamic languages cannot scale(2) as well as Java
can, because those languages are built on top of their own runtimes, which are arguably
vastly inferior to the engineering effort that goes into the garbage collection facilities
found in the JVM Hotspot or CLR implementations. 
&lt;li&gt;
Pro-Ruby (and pro-Python, though again they're not in the frame of this argument quite
so much) adherents argue that the dynamic nature of these languages means less work
during the creation and maintenance of the codebase, resulting in a far fewer lines-of-code
count than one would have with a more verbose language like Java, thus implicitly
improving the scale(1) of a dynamic language. 
&lt;p&gt;
On the subject of IDE refactoring, scripting language proponents point out that the
original refactoring browser was an implementation built for (and into) Smalltalk,
one of the world's first dynamic languages.
&lt;/p&gt;
&lt;li&gt;
Pro-Ruby adherents also point out that there are plenty of web applications and web
sites that scale(2) "well enough" on top of the MRV (Matz's Ruby VM?) interpreter
that comes "out of the box" with Ruby, despite the widely-described fact that MRV
Ruby Threads are what Java used to call "green threads", where the interpreter manages
thread scheduling and management entirely on its own, effectively using one native
thread underneath. 
&lt;li&gt;
Both sides tend to get caught up in "you don't know as much as me about this" kinds
of arguments as well, essentially relying on the idea that the less you've coded in
a language, the less you could possibly know about that language, and the more you've
coded in a language, the more knowledgeable you must be. Both positions are fallacies:
I know a great deal about D, even though I've barely written a thousand lines of code
in it, because D inherits much of its feature set and linguistic expression from both
Java and C++. Am I a certified expert in it? Hardly--there are likely dozens of D
idioms that I don't yet know, and certainly haven't elevated to the state of intuitive
use, and those will come as I write more lines of D code. But that doesn't mean I
don't already have a deep understanding of how to design D programs, since it fundamentally
remains, as its genealogical roots imply, an object-oriented language. Similar rationale
holds for Ruby and Python and ECMAScript, as well as for languages like Haskell, ML,
Prolog, Scala, F#, and so on: the more you know about "neighboring" languages on the
linguistic geography, the more you know about that language in particular. If two
of you are learning Ruby, and you're a Python programmer, you already have a leg up
on the guy who's never left C++. Along the other end of this continuum, the programmer
who's written half a million lines of C++ code and still never uses the "private"
keyword is &lt;em&gt;not&lt;/em&gt; an expert C++ programmer, no matter what his checkin metrics
claim. (And believe me, I've met way too many of these guys, in more than just the
C++ domain.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
A couple of thoughts come to mind on this whole mess.
&lt;/p&gt;
&lt;h3&gt;Just how refactorable are you?
&lt;/h3&gt;
&lt;p&gt;
First of all, it's a widely debatable point as to the actual refactorability of dynamic
languages. On NFJS speaker panels, Dave Thomas (he of the PickAxe book) would routinely
admit that not all of the refactorings currently supported in Eclipse were possible
on a dynamic language platform given that type information (such as it is in a language
like Ruby) isn't present until runtime. He would also take great pains to point out
that simple search-and-replace across files, something any non-trivial editor supports,
will do many of the same refactorings as Eclipse or IntelliJ provides, since type
is no longer an issue. Having said that, however, it's relatively easy to imagine
that the IDE could be actively "running" the code as it is being typed, in much the
same way that Eclipse is doing constant compiles, tracking type information throughout
the editing process. This is an area I personally expect the various IDE vendors will
explore in depth as they look for ways to capture the dynamic language dynamic (if
you'll pardon the pun) currently taking place.
&lt;/p&gt;
&lt;h3&gt;Who exactly are you for?
&lt;/h3&gt;
&lt;p&gt;
What sometimes gets lost in this discussion is that not all dynamic languages need
be for programmers; a tremendous amount of success has been achieved by creating a
core engine and surrounding it with a scripting engine that non-programmers use to
exercise the engine in meaningful ways. Excel and Word do it, Quake and Unreal (along
with other equally impressively-successful games) do it, UNIX shells do it, and various
enterprise projects I've worked on have done it, all successfully. A model whereby
core components are written in Java/C#/C++ and are manipulated from the UI (or other
"top-of-the-stack" code, such as might be found in nightly batch execution) by these
less-rigorous languages is a powerful and effective architecture to keep in mind,
particularly in combination with the next point....
&lt;/p&gt;
&lt;h3&gt;Where do you run again?
&lt;/h3&gt;
&lt;p&gt;
With the release of JRuby, and the work on projects like IronRuby and Ruby.NET, it's
entirely reasonable to assume that these dynamic languages can and will now run on
top of modern virtual machines like the JVM and the CLR, completely negating arguments
2 and 4. While a dynamic language will usually take some kind of performance and memory
hit when running on top of VMs that were designed for statically-typed languages,
work on the DLR and the MLVM, as well as enhancements to the underlying platform that
will be more beneficial to these dynamic language scenarios, will reduce that. Parrot
may change that in time, but right now it sits at a 0.5 release and doesn't seem to
be making huge inroads into reaching a 1.0 release that will be attractive to anyone
outside of the "bleeding-edge" crowd.
&lt;/p&gt;
&lt;h3&gt;So where does that leave us?
&lt;/h3&gt;
&lt;p&gt;
The allure of the dynamic language is strong on numerous levels. Without having to
worry about type details, the dynamic language programmer can typically slam out more
work-per-line-of-code than his statically-typed compatriot, given that both write
the same set of unit tests to verify the code. However, I think this idea that the
statically-typed developer must produce the same number of unit tests as his dynamically-minded
coworker is a fallacy--a large part of the point of a compiler is to provide those
same tests, so why duplicate its work? Plus we have the guarantee that the compiler
will always execute these tests, regardless of whether the programmer using it remembers
to write those tests or not.
&lt;/p&gt;
&lt;p&gt;
Having said that, by the way, I think today's compilers (C++, Java and C#) are pretty
weak in the type expressions they require and verify. Type-inferencing languages,
like ML or Haskell and their modern descendents, F# and Scala, clearly don't require
the degree of verbosity currently demanded by the traditional O-O compilers. I'm pretty
certain this will get fixed over time, a la how C# has introduced &lt;a href="http://blogs.tedneward.com/2005/09/22/Language+Innovation+C+30+Explained.aspx"&gt;implicitly
typed variables&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Meanwhile, why the rancor between these two camps? It's eerily reminiscent of the
ill-will that flowed back and forth between the C++ and Java communities during Java's
early days, leading me to believe that it's more a concern over job market and emplyability
than it is a real technical argument. In the end, there will continue to be a ton
of Java work for the rest of this decade and well into the next, and JRuby (and Groovy)
afford the Java developer lots of opportunities to learn those dynamic languages and
still remain relevant to her employer.
&lt;/p&gt;
&lt;p&gt;
It's as Marx said, lo these many years ago: "From each language, according to its
abilities, to each project, according to its needs."
&lt;/p&gt;
&lt;p&gt;
Oh, except Perl. Perl just sucks, period. :-)
&lt;/p&gt;
&lt;h3&gt;PostScript
&lt;/h3&gt;
&lt;p&gt;
I find it deeply ironic that the news piece TSS cited at the top of the discussion
claims that the Chandler project failed due to mismanagement, not its choice of implementation
language. It doesn't even mention what language was used to build Chandler, leading
me to wonder if anybody even read the piece before choosing up their sides and throwing
dirt at one another.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=813ea27d-1f63-4e95-8a7f-053d738b2bf4" /&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,813ea27d-1f63-4e95-8a7f-053d738b2bf4.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Ruby</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=bfc9338c-f7a0-40df-80d4-129e6a016f80</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,bfc9338c-f7a0-40df-80d4-129e6a016f80.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,bfc9338c-f7a0-40df-80d4-129e6a016f80.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bfc9338c-f7a0-40df-80d4-129e6a016f80</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
People visiting my house have commented from time to time on the fact that at my house,
there's no WEP key or WPA password to get on the network; in fact, if you were to
park your car in my driveway and open up your notebook, you can jump onto the network
and start browsing away. For years, I've always shrugged and said, "If I can't spot
you sitting in my driveway, you deserve the opportunity to attack my network." Fortunately,
Bruce Schneier, author of the insanely-good-reading <a href="http://www.schneier.com/crypto-gram.html">Crypto-Gram
newsletter</a>, is in the same camp as I:
</p>
        <blockquote>
          <p>
My Open Wireless Network 
</p>
          <p>
Whenever I talk or write about my own security setup, the one thing that surprises
people -- and attracts the most criticism -- is the fact that I run an open wireless
network at home. 
</p>
          <p>
There's no password. There's no encryption. Anyone with wireless capability who can
see my network can use it to access the internet. 
</p>
          <p>
To me, it's basic politeness. Providing internet access to guests is kind of like
providing heat and electricity, or a hot cup of tea. But to some observers, it's both
wrong and dangerous. 
</p>
          <p>
I'm told that uninvited strangers may sit in their cars in front of my house, and
use my network to send spam, eavesdrop on my passwords, and upload and download everything
from pirated movies to child pornography. As a result, I risk all sorts of bad things
happening to me, from seeing my IP address blacklisted to having the police crash
through my door. 
</p>
          <p>
While this is technically true, I don't think it's much of a risk. I can count five
open wireless networks in coffee shops within a mile of my house, and any potential
spammer is far more likely to sit in a warm room with a cup of coffee and a scone
than in a cold car outside my house. And yes, if someone did commit a crime using
my network the police might visit, but what better defense is there than the fact
that I have an open wireless network? If I enabled wireless security on my network
and someone hacked it, I would have a far harder time proving my innocence. 
</p>
          <p>
This is not to say that the new wireless security protocol, WPA, isn't very good.
It is. But there are going to be security flaws in it; there always are. 
</p>
          <p>
I spoke to several lawyers about this, and in their lawyerly way they outlined several
other risks with leaving your network open. 
</p>
          <p>
While none thought you could be successfully prosecuted just because someone else
used your network to commit a crime, any investigation could be time-consuming and
expensive. You might have your computer equipment seized, and if you have any contraband
of your own on your machine, it could be a delicate situation. Also, prosecutors aren't
always the most technically savvy bunch, and you might end up being charged despite
your innocence. The lawyers I spoke with say most defense attorneys will advise you
to reach a plea agreement rather than risk going to trial on child-pornography charges. 
</p>
          <p>
In a less far-fetched scenario, the Recording Industry Association of America is known
to sue copyright infringers based on nothing more than an IP address. The accused's
chance of winning is higher than in a criminal case, because in civil litigation the
burden of proof is lower. And again, lawyers argue that even if you win it's not worth
the risk or expense, and that you should settle and pay a few thousand dollars. 
</p>
          <p>
I remain unconvinced of this threat, though. The RIAA has conducted about 26,000 lawsuits,
and there are more than 15 million music downloaders. Mark Mulligan of Jupiter Research
said it best: "If you're a file sharer, you know that the likelihood of you being
caught is very similar to that of being hit by an asteroid." 
</p>
          <p>
I'm also unmoved by those who say I'm putting my own data at risk, because hackers
might park in front of my house, log on to my open network and eavesdrop on my internet
traffic or break into my computers. 
</p>
          <p>
This is true, but my computers are much more at risk when I use them on wireless networks
in airports, coffee shops and other public places. If I configure my computer to be
secure regardless of the network it's on, then it simply doesn't matter. And if my
computer isn't secure on a public network, securing my own network isn't going to
reduce my risk very much. 
</p>
          <p>
Yes, computer security is hard. But if your computers leave your house, you have to
solve it anyway. And any solution will apply to your desktop machines as well. 
</p>
          <p>
Finally, critics say someone might steal bandwidth from me. Despite isolated court
rulings that this is illegal, my feeling is that they're welcome to it. I really don't
mind if neighbors use my wireless network when they need it, and I've heard several
stories of people who have been rescued from connectivity emergencies by open wireless
networks in the neighborhood. 
</p>
          <p>
Similarly, I appreciate an open network when I am otherwise without bandwidth. If
someone were using my network to the point that it affected my own traffic or if some
neighbor kid was dinking around, I might want to do something about it; but as long
as we're all polite, why should this concern me? Pay it forward, I say. 
</p>
          <p>
Certainly this does concern ISPs. Running an open wireless network will often violate
your terms of service. But despite the occasional cease-and-desist letter and providers
getting pissy at people who exceed some secret bandwidth limit, this isn't a big risk
either. The worst that will happen to you is that you'll have to find a new ISP. 
</p>
          <p>
A company called Fon has an interesting approach to this problem. Fon wireless access
points have two wireless networks: a secure one for you, and an open one for everyone
else. You can configure your open network in either "Bill" or "Linus" mode: In the
former, people pay you to use your network, and you have to pay to use any other Fon
wireless network. 
</p>
          <p>
In Linus mode, anyone can use your network, and you can use any other Fon wireless
network for free. It's a really clever idea. 
</p>
          <p>
Security is always a trade-off. I know people who rarely lock their front door, who
drive in the rain (and, while using a cell phone), and who talk to strangers. In my
opinion, securing my wireless network isn't worth it. And I appreciate everyone else
who keeps an open wireless network, including all the coffee shops, bars and libraries
I have visited in the past, the Dayton International Airport where I started writing
this, and the Four Points Sheraton where I finished. You all make the world a better
place.
</p>
        </blockquote>
        <p>
I'll admit that he's gone to far greater lengths to justify the open wireless network
than I; frankly, the idea that somebody might try to sit in my driveway in order to
hack my desktop machine and store kitty porn on it had never occurred to me. I was
always far more concerned that somebody might sit on my ISP's server, hack my desktop
machine's IP from there and store kitty porn on it. Which is why, like Schneier, I
keep any machine that's in my house as up to date as possible. Granted, that doesn't
protect me against a zero-day exploit, but if an attacker is that determined to put
kitty porn on my machine, I probably couldn't stop them from breaking down my front
door while we're all at work and school and loading it on via a CD-ROM, either. 
</p>
        <p>
And, at least in my neighborhood, I can (barely) find the signal for a few other wireless
networks that are wide open, too, so I know I'm not the only target of opportunity
here.So the prospective kitty porn bandit has his choice of machines to attack, and
frankly I'll take the odds of my machines being the more hardened targets over my
neighbors' machines any day. (Remember, computer security is often an exercise in
convincing the bad guy to go play in somebody else's yard. I wish it were otherwise,
but until we have effective response and deterrence mechanisms, it's going to remain
that way for a long time.) 
</p>
        <p>
I've known a lot of people who leave their front doors unlocked--my grandparents lived
in rural Illinois for sixty some-odd years in the same house, leaving the front door
pretty much unlocked all the time, and the keys to their cars in the drivers' side
sun shade, and never in all that time did any seedy character "break in" to their
home or steal their car. (Hell, after my grandfather died a few years ago, the kids--my
mom and her siblings--descended on the place to get rid of a ton of the junk he'd
collected over the years. I think they would have <em>welcomed</em> a seedy character
trying to make off with the stuff at that point.) 
</p>
        <p>
Point is, as Schneier points out in the last paragraph, security is always a trade-off,
and we must never lose sight of that fact. Remember, dogma is the root of all evil,
and should never be considered a substitute for reasoned thought processes. 
</p>
        <p>
And meanwhile, friends, when you come to my house to visit, enjoy the wireless, the
heat, and the electricity. If you're nice, we may even let you borrow chair for a
while, too. :-)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=bfc9338c-f7a0-40df-80d4-129e6a016f80" />
        <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>My Open Wireless Network</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,bfc9338c-f7a0-40df-80d4-129e6a016f80.aspx</guid>
      <link>http://blogs.tedneward.com/2008/01/15/My+Open+Wireless+Network.aspx</link>
      <pubDate>Tue, 15 Jan 2008 17:45:10 GMT</pubDate>
      <description>&lt;p&gt;
People visiting my house have commented from time to time on the fact that at my house,
there's no WEP key or WPA password to get on the network; in fact, if you were to
park your car in my driveway and open up your notebook, you can jump onto the network
and start browsing away. For years, I've always shrugged and said, "If I can't spot
you sitting in my driveway, you deserve the opportunity to attack my network." Fortunately,
Bruce Schneier, author of the insanely-good-reading &lt;a href="http://www.schneier.com/crypto-gram.html"&gt;Crypto-Gram
newsletter&lt;/a&gt;, is in the same camp as I:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
My Open Wireless Network 
&lt;p&gt;
Whenever I talk or write about my own security setup, the one thing that surprises
people -- and attracts the most criticism -- is the fact that I run an open wireless
network at home. 
&lt;p&gt;
There's no password. There's no encryption. Anyone with wireless capability who can
see my network can use it to access the internet. 
&lt;p&gt;
To me, it's basic politeness. Providing internet access to guests is kind of like
providing heat and electricity, or a hot cup of tea. But to some observers, it's both
wrong and dangerous. 
&lt;p&gt;
I'm told that uninvited strangers may sit in their cars in front of my house, and
use my network to send spam, eavesdrop on my passwords, and upload and download everything
from pirated movies to child pornography. As a result, I risk all sorts of bad things
happening to me, from seeing my IP address blacklisted to having the police crash
through my door. 
&lt;p&gt;
While this is technically true, I don't think it's much of a risk. I can count five
open wireless networks in coffee shops within a mile of my house, and any potential
spammer is far more likely to sit in a warm room with a cup of coffee and a scone
than in a cold car outside my house. And yes, if someone did commit a crime using
my network the police might visit, but what better defense is there than the fact
that I have an open wireless network? If I enabled wireless security on my network
and someone hacked it, I would have a far harder time proving my innocence. 
&lt;p&gt;
This is not to say that the new wireless security protocol, WPA, isn't very good.
It is. But there are going to be security flaws in it; there always are. 
&lt;p&gt;
I spoke to several lawyers about this, and in their lawyerly way they outlined several
other risks with leaving your network open. 
&lt;p&gt;
While none thought you could be successfully prosecuted just because someone else
used your network to commit a crime, any investigation could be time-consuming and
expensive. You might have your computer equipment seized, and if you have any contraband
of your own on your machine, it could be a delicate situation. Also, prosecutors aren't
always the most technically savvy bunch, and you might end up being charged despite
your innocence. The lawyers I spoke with say most defense attorneys will advise you
to reach a plea agreement rather than risk going to trial on child-pornography charges. 
&lt;p&gt;
In a less far-fetched scenario, the Recording Industry Association of America is known
to sue copyright infringers based on nothing more than an IP address. The accused's
chance of winning is higher than in a criminal case, because in civil litigation the
burden of proof is lower. And again, lawyers argue that even if you win it's not worth
the risk or expense, and that you should settle and pay a few thousand dollars. 
&lt;p&gt;
I remain unconvinced of this threat, though. The RIAA has conducted about 26,000 lawsuits,
and there are more than 15 million music downloaders. Mark Mulligan of Jupiter Research
said it best: "If you're a file sharer, you know that the likelihood of you being
caught is very similar to that of being hit by an asteroid." 
&lt;p&gt;
I'm also unmoved by those who say I'm putting my own data at risk, because hackers
might park in front of my house, log on to my open network and eavesdrop on my internet
traffic or break into my computers. 
&lt;p&gt;
This is true, but my computers are much more at risk when I use them on wireless networks
in airports, coffee shops and other public places. If I configure my computer to be
secure regardless of the network it's on, then it simply doesn't matter. And if my
computer isn't secure on a public network, securing my own network isn't going to
reduce my risk very much. 
&lt;p&gt;
Yes, computer security is hard. But if your computers leave your house, you have to
solve it anyway. And any solution will apply to your desktop machines as well. 
&lt;p&gt;
Finally, critics say someone might steal bandwidth from me. Despite isolated court
rulings that this is illegal, my feeling is that they're welcome to it. I really don't
mind if neighbors use my wireless network when they need it, and I've heard several
stories of people who have been rescued from connectivity emergencies by open wireless
networks in the neighborhood. 
&lt;p&gt;
Similarly, I appreciate an open network when I am otherwise without bandwidth. If
someone were using my network to the point that it affected my own traffic or if some
neighbor kid was dinking around, I might want to do something about it; but as long
as we're all polite, why should this concern me? Pay it forward, I say. 
&lt;p&gt;
Certainly this does concern ISPs. Running an open wireless network will often violate
your terms of service. But despite the occasional cease-and-desist letter and providers
getting pissy at people who exceed some secret bandwidth limit, this isn't a big risk
either. The worst that will happen to you is that you'll have to find a new ISP. 
&lt;p&gt;
A company called Fon has an interesting approach to this problem. Fon wireless access
points have two wireless networks: a secure one for you, and an open one for everyone
else. You can configure your open network in either "Bill" or "Linus" mode: In the
former, people pay you to use your network, and you have to pay to use any other Fon
wireless network. 
&lt;p&gt;
In Linus mode, anyone can use your network, and you can use any other Fon wireless
network for free. It's a really clever idea. 
&lt;p&gt;
Security is always a trade-off. I know people who rarely lock their front door, who
drive in the rain (and, while using a cell phone), and who talk to strangers. In my
opinion, securing my wireless network isn't worth it. And I appreciate everyone else
who keeps an open wireless network, including all the coffee shops, bars and libraries
I have visited in the past, the Dayton International Airport where I started writing
this, and the Four Points Sheraton where I finished. You all make the world a better
place.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I'll admit that he's gone to far greater lengths to justify the open wireless network
than I; frankly, the idea that somebody might try to sit in my driveway in order to
hack my desktop machine and store kitty porn on it had never occurred to me. I was
always far more concerned that somebody might sit on my ISP's server, hack my desktop
machine's IP from there and store kitty porn on it. Which is why, like Schneier, I
keep any machine that's in my house as up to date as possible. Granted, that doesn't
protect me against a zero-day exploit, but if an attacker is that determined to put
kitty porn on my machine, I probably couldn't stop them from breaking down my front
door while we're all at work and school and loading it on via a CD-ROM, either. 
&lt;p&gt;
And, at least in my neighborhood, I can (barely) find the signal for a few other wireless
networks that are wide open, too, so I know I'm not the only target of opportunity
here.So the prospective kitty porn bandit has his choice of machines to attack, and
frankly I'll take the odds of my machines being the more hardened targets over my
neighbors' machines any day. (Remember, computer security is often an exercise in
convincing the bad guy to go play in somebody else's yard. I wish it were otherwise,
but until we have effective response and deterrence mechanisms, it's going to remain
that way for a long time.) 
&lt;p&gt;
I've known a lot of people who leave their front doors unlocked--my grandparents lived
in rural Illinois for sixty some-odd years in the same house, leaving the front door
pretty much unlocked all the time, and the keys to their cars in the drivers' side
sun shade, and never in all that time did any seedy character "break in" to their
home or steal their car. (Hell, after my grandfather died a few years ago, the kids--my
mom and her siblings--descended on the place to get rid of a ton of the junk he'd
collected over the years. I think they would have &lt;em&gt;welcomed&lt;/em&gt; a seedy character
trying to make off with the stuff at that point.) 
&lt;p&gt;
Point is, as Schneier points out in the last paragraph, security is always a trade-off,
and we must never lose sight of that fact. Remember, dogma is the root of all evil,
and should never be considered a substitute for reasoned thought processes. 
&lt;p&gt;
And meanwhile, friends, when you come to my house to visit, enjoy the wireless, the
heat, and the electricity. If you're nice, we may even let you borrow chair for a
while, too. :-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=bfc9338c-f7a0-40df-80d4-129e6a016f80" /&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,bfc9338c-f7a0-40df-80d4-129e6a016f80.aspx</comments>
      <category>Development Processes</category>
      <category>Mac OS</category>
      <category>Security</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=7d2e2ba7-867b-476e-953f-121317643c02</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,7d2e2ba7-867b-476e-953f-121317643c02.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,7d2e2ba7-867b-476e-953f-121317643c02.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7d2e2ba7-867b-476e-953f-121317643c02</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Bruce Schneier has <a href="http://www.schneier.com/blog/archives/2007/12/refuse_to_be_te.html">a
great blog post on this</a>. I'm joining the movement, with this declaration:
</p>
        <blockquote>
          <p>
I am not afraid of terrorism, and I want you to stop being afraid on my behalf. Please
start scaling back the official government war on terror. Please replace it with a
smaller, more focused anti-terrorist police effort in keeping with the rule of law.
Please stop overreacting. I understand that it will not be possible to stop all terrorist
acts. I accept that. I am not afraid.
</p>
        </blockquote>
        <p>
In fact, I would amend this a little to include more than just the politically-correct
discussion of terrorism and the government:
</p>
        <blockquote>
          <p>
I am not afraid of security discussions, and I want you to stop being afraid on my
behalf. Please start scaling back the draconian requirements on my passwords and connection
options. Not everything has to run over HTTPS and require passwords that must be 12
characters long and contain an upper-case letter, a lower-case letter, a number, a
punctuation mark, and a letter from the Klingon alphabet. Please replace it with a
smaller, more focused security effort in keeping with the risk involved. Please stop
overreacting. I understand that it will not be possible to stop all acts of security
attack. I accept that. I am not afraid.
</p>
        </blockquote>
        <p>
I want companies not to abandon their security efforts, but to put the effort into
more targeted efforts. Don't spend millions instituting a VPN; instead, spend that
time and money getting developers to find and fix all the command injection and/or
cross-site scripting attacks that plague web applications.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7d2e2ba7-867b-476e-953f-121317643c02" />
        <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>I Refused to be Terrorized</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,7d2e2ba7-867b-476e-953f-121317643c02.aspx</guid>
      <link>http://blogs.tedneward.com/2007/12/30/I+Refused+To+Be+Terrorized.aspx</link>
      <pubDate>Sun, 30 Dec 2007 00:46:57 GMT</pubDate>
      <description>&lt;p&gt;
Bruce Schneier has &lt;a href="http://www.schneier.com/blog/archives/2007/12/refuse_to_be_te.html"&gt;a
great blog post on this&lt;/a&gt;. I'm joining the movement, with this declaration:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I am not afraid of terrorism, and I want you to stop being afraid on my behalf. Please
start scaling back the official government war on terror. Please replace it with a
smaller, more focused anti-terrorist police effort in keeping with the rule of law.
Please stop overreacting. I understand that it will not be possible to stop all terrorist
acts. I accept that. I am not afraid.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In fact, I would amend this a little to include more than just the politically-correct
discussion of terrorism and the government:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I am not afraid of security discussions, and I want you to stop being afraid on my
behalf. Please start scaling back the draconian requirements on my passwords and connection
options. Not everything has to run over HTTPS and require passwords that must be 12
characters long and contain an upper-case letter, a lower-case letter, a number, a
punctuation mark, and a letter from the Klingon alphabet. Please replace it with a
smaller, more focused security effort in keeping with the risk involved. Please stop
overreacting. I understand that it will not be possible to stop all acts of security
attack. I accept that. I am not afraid.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I want companies not to abandon their security efforts, but to put the effort into
more targeted efforts. Don't spend millions instituting a VPN; instead, spend that
time and money getting developers to find and fix all the command injection and/or
cross-site scripting attacks that plague web applications.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=7d2e2ba7-867b-476e-953f-121317643c02" /&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,7d2e2ba7-867b-476e-953f-121317643c02.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=2f428c38-e44d-43c8-bc60-b382a334bd84</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,2f428c38-e44d-43c8-bc60-b382a334bd84.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,2f428c38-e44d-43c8-bc60-b382a334bd84.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2f428c38-e44d-43c8-bc60-b382a334bd84</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
OpenJDK, the open-source JDK 7 release (and no, I don't know if there's any practical
difference between the two) has officially opened for business with the promotion
of the <a href="http://weblogs.java.net/blog/kellyohair/archive/2007/12/openjdk_mercuri_7.html">"real,
live" Mercurial repositories</a>. These are the real deal, the same repositories that
Sun employees will be working on as they modify the code... which means, in all reality,
that there is a <em>very tiny</em> window of opportunity for you to check out code
between changesets that are dependent on one another due to the way they've got the
forest set up--if you get weird build errors, try re-fetching... but more on that
later.
</p>
        <p>
Think about it for a second--now, thanks to the way Mercurial handles source (a distributed
source code system is different from a centralized client/server one like SVN or CVS),
you can hack away on your own private build of the JDK, and still keep up to date
with what Sun's doing. And, if Sun likes what you're doing, you could end up contributing
back to the JDK as a whole.
</p>
        <p>
You could make changes to the langtools bundle to start adding new features you think
should be in Java.
</p>
        <p>
You could make changes to the hotspot bundle to start exploring ways to optimize GC
better.
</p>
        <p>
You could fix bugs you find in the various Java libraries.
</p>
        <p>
You could even add new features to the core classes that you've been saying needed
to be there since Day 1.
</p>
        <p>
You can start exploring the new Modules system (JSR-277) strawman implementation.
</p>
        <p>
Then, you can post your diffs, or just tell people where your changesets are, and
others can play with them.
</p>
        <p>
Cool.
</p>
        <h2>Getting Started
</h2>
        <p>
Meanwhile, for those of you looking to get started with hacking on the JDK, there's
a couple of things you need to do:
</p>
        <ol>
          <li>
Fetch the prereqs. 
</li>
          <li>
Fetch the source through Mercurial. 
</li>
          <li>
Set up your build prompt. 
</li>
          <li>
Type "make" and go away for an hour or two.</li>
        </ol>
        <p>
Naturally, things are just a <em>teeny</em> bit more complicated than that, particularly
if you're on a Windows box. (<strong>Update:</strong> Volker Simonis has blogged,
similar to this post, <a href="http://weblogs.java.net/blog/simonis/archive/2008/01/hotspot_develop.html">his
experience in configuring a Suse Enterprise Linux 9.3 box to build the OpenJDK</a>.)
Thus, as one who's labored through this process on said platform, I'll show you how
I got it all up and running on my machine (well, technically, pseudo-machine, it's
a VMWare image with Windows XP SP2 in it). If you have questions, you're free to send
me email, but chances are I'll just redirect you to build-dev, where the amazing Kelly
O'Hair hangs out and answers build questions. (MAJOR kudos again to Kelly for getting
this done!)
</p>
        <p>
Note that Sun is looking at other platforms, and has some good docs on building for
Ubuntu 6.x and 7.x in the README already known--I've managed that with very little
difficulty, so if you're starting from scratch, I'd suggest grabbing the free VMWare
Player, an Ubuntu 7.04 Desktop image, and use that as a JDK build environment.
</p>
        <p>
While we're at it, along the way, I'll be pointing out areas that I think Sun could
use and would appreciate some community contributions. (People are always asking me
this at conferences, as a way of making their name more well-known and building credibility
in the industry.) Note that I have no "pull" with Sun and can't begin to guess where
they <em>want</em> the help, I'm simply suggesting where I think the help would be
useful--to the community if not to Sun directly.
</p>
        <p>
By the way, the official document for build process requirements is the <a href="http://hg.openjdk.java.net/jdk7/jdk7/raw-file/tip/README-builds.html">OpenJDK
Build README</a>; I only offer this up as a supplement and to offer up my own experiences.
Note that I didn't go "all the way", in that I don't care about building the Java
Plug-In or some of the other ancillary stuff, such as the JDK installer itself, so
I didn't necessarily install all the bits documented on the OpenJDK README page. I
wanted source that I could hack, step into, debug, and so on.
</p>
        <p>
Without further ado....
</p>
        <h1>
        </h1>
        <h2>1. Fetch the prereqs
</h2>
        <p>
This sort of goes without saying, but in order to build the JDK, you need to have
the necessary tools in place.
</p>
        <ul>
          <li>
            <strong>
              <em>Environment.</em>
            </strong> The build needs to be portable across both
Windows and *nix, obviously, so OpenJDK needs a *nix-like environment on the Windows
platform. Originally, back in the JDK 1.2 era, this was a commercial toolkit Sun purchased,
the MKS Toolkit, but obviously that doesn't work for open source, so they've chosen
to use <a href="http://www.cygwin.com">Cygwin</a>. You'll need to make sure you have
a couple of tools explicitly documented by Sun (ar.exe, cpio.exe, make.exe, file.exe,
and m4.exe), but realistically you'll want the rest of the Cygwin developer tools
just to have a complete environment. Cygwin afficionados will (hopefully) weigh in
with what the best packages mix to grab are; I just grabbed everything that looked
tasty at the time, including stuff that had nothing to do with building OpenJDK. Note
that there is a big problem with the make.exe that comes with Cygwin, however... 
(<strong>Update:</strong> Poonam's Weblog notes, "Along with the default installation,
we need to install Devel, Interpreters and Utils packages.") 
<ul><li>
On my system, I put this in C:\Prg\cygwin. 
</li><li>
CONTRIBUTION: There's a lot of MSYS developers who would love it if you could figure
out how to make the build work with their toolchain, too.... and don't ask me how,
because I have no real idea; I'm totally n00b when it comes to the differences between
the two.</li></ul></li>
          <li>
            <strong>
              <em>GNU Make 3.78.1 to 3.80.</em>
            </strong> NOT the 3.81 or later version,
because apparently there's problems with DOS-like paths, like C:/ (which is obviously
going to be a factor on Windows; see some of <a href="http://blogs.sun.com/kto/entry/windows_cygwin_mks_java_and">Kelly's
problems with shells</a> for examples of what he's had to wrestle with). Getting this
turned out to be a pain, and required some searching; Kelly pointed out <a href="http://www.cmake.org/files/cygwin/make.exe">a
patched make.exe on Cygwin</a> that should work. Make sure this make appears <em>before</em> the
regular Cygwin make in your shell prompt (later). (<strong>Update:</strong> Find the
right one <a href="http://cygwin.paracoda.com/release/make/make-3.80-1.tar.bz2">here</a>,
as well.) 
<ul><li>
On my system, I created a directory for the OpenJDK project, in C:\Prg\OpenJDK, and
put GNU make in C:\Prg\OpenJDK\bin. 
</li><li>
CONTRIBUTION: Either fix the damn PATH issues ("Dear Mr. Gates, Would you <em>please</em> tell
your developers to use the right kind of slash, already?"), or else fix Cygwin's make
to recognize C:/ (note the forward slash) paths. Not sure what else could be done
here.</li></ul></li>
          <li>
            <strong>
              <em>Compiler.</em>
            </strong> Sun originally was using the Microsoft Visual
C++ 6.0 environment (which made sense at the time, since they were a company and could
pay for it); with the open-source release... well... turns out that they're still
using the Microsoft tools, only they've also added Microsoft Visual Studio 2003 to
the list of supported compilers. (I'm using MSVS2003 myself.) This is a pain because
both of those environments are commercial, and the Visual C++ 2005 Express (which
is free) doesn't seem to work yet. People have suggested other compilers (Watcom's
OpenC++, Cygwin's gcc, and so on), but right now that doesn't sound like a high priority
for Sun. Of course, it's fair to suggest that if you're building for Windows, you
probably have a MSVS installation somewhere, but still, it'd be nice.... 
<ul><li>
On my system, I put MSVS2003 in C:\Prg\MSVS2003. Note that I *just* installed the
Visual C++ bits, and left out the rest of the .NET stuff. (I do .NET in another VMWare
image, so I don't need it here.) To make our life simpler, reister the environment
variables globally. (This is an install option.) 
</li><li>
CONTRIBUTION: Port the makefiles to use <a href="http://www.microsoft.com/express/vc/Default.aspx">Visual
C++ 2005 Express</a>, or one of the other free compilers. I would think the easiest
transition would be to VC2005Ex, but there may be some tools missing from the Express
editions that the build needs; I haven't spent much time here researching what's working
and not. This would likely be (much) harder for other compilers, owing to the differences
in toolchains. 
</li><li>
CONTRIBUTION: Port the makefiles to use Visual Studio 2008.</li></ul></li>
          <li>
            <strong>
              <em>DirectX SDK.</em>
            </strong> Yes, you need the DirectX SDK, specifically
the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FD044A42-9912-42A3-9A9E-D857199F888E&amp;displaylang=en">Summer
2004 9.X Update</a>, for building some of the advanced graphics stuff. The Build README
has it linked there, as well, and the link, as of this writing, is still good. Install
it, then take note of the DXSDK environment variable--we'll need it later. 
<ul><li>
On my system, I put DirectX in C:\Prg\DirectX9SDK_062005.</li></ul></li>
          <li>
            <strong>
              <em>FreeType 2.</em>
            </strong> This is something to do with fonts, and is needed
to remove a commercial dependency that was holding up the OpenJDK from building about
a year ago. <a href="http://www.freetype.org/">Grab it</a>, install it, and note the
headers and lib directory. The FreeType <a href="http://gnuwin32.sourceforge.net/packages/freetype.htm">download
page</a> has some links to pre-built stuff, but in the end, you just want freetype.dll,
freetype.lib, and the various FreeType headers. 
<ul><li>
On my system, I put these in C:\Prg\OpenJDK\deps\freetype-igor (named after the helpful
soul on build-dev who was kind enough to send me his pre-built FreeType bits). Note
that underneath that directory, I have windows/freetype-i586/headers and /lib, which
I'll use later for environment variables. 
</li><li>
CONTRIBUTION: Put a "JDK-specific" bundle of FreeType somewhere on the Web for people
to download and not have to build. :-)</li></ul></li>
          <li>
            <strong>
              <em>A "bootstrap" JDK.</em>
            </strong> Go grab <a href="http://java.sun.com/javase/downloads/index.jsp">JDK
1.6</a>; you'll need this for building the Java bits. (I would hope this isn't a problem
for you; if it is, you <em>may</em> want to quickly go to some other Web page. <em>Any</em> web
page.) 
<ul><li>
On my system, this resides in C:\Prg\jdk1.6.0.</li></ul></li>
          <li>
            <strong>
              <em>Apache Ant.</em>
            </strong> At least version 1.6.3, I'm using <a href="http://ant.apache.org/bindownload.cgi">1.7</a> without
a problem. 
<ul><li>
On my system, this resides in C:\Prg\apache-ant-1.7.0.</li></ul></li>
          <li>
            <strong>
              <em>The "binary plugs".</em>
            </strong> As much work has Sun has done to unencumber
the JDK, there's still little bits and pieces that are commercial that they can't
release the source to, so they put them into a "binary plugs" package and have you
install it, then point to it in the build scripts, and copy those files over. They
get versioned every time Sun releases a built JDK 7 bundle, but I don't think you
need to <a href="http://download.java.net/openjdk/jdk7/">grab this</a> more than once;
just the same, keep an eye on that as time goes on, and if you get weird build errors,
check build-dev to see if the plugs changed. 
<ul><li>
On my system, this resides in C:\Prg\OpenJDK\deps\openjdk-binary-plugs. (The .jar
file is an executable jar, so just "java -jar" it and tell it to install in C:\Prg\OpenJDK\deps;
it adds the rest. It's done in 3 seconds, and consists of 1 file. Now you see why
I wouldn't worry too much about this.)</li></ul></li>
          <li>
            <strong>
              <em>Mercurial.</em>
            </strong> This is a distributed revision control system,
and there's lots more to say about that at the <a href="http://www.selenic.com/mercurial/wiki/index.cgi/Mercurial">Mercurial
website</a>. Its commands look somewhat similar to SVN, though definitely read <a href="http://hgbook.red-bean.com/">"Distributed
Revision Control with Mercurial"</a> if you're going to be keeping up with the source
trees as they go. You *want* the "forest" extension as part of your Mercurial binary,
so grab the <a href="http://qct.sourceforge.net/Mercurial-BI.html">"Batteries Included"</a> installer
version. I went with the non-TortoiseHG version, and had to download all four of the
released files off that page and install and uninstall and install and uninstall until
I found one that worked (the "win32extrasp1.exe" version in the "dec" release list
on Sourceforge). 
<ul><li>
On my system, Mercurial lives in C:\Prg\Mercurial. Put in on the PATH so you have
access to "hg.exe". 
</li><li>
CONTRIBUTION: Figure out what the differences are and post it someplace--how to get
the "forest" extension installed and turned on in Mercurial was a <em>pain</em>; Google
was of little to no help here. (Tag it as a comment to this blog entry, if you like,
and I'll update the entry itself once I see it.) 
</li><li><strong>Update:</strong><a href="http://blogs.sun.com/jmxetc/entry/how_i_installed_the_mercurial">Daniel
Fuchs blogs</a> about how to get Mercurial's "forest" extension installed in your
installation, in case you don't get the "Batteries Included" version: <blockquote><p>
I simply cloned the <a href="http://www.terminus.org/hg/hgforest">forest repository</a> in <code>c:\Mercurial</code>.
In a cygwin terminal: 
</p><pre>  cd c:/Mercurial
  hg clone http://www.terminus.org/hg/hgforest  hgforest
</pre><p>
Then I edited <code>c:/Mercurial/Mercurial.ini</code> and added the lines:
</p><pre>  [extensions]
  forest=c:/Mercurial/hgforest/forest.py
</pre><p>
as documented in the <a href="http://www.selenic.com/mercurial/wiki/index.cgi/ForestExtension">Mercurial
Wiki</a>. 
</p></blockquote></li></ul></li>
          <li>
            <strong>
              <em>Optional: FindBugs.</em>
            </strong> The build will start using FindBugs
to do source-analysis to find bugs before they happen, so it's not a bad idea to have
that as well. 
<ul><li>
On my system, this resides in C:\Prg\findbugs-1.2.1.</li></ul></li>
        </ul>
        <p>
At this point, you should be ready to go.
</p>
        <h2>2. Fetch the source.
</h2>
        <p>
          <a href="http://blogs.sun.com/navi/entry/openjdk_mercurial_repositories_are_open">Ivan's
got it (mostly) right</a>: just do this:
</p>
        <blockquote>
          <p>
            <font face="Courier New">cd C:\Prg\OpenJDK</font>
          </p>
          <p>
            <font face="Courier New">md jdk7</font>
          </p>
          <p>
            <font face="Courier New">hg fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7</font>
          </p>
        </blockquote>
        <p>
(Don't use MASTER as he does, I don't think that works--that was just for the experimental
repositories.) Don't forget the trailing slash, either, or you'll get an error saying
something along the lines of http://hg.openjdk.java.net/jdk7%5Ccorba is not a valid
URL or somesuch.
</p>
        <p>
If your Mercurial doesn't have the "forest" extension, "fclone" won't work; Ivan's
got tips on how to pull down the sub-repositories by hand, but I get nervous doing
that because what if the list changes and I wasn't paying attention?
</p>
        <p>
Your network will go wild for about twenty minutes or so, maybe longer, pulling lots
of stuff down from the URL above. The sources should now reside in C:\Prg\OpenJDK\jdk7.
Go browse 'em for a bit, if you feel so inclined. Get a good rush going, because this
next step can be the tricky one.
</p>
        <p>
          <strong>Update:</strong> Volker Simonis ran into some issues with using Mercurial
and an HTTP proxy, and found it difficult to find assistance across the Web. In the
interests of making it easier for others, he's allowed me to republish his experience
here:
</p>
        <blockquote>
          <p>
I just had a real hard time to get the forest extension working and finally found
out that it was because the forest extension doesn't honor the "http_proxy" environment
variable. So I thought I'll post it here in case anybody else will face the same problem
in order to save him some time. (If you're only interested in the solution of the
problem, you can skip the next paragraphs and jump right to the end of this post).
</p>
          <p>
I installed Mercurial and the forest extension as described in various places, here
on the list and on the Web - that was the easy part:) Afterwards I could do:
</p>
          <pre>/share/software/OpenJDK&gt; hg clone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7
requesting all changes
adding changesets
adding manifests 
adding file changes
added 2 changesets with 26 changes to 26 files<br />
26 files updated, 0 files merged, 0 files removed, 0 files unresolved </pre>
          <p>
So everything worked fine! Note that I'm behind a firewall, but Mercurial correctly
picked up my http proxy from the "http_proxy" environment variable! 
</p>
          <p>
But now, everytime I tried 'fclone', I got the following error: 
</p>
          <pre>/share/software/OpenJDK&gt; hg fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7 
[.]
abort: error: Name or service not known
</pre>
          <p>
That was not amusing. First I thought I got something wrong during the installation
of the forest extension. I than used the '--traceback' option to "hg" which told me
that the error was in keepalive.py: 
</p>
          <pre>/share/software/OpenJDK&gt; hg --traceback fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7 
[.] 
Traceback (most recent call last):
...
File "/share/software/Python-2.5.1_bin/lib/python2.5/site-packages/mercurial/keepalive.py", 
line 328, in _start_transaction raise urllib2.URLError(err)
URLError: &lt;urlopen error (-2, 'Name or service not known')&gt;
abort: error: Name or service not known 
</pre>
          <p>
So I enabled the debugging output in keepalive.py and realized, that the first two
connections to hg.openjdk.java.net where made trough the proxy, while the third one
(the first that actually fetches files), wants to go directly to hg.openjdk.java.net,
which badly fails: 
</p>
          <pre>/share/software/OpenJDK&gt; hg fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7
keepalive.py - creating new connection to proxy:8080 (1078835788)
keepalive.py - STATUS: 200, OK
keepalive.py - re-using connection to proxy:8080 (1078835788)
keepalive.py - STATUS: 200, OK 
[.]
keepalive.py - creating new connection to hg.openjdk.java.net (1078970092)
abort: error: Name or service not known
</pre>
          <p>
The problem can be fixed by adding the proxy settings to your .hgrc file, like this: 
</p>
          <pre>[http_proxy]
host=proxy:8080
</pre>
          <p>
where you have to replace "proxy:8080" with the name and the port of your real proxy
host!
</p>
        </blockquote>
        <p>
Volker's original email came from the buid-dev list, and if you have further questions
about Mercrial and HTTP proxies, I'd suggest that as a resource.
</p>
        <p>
        </p>
        <h2>3. Set up your environment.
</h2>
        <p>
This is where you'll spend a fair amount of time, because getting this right can be
ugly. There's some environment variables that tell the build script where to find
things, and we have to point out those things, like compiler location and such. If
you installed everything in the same places I did, then the following, which I put
into C:\Prg\OpenJDK\build_shell.sh, <em>should</em> work for you:
</p>
        <blockquote>
          <p>
            <font face="Courier New">#!/bin/sh </font>
          </p>
          <p>
            <font face="Courier New"># "External" bits (outside of OpenJDK path structure)<br />
#<br />
export ALT_BOOTDIR=C:/Prg/jdk1.6.0<br />
export ANT_HOME=c:/Prg/apache-ant-1.7.0<br />
export FINDBUGS_HOME=/cygdrive/c/Prg/findbugs-1.2.1 </font>
          </p>
          <p>
            <font face="Courier New"># OpenJDK flag (to make FreeType check pass)<br />
#<br />
export OPENJDK=true </font>
          </p>
          <p>
            <font face="Courier New">export OPENJDK_HOME=C:/Prg/OpenJDK<br />
openjdkpath=$(cygpath --unix $OPENJDK_HOME) </font>
          </p>
          <p>
            <font face="Courier New"># OpenJDK-related bits<br />
# (ALT_JDK_IMPORT_PATH fixes a corba bug; remove it later)<br />
#<br />
export ALT_JDK_IMPORT_PATH=$(cygpath --unix C:/Prg/jdk1.6.0)<br />
export ALT_BINARY_PLUGS_PATH=$OPENJDK_HOME/openjdk-binary-plugs<br />
export ALT_UNICOWS_DLL_PATH=$OPENJDK_HOME/deps/unicows<br />
export ALT_FREETYPE_LIB_PATH=$OPENJDK_HOME/deps/freetype-igor/windows/freetype-i586/lib<br />
export ALT_FREETYPE_HEADERS_PATH=$OPENJDK_HOME/deps/freetype-igor/windows/freetype-i586/include/freetype2<br />
. $openjdkpath/jdk7/jdk/make/jdk_generic_profile.sh </font>
          </p>
          <p>
            <font face="Courier New"># Need GNU make in front of Cygwin's; this is the only practical
way to do it<br />
#<br />
PATH=$openjdkpath/bin:$PATH<br />
export PATH </font>
          </p>
          <p>
            <font face="Courier New"># Let people know this is an OpenJDK-savvy prompt<br />
#<br />
export PS1='OpenJDK:\[\e]0;\w\a\]\[\e[32m\]\u@${COMPUTERNAME}:\[\e[33m\]\w\[\e[0m\]\n\$
'</font>
          </p>
        </blockquote>
        <p>
          <strike>Note the UNICOWS_DLL thing in the middle; this was necessary in earlier builds,
and I don't know if it still is. For now I'm not messing with it; if you discover
that you need it, the Build README has links.</strike> (<strong>Update:</strong> Kelly
confirmed that this is no longer necessary in the OpenJDK build. Yay!)
</p>
        <p>
Note that I set the COMPILER_VERSION flag to tell the build script which compiler
I'm using--if that's not set, the build fails pretty quickly, complaining that "COMPILER_VERSION"
cannot be empty. (<strong>Update:</strong> Kelly mentions, "I suspect the reason you
are having the COMPILER_VERSION problem is that the makefiles are trying to run cl.exe
to get the version, and if the PATH/LIB/INCLUDE env variables are not setup right,
cl.exe fails. Several people have run into that problem.")
</p>
        <p>
Note that OPENJDK must be set, or the build process thinks this is a commercial build,
and an early sanity-check to see what version of FreeType is running will fail. (Specfically,
Sun builds a tool just to see if the code compiles; if it fails to compile, chances
are you forgot to set this flag. That's been my problem, each and every time I tried
to rebuild the OpenJDK build space. Hopefully I never forget it again.)
</p>
        <p>
Note that I call into jdk_generic_profile.sh to do some more setup work; this gets
all the MSVS2003 stuff into the PATH as well.
</p>
        <p>
Be very careful with which path you use; sometimes the build wants C:/Prg style paths,
and sometimes it wants /cygdrive/c/Prg style paths. Don't assume the script above
is perfect--I'm still testing it, and will update this entry as necessary as I find
bugs in it.
</p>
        <p>
(<strong>Update:</strong> Kelly mentions, "Be careful putting cygwin before VS2003
in the PATH, cygwin has a link.exe and so does VS2003, you need the one from VS2003.")
</p>
        <p>
From a Cygwin bash prompt,
</p>
        <blockquote>
          <p>
            <font face="Courier New">cd /cygdrive/c/Prg/OpenJDK</font>
          </p>
          <p>
            <font face="Courier New">. ./build_shell.sh</font>
          </p>
          <p>
            <font face="Courier New">cd jdk7</font>
          </p>
          <p>
            <font face="Courier New">make sanity</font>
          </p>
        </blockquote>
        <p>
It will churn, think, text will go flying by, and you will (hopefully) see "Sanity
check passed". If not, look at the (voluminous) output to figure out what paths are
wrong, and correct them. Note that certain paths may be reported as warnings and yet
the buld will still succeed, that's OK, as far as I can tell.
</p>
        <p>
And no, I don't know what all of those environment variables are for. Kelly might,
but I suspect there's a lot of built-up cruft from over the years that they'd like
to start paring down. Let's hope.
</p>
        <h2>4. Type "make" and go away for a while.
</h2>
        <p>
Specifically, type "make help" to see the list of targets.
</p>
        <blockquote>
          <p>
            <font face="Courier New">OpenJDK:Ted@XPJAVA:/cygdrive/c/Prg/OpenJDK/jdk7<br />
$ make help<br />
Makefile for the JDK builds (all the JDK). </font>
          </p>
          <p>
            <font face="Courier New">--- Common Targets ---<br />
all -- build the core JDK (default target)<br />
help -- Print out help information<br />
check -- Check make variable values for correctness<br />
sanity -- Perform detailed sanity checks on system and settings<br />
fastdebug_build -- build the core JDK in 'fastdebug' mode (-g -O)<br />
debug_build -- build the core JDK in 'debug' mode (-g)<br />
clean -- remove all built and imported files<br />
clobber -- same as clean </font>
          </p>
          <p>
            <font face="Courier New">--- Common Variables ---<br />
ALT_OUTPUTDIR - Output directory<br />
OUTPUTDIR=./build/windows-i586<br />
ALT_PARALLEL_COMPILE_JOBS - Solaris/Linux parallel compile run count<br />
PARALLEL_COMPILE_JOBS=2<br />
ALT_SLASH_JAVA - Root of all build tools, e.g. /java or J:<br />
SLASH_JAVA=J:<br />
ALT_BOOTDIR - JDK used to boot the build<br />
BOOTDIR=C:/Prg/jdk1.6.0<br />
ALT_JDK_IMPORT_PATH - JDK used to import components of the build<br />
JDK_IMPORT_PATH=c:/Prg/JDK16~1.0<br />
ALT_COMPILER_PATH - Compiler install directory<br />
COMPILER_PATH=C:/Prg/MSVS2003/Common7/Tools/../../Vc7/Bin/<br />
ALT_CACERTS_FILE - Location of certificates file<br />
CACERTS_FILE=/lib/security/cacerts<br />
ALT_DEVTOOLS_PATH - Directory containing zip and gnumake<br />
DEVTOOLS_PATH=/usr/bin/<br />
ALT_DXSDK_PATH - Root directory of DirectX SDK<br />
DXSDK_PATH=C:/Prg/DIRECT~1<br />
ALT_MSDEVTOOLS_PATH - Root directory of VC++ tools (e.g. rc.exe)<br />
MSDEVTOOLS_PATH=C:/Prg/MSVS2003/Common7/Tools/../../Vc7/Bin/<br />
ALT_MSVCRT_DLL_PATH - Directory containing mscvrt.dll<br />
MSVCRT_DLL_PATH=C:/WINDOWS/system32<br />
WARNING: SLASH_JAVA does not exist, try make sanity<br />
WARNING: CACERTS_FILE does not exist, try make sanity </font>
          </p>
          <p>
            <font face="Courier New">--- Notes ---<br />
- All builds use same output directory unless overridden with<br />
ALT_OUTPUTDIR=&lt;dir&gt;, changing from product to fastdebug you may want<br />
to use the clean target first.<br />
- JDK_IMPORT_PATH must refer to a compatible build, not all past promoted<br />
builds or previous release JDK builds will work.<br />
- The fastest builds have been when the sources and the BOOTDIR are on<br />
local disk. </font>
          </p>
          <p>
            <font face="Courier New">--- Examples ---<br />
make fastdebug_build<br />
make ALT_OUTPUTDIR=/tmp/foobar all<br />
make ALT_OUTPUTDIR=/tmp/foobar fastdebug_build<br />
make ALT_OUTPUTDIR=/tmp/foobar all<br />
make ALT_BOOTDIR=/opt/java/jdk1.5.0<br />
make ALT_JDK_IMPORT_PATH=/opt/java/jdk1.6.0 </font>
          </p>
          <p>
            <font face="Courier New">OpenJDK:Ted@XPJAVA:/cygdrive/c/Prg/OpenJDK/jdk7<br />
$</font>
          </p>
        </blockquote>
        <p>
The one I want is "make fastdebug_build" or "make debug_build" (so I have debug symbols
and can go spelunking). Do it.
</p>
        <p>
Watch the stuff go flying by.
</p>
        <p>
Get bored.
</p>
        <p>
Get lunch.
</p>
        <p>
Come back, it might be done. :-)
</p>
        <p>
If it's a successful build, you'll have "stuff" in the C:\Prg\OpenJDK\jdk7\build directory,
corresponding to the kind of build you kicked off; for a "fastdebug" build, for example,
there'll be a "windows-i586-fastdebug" directory in which you'll find a "j2sdk-image"
directory in which there <em>should</em> be a complete JDK environment. Try running
Java and see if it works (make sure your PATH is updated to point to the right place
before you do!)
</p>
        <p>
If not, it's debugging time. :-) Note that the "build" directory is completely built
from scratch, so if you get a partial build and want to start over from scratch, just
"rd /s build" from the jdk7 directory. (It's easier than "make clean" or "make clobber",
I've found.)
</p>
        <h2>More About Builds
</h2>
        <p>
When building the JDK, you may want to build bits "underneath" the top-level directory,
but doing this is a tad tricky. I asked about this on the build-dev list, and Kelly
responded with a great email about the build process, specifically about launching
"sub" makes within the system:
</p>
        <blockquote>
          <p>
Due to history, a build directly from the jdk/make directories uses a default OUTPUTDIR
of jdk/build/* but if FASTDEBUG=true, it's jdk/build/*-fastdebug, or if a plain debug
build with just VARIANT=DBG it would be jdk/build/*-debug The variant builds leave
results in a completely separate outputdir. 
</p>
          <p>
If you used the very top level makefile (which came from the now defunct control/make
area) the default OUTPUTDIR is ./build/* (at the very top of the repositories). When
this top level Makefile runs the jdk/make Makefiles, it passes in a ALT_OUTPUTDIR
to refer to this top level build result area because it's default outputdir is not
the same place. 
</p>
          <p>
I don't know the complete history as to why this was done this way, but my tendency
is to try and get us back to a single default OUTPUTDIR for all the repositories.
Someday... 
</p>
          <p>
This is what I do when I work on just the jdk repository:<br />
cd jdk/make &amp;&amp; gnumake
</p>
          <p>
That primes the outputdir area, then I can drop down in:<br />
cd jdk/make/java &amp;&amp; gnumake
</p>
          <p>
Or even drop in and clean an area and re-build it:<br />
cd jdk/make/jpda &amp;&amp; gnumake clean &amp;&amp; gnumake 
</p>
          <p>
Or just repeat the entire build (incremental build)<br />
cd jdk/make &amp;&amp; gnumake
</p>
          <p>
If I wanted the jdk image (j2sdk-image), I would need to:<br />
cd jdk/make &amp;&amp; gnumake image 
</p>
          <p>
But the output by default will go to jdk/build/* and a different directory if VARIANT=DBG
or FASTDEBUG=true. 
</p>
        </blockquote>
        <p>
This should help having to go through the whole process for incremental updates. (Note
that on my system, I had to call it "make" instead of "gnumake".)
</p>
        <h2>Futures
</h2>
        <p>
As time goes on, I'll hopefully find the time to blog about how to find various little
things in the JDK and make source-modifications to prove that they work, and use that
as a springboard from which to let you start hacking on the JDK. In the meantime, <em>please</em>,
if you run into trouble and find fixes to any of the above, comment or email me, and
I'll correct this.
</p>
        <h2>Contributions/Suggested TODOs
</h2>
        <ul>
          <li>
Have the make system automatically capture the results of the build in a log file,
for easier debugging. Granted, you can "make &gt;| build.output", but that seems tedious
when it could easily be captured automagically for you each time. ("make sanity" does
this, capturing the results in build/windows-i586-fastdebug/sanityCheckMessages.txt
and sanityCheckWarnings.txt. 
</li>
          <li>
Documentation, documentation, documentation. This thing does a lot of recursive makes
and invokes a lot of tools (some of them built as part of the build process itself),
and it would be <em>much</em> easier to debug and understand if the process were better
documented. Even a simple flowchart/tree of the various Make invocations and what
each does (in practice) would be helpful when trying to track down issues. 
</li>
          <li>
Add support for all output to be captured into a build log file. This can obviously
be done at the command-line via "make |&amp; tee build.log" or "&gt;&amp; build.log",
but I think it'd be nice if it were somehow folded in as part of the build process
so it happened automatically.</li>
        </ul>
        <h2>Updates 
</h2>
        <ol>
          <li>
Kelly OHair sent me some updated information, such as the right link to use for the
README file (from the HG repository instead of the SVN one). 
</li>
          <li>
Kelly also mentioned that the plugin and installers are not part of the OpenJDK build
yet, so that's not something I could build even if I wanted to. Which is fine, for
me. :-) 
</li>
          <li>
Kelly confirmed that UNICOWS is not needed in OpenJDK. 
</li>
          <li>
Kelly mentions that link.exe on the PATH must be VS2003's, not Cygwin's. 
</li>
          <li>
Kelly mentions the COMPILER_VERSION problem might be PATH issues. 
</li>
          <li>
Kelly notes, "On the C:\ vs C:/ vs. /cyg*/ paths, I try and use the C:/ all the time
everywhere, and anywhere in the Makefiles where I know I need C:\ or the /cyg*/ paths,
I try and use cygpath or MKS dosname to force them into the right form. NMAKE.EXE
only likes C:\ paths, and cygwin PATH only wants /cyg*/ paths, and Windows/Java/MKS
never want /cyg*/ paths. :^( I wish we had a better solution on Windows for this shell/path
mania." 
</li>
          <li>
Poonam's Weblog has a good page on <a href="http://blogs.sun.com/poonam/entry/building_openjdk_on_windows">building
the OpenJDK on Windows with NetBeans</a>, from which I've stolen... ahem, <em>leveraged</em>...
some links. His webpage has a link for the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=73BA7BD7-ED06-4F0D-80A4-2A7EEAEE17E2&amp;displaylang=en">UNICOWS
download page</a>, but that only includes the DLL, not the .LIB, which you will also
need. (It's an import library for the DLL; you need both.) The only place I know to
get the .LIB is from the Platform SDK, and you need an old one, circa November 2001
or so. I don't know if it's kosher to redistribute any other way (meaning, Microsoft
won't let us, as far as I know). 
</li>
          <li>
Added Volker Simonis' experiences with HTTP proxies in Mercurial 
</li>
          <li>
Added the "sub" make build discussion from Kelly on build-dev 
</li>
          <li>
Added the link to Volker's blog about building on Suse Linux</li>
        </ol>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=2f428c38-e44d-43c8-bc60-b382a334bd84" />
        <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>Let the JDK Hacking Begin...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,2f428c38-e44d-43c8-bc60-b382a334bd84.aspx</guid>
      <link>http://blogs.tedneward.com/2007/12/15/Let+The+JDK+Hacking+Begin.aspx</link>
      <pubDate>Sat, 15 Dec 2007 10:35:59 GMT</pubDate>
      <description>&lt;p&gt;
OpenJDK, the open-source JDK 7 release (and no, I don't know if there's any practical
difference between the two) has officially opened for business with the promotion
of the &lt;a href="http://weblogs.java.net/blog/kellyohair/archive/2007/12/openjdk_mercuri_7.html"&gt;"real,
live" Mercurial repositories&lt;/a&gt;. These are the real deal, the same repositories that
Sun employees will be working on as they modify the code... which means, in all reality,
that there is a &lt;em&gt;very tiny&lt;/em&gt; window of opportunity for you to check out code
between changesets that are dependent on one another due to the way they've got the
forest set up--if you get weird build errors, try re-fetching... but more on that
later.
&lt;/p&gt;
&lt;p&gt;
Think about it for a second--now, thanks to the way Mercurial handles source (a distributed
source code system is different from a centralized client/server one like SVN or CVS),
you can hack away on your own private build of the JDK, and still keep up to date
with what Sun's doing. And, if Sun likes what you're doing, you could end up contributing
back to the JDK as a whole.
&lt;/p&gt;
&lt;p&gt;
You could make changes to the langtools bundle to start adding new features you think
should be in Java.
&lt;/p&gt;
&lt;p&gt;
You could make changes to the hotspot bundle to start exploring ways to optimize GC
better.
&lt;/p&gt;
&lt;p&gt;
You could fix bugs you find in the various Java libraries.
&lt;/p&gt;
&lt;p&gt;
You could even add new features to the core classes that you've been saying needed
to be there since Day 1.
&lt;/p&gt;
&lt;p&gt;
You can start exploring the new Modules system (JSR-277) strawman implementation.
&lt;/p&gt;
&lt;p&gt;
Then, you can post your diffs, or just tell people where your changesets are, and
others can play with them.
&lt;/p&gt;
&lt;p&gt;
Cool.
&lt;/p&gt;
&lt;h2&gt;Getting Started
&lt;/h2&gt;
&lt;p&gt;
Meanwhile, for those of you looking to get started with hacking on the JDK, there's
a couple of things you need to do:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Fetch the prereqs. 
&lt;li&gt;
Fetch the source through Mercurial. 
&lt;li&gt;
Set up your build prompt. 
&lt;li&gt;
Type "make" and go away for an hour or two.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Naturally, things are just a &lt;em&gt;teeny&lt;/em&gt; bit more complicated than that, particularly
if you're on a Windows box. (&lt;strong&gt;Update:&lt;/strong&gt; Volker Simonis has blogged,
similar to this post, &lt;a href="http://weblogs.java.net/blog/simonis/archive/2008/01/hotspot_develop.html"&gt;his
experience in configuring a Suse Enterprise Linux 9.3 box to build the OpenJDK&lt;/a&gt;.)
Thus, as one who's labored through this process on said platform, I'll show you how
I got it all up and running on my machine (well, technically, pseudo-machine, it's
a VMWare image with Windows XP SP2 in it). If you have questions, you're free to send
me email, but chances are I'll just redirect you to build-dev, where the amazing Kelly
O'Hair hangs out and answers build questions. (MAJOR kudos again to Kelly for getting
this done!)
&lt;/p&gt;
&lt;p&gt;
Note that Sun is looking at other platforms, and has some good docs on building for
Ubuntu 6.x and 7.x in the README already known--I've managed that with very little
difficulty, so if you're starting from scratch, I'd suggest grabbing the free VMWare
Player, an Ubuntu 7.04 Desktop image, and use that as a JDK build environment.
&lt;/p&gt;
&lt;p&gt;
While we're at it, along the way, I'll be pointing out areas that I think Sun could
use and would appreciate some community contributions. (People are always asking me
this at conferences, as a way of making their name more well-known and building credibility
in the industry.) Note that I have no "pull" with Sun and can't begin to guess where
they &lt;em&gt;want&lt;/em&gt; the help, I'm simply suggesting where I think the help would be
useful--to the community if not to Sun directly.
&lt;/p&gt;
&lt;p&gt;
By the way, the official document for build process requirements is the &lt;a href="http://hg.openjdk.java.net/jdk7/jdk7/raw-file/tip/README-builds.html"&gt;OpenJDK
Build README&lt;/a&gt;; I only offer this up as a supplement and to offer up my own experiences.
Note that I didn't go "all the way", in that I don't care about building the Java
Plug-In or some of the other ancillary stuff, such as the JDK installer itself, so
I didn't necessarily install all the bits documented on the OpenJDK README page. I
wanted source that I could hack, step into, debug, and so on.
&lt;/p&gt;
&lt;p&gt;
Without further ado....
&lt;/p&gt;
&lt;h1&gt;
&lt;/h1&gt;
&lt;h2&gt;1. Fetch the prereqs
&lt;/h2&gt;
&lt;p&gt;
This sort of goes without saying, but in order to build the JDK, you need to have
the necessary tools in place.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Environment.&lt;/em&gt;&lt;/strong&gt; The build needs to be portable across both
Windows and *nix, obviously, so OpenJDK needs a *nix-like environment on the Windows
platform. Originally, back in the JDK 1.2 era, this was a commercial toolkit Sun purchased,
the MKS Toolkit, but obviously that doesn't work for open source, so they've chosen
to use &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt;. You'll need to make sure you have
a couple of tools explicitly documented by Sun (ar.exe, cpio.exe, make.exe, file.exe,
and m4.exe), but realistically you'll want the rest of the Cygwin developer tools
just to have a complete environment. Cygwin afficionados will (hopefully) weigh in
with what the best packages mix to grab are; I just grabbed everything that looked
tasty at the time, including stuff that had nothing to do with building OpenJDK. Note
that there is a big problem with the make.exe that comes with Cygwin, however...&amp;nbsp;
(&lt;strong&gt;Update:&lt;/strong&gt; Poonam's Weblog notes, "Along with the default installation,
we need to install Devel, Interpreters and Utils packages.") 
&lt;ul&gt;
&lt;li&gt;
On my system, I put this in C:\Prg\cygwin. 
&lt;li&gt;
CONTRIBUTION: There's a lot of MSYS developers who would love it if you could figure
out how to make the build work with their toolchain, too.... and don't ask me how,
because I have no real idea; I'm totally n00b when it comes to the differences between
the two.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;GNU Make 3.78.1 to 3.80.&lt;/em&gt;&lt;/strong&gt; NOT the 3.81 or later version,
because apparently there's problems with DOS-like paths, like C:/ (which is obviously
going to be a factor on Windows; see some of &lt;a href="http://blogs.sun.com/kto/entry/windows_cygwin_mks_java_and"&gt;Kelly's
problems with shells&lt;/a&gt; for examples of what he's had to wrestle with). Getting this
turned out to be a pain, and required some searching; Kelly pointed out &lt;a href="http://www.cmake.org/files/cygwin/make.exe"&gt;a
patched make.exe on Cygwin&lt;/a&gt; that should work. Make sure this make appears &lt;em&gt;before&lt;/em&gt; the
regular Cygwin make in your shell prompt (later). (&lt;strong&gt;Update:&lt;/strong&gt; Find the
right one &lt;a href="http://cygwin.paracoda.com/release/make/make-3.80-1.tar.bz2"&gt;here&lt;/a&gt;,
as well.) 
&lt;ul&gt;
&lt;li&gt;
On my system, I created a directory for the OpenJDK project, in C:\Prg\OpenJDK, and
put GNU make in C:\Prg\OpenJDK\bin. 
&lt;li&gt;
CONTRIBUTION: Either fix the damn PATH issues ("Dear Mr. Gates, Would you &lt;em&gt;please&lt;/em&gt; tell
your developers to use the right kind of slash, already?"), or else fix Cygwin's make
to recognize C:/ (note the forward slash) paths. Not sure what else could be done
here.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Compiler.&lt;/em&gt;&lt;/strong&gt; Sun originally was using the Microsoft Visual
C++ 6.0 environment (which made sense at the time, since they were a company and could
pay for it); with the open-source release... well... turns out that they're still
using the Microsoft tools, only they've also added Microsoft Visual Studio 2003 to
the list of supported compilers. (I'm using MSVS2003 myself.) This is a pain because
both of those environments are commercial, and the Visual C++ 2005 Express (which
is free) doesn't seem to work yet. People have suggested other compilers (Watcom's
OpenC++, Cygwin's gcc, and so on), but right now that doesn't sound like a high priority
for Sun. Of course, it's fair to suggest that if you're building for Windows, you
probably have a MSVS installation somewhere, but still, it'd be nice.... 
&lt;ul&gt;
&lt;li&gt;
On my system, I put MSVS2003 in C:\Prg\MSVS2003. Note that I *just* installed the
Visual C++ bits, and left out the rest of the .NET stuff. (I do .NET in another VMWare
image, so I don't need it here.) To make our life simpler, reister the environment
variables globally. (This is an install option.) 
&lt;li&gt;
CONTRIBUTION: Port the makefiles to use &lt;a href="http://www.microsoft.com/express/vc/Default.aspx"&gt;Visual
C++ 2005 Express&lt;/a&gt;, or one of the other free compilers. I would think the easiest
transition would be to VC2005Ex, but there may be some tools missing from the Express
editions that the build needs; I haven't spent much time here researching what's working
and not. This would likely be (much) harder for other compilers, owing to the differences
in toolchains. 
&lt;li&gt;
CONTRIBUTION: Port the makefiles to use Visual Studio 2008.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;DirectX SDK.&lt;/em&gt;&lt;/strong&gt; Yes, you need the DirectX SDK, specifically
the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FD044A42-9912-42A3-9A9E-D857199F888E&amp;amp;displaylang=en"&gt;Summer
2004 9.X Update&lt;/a&gt;, for building some of the advanced graphics stuff. The Build README
has it linked there, as well, and the link, as of this writing, is still good. Install
it, then take note of the DXSDK environment variable--we'll need it later. 
&lt;ul&gt;
&lt;li&gt;
On my system, I put DirectX in C:\Prg\DirectX9SDK_062005.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;FreeType 2.&lt;/em&gt;&lt;/strong&gt; This is something to do with fonts, and is needed
to remove a commercial dependency that was holding up the OpenJDK from building about
a year ago. &lt;a href="http://www.freetype.org/"&gt;Grab it&lt;/a&gt;, install it, and note the
headers and lib directory. The FreeType &lt;a href="http://gnuwin32.sourceforge.net/packages/freetype.htm"&gt;download
page&lt;/a&gt; has some links to pre-built stuff, but in the end, you just want freetype.dll,
freetype.lib, and the various FreeType headers. 
&lt;ul&gt;
&lt;li&gt;
On my system, I put these in C:\Prg\OpenJDK\deps\freetype-igor (named after the helpful
soul on build-dev who was kind enough to send me his pre-built FreeType bits). Note
that underneath that directory, I have windows/freetype-i586/headers and /lib, which
I'll use later for environment variables. 
&lt;li&gt;
CONTRIBUTION: Put a "JDK-specific" bundle of FreeType somewhere on the Web for people
to download and not have to build. :-)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;A "bootstrap" JDK.&lt;/em&gt;&lt;/strong&gt; Go grab &lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;JDK
1.6&lt;/a&gt;; you'll need this for building the Java bits. (I would hope this isn't a problem
for you; if it is, you &lt;em&gt;may&lt;/em&gt; want to quickly go to some other Web page. &lt;em&gt;Any&lt;/em&gt; web
page.) 
&lt;ul&gt;
&lt;li&gt;
On my system, this resides in C:\Prg\jdk1.6.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Apache Ant.&lt;/em&gt;&lt;/strong&gt; At least version 1.6.3, I'm using &lt;a href="http://ant.apache.org/bindownload.cgi"&gt;1.7&lt;/a&gt; without
a problem. 
&lt;ul&gt;
&lt;li&gt;
On my system, this resides in C:\Prg\apache-ant-1.7.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;The "binary plugs".&lt;/em&gt;&lt;/strong&gt; As much work has Sun has done to unencumber
the JDK, there's still little bits and pieces that are commercial that they can't
release the source to, so they put them into a "binary plugs" package and have you
install it, then point to it in the build scripts, and copy those files over. They
get versioned every time Sun releases a built JDK 7 bundle, but I don't think you
need to &lt;a href="http://download.java.net/openjdk/jdk7/"&gt;grab this&lt;/a&gt; more than once;
just the same, keep an eye on that as time goes on, and if you get weird build errors,
check build-dev to see if the plugs changed. 
&lt;ul&gt;
&lt;li&gt;
On my system, this resides in C:\Prg\OpenJDK\deps\openjdk-binary-plugs. (The .jar
file is an executable jar, so just "java -jar" it and tell it to install in C:\Prg\OpenJDK\deps;
it adds the rest. It's done in 3 seconds, and consists of 1 file. Now you see why
I wouldn't worry too much about this.)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Mercurial.&lt;/em&gt;&lt;/strong&gt; This is a distributed revision control system,
and there's lots more to say about that at the &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Mercurial"&gt;Mercurial
website&lt;/a&gt;. Its commands look somewhat similar to SVN, though definitely read &lt;a href="http://hgbook.red-bean.com/"&gt;"Distributed
Revision Control with Mercurial"&lt;/a&gt; if you're going to be keeping up with the source
trees as they go. You *want* the "forest" extension as part of your Mercurial binary,
so grab the &lt;a href="http://qct.sourceforge.net/Mercurial-BI.html"&gt;"Batteries Included"&lt;/a&gt; installer
version. I went with the non-TortoiseHG version, and had to download all four of the
released files off that page and install and uninstall and install and uninstall until
I found one that worked (the "win32extrasp1.exe" version in the "dec" release list
on Sourceforge). 
&lt;ul&gt;
&lt;li&gt;
On my system, Mercurial lives in C:\Prg\Mercurial. Put in on the PATH so you have
access to "hg.exe". 
&lt;li&gt;
CONTRIBUTION: Figure out what the differences are and post it someplace--how to get
the "forest" extension installed and turned on in Mercurial was a &lt;em&gt;pain&lt;/em&gt;; Google
was of little to no help here. (Tag it as a comment to this blog entry, if you like,
and I'll update the entry itself once I see it.) 
&lt;li&gt;
&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://blogs.sun.com/jmxetc/entry/how_i_installed_the_mercurial"&gt;Daniel
Fuchs blogs&lt;/a&gt; about how to get Mercurial's "forest" extension installed in your
installation, in case you don't get the "Batteries Included" version: &lt;blockquote&gt; 
&lt;p&gt;
I simply cloned the &lt;a href="http://www.terminus.org/hg/hgforest"&gt;forest repository&lt;/a&gt; in &lt;code&gt;c:\Mercurial&lt;/code&gt;.
In a cygwin terminal: 
&lt;/p&gt;
&lt;pre&gt;  cd c:/Mercurial
  hg clone http://www.terminus.org/hg/hgforest  hgforest
&lt;/pre&gt;
&lt;p&gt;
Then I edited &lt;code&gt;c:/Mercurial/Mercurial.ini&lt;/code&gt; and added the lines:&lt;pre&gt;  [extensions]
  forest=c:/Mercurial/hgforest/forest.py
&lt;/pre&gt;
&lt;p&gt;
as documented in the &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/ForestExtension"&gt;Mercurial
Wiki&lt;/a&gt;. 
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Optional: FindBugs.&lt;/em&gt;&lt;/strong&gt; The build will start using FindBugs
to do source-analysis to find bugs before they happen, so it's not a bad idea to have
that as well. 
&lt;ul&gt;
&lt;li&gt;
On my system, this resides in C:\Prg\findbugs-1.2.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
At this point, you should be ready to go.
&lt;/p&gt;
&lt;h2&gt;2. Fetch the source.
&lt;/h2&gt;
&lt;p&gt;
&lt;a href="http://blogs.sun.com/navi/entry/openjdk_mercurial_repositories_are_open"&gt;Ivan's
got it (mostly) right&lt;/a&gt;: just do this:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;cd C:\Prg\OpenJDK&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;md jdk7&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;hg fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
(Don't use MASTER as he does, I don't think that works--that was just for the experimental
repositories.) Don't forget the trailing slash, either, or you'll get an error saying
something along the lines of http://hg.openjdk.java.net/jdk7%5Ccorba is not a valid
URL or somesuch.
&lt;/p&gt;
&lt;p&gt;
If your Mercurial doesn't have the "forest" extension, "fclone" won't work; Ivan's
got tips on how to pull down the sub-repositories by hand, but I get nervous doing
that because what if the list changes and I wasn't paying attention?
&lt;/p&gt;
&lt;p&gt;
Your network will go wild for about twenty minutes or so, maybe longer, pulling lots
of stuff down from the URL above. The sources should now reside in C:\Prg\OpenJDK\jdk7.
Go browse 'em for a bit, if you feel so inclined. Get a good rush going, because this
next step can be the tricky one.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; Volker Simonis ran into some issues with using Mercurial
and an HTTP proxy, and found it difficult to find assistance across the Web. In the
interests of making it easier for others, he's allowed me to republish his experience
here:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I just had a real hard time to get the forest extension working and finally found
out that it was because the forest extension doesn't honor the "http_proxy" environment
variable. So I thought I'll post it here in case anybody else will face the same problem
in order to save him some time. (If you're only interested in the solution of the
problem, you can skip the next paragraphs and jump right to the end of this post).
&lt;/p&gt;
&lt;p&gt;
I installed Mercurial and the forest extension as described in various places, here
on the list and on the Web - that was the easy part:) Afterwards I could do:
&lt;/p&gt;
&lt;pre&gt;/share/software/OpenJDK&amp;gt; hg clone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7
requesting all changes
adding changesets
adding manifests 
adding file changes
added 2 changesets with 26 changes to 26 files&lt;br&gt;
26 files updated, 0 files merged, 0 files removed, 0 files unresolved &lt;/pre&gt;
&lt;p&gt;
So everything worked fine! Note that I'm behind a firewall, but Mercurial correctly
picked up my http proxy from the "http_proxy" environment variable! 
&lt;/p&gt;
&lt;p&gt;
But now, everytime I tried 'fclone', I got the following error: 
&lt;/p&gt;
&lt;pre&gt;/share/software/OpenJDK&amp;gt; hg fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7 
[.]
abort: error: Name or service not known
&lt;/pre&gt;
&lt;p&gt;
That was not amusing. First I thought I got something wrong during the installation
of the forest extension. I than used the '--traceback' option to "hg" which told me
that the error was in keepalive.py: 
&lt;/p&gt;
&lt;pre&gt;/share/software/OpenJDK&amp;gt; hg --traceback fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7 
[.] 
Traceback (most recent call last):
...
File "/share/software/Python-2.5.1_bin/lib/python2.5/site-packages/mercurial/keepalive.py", 
line 328, in _start_transaction raise urllib2.URLError(err)
URLError: &amp;lt;urlopen error (-2, 'Name or service not known')&amp;gt;
abort: error: Name or service not known 
&lt;/pre&gt;
&lt;p&gt;
So I enabled the debugging output in keepalive.py and realized, that the first two
connections to hg.openjdk.java.net where made trough the proxy, while the third one
(the first that actually fetches files), wants to go directly to hg.openjdk.java.net,
which badly fails: 
&lt;/p&gt;
&lt;pre&gt;/share/software/OpenJDK&amp;gt; hg fclone http://hg.openjdk.java.net/jdk7/jdk7/ jdk7
keepalive.py - creating new connection to proxy:8080 (1078835788)
keepalive.py - STATUS: 200, OK
keepalive.py - re-using connection to proxy:8080 (1078835788)
keepalive.py - STATUS: 200, OK 
[.]
keepalive.py - creating new connection to hg.openjdk.java.net (1078970092)
abort: error: Name or service not known
&lt;/pre&gt;
&lt;p&gt;
The problem can be fixed by adding the proxy settings to your .hgrc file, like this: 
&lt;/p&gt;
&lt;pre&gt;[http_proxy]
host=proxy:8080
&lt;/pre&gt;
&lt;p&gt;
where you have to replace "proxy:8080" with the name and the port of your real proxy
host!
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Volker's original email came from the buid-dev list, and if you have further questions
about Mercrial and HTTP proxies, I'd suggest that as a resource.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;3. Set up your environment.
&lt;/h2&gt;
&lt;p&gt;
This is where you'll spend a fair amount of time, because getting this right can be
ugly. There's some environment variables that tell the build script where to find
things, and we have to point out those things, like compiler location and such. If
you installed everything in the same places I did, then the following, which I put
into C:\Prg\OpenJDK\build_shell.sh, &lt;em&gt;should&lt;/em&gt; work for you:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;#!/bin/sh &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;# "External" bits (outside of OpenJDK path structure)&lt;br&gt;
#&lt;br&gt;
export ALT_BOOTDIR=C:/Prg/jdk1.6.0&lt;br&gt;
export ANT_HOME=c:/Prg/apache-ant-1.7.0&lt;br&gt;
export FINDBUGS_HOME=/cygdrive/c/Prg/findbugs-1.2.1 &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;# OpenJDK flag (to make FreeType check pass)&lt;br&gt;
#&lt;br&gt;
export OPENJDK=true &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;export OPENJDK_HOME=C:/Prg/OpenJDK&lt;br&gt;
openjdkpath=$(cygpath --unix $OPENJDK_HOME) &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;# OpenJDK-related bits&lt;br&gt;
# (ALT_JDK_IMPORT_PATH fixes a corba bug; remove it later)&lt;br&gt;
#&lt;br&gt;
export ALT_JDK_IMPORT_PATH=$(cygpath --unix C:/Prg/jdk1.6.0)&lt;br&gt;
export ALT_BINARY_PLUGS_PATH=$OPENJDK_HOME/openjdk-binary-plugs&lt;br&gt;
export ALT_UNICOWS_DLL_PATH=$OPENJDK_HOME/deps/unicows&lt;br&gt;
export ALT_FREETYPE_LIB_PATH=$OPENJDK_HOME/deps/freetype-igor/windows/freetype-i586/lib&lt;br&gt;
export ALT_FREETYPE_HEADERS_PATH=$OPENJDK_HOME/deps/freetype-igor/windows/freetype-i586/include/freetype2&lt;br&gt;
. $openjdkpath/jdk7/jdk/make/jdk_generic_profile.sh &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;# Need GNU make in front of Cygwin's; this is the only practical
way to do it&lt;br&gt;
#&lt;br&gt;
PATH=$openjdkpath/bin:$PATH&lt;br&gt;
export PATH &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;# Let people know this is an OpenJDK-savvy prompt&lt;br&gt;
#&lt;br&gt;
export PS1='OpenJDK:\[\e]0;\w\a\]\[\e[32m\]\u@${COMPUTERNAME}:\[\e[33m\]\w\[\e[0m\]\n\$
'&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strike&gt;Note the UNICOWS_DLL thing in the middle; this was necessary in earlier builds,
and I don't know if it still is. For now I'm not messing with it; if you discover
that you need it, the Build README has links.&lt;/strike&gt; (&lt;strong&gt;Update:&lt;/strong&gt; Kelly
confirmed that this is no longer necessary in the OpenJDK build. Yay!)
&lt;/p&gt;
&lt;p&gt;
Note that I set the COMPILER_VERSION flag to tell the build script which compiler
I'm using--if that's not set, the build fails pretty quickly, complaining that "COMPILER_VERSION"
cannot be empty. (&lt;strong&gt;Update:&lt;/strong&gt; Kelly mentions, "I suspect the reason you
are having the COMPILER_VERSION problem is that the makefiles are trying to run cl.exe
to get the version, and if the PATH/LIB/INCLUDE env variables are not setup right,
cl.exe fails. Several people have run into that problem.")
&lt;/p&gt;
&lt;p&gt;
Note that OPENJDK must be set, or the build process thinks this is a commercial build,
and an early sanity-check to see what version of FreeType is running will fail. (Specfically,
Sun builds a tool just to see if the code compiles; if it fails to compile, chances
are you forgot to set this flag. That's been my problem, each and every time I tried
to rebuild the OpenJDK build space. Hopefully I never forget it again.)
&lt;/p&gt;
&lt;p&gt;
Note that I call into jdk_generic_profile.sh to do some more setup work; this gets
all the MSVS2003 stuff into the PATH as well.
&lt;/p&gt;
&lt;p&gt;
Be very careful with which path you use; sometimes the build wants C:/Prg style paths,
and sometimes it wants /cygdrive/c/Prg style paths. Don't assume the script above
is perfect--I'm still testing it, and will update this entry as necessary as I find
bugs in it.
&lt;/p&gt;
&lt;p&gt;
(&lt;strong&gt;Update:&lt;/strong&gt; Kelly mentions, "Be careful putting cygwin before VS2003
in the PATH, cygwin has a link.exe and so does VS2003, you need the one from VS2003.")
&lt;/p&gt;
&lt;p&gt;
From a Cygwin bash prompt,
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;cd /cygdrive/c/Prg/OpenJDK&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;. ./build_shell.sh&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;cd jdk7&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;make sanity&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
It will churn, think, text will go flying by, and you will (hopefully) see "Sanity
check passed". If not, look at the (voluminous) output to figure out what paths are
wrong, and correct them. Note that certain paths may be reported as warnings and yet
the buld will still succeed, that's OK, as far as I can tell.
&lt;/p&gt;
&lt;p&gt;
And no, I don't know what all of those environment variables are for. Kelly might,
but I suspect there's a lot of built-up cruft from over the years that they'd like
to start paring down. Let's hope.
&lt;/p&gt;
&lt;h2&gt;4. Type "make" and go away for a while.
&lt;/h2&gt;
&lt;p&gt;
Specifically, type "make help" to see the list of targets.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;OpenJDK:Ted@XPJAVA:/cygdrive/c/Prg/OpenJDK/jdk7&lt;br&gt;
$ make help&lt;br&gt;
Makefile for the JDK builds (all the JDK). &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;--- Common Targets ---&lt;br&gt;
all -- build the core JDK (default target)&lt;br&gt;
help -- Print out help information&lt;br&gt;
check -- Check make variable values for correctness&lt;br&gt;
sanity -- Perform detailed sanity checks on system and settings&lt;br&gt;
fastdebug_build -- build the core JDK in 'fastdebug' mode (-g -O)&lt;br&gt;
debug_build -- build the core JDK in 'debug' mode (-g)&lt;br&gt;
clean -- remove all built and imported files&lt;br&gt;
clobber -- same as clean &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;--- Common Variables ---&lt;br&gt;
ALT_OUTPUTDIR - Output directory&lt;br&gt;
OUTPUTDIR=./build/windows-i586&lt;br&gt;
ALT_PARALLEL_COMPILE_JOBS - Solaris/Linux parallel compile run count&lt;br&gt;
PARALLEL_COMPILE_JOBS=2&lt;br&gt;
ALT_SLASH_JAVA - Root of all build tools, e.g. /java or J:&lt;br&gt;
SLASH_JAVA=J:&lt;br&gt;
ALT_BOOTDIR - JDK used to boot the build&lt;br&gt;
BOOTDIR=C:/Prg/jdk1.6.0&lt;br&gt;
ALT_JDK_IMPORT_PATH - JDK used to import components of the build&lt;br&gt;
JDK_IMPORT_PATH=c:/Prg/JDK16~1.0&lt;br&gt;
ALT_COMPILER_PATH - Compiler install directory&lt;br&gt;
COMPILER_PATH=C:/Prg/MSVS2003/Common7/Tools/../../Vc7/Bin/&lt;br&gt;
ALT_CACERTS_FILE - Location of certificates file&lt;br&gt;
CACERTS_FILE=/lib/security/cacerts&lt;br&gt;
ALT_DEVTOOLS_PATH - Directory containing zip and gnumake&lt;br&gt;
DEVTOOLS_PATH=/usr/bin/&lt;br&gt;
ALT_DXSDK_PATH - Root directory of DirectX SDK&lt;br&gt;
DXSDK_PATH=C:/Prg/DIRECT~1&lt;br&gt;
ALT_MSDEVTOOLS_PATH - Root directory of VC++ tools (e.g. rc.exe)&lt;br&gt;
MSDEVTOOLS_PATH=C:/Prg/MSVS2003/Common7/Tools/../../Vc7/Bin/&lt;br&gt;
ALT_MSVCRT_DLL_PATH - Directory containing mscvrt.dll&lt;br&gt;
MSVCRT_DLL_PATH=C:/WINDOWS/system32&lt;br&gt;
WARNING: SLASH_JAVA does not exist, try make sanity&lt;br&gt;
WARNING: CACERTS_FILE does not exist, try make sanity &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;--- Notes ---&lt;br&gt;
- All builds use same output directory unless overridden with&lt;br&gt;
ALT_OUTPUTDIR=&amp;lt;dir&amp;gt;, changing from product to fastdebug you may want&lt;br&gt;
to use the clean target first.&lt;br&gt;
- JDK_IMPORT_PATH must refer to a compatible build, not all past promoted&lt;br&gt;
builds or previous release JDK builds will work.&lt;br&gt;
- The fastest builds have been when the sources and the BOOTDIR are on&lt;br&gt;
local disk. &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;--- Examples ---&lt;br&gt;
make fastdebug_build&lt;br&gt;
make ALT_OUTPUTDIR=/tmp/foobar all&lt;br&gt;
make ALT_OUTPUTDIR=/tmp/foobar fastdebug_build&lt;br&gt;
make ALT_OUTPUTDIR=/tmp/foobar all&lt;br&gt;
make ALT_BOOTDIR=/opt/java/jdk1.5.0&lt;br&gt;
make ALT_JDK_IMPORT_PATH=/opt/java/jdk1.6.0 &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;OpenJDK:Ted@XPJAVA:/cygdrive/c/Prg/OpenJDK/jdk7&lt;br&gt;
$&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The one I want is "make fastdebug_build" or "make debug_build" (so I have debug symbols
and can go spelunking). Do it.
&lt;/p&gt;
&lt;p&gt;
Watch the stuff go flying by.
&lt;/p&gt;
&lt;p&gt;
Get bored.
&lt;/p&gt;
&lt;p&gt;
Get lunch.
&lt;/p&gt;
&lt;p&gt;
Come back, it might be done. :-)
&lt;/p&gt;
&lt;p&gt;
If it's a successful build, you'll have "stuff" in the C:\Prg\OpenJDK\jdk7\build directory,
corresponding to the kind of build you kicked off; for a "fastdebug" build, for example,
there'll be a "windows-i586-fastdebug" directory in which you'll find a "j2sdk-image"
directory in which there &lt;em&gt;should&lt;/em&gt; be a complete JDK environment. Try running
Java and see if it works (make sure your PATH is updated to point to the right place
before you do!)
&lt;/p&gt;
&lt;p&gt;
If not, it's debugging time. :-) Note that the "build" directory is completely built
from scratch, so if you get a partial build and want to start over from scratch, just
"rd /s build" from the jdk7 directory. (It's easier than "make clean" or "make clobber",
I've found.)
&lt;/p&gt;
&lt;h2&gt;More About Builds
&lt;/h2&gt;
&lt;p&gt;
When building the JDK, you may want to build bits "underneath" the top-level directory,
but doing this is a tad tricky. I asked about this on the build-dev list, and Kelly
responded with a great email about the build process, specifically about launching
"sub" makes within the system:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Due to history, a build directly from the jdk/make directories uses a default OUTPUTDIR
of jdk/build/* but if FASTDEBUG=true, it's jdk/build/*-fastdebug, or if a plain debug
build with just VARIANT=DBG it would be jdk/build/*-debug The variant builds leave
results in a completely separate outputdir. 
&lt;/p&gt;
&lt;p&gt;
If you used the very top level makefile (which came from the now defunct control/make
area) the default OUTPUTDIR is ./build/* (at the very top of the repositories). When
this top level Makefile runs the jdk/make Makefiles, it passes in a ALT_OUTPUTDIR
to refer to this top level build result area because it's default outputdir is not
the same place. 
&lt;p&gt;
I don't know the complete history as to why this was done this way, but my tendency
is to try and get us back to a single default OUTPUTDIR for all the repositories.
Someday... 
&lt;p&gt;
This is what I do when I work on just the jdk repository:&lt;br&gt;
cd jdk/make &amp;amp;&amp;amp; gnumake
&lt;/p&gt;
&lt;p&gt;
That primes the outputdir area, then I can drop down in:&lt;br&gt;
cd jdk/make/java &amp;amp;&amp;amp; gnumake
&lt;/p&gt;
&lt;p&gt;
Or even drop in and clean an area and re-build it:&lt;br&gt;
cd jdk/make/jpda &amp;amp;&amp;amp; gnumake clean &amp;amp;&amp;amp; gnumake 
&lt;/p&gt;
&lt;p&gt;
Or just repeat the entire build (incremental build)&lt;br&gt;
cd jdk/make &amp;amp;&amp;amp; gnumake
&lt;/p&gt;
&lt;p&gt;
If I wanted the jdk image (j2sdk-image), I would need to:&lt;br&gt;
cd jdk/make &amp;amp;&amp;amp; gnumake image 
&lt;/p&gt;
&lt;p&gt;
But the output by default will go to jdk/build/* and a different directory if VARIANT=DBG
or FASTDEBUG=true. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This should help having to go through the whole process for incremental updates. (Note
that on my system, I had to call it "make" instead of "gnumake".)
&lt;/p&gt;
&lt;h2&gt;Futures
&lt;/h2&gt;
&lt;p&gt;
As time goes on, I'll hopefully find the time to blog about how to find various little
things in the JDK and make source-modifications to prove that they work, and use that
as a springboard from which to let you start hacking on the JDK. In the meantime, &lt;em&gt;please&lt;/em&gt;,
if you run into trouble and find fixes to any of the above, comment or email me, and
I'll correct this.
&lt;/p&gt;
&lt;h2&gt;Contributions/Suggested TODOs
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
Have the make system automatically capture the results of the build in a log file,
for easier debugging. Granted, you can "make &amp;gt;| build.output", but that seems tedious
when it could easily be captured automagically for you each time. ("make sanity" does
this, capturing the results in build/windows-i586-fastdebug/sanityCheckMessages.txt
and sanityCheckWarnings.txt. 
&lt;li&gt;
Documentation, documentation, documentation. This thing does a lot of recursive makes
and invokes a lot of tools (some of them built as part of the build process itself),
and it would be &lt;em&gt;much&lt;/em&gt; easier to debug and understand if the process were better
documented. Even a simple flowchart/tree of the various Make invocations and what
each does (in practice) would be helpful when trying to track down issues. 
&lt;li&gt;
Add support for all output to be captured into a build log file. This can obviously
be done at the command-line via "make |&amp;amp; tee build.log" or "&amp;gt;&amp;amp; build.log",
but I think it'd be nice if it were somehow folded in as part of the build process
so it happened automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Updates 
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
Kelly OHair sent me some updated information, such as the right link to use for the
README file (from the HG repository instead of the SVN one). 
&lt;li&gt;
Kelly also mentioned that the plugin and installers are not part of the OpenJDK build
yet, so that's not something I could build even if I wanted to. Which is fine, for
me. :-) 
&lt;li&gt;
Kelly confirmed that UNICOWS is not needed in OpenJDK. 
&lt;li&gt;
Kelly mentions that link.exe on the PATH must be VS2003's, not Cygwin's. 
&lt;li&gt;
Kelly mentions the COMPILER_VERSION problem might be PATH issues. 
&lt;li&gt;
Kelly notes, "On the C:\ vs C:/ vs. /cyg*/ paths, I try and use the C:/ all the time
everywhere, and anywhere in the Makefiles where I know I need C:\ or the /cyg*/ paths,
I try and use cygpath or MKS dosname to force them into the right form. NMAKE.EXE
only likes C:\ paths, and cygwin PATH only wants /cyg*/ paths, and Windows/Java/MKS
never want /cyg*/ paths. :^( I wish we had a better solution on Windows for this shell/path
mania." 
&lt;li&gt;
Poonam's Weblog has a good page on &lt;a href="http://blogs.sun.com/poonam/entry/building_openjdk_on_windows"&gt;building
the OpenJDK on Windows with NetBeans&lt;/a&gt;, from which I've stolen... ahem, &lt;em&gt;leveraged&lt;/em&gt;...
some links. His webpage has a link for the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=73BA7BD7-ED06-4F0D-80A4-2A7EEAEE17E2&amp;amp;displaylang=en"&gt;UNICOWS
download page&lt;/a&gt;, but that only includes the DLL, not the .LIB, which you will also
need. (It's an import library for the DLL; you need both.) The only place I know to
get the .LIB is from the Platform SDK, and you need an old one, circa November 2001
or so. I don't know if it's kosher to redistribute any other way (meaning, Microsoft
won't let us, as far as I know). 
&lt;li&gt;
Added Volker Simonis' experiences with HTTP proxies in Mercurial 
&lt;li&gt;
Added the "sub" make build discussion from Kelly on build-dev 
&lt;li&gt;
Added the link to Volker's blog about building on Suse Linux&lt;/li&gt;
&lt;/ol&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=2f428c38-e44d-43c8-bc60-b382a334bd84" /&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,2f428c38-e44d-43c8-bc60-b382a334bd84.aspx</comments>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=8a1fb6e7-72b6-411f-86d2-209d13ee638f</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,8a1fb6e7-72b6-411f-86d2-209d13ee638f.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,8a1fb6e7-72b6-411f-86d2-209d13ee638f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8a1fb6e7-72b6-411f-86d2-209d13ee638f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is, without a doubt, the most accurate quote <em>ever</em> about the "fun" of
writing a book:
</p>
        <blockquote>
          <p>
Writing a book is an adventure. To begin with, it is a toy and an amusement; then
it becomes a mistress, and then it becomes a master, and then a tyrant. The last phase
is that just as you are about to be reconciled to your servitude, you kill the monster,
and fling him out to the public. (<a href="http://www.brainyquote.com/quotes/quotes/w/winstonchu136000.html">Source</a>:
Winston Churchill)
</p>
        </blockquote>
        <p>
Keep that in mind, all you who are considering authoring as a career or career supplement.
</p>
        <p>
Were I to offer my own, it would be like so:
</p>
        <blockquote>
          <p>
Writing a book is like having a child. 
</p>
          <p>
Trying is the best part, in some ways. You have this idea, this burning sensation
in your heart, that just <em>has</em> to get out into the world. But you need a partner,
a publisher who will help you bring your vision to life. You write proposals, you
write tables of contents, you imagine the book cover in your mind. Then, YES! You
get a publisher to agree. You sign the contract, fax it in, and you are on the way!
We are <em>authoring!</em></p>
          <p>
At first, it is wonderful and exciting and full of potential. You run into a few hangups,
a few periods of nausea as you realize the magnitude of what you're really doing.
You resolve to press on. As you continue, you begin to feel like you're in control
again, but you start to get this sense like it's an albatross, a weight around your
neck. Before long, you're dragging your feet, you can't seem to muster the energy
to do anything, just get this thing <em>done</em>. The deadline approaches, the sheer
horror of what's left to be done paralyzes you. You look your editor in the eye (literally
or figuratively) and say, "I can't do this." The editor says, "Push". You whimper,
"Don't make me do this, just cancel the contract." The editor says, "Push". You scream
at them, "This is YOUR fault, you MADE me do this!" The editor says, "Push". Then,
all of a sudden, it's done, it's out, it's on the shelf, and you take photos and show
it off to all the friends, neighbors and family, who look at you a little sympathetically,
and don't mention how awful you really look in that photo.
</p>
          <p>
As the book is out in the world, you feel a sense of pride an joy at it. You imagine
it profoundly changing the way people look at the world. You imagine it reaching bestseller
lists. You're already practicing the speech for the Nobel. You're sitting in your
study, you reach out and grab one of the free copies still sitting on your desk, and
you open to a random page. Uh, oh. There's a typo, or a mistake, or something that
clearly got past you and the technical reviewers and the copyeditors. Damn. Oh, well,
one mistake can't make that much difference.
</p>
          <p>
Then the reviews come in on Amazon. People like it. People post good reviews. One
of them is not positive. You get angry: this is your <em>baby</em> they are attacking.
How DARE they. You make plans to find large men with Italian names and track down
that reviewer. You suddenly realize your overprotectiveness. You laugh at yourself
weakly. You try to convince yourself that there's no pleasing some people.
</p>
          <p>
Then someone comes up to you at a conference or interview or other gathering, and
says, "Wow, you wrote that? I have that book on my shelf!" and suddenly it's all OK.
It may not be perfect, but it's yours, and you love it all the same, warts and all.
</p>
        </blockquote>
        <p>
Nearly a dozen books later, it's always the same.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8a1fb6e7-72b6-411f-86d2-209d13ee638f" />
        <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>Quotes on writing</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,8a1fb6e7-72b6-411f-86d2-209d13ee638f.aspx</guid>
      <link>http://blogs.tedneward.com/2007/12/08/Quotes+On+Writing.aspx</link>
      <pubDate>Sat, 08 Dec 2007 10:48:51 GMT</pubDate>
      <description>&lt;p&gt;
This is, without a doubt, the most accurate quote &lt;em&gt;ever&lt;/em&gt; about the "fun" of
writing a book:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Writing a book is an adventure. To begin with, it is a toy and an amusement; then
it becomes a mistress, and then it becomes a master, and then a tyrant. The last phase
is that just as you are about to be reconciled to your servitude, you kill the monster,
and fling him out to the public. (&lt;a href="http://www.brainyquote.com/quotes/quotes/w/winstonchu136000.html"&gt;Source&lt;/a&gt;:
Winston Churchill)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Keep that in mind, all you who are considering authoring as a career or career supplement.
&lt;/p&gt;
&lt;p&gt;
Were I to offer my own, it would be like so:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Writing a book is like having a child. 
&lt;/p&gt;
&lt;p&gt;
Trying is the best part, in some ways. You have this idea, this burning sensation
in your heart, that just &lt;em&gt;has&lt;/em&gt; to get out into the world. But you need a partner,
a publisher who will help you bring your vision to life. You write proposals, you
write tables of contents, you imagine the book cover in your mind. Then, YES! You
get a publisher to agree. You sign the contract, fax it in, and you are on the way!
We are &lt;em&gt;authoring!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
At first, it is wonderful and exciting and full of potential. You run into a few hangups,
a few periods of nausea&amp;nbsp;as you realize the magnitude of what you're really doing.
You resolve to press on. As you continue, you begin to feel like you're in control
again, but you start to get this sense like it's an albatross, a weight around your
neck. Before long, you're dragging your feet, you can't seem to muster the energy
to do anything, just get this thing &lt;em&gt;done&lt;/em&gt;. The deadline approaches, the sheer
horror of what's left to be done paralyzes you. You look your editor in the eye (literally
or figuratively) and say, "I can't do this." The editor says, "Push". You whimper,
"Don't make me do this, just cancel the contract." The editor says, "Push". You scream
at them, "This is YOUR fault, you MADE me do this!" The editor says, "Push". Then,
all of a sudden, it's done, it's out, it's on the shelf, and you take photos and show
it off to all the friends, neighbors and family, who look at you a little sympathetically,
and don't mention how awful you really look in that photo.
&lt;/p&gt;
&lt;p&gt;
As the book is out in the world, you feel a sense of pride an joy at it. You imagine
it profoundly changing the way people look at the world. You imagine it reaching bestseller
lists. You're already practicing the speech for the Nobel. You're sitting in your
study, you reach out and grab one of the free copies still sitting on your desk, and
you open to a random page. Uh, oh. There's a typo, or a mistake, or something that
clearly got past you and the technical reviewers and the copyeditors. Damn. Oh, well,
one mistake can't make that much difference.
&lt;/p&gt;
&lt;p&gt;
Then the reviews come in on Amazon. People like it. People post good reviews. One
of them is not positive. You get angry: this is your &lt;em&gt;baby&lt;/em&gt; they are attacking.
How DARE they. You make plans to find large men with Italian names and track down
that reviewer. You suddenly realize your overprotectiveness. You laugh at yourself
weakly. You try to convince yourself that there's no pleasing some people.
&lt;/p&gt;
&lt;p&gt;
Then someone comes up to you at a conference or interview or other gathering, and
says, "Wow, you wrote that? I have that book on my shelf!" and suddenly it's all OK.
It may not be perfect, but it's yours, and you love it all the same, warts and all.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Nearly a dozen books later, it's always the same.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8a1fb6e7-72b6-411f-86d2-209d13ee638f" /&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,8a1fb6e7-72b6-411f-86d2-209d13ee638f.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=6d55141d-e920-4ef0-bb65-51d899521c0c</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,6d55141d-e920-4ef0-bb65-51d899521c0c.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,6d55141d-e920-4ef0-bb65-51d899521c0c.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6d55141d-e920-4ef0-bb65-51d899521c0c</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Michael Nygard (author of the <em>great</em> book <em>Release It!</em>), writes that
"<a href="http://www.michaelnygard.com/blog/2007/11/a_dozen_levels_of_done.html">[his]
definition of 'done' continues to expand</a>". Currently, his definition reads:
</p>
        <blockquote>
          <p>
A feature is not "done" until all of the following can be said about it: 
</p>
          <ol>
            <li>
All unit tests are green. 
</li>
            <li>
The code is as simple as it can be. 
</li>
            <li>
It communicates clearly. 
</li>
            <li>
It compiles in the automated build from a clean checkout. 
</li>
            <li>
It has passed unit, functional, integration, stress, longevity, load, and resilience
testing. 
</li>
            <li>
The customer has accepted the feature. 
</li>
            <li>
It is included in a release that has been branched in version control. 
</li>
            <li>
The feature's impact on capacity is well-understood. 
</li>
            <li>
Deployment instructions for the release are defined and do not include a "point of
no return". 
</li>
            <li>
Rollback instructions for the release are defined and tested. 
</li>
            <li>
It has been deployed and verified. 
</li>
            <li>
It is generating revenue.</li>
          </ol>
          <p>
Until all of these are true, the feature is just unfinished inventory.
</p>
        </blockquote>
        <p>
As much as I agree with the first 11, I'm not sure I agree with #12. Not because it's
not important--too many software features are added with no positive result--but because
it's too hard to measure the revenue a particular program, much less a particular
software <em>feature</em>, is generating. 
</p>
        <p>
My guess is that this is also conflating the differences between "features" and "releases",
since they aren't always one and the same, and that not all "features" will be ones
mandated by the customer (making #6 somewhat irrelevant). Still, this is an important
point to any and all development shops: 
</p>
        <p>
What do <em>you</em> call "done"?
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=6d55141d-e920-4ef0-bb65-51d899521c0c" />
        <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>A Dozen Levels of Done</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,6d55141d-e920-4ef0-bb65-51d899521c0c.aspx</guid>
      <link>http://blogs.tedneward.com/2007/12/05/A+Dozen+Levels+Of+Done.aspx</link>
      <pubDate>Wed, 05 Dec 2007 10:44:41 GMT</pubDate>
      <description>&lt;p&gt;
Michael Nygard (author of the &lt;em&gt;great&lt;/em&gt; book &lt;em&gt;Release It!&lt;/em&gt;), writes that
"&lt;a href="http://www.michaelnygard.com/blog/2007/11/a_dozen_levels_of_done.html"&gt;[his]
definition of 'done' continues to expand&lt;/a&gt;". Currently, his definition reads:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
A feature is not "done" until all of the following can be said about it: 
&lt;ol&gt;
&lt;li&gt;
All unit tests are green. 
&lt;li&gt;
The code is as simple as it can be. 
&lt;li&gt;
It communicates clearly. 
&lt;li&gt;
It compiles in the automated build from a clean checkout. 
&lt;li&gt;
It has passed unit, functional, integration, stress, longevity, load, and resilience
testing. 
&lt;li&gt;
The customer has accepted the feature. 
&lt;li&gt;
It is included in a release that has been branched in version control. 
&lt;li&gt;
The feature's impact on capacity is well-understood. 
&lt;li&gt;
Deployment instructions for the release are defined and do not include a "point of
no return". 
&lt;li&gt;
Rollback instructions for the release are defined and tested. 
&lt;li&gt;
It has been deployed and verified. 
&lt;li&gt;
It is generating revenue.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Until all of these are true, the feature is just unfinished inventory.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As much as I agree with the first 11, I'm not sure I agree with #12. Not because it's
not important--too many software features are added with no positive result--but because
it's too hard to measure the revenue a particular program, much less a particular
software &lt;em&gt;feature&lt;/em&gt;, is generating. 
&lt;p&gt;
My guess is that this is also conflating the differences between "features" and "releases",
since they aren't always one and the same, and that not all "features" will be ones
mandated by the customer (making #6 somewhat irrelevant). Still, this is an important
point to any and all development shops: 
&lt;p&gt;
What do &lt;em&gt;you&lt;/em&gt; call "done"?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=6d55141d-e920-4ef0-bb65-51d899521c0c" /&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,6d55141d-e920-4ef0-bb65-51d899521c0c.aspx</comments>
      <category>Development Processes</category>
      <category>Reading</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=fc939cee-6668-47a5-bf06-fd85ea8d8557</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,fc939cee-6668-47a5-bf06-fd85ea8d8557.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,fc939cee-6668-47a5-bf06-fd85ea8d8557.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=fc939cee-6668-47a5-bf06-fd85ea8d8557</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
... for Ruby, or PowerShell/.NET? I'm looking for something to make it easier
to use WebDAV from a shell scripting language on Windows; Ruby and PowerShell are
the two that come to mind as the easiest to use on Windows. For some reason, Google
doesn't yield much by way of results, and I've <em>got</em> to believe there's better
WebDAV support out there than what I'm finding.
</p>
        <p>
(Yes, I could write one, but why bother, if one is out there that already exists?
DRY!)
</p>
        <p>
BTW, anybody who finds one and wants credit for it, I'll be happy to post here. If
you're a commercial vendor and you send me a license to go with it, I'll post that,
too, with some code and explanation on how I'm using it, though I doubt it's going
to be all that different from how anybody else would use it. ;-)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=fc939cee-6668-47a5-bf06-fd85ea8d8557" />
        <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>Anybody know of a good WebDAV client library ...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,fc939cee-6668-47a5-bf06-fd85ea8d8557.aspx</guid>
      <link>http://blogs.tedneward.com/2007/12/04/Anybody+Know+Of+A+Good+WebDAV+Client+Library.aspx</link>
      <pubDate>Tue, 04 Dec 2007 01:03:19 GMT</pubDate>
      <description>&lt;p&gt;
... for Ruby,&amp;nbsp;or PowerShell/.NET? I'm looking for something to make it easier
to use WebDAV from a shell scripting language on Windows; Ruby and PowerShell are
the two that come to mind as the easiest to use on Windows. For some reason, Google
doesn't yield much by way of results, and I've &lt;em&gt;got&lt;/em&gt; to believe there's better
WebDAV support out there than what I'm finding.
&lt;/p&gt;
&lt;p&gt;
(Yes, I could write one, but why bother, if one is out there that already exists?
DRY!)
&lt;/p&gt;
&lt;p&gt;
BTW, anybody who finds one and wants credit for it, I'll be happy to post here. If
you're a commercial vendor and you send me a license to go with it, I'll post that,
too, with some code and explanation on how I'm using it, though I doubt it's going
to be all that different from how anybody else would use it. ;-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=fc939cee-6668-47a5-bf06-fd85ea8d8557" /&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,fc939cee-6668-47a5-bf06-fd85ea8d8557.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=3aedfe99-c280-46eb-9a05-1a41f5e4ffb7</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,3aedfe99-c280-46eb-9a05-1a41f5e4ffb7.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,3aedfe99-c280-46eb-9a05-1a41f5e4ffb7.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3aedfe99-c280-46eb-9a05-1a41f5e4ffb7</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
"Hi. My name's Ted, and I write shitty code."
</p>
        <p>
With this opening, a group of us earlier this year opened a panel (back in March,
as I recall) at the No Fluff Just Stuff conference in Minneapolis. Neal Ford started
the idea, whispering it to me as we sat down for the panel, and I immediately followed
his opening statement in the same vein. Poor Charles Nutter, who was new to the tour,
didn't get the whispered-down-the-line instruction, and tried valiantly to recover
the panel's apparent collective discard of dignity--"Hi, I'm Charles, and I write <em>Ruby</em> code"--to
no avail. (He's since stopped trying.)
</p>
        <p>
The reason for our declaration of impotent implementation, of course, was, <a href="http://kickin-the-darkness.blogspot.com/2007/09/confessions-of-terrible-programmer.html">as
this post states so well</a>, a Zen-like celebration of our inadequacies: <em>To be
a Great Programmer, you must admit that you are a Terrible Programmer.</em></p>
        <p>
To those who count themselves as the uninitiated into our particular brand of philosophy
(or religion, or just plain weirdness), the declaration is a statement of anti-Perfectionism.
"I am human, therefore I make mistakes. If I make mistakes, then I cannot assume that
I will write code that has no mistakes. If I cannot write code that has no mistakes,
then I must assume that mistakes are rampant within the code. If mistakes are rampant
within the code, then I must find them. But because I make mistakes, then I must also
assume that I make mistakes trying to identify the mistakes in the code. <em>Therefore,
I will seek the best support I can find in helping me find the mistakes in my code.</em>"
</p>
        <p>
This support can come in a variety of forms. The Terrible Programmer cites several
of his favorites: use of the Statically-Typed Language (in his case, Ada),
Virulent Assertions, Testing Masochism, the Brutally Honest Code Review, and Zeal
for the Visible Crash. Myself, I like to consider other tools as well: the Static
Analysis Tool Suite, a Commitment to Confront the Uncomfortable Truth, and the
Abject Rejection of Best Practices.
</p>
        <p>
By this point in time, most developers have at least heard of, if not considered adoption
of, the Masochistic Testing meme. Fellow NFJS'ers Stuart Halloway and Justin Gehtland
have founded a consultancy firm, Relevance, that sets a high bar as a corporate cultural
standard: 100% test coverage of their code. Neal Ford has reported that ThoughtWorks
makes similar statements, though it's my understanding that clients sometimes put
accidental obstacles in their way of achieving said goal. It's amibtious, but as the
ancient American Indian proverb is said to state, <em>If you aim your arrow at the
sun, it will fly higher and father than if you aim it at the ground</em>.
</p>
        <p>
In fact, on a panel this weekend in Dallas, fellow NFJS'er David Bock attributed the
rise of interest in dynamic languages to the growth of the unit-testing meme, since
faith in the quality of code authored in a dynamic language can only follow if the
code has been rigorously tested, since we have no tool checking the syntactic or semantic
correctness before it is executed.
</p>
        <p>
Among the jet-setting Ruby crowd, this means a near-slavish devotion to unit tests.
Interestingly enough, I find this attitude curiously incomplete: if we assume that
we make mistakes, and that we therefore require unit tests to prove to ourselves (and,
by comfortable side effect, the world around us) that the code is correct, would we
not also benefit from the automated--and in some ways far more comprehensive--checking
that a static-analysis tool can provide? Stu Halloway once stated, "In five years,
we will look back upon the Java compiler as a weak form of unit testing." I have no
doubt that he's right--but I draw an entirely different conclusion from his statement:
we need better static analysis tools, not to abandon them entirely. 
</p>
        <p>
Consider, if you will, the static-analysis tool known as FindBugs. Fellow NFJS'er (and author
of the JavaOne bestselling book <em>Java Concurrency in Practice</em>) Brian
Goetz offered a presentation last year on the use of FindBugs in which he cited the
use of the tool over the existing JDK Swing code base. Swing has been in use since
1998, has had close to a decade of debugging driven by actual field use, and (despite
what personal misgivings the average Java programmer may have about building a "rich
client" application instead of a browser-based one) can legitimately call itself a
successful library in widespread use.
</p>
        <p>
If memory serves, Brian's presentation noted that when run over the Swing code base,
FindBugs discovered 70-something concurrency errors that remained in the code base,
some since JDK 1.2. <em>In close to a decade of use, 70-something concurrency bugs
had been neither fixed nor found.</em> Even if I misremember that number, and it is
off by an order of magnitude--7 bugs instead of 70--the implication remains clear: <em>simple
usage cannot reveal all bugs.</em></p>
        <p>
The effect of this on the strength of the unit-testing argument cannot be understated--if
the quality of dynamic-language-authored code rests on the exercise of that code under
constrained circumstances in order to prove its correctness, then we have a major
problem facing us, because the interleaving of execution paths that define concurrency
bugs remain beyond the ability of most (arguably all) languages and/or platforms to
control. <em>It thus follows that concurrent code cannot be effectively unit tested,
and thus the premise that dynamic-language-authored code can be proven correct by
simple use of unit tests is flawed.</em></p>
        <p>
Some may take this argument to imply a rejection of unit tests. Those who do would
be seeking evidence to support a position that is equally untenable, that unit-testing
is somehow "wrong" or unnecessary. No such statement is implied; quite the opposite,
in fact. We can neither reject the necessitary of unit testing any more than
we can the beneficence of static analysis tools; each is, in its own way, incomplete
in its ability to prove code correct, at least in current incarnations. In fact, although
I will not speak for them, many of the Apostles of UnitTestitarianism in fact indirectly
support this belief, arguing that unit tests do not obviate the need for a quality-analysis
phase after a development iteration, because correct unit tests cannot imply completely
correct code.
</p>
        <p>
Currently much research is taking place in the statically-typed languages to make
them more typesafe without sacrificing the productivity enhancements seen in the dynamically-typed
language world. Scala, for example, makes heavy use of type-inferencing to reduce
the burden of type declarations by the programmer, requiring such declarations only
when the inferencing yields ambiguity. As a result, Scala's syntax--at a first glance--looks
remarkably similar in places to Ruby's, yet the Scala compiler is still fully type-safe,
ensuring that accidental coercion doesn't yield confusion. Microsoft is pursuing much
the same route as part of their LINQ strategy for Visual Studio 2008/.NET 3.5 (the
"Orcas" release), and some additional research is being done around functional languages
in the form of F#.
</p>
        <p>
At the end of the day, the fact remains that I write shitty code. That means I need
all the help I can get--human-centric or otherwise--to make sure that my code is correct.
I will take that help in the form of unit tests that I force myself (and others around
me force myself) to write. But I also have to accept the possibility that my unit
tests themselves may be flawed, and that therefore other tools--which do not suffer
from my inherent human capacity to forget or brush off--are a powerful and necessary
component of my toolbox.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=3aedfe99-c280-46eb-9a05-1a41f5e4ffb7" />
        <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>Welcome to the Shitty Code Support Group</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,3aedfe99-c280-46eb-9a05-1a41f5e4ffb7.aspx</guid>
      <link>http://blogs.tedneward.com/2007/10/30/Welcome+To+The+Shitty+Code+Support+Group.aspx</link>
      <pubDate>Tue, 30 Oct 2007 00:12:32 GMT</pubDate>
      <description>&lt;p&gt;
"Hi. My name's Ted, and I write shitty code."
&lt;/p&gt;
&lt;p&gt;
With this opening, a group of us&amp;nbsp;earlier this year opened a panel (back in March,
as I recall) at the No Fluff Just Stuff conference in Minneapolis. Neal Ford started
the idea, whispering it to me as we sat down for the panel, and I immediately followed
his opening statement in the same vein. Poor Charles Nutter, who was new to the tour,
didn't get the whispered-down-the-line instruction, and tried valiantly to recover
the panel's apparent collective discard of dignity--"Hi, I'm Charles, and I write &lt;em&gt;Ruby&lt;/em&gt; code"--to
no avail. (He's since stopped trying.)
&lt;/p&gt;
&lt;p&gt;
The reason for our declaration of impotent implementation, of course, was, &lt;a href="http://kickin-the-darkness.blogspot.com/2007/09/confessions-of-terrible-programmer.html"&gt;as
this post states so well&lt;/a&gt;, a Zen-like celebration of our inadequacies: &lt;em&gt;To be
a Great Programmer, you must admit that you are a Terrible Programmer.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
To those who count themselves as the uninitiated into our particular brand of philosophy
(or religion, or just plain weirdness), the declaration is a statement of anti-Perfectionism.
"I am human, therefore I make mistakes. If I make mistakes, then I cannot assume that
I will write code that has no mistakes. If I cannot write code that has no mistakes,
then I must assume that mistakes are rampant within the code. If mistakes are rampant
within the code, then I must find them. But because I make mistakes, then I must also
assume that I make mistakes trying to identify the mistakes in the code. &lt;em&gt;Therefore,
I will seek the best support I can find in helping me find the mistakes in my code.&lt;/em&gt;"
&lt;/p&gt;
&lt;p&gt;
This support can come in a variety of forms. The Terrible Programmer cites several
of his favorites:&amp;nbsp;use of the&amp;nbsp;Statically-Typed Language (in his case, Ada),
Virulent Assertions, Testing Masochism, the Brutally Honest Code Review, and Zeal
for the Visible Crash. Myself, I like to consider other tools as well: the Static
Analysis Tool Suite,&amp;nbsp;a Commitment to Confront the Uncomfortable Truth, and the
Abject Rejection of Best Practices.
&lt;/p&gt;
&lt;p&gt;
By this point in time, most developers have at least heard of, if not considered adoption
of, the Masochistic Testing meme. Fellow NFJS'ers Stuart Halloway and Justin Gehtland
have founded a consultancy firm, Relevance, that sets a high bar as a corporate cultural
standard: 100% test coverage of their code. Neal Ford has reported that ThoughtWorks
makes similar statements, though it's my understanding that clients sometimes put
accidental obstacles in their way of achieving said goal. It's amibtious, but as the
ancient American Indian proverb is said to state, &lt;em&gt;If you aim your arrow at the
sun, it will fly higher and father than if you aim it at the ground&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
In fact, on a panel this weekend in Dallas, fellow NFJS'er David Bock attributed the
rise of interest in dynamic languages to the growth of the unit-testing meme, since
faith in the quality of code authored in a dynamic language can only follow if the
code has been rigorously tested, since we have no tool checking the syntactic or semantic
correctness before it is executed.
&lt;/p&gt;
&lt;p&gt;
Among the jet-setting Ruby crowd, this means a near-slavish devotion to unit tests.
Interestingly enough, I find this attitude curiously incomplete: if we assume that
we make mistakes, and that we therefore require unit tests to prove to ourselves (and,
by comfortable side effect, the world around us) that the code is correct, would we
not also benefit from the automated--and in some ways far more comprehensive--checking
that a static-analysis tool can provide? Stu Halloway once stated, "In five years,
we will look back upon the Java compiler as a weak form of unit testing." I have no
doubt that he's right--but I draw an entirely different conclusion from his statement:
we need better static analysis tools, not to abandon them entirely.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Consider, if you will, the static-analysis tool known as FindBugs. Fellow NFJS'er&amp;nbsp;(and&amp;nbsp;author
of&amp;nbsp;the JavaOne bestselling book &lt;em&gt;Java Concurrency in Practice&lt;/em&gt;)&amp;nbsp;Brian
Goetz offered a presentation last year on the use of FindBugs in which he cited the
use of the tool over the existing JDK Swing code base. Swing has been in use since
1998, has had close to a decade of debugging driven by actual field use, and (despite
what personal misgivings the average Java programmer may have about building a "rich
client" application instead of a browser-based one) can legitimately call itself a
successful library in widespread use.
&lt;/p&gt;
&lt;p&gt;
If memory serves, Brian's presentation noted that when run over the Swing code base,
FindBugs discovered 70-something concurrency errors that remained in the code base,
some since JDK 1.2. &lt;em&gt;In close to a decade of use, 70-something concurrency bugs
had been neither fixed nor found.&lt;/em&gt; Even if I misremember that number, and it is
off by an order of magnitude--7 bugs instead of 70--the implication remains clear: &lt;em&gt;simple
usage cannot reveal all bugs.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The effect of this on the strength of the unit-testing argument cannot be understated--if
the quality of dynamic-language-authored code rests on the exercise of that code under
constrained circumstances in order to prove its correctness, then we have a major
problem facing us, because the interleaving of execution paths that define concurrency
bugs remain beyond the ability of most (arguably all) languages and/or platforms to
control. &lt;em&gt;It thus follows that concurrent code cannot be effectively unit tested,
and thus the premise that dynamic-language-authored code can be proven correct by
simple use of unit tests is flawed.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Some may take this argument to imply a rejection of unit tests. Those who do would
be seeking evidence to support a position that is equally untenable, that unit-testing
is somehow "wrong" or unnecessary. No such statement is implied; quite&amp;nbsp;the opposite,
in fact. We can neither reject the&amp;nbsp;necessitary of unit testing any more than
we can the&amp;nbsp;beneficence of static analysis tools; each is, in its own way, incomplete
in its ability to prove code correct, at least in current incarnations. In fact, although
I will not speak for them, many of the Apostles of UnitTestitarianism in fact indirectly
support this belief, arguing that unit tests do not obviate the need for a quality-analysis
phase after a development iteration, because correct unit tests cannot imply completely
correct code.
&lt;/p&gt;
&lt;p&gt;
Currently much research is taking place in the statically-typed languages to make
them more typesafe without sacrificing the productivity enhancements seen in the dynamically-typed
language world. Scala, for example, makes heavy use of type-inferencing to reduce
the burden of type declarations by the programmer, requiring such declarations only
when the inferencing yields ambiguity. As a result, Scala's syntax--at a first glance--looks
remarkably similar in places to Ruby's, yet the Scala compiler is still fully type-safe,
ensuring that accidental coercion doesn't yield confusion. Microsoft is pursuing much
the same route as part of their LINQ strategy for Visual Studio 2008/.NET 3.5 (the
"Orcas" release), and some additional research is being done around functional languages
in the form of F#.
&lt;/p&gt;
&lt;p&gt;
At the end of the day, the fact remains that I write shitty code. That means I need
all the help I can get--human-centric or otherwise--to make sure that my code is correct.
I will take that help in the form of unit tests that I force myself (and others around
me force myself) to write. But I also have to accept the possibility that my unit
tests themselves may be flawed, and that therefore other tools--which do not suffer
from my inherent human capacity to forget or brush off--are a powerful and necessary
component of my toolbox.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=3aedfe99-c280-46eb-9a05-1a41f5e4ffb7" /&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,3aedfe99-c280-46eb-9a05-1a41f5e4ffb7.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=5809b25c-d912-47d7-8b59-963c9c7ad0a0</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,5809b25c-d912-47d7-8b59-963c9c7ad0a0.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,5809b25c-d912-47d7-8b59-963c9c7ad0a0.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5809b25c-d912-47d7-8b59-963c9c7ad0a0</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is not a title I convey lightly, but Michael Nygard's <em>Release It!</em> deserves
the honor. It's the first book I've ever seen that addresses the issues of building
software that's Production-friendly and sysadmin-approachable. He describes a series
of antipatterns describing a variety of software failures, and offers up a series
of solutions (patterns, if you will) to building software systems designed to combat
said failures.
</p>
        <p>
From the back cover:
</p>
        <blockquote>
          <p>
Every website project is really an enterprise integration project: the stakes are
high and the projects complex. In this world where good marketing can be fatal to
yor website, where networks are unreliable, and where astronomically unlikely coincidences
happen daily, you need all the help you can get.
</p>
          <p>
...
</p>
        </blockquote>
        <blockquote>
          <p>
You're a whiz at development. But 80% of typical project lifecyle cost can occur in
production--not in development.
</p>
        </blockquote>
        <p>
Although Michael's personal experience stems mostly from the Java space, the lessons
and stories he offers up are equally relevant to Java, .NET, C++, Ruby, PHP, and any
other language or platform you can imagine. Michael Nygard not only knows the Ten
Fallacies of Enterprise Development, he <em>breathes</em> them.
</p>
        <p>
Go. Now. Buy. Read. Don't write another line of code until you do.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5809b25c-d912-47d7-8b59-963c9c7ad0a0" />
        <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>A Book Every Developer Must Read</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,5809b25c-d912-47d7-8b59-963c9c7ad0a0.aspx</guid>
      <link>http://blogs.tedneward.com/2007/10/08/A+Book+Every+Developer+Must+Read.aspx</link>
      <pubDate>Mon, 08 Oct 2007 00:41:29 GMT</pubDate>
      <description>&lt;p&gt;
This is not a title I convey lightly, but Michael Nygard's &lt;em&gt;Release It!&lt;/em&gt; deserves
the honor. It's the first book I've ever seen that addresses the issues of building
software that's Production-friendly and sysadmin-approachable. He describes a series
of antipatterns describing a variety of software failures, and offers up a series
of solutions (patterns, if you will) to building software systems designed to combat
said failures.
&lt;/p&gt;
&lt;p&gt;
From the back cover:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Every website project is really an enterprise integration project: the stakes are
high and the projects complex. In this world where good marketing can be fatal to
yor website, where networks are unreliable, and where astronomically unlikely coincidences
happen daily, you need all the help you can get.
&lt;/p&gt;
&lt;p&gt;
...
&lt;/p&gt;
&lt;/blockquote&gt; &lt;blockquote&gt; 
&lt;p&gt;
You're a whiz at development. But 80% of typical project lifecyle cost can occur in
production--not in development.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Although Michael's personal experience stems mostly from the Java space, the lessons
and stories he offers up are equally relevant to Java, .NET, C++, Ruby, PHP, and any
other language or platform you can imagine. Michael Nygard not only knows the Ten
Fallacies of Enterprise Development, he &lt;em&gt;breathes&lt;/em&gt; them.
&lt;/p&gt;
&lt;p&gt;
Go. Now. Buy. Read. Don't write another line of code until you do.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=5809b25c-d912-47d7-8b59-963c9c7ad0a0" /&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,5809b25c-d912-47d7-8b59-963c9c7ad0a0.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=62008d6c-6efb-4641-9f5e-e844872d3937</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,62008d6c-6efb-4641-9f5e-e844872d3937.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,62008d6c-6efb-4641-9f5e-e844872d3937.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=62008d6c-6efb-4641-9f5e-e844872d3937</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I get e-mail from blog readers, and this one--literally--stopped me in my tracks as
I was reading. Rather than interpret, I'll just quote (with permission) the e-mail
and respond afterwards
</p>
        <blockquote>
          <p>
Hi Ted,
</p>
          <p>
I had a job interview last Friday which I wanted to share with you. It was for a “Solutions
Architect” role with a large Airline here in New Zealand. I had a preliminary interview
with the head Architect which went extremely well, and I was called in a few days
later for an interview with the other three guys on the Architecture team. 
</p>
          <p>
The second interview started off with the usual pleasantries, and then the technical
grilling began with: 
</p>
          <p>
            <b>“What are the best practices that you would put in place on a project?”</b>
          </p>
          <p>
I replied “I’ve come to realise that there is no such thing as ’Best Practice’ in
architecture – everything is contextual.” 
</p>
          <p>
Well, it went down like a sh*t sandwich! The young German guy who asked the question
looked at me like some sort of heretic and said – “ I disagree”. I thought to myself,
no damn it – I’m going to push it to see where this guys argument goes, so I said
“I can take any best practice you can think of, and by changing the context, I can
render that best practice a worst practice”. He didn’t like that very much, but I
thought, ‘bugger him, I know I’m right’. 
</p>
          <p>
He then came out with the next question “What do you do when your architectural principles
are compromised”. I asked “what do you mean”, and he indicated that an application
he designed recently, was found to be far too expensive to implement So he asked again
‘what would you do’? 
</p>
          <p>
I replied “redesign it”. He scoffed at this answer, and reiterated “but what if the
redesign was compromising your architectural principles”? So I asked “what is more
important. Your principles, or achieving a business objective?”. I don’t remember
exactly what his answer was, but it was along the lines of “you have to maintain a
corporate standard”. 
</p>
          <p>
His next attack was at extreme programming. Having seen that I had used extreme programming
one of my recent projects (in addition to also using waterfall, more recently, on
others), he asked “don’t you think that the very risky nature of extreme programming
is at odds with it’s ability to deliver software consistently?”. This was a bit of
a stunner. I indicated that, once again, it was contextual. XP is appropriate on some
projects, but it is not on others. On the XP project I worked on, it was entirely
appropriate. We delivered early, within budget, the client got what he wanted, and
we got a few million dollars worth of work out of it. Not surprisingly, he didn’t
have a lot to say to me after that. 
</p>
          <p>
Having worked as a consultant for a number of years now, I have been entirely focused
on adding <b>business value</b>. I was stunned to hear first hand, how divorced from
the business this “architect” was. Clearly he has to maintain some sort of structure
with their corporate systems, but surely each business solution should be assessed
primarily in the context of it’s own business objectives. 
</p>
          <p>
The interview was good in the respect that I was able to quickly establish that it
wasn’t the place for me, but it did leave me with some unanswered questions: 
</p>
          <ol>
            <li>
How could their idea of an architect (being the policemen of corporate best practice)
be so far removed from someone like myself, who aims to make case by case judgements
based on pragmatism and experience? 
</li>
            <li>
Is architecture supposed to be facilitative or restrictive? 
</li>
            <li>
What relevance do architects have today? Are they just overpaid, out of touch developers?</li>
          </ol>
          <p>
Regards, 
</p>
          <p>
Shane Paterson 
</p>
          <p>
Hands on Architect Type 
</p>
          <p>
(for lack of a more relevant title)
</p>
        </blockquote>
        <p>
Wow. 
</p>
        <p>
For starters, Shane, kudos to you for sticking to your guns, and for figuring out
really quickly that this was clearly not a place you wanted to work--a lot of developers
have a mentality that says that they need the company more than the company needs
them, sort of a "job at any price" mindset. Interviews aren't supposed to be the place
where candidates grovel and say whatever the company wants them to hear--an interview
is supposed to be a vetting process for both sides. 
</p>
        <p>
But on to your questions: 
</p>
        <p>
          <em>How could their idea of an architect be so far removed from someone like myself?</em> I
can't answer this one solidly, but I can say that the definition of an architect seems
to be vague and indiscriminate a term, only exceeded in opacity by the term "software"
itself. For some companies I've worked for, the "architect" was as you describe yourself,
someone whose hands were dirty with code, acting as technical lead, developer, sometimes-project-manager,
and always focused on customer/business value as well as technical details. At other
places, the architect (or "architect team") was a group of developers who had to be
promoted (usually due to longevity) with no clear promotion path available to them
other than management. This "architect team" then lays down "corporate standards",
usually based on "industry standards", with little to no feedback as to the applicability
of their standards to the problems faced by the developers underneath them. A friend
of mine on the NFJS tour, Brian Sletten, tells a story of how he consulted on a project,
implementing the (powerful) 1060 Netkernel toolkit at the core of the system, to resounding
success. Then, on deployment, the "architecture team" took a look, pronounced the
system to be incompatible with their "official standards", and <em>forced new development
of a working product</em>. In other words, the fact that it worked (and could easily
be turned to interoperate with their SOAP-based standard, of which there were zero
existing services) was in no way going to stand as an impediment to their enforcement
of the corporate standard.
</p>
        <p>
          <em>Is architecture supposed to be facilitative or restrictive?</em> Ah, this is a
harder one to answer. In essence, both. Now, before the crowd starts getting out their
torches and pitchforks to have a good old-fashioned lynching, hear me out.
</p>
        <p>
Architecture is intended to be facilitative, of course, in that a good architecture
should enable developers to build applications quickly and easily, without having
to spend significant amounts of time re-inventing similar infrastructure across multiple
projects. A good architecture will also facilitate interoperability across applications,
ensure a good code quality, ensure good maintainability, provide for future extensibility,
and so on. All of this, I would argue, falls under the heading of "facilitation".
</p>
        <p>
But an architecture is also intended to be restrictive, in that it should channel
software developers in a direction that leads to all of these successes, and away
from potential decisions that would lead to prolems later. In other words, as Microsoft's
CLR architect Rico Mariani put it, a good architecture should enable developers to
"fall into the pit of success", where if you just (to quote the proverbial surfer)
"go with the flow", you make decisions that lead to all of those good qualities we
just discussed.
</p>
        <p>
This is asking a lot of an architecture, granted. But that's the ideal.
</p>
        <p>
          <em>What relevance do architects have today?</em> Well, this is a dangerous question,
in that you're asking it of one who considers himself an architect and technologist,
so take this with the usual grain of salt. Are we just overpaid out-of-touch developers?
God, I hope not. Fowler talks about architecture being irrelevant in an agile project,
but I disagree with that notion pretty fundamentally: an architect is the captain
of the ship, making the decisions that cross multiple areas of concern (navigation,
engineering, and so on), taking final responsibility for the overall health of the
ship and its crew (project and its members), able to step into any station to perform
those duties as the need arises (write code for any part of the project should they
lose a member). He has to be familiar with the problem domain, the technology
involved, and keep an eye out on new technologies that might make the project easier
or answer new customers' feature requests.
</p>
        <p>
And if anybody stands up at this point and says, "Hey, wait a minute, that's a pretty
tall order for anybody to fill!", then you start to get an idea of why architects
do, frequently, get paid more than developers do. Having to know the business, the
technology at a high and low level of detail, keeping your hands in the code, and
watching the horizon for new developments in industry, is a pretty good way to burn
out any free time you might have thought you'd have.
</p>
        <p>
Granted, all of these answers notwithstanding, there's a large number of "architects"
out there whose principal goal is to simply remain employed. To do that, they cite
"best practices" established by "industry experts" as a cover for making decisions
of their own, because nobody ever gets fired for choosing what industry "best practices"
dictate. That's partly why I hate that term: it's a cop-out. It's basically relying
on articles on popular websites and magazines to do your thinking for you. Inevitably,
when somebody at a conference says the word, "Best Practice", listeners' minds turn
off, their pens turn on, and they dutifully enscribe this bit of knowledge into their
projects at home, <em>without considering the applicability to their project or corporate
culture</em>. Nothing, not a single technology, not a single development methodology,
not even a single tool, is <em>always</em> the right answer.
</p>
        <p>
In the end, I think what Shane ran into was an "architect" with an agenda and an alpha-geek
complex. He refused to consider somebody with a competing point of view, because God
forbid somebody show him <em>not</em> to be the expert he's hoodwinked everybody else
at work to think he is. Unfortunately I've run across this phenomenon too often to
call it statistical error, and the only thing you can do is to do exactly what you
did, Shane: get the hell out of Dodge.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=62008d6c-6efb-4641-9f5e-e844872d3937" />
        <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>Hard Questions About Architects</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,62008d6c-6efb-4641-9f5e-e844872d3937.aspx</guid>
      <link>http://blogs.tedneward.com/2007/09/20/Hard+Questions+About+Architects.aspx</link>
      <pubDate>Thu, 20 Sep 2007 11:11:38 GMT</pubDate>
      <description>&lt;p&gt;
I get e-mail from blog readers, and this one--literally--stopped me in my tracks as
I was reading. Rather than interpret, I'll just quote (with permission) the e-mail
and respond afterwards
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Hi Ted,
&lt;/p&gt;
&lt;p&gt;
I had a job interview last Friday which I wanted to share with you. It was for a “Solutions
Architect” role with a large Airline here in New Zealand. I had a preliminary interview
with the head Architect which went extremely well, and I was called in a few days
later for an interview with the other three guys on the Architecture team. 
&lt;p&gt;
The second interview started off with the usual pleasantries, and then the technical
grilling began with: 
&lt;p&gt;
&lt;b&gt;“What are the best practices that you would put in place on a project?”&lt;/b&gt; 
&lt;p&gt;
I replied “I’ve come to realise that there is no such thing as ’Best Practice’ in
architecture – everything is contextual.” 
&lt;p&gt;
Well, it went down like a sh*t sandwich! The young German guy who asked the question
looked at me like some sort of heretic and said – “ I disagree”. I thought to myself,
no damn it – I’m going to push it to see where this guys argument goes, so I said
“I can take any best practice you can think of, and by changing the context, I can
render that best practice a worst practice”. He didn’t like that very much, but I
thought, ‘bugger him, I know I’m right’. 
&lt;p&gt;
He then came out with the next question “What do you do when your architectural principles
are compromised”. I asked “what do you mean”, and he indicated that an application
he designed recently, was found to be far too expensive to implement So he asked again
‘what would you do’? 
&lt;p&gt;
I replied “redesign it”. He scoffed at this answer, and reiterated “but what if the
redesign was compromising your architectural principles”? So I asked “what is more
important. Your principles, or achieving a business objective?”. I don’t remember
exactly what his answer was, but it was along the lines of “you have to maintain a
corporate standard”. 
&lt;p&gt;
His next attack was at extreme programming. Having seen that I had used extreme programming
one of my recent projects (in addition to also using waterfall, more recently, on
others), he asked “don’t you think that the very risky nature of extreme programming
is at odds with it’s ability to deliver software consistently?”. This was a bit of
a stunner. I indicated that, once again, it was contextual. XP is appropriate on some
projects, but it is not on others. On the XP project I worked on, it was entirely
appropriate. We delivered early, within budget, the client got what he wanted, and
we got a few million dollars worth of work out of it. Not surprisingly, he didn’t
have a lot to say to me after that. 
&lt;p&gt;
Having worked as a consultant for a number of years now, I have been entirely focused
on adding &lt;b&gt;business value&lt;/b&gt;. I was stunned to hear first hand, how divorced from
the business this “architect” was. Clearly he has to maintain some sort of structure
with their corporate systems, but surely each business solution should be assessed
primarily in the context of it’s own business objectives. 
&lt;p&gt;
The interview was good in the respect that I was able to quickly establish that it
wasn’t the place for me, but it did leave me with some unanswered questions: 
&lt;ol&gt;
&lt;li&gt;
How could their idea of an architect (being the policemen of corporate best practice)
be so far removed from someone like myself, who aims to make case by case judgements
based on pragmatism and experience? 
&lt;li&gt;
Is architecture supposed to be facilitative or restrictive? 
&lt;li&gt;
What relevance do architects have today? Are they just overpaid, out of touch developers?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Regards, 
&lt;p&gt;
Shane Paterson 
&lt;p&gt;
Hands on Architect Type 
&lt;p&gt;
(for lack of a more relevant title)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Wow. 
&lt;p&gt;
For starters, Shane, kudos to you for sticking to your guns, and for figuring out
really quickly that this was clearly not a place you wanted to work--a lot of developers
have a mentality that says that they need the company more than the company needs
them, sort of a "job at any price" mindset. Interviews aren't supposed to be the place
where candidates grovel and say whatever the company wants them to hear--an interview
is supposed to be a vetting process for both sides. 
&lt;p&gt;
But on to your questions: 
&lt;p&gt;
&lt;em&gt;How could their idea of an architect be so far removed from someone like myself?&lt;/em&gt; I
can't answer this one solidly, but I can say that the definition of an architect seems
to be vague and indiscriminate a term, only exceeded in opacity by the term "software"
itself. For some companies I've worked for, the "architect" was as you describe yourself,
someone whose hands were dirty with code, acting as technical lead, developer, sometimes-project-manager,
and always focused on customer/business value as well as technical details. At other
places, the architect (or "architect team") was a group of developers who had to be
promoted (usually due to longevity) with no clear promotion path available to them
other than management. This "architect team" then lays down "corporate standards",
usually based on "industry standards", with little to no feedback as to the applicability
of their standards to the problems faced by the developers underneath them. A friend
of mine on the NFJS tour, Brian Sletten, tells a story of how he consulted on a project,
implementing the (powerful) 1060 Netkernel toolkit at the core of the system, to resounding
success. Then, on deployment, the "architecture team" took a look, pronounced the
system to be incompatible with their "official standards", and &lt;em&gt;forced new development
of a working product&lt;/em&gt;. In other words, the fact that it worked (and could easily
be turned to interoperate with their SOAP-based standard, of which there were zero
existing services) was in no way going to stand as an impediment to their enforcement
of the corporate standard.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Is architecture supposed to be facilitative or restrictive?&lt;/em&gt; Ah, this is a
harder one to answer. In essence, both. Now, before the crowd starts getting out their
torches and pitchforks to have a good old-fashioned lynching, hear me out.
&lt;/p&gt;
&lt;p&gt;
Architecture is intended to be facilitative, of course, in that a good architecture
should enable developers to build applications quickly and easily, without having
to spend significant amounts of time re-inventing similar infrastructure across multiple
projects. A good architecture will also facilitate interoperability across applications,
ensure a good code quality, ensure good maintainability, provide for future extensibility,
and so on. All of this, I would argue, falls under the heading of "facilitation".
&lt;/p&gt;
&lt;p&gt;
But an architecture is also intended to be restrictive, in that it should channel
software developers in a direction that leads to all of these successes, and away
from potential decisions that would lead to prolems later. In other words, as Microsoft's
CLR architect Rico Mariani put it, a good architecture should enable developers to
"fall into the pit of success", where if you just (to quote the proverbial surfer)
"go with the flow", you make decisions that lead to all of those good qualities we
just discussed.
&lt;/p&gt;
&lt;p&gt;
This is asking a lot of an architecture, granted. But that's the ideal.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;What relevance do architects have today?&lt;/em&gt; Well, this is a dangerous question,
in that you're asking it of one who considers himself an architect and technologist,
so take this with the usual grain of salt. Are we just overpaid out-of-touch developers?
God, I hope not. Fowler talks about architecture being irrelevant in an agile project,
but I disagree with that notion pretty fundamentally: an architect is the captain
of the ship, making the decisions that cross multiple areas of concern (navigation,
engineering, and so on), taking final responsibility for the overall health of the
ship and its crew (project and its members), able to step into any station to perform
those duties as the need arises (write code for any part of the project should they
lose a member). He has to be familiar with the problem domain,&amp;nbsp;the technology
involved, and keep an eye out on new technologies that might make the project easier
or answer new customers' feature requests.
&lt;/p&gt;
&lt;p&gt;
And if anybody stands up at this point and says, "Hey, wait a minute, that's a pretty
tall order for anybody to fill!", then you start to get an idea of why architects
do, frequently, get paid more than developers do. Having to know the business, the
technology at a high and low level of detail, keeping your hands in the code, and
watching the horizon for new developments in industry, is a pretty good way to burn
out any free time you might have thought you'd have.
&lt;/p&gt;
&lt;p&gt;
Granted, all of these answers notwithstanding, there's a large number of "architects"
out there whose principal goal is to simply remain employed. To do that, they cite
"best practices" established by "industry experts" as a cover for making decisions
of their own, because nobody ever gets fired for choosing what industry "best practices"
dictate. That's partly why I hate that term: it's a cop-out. It's basically relying
on articles on popular websites and magazines to do your thinking for you. Inevitably,
when somebody at a conference says the word, "Best Practice", listeners' minds turn
off, their pens turn on, and they dutifully enscribe this bit of knowledge into their
projects at home, &lt;em&gt;without considering the applicability to their project or corporate
culture&lt;/em&gt;. Nothing, not a single technology, not a single development methodology,
not even a single tool, is &lt;em&gt;always&lt;/em&gt; the right answer.
&lt;/p&gt;
&lt;p&gt;
In the end, I think what Shane ran into was an "architect" with an agenda and an alpha-geek
complex. He refused to consider somebody with a competing point of view, because God
forbid somebody show him &lt;em&gt;not&lt;/em&gt; to be the expert he's hoodwinked everybody else
at work to think he is. Unfortunately I've run across this phenomenon too often to
call it statistical error, and the only thing you can do is to do exactly what you
did, Shane: get the hell out of Dodge.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=62008d6c-6efb-4641-9f5e-e844872d3937" /&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,62008d6c-6efb-4641-9f5e-e844872d3937.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=d3e893b9-3065-4a51-81ec-05f562e3b4eb</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,d3e893b9-3065-4a51-81ec-05f562e3b4eb.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,d3e893b9-3065-4a51-81ec-05f562e3b4eb.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d3e893b9-3065-4a51-81ec-05f562e3b4eb</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <em>
        </em>
        <p>
          <em>Software is endless battle and conflict, and you cannot develop effectively unless
you can identify the enemies of your project. Obstacles are subtle and evasive, sometimes
appearing to be strengths and not distractions. You need clarity. Learn to smoke out
your obstacles, to spot them by the signs and patterns that reveal hostility and opposition
to your success. Then, once you have them in your sights, have your team declare war.
As the opposite poles of a magnet create motion, your enemies--your opposites--can
fill you with purpose and direction. As people and problems that stand in your way,
who represent what you loathe, oppositions to react against, they are a source of
energy. Do not be naive: with some problems, there can be no compromise, no middle
ground.</em>
        </p>
        <p>
In the early 1970s, Margaret Thatcher shook up British politics by refusing to take
the style of the politicians before her: where they were smooth and conciliatory,
she was confrontational, attacking her opponents directly. She bucked the conventional
wisdom, attacking her opponents mercilessly where historically politicians sought
to reassure and compromise. Her opponents had no choice but to respond in kind. Thatcher's
approach polarized the population, seizing the attention, attracting the undecided
and winning a sizable victory.
</p>
        <p>
But now she had to rule, and as she continued down her obstinate, all-in style of
"radicalism" politics, she seemed to gain more enemies than any one politician could
hold off. Then, in 1982, Argentina attacked the British Falkland Islands in the South
Atlantic. Despite the distance--the Falklands were almost diametrically opposite the
globe from the British home islands, off the tip of South America--Thatcher never
hesitated, dispatching the British armed forces to respond to the incursion with deadly
force, and the Argentinians were beaten. Suddenly, her obstinacy and radicalism were
seen in a different light: courage, nobility, resolute and confident.
</p>
        <p>
Thatcher, as an outsider (a middle-class woman and a right-wing radical), chose not
to try and "fit in" with the crowd, but to stake her territory clearly and loudly. Life
as an outsider can be hard, but she knew that if she tried to blend in,
she could easily be replaced. Instead, she set herself up at every turn as one
woman against an army of men.
</p>
        <p>
As Greene notes, 
</p>
        <blockquote>
          <p>
We live in an era in which people are seldom directly hostile. The rules
of engagement--social, political, military--have changed, and so must your notion
of the enemy. An up-front enemy is rare now and is actually a blessing. ... Although
the world  is more competitive than ever, outward aggression is discouraged,
so people have learned to go underground, to attack unpredictably and craftily. ...
Understand: the word 'enemy'--from the Latin <em>inimicus</em>, "not a friend"--has
been demonized and politicized. Your first task as a strategist is to widen your concept
of the enemy, to include in that group those who are working against you, thwarting
you, even in subtle ways.
</p>
        </blockquote>
        <p>
Software projects face much the same kind of problem: there are numerous forces that
are at work trying to drag the project down into failure. While agile books love to
assume an environment in which the agile methodology is widely accepted and embraced,
reality often intrudes in very rude ways. Sometimes management's decision to
"go agile" is based not to try and deliver software more successfully, but to
simply take the latest "fad" and throw it into the mix, such that when it fails, management
can say, "But we followed industry best practices, it clearly can't be <em>management</em> at
fault." (This is the same idea behind the statement, "Nobody ever got fired for buying
IBM (or Microsoft or Java or ...)." Sometimes the users are not as committed to the
project as we might hope, and at times, the users are even contradictory to one another,
as each seeks to promote their own agenda within the project.
</p>
        <p>
As a software development lead (or architect, or technical lead, or project manager,
or agile coach, or whatever), you need to learn how to spot these enemies to your
project, identify them clearly, and make it clear that you see them as an enemy that
will not be tolerated. This doesn't mean always treat them openly hostile--sometimes
the worst enemies can be turned into the best friends, if you can identify what drives
them to the position that they take, and work to meet their needs. Case in point:
system administrators frequently find themselves at odds with developers, because
the developer seeks (by nature) to change the system, and sysadmins seek (by nature)
to keep everything <em>status quo</em>. Recognizing that sysadmins have historically
been blindsided by projects that essentially ignored <em>their</em> needs (such as
a need to know that the system is still running, or the need to be able to easily
add users, change security policies, or diagnose failures quickly at 3AM in the morning)
means that we as developers can either treat them as enemies to be overcome, or win
them as friends by incorporating their needs into the project. But they are either
"for us" or "against us", and not just a group to be ignored.
</p>
        <p>
Other enemies are not to be tolerated at any level: apathy, sloth, or ignorance are
all too common among developer teams. Ignorance of how underlying technologies work.
Apathy as to the correctness of the code being created. Sloth in the documentation
or tests. These are enemies that, given enough time and inattention, will drag the
project down into the tar pits of potential failure. They cannot be given any quarter.
Face them squarely, with no compromise. Your team, if they hold these qualities, must
be shown that there is no tolerance for them. Hold brown-bag lunches once a week to
talk about new technologies, and their poential impact on the team or company or project.
Conduct code reviews religiously, during active development (rather that at the end
as a token gesture), with no eye towards criticizing the author of the code, but the
code itself. Demand perfection in the surrounding artifacts of the project: the help
files, the user documentation, the graphics used for buttons and backdrops and menus.
</p>
        <p>
Do not wait for the enemies of your project to show themselves, either--actively seek
them out and crush them. Take ignorance, for example. Do not just "allow" each of
your developers to research new technologies, but demand it of them: have each one
give a brown-bag presentation in turn. In a four-man team, this means that each developer
will have a month in which to find something new to discover, analyze, discuss and
present. They do not have to have all the answers to the technology, and in fact,
if the technology is sufficiently large or interesting, they can spend the next month
investigating a new element or new use of the technology. Demanding this of your developers
means they are forced to educate themselves, and forced to raise their own awareness
of the changing world. (Naturally, developers must be given time to do this research;
anecdotally, giving them Friday afternoons to do this experimentation and research,
when energy and interest in the work week is already typically at an ebb, works well.)
</p>
        <p>
Wherever possible, avoid enemies that are large and hard to pinpoint. Simply saying
"We need to have better quality code" is too amorphous and too vague. Developers have
nothing to measure against. Personalize your enemies, eyeball to eyeball. Put names
to them, make them clearly visible to all involved. "We will have 100% code coverage
in our unit tests" is a clearly-defined goal, and anything that prevents that goal
from being reached will be clearly visible. "We will not ship code that fails to pass
any unit test" is another clear goal, but must be paired with something that
avoids the natural "Well, then, we'll not write any unit tests, and we'll have met
that goal!" response. Demanding a ratio of unit-test-lines-to-lines ratio is a good
start: "We will have three lines of unit test code per line of code" now offers a
measurable, identifiable enemy that can be stared in the face. Go so far as to make
a ceremony out of it: call the developers into a room, put a poster on a wall, and
make your intentions clear. Motivate them. "When we presented the release of the payroll
system to the HR department last year, the users called it 'barely acceptable' and
'hard to use'. I <em>refuse</em> to allow that to happen again. The system we build
for them this year will be amazing. It will be reliable. It will have those features
they need to get their job done <em>(and be specific here)</em>, and we will accept
no excuse otherwise."
</p>
        <p>
One of the world's most successful software companies, Microsoft is no stranger to
the polarity strategy. The company as a whole as declared war on its enemies in a
variety of fields, and with few exceptions, has won in almost every conflict. Microsoft
actively courts conflict and confrontation. The presence of a well-established competitor
in a particular field is no barrier to entry; Microsoft has routinely entered fields
with dominant competitors and come out ahead in the end. Witness their entries into
the word-processor and spreadsheet markets held at the time by dominant
competitors WordPerfect and Lotus 1-2-3, their entry into the video-game console
market against well-established competitors Sega and Nintendo, and more recently,
the mobile entertainment device market (the Zune) against the iPod. In the latter,
the battle has just begun, and the market remains firmly in the hands of the iPod,
but let it not be forgotten that Microsoft is not one to retreat quickly from a battle.
</p>
        <p>
Microsoft is also known to do this within their projects; developers who are committed
to a project yet seem hesitant or lax in their work are asked if they are really "on
board" with this project. The legends of Microsoft developers putting in 80-plus hours
a week on a project are somewhat true, but not because Microsoft management expects
it of them, but because developers have been willing to put that kind of time into
the project in order to succeed. 
</p>
        <p>
And Microsoft management itself has declared war on its enemies, time and again, looking
to eliminate any and all opposition the successful release of software. Distractions?
Every developer gets his own office. Household chores? Microsoft has been known to
offer their developers laundry services at work. Computing resources? It's not at
all uncommon to walk into a Microsoft developers' office and see multiple CPUs (under
desks, in corners, laptops, and so on) and monitors all over the room. Bodily needs?
Refrigerators on every floor, stocked with sodas of every variety, water, juices,
anything that the thirsty developer could need, all free for the taking. Even fatigue
is an enemy: Microsoft buildings have video game consoles, foosball tables, bean bag
chairs, and more tools of relaxational activities to help the developer
take a break when necessary, so that they can resume the fight refreshed. 
</p>
        <p>
Greene notes further,
</p>
        <blockquote>
          <p>
There are always hostile people and destructive relationships. The only way to break
out of a negative dynamic is to confront it. Repressing your anger, avoiding
the person threatening you, always looking to conciliate--these common strategies
spell ruin. Avoidance of conflict becomes a habit, and you lose the taste for
battle. Feeling guilty is pointless; it is not your fault you have enemies. Feeling
wronged or victimized is equally futile. In both cases you are looking inward, concentrating
on yourself and your feelings. Instead of internalizing a bad situation, externalize
it and face your enemy. It is the only way out.
</p>
        </blockquote>
        <p>
To adapt this to software, instead of simply talking about the hopeless situation
in which you find yourself--your company has no interest in agile, your team is just
too "inexperienced" to tackle the kinds of projects you are being given, and so on--externalize
it. Face the enemy. Your company has no interest in agile? Fine--instead of trying
to talk them into it, take the radical approach, <em>do</em> a project in an
agile fashion (even without upper management's knowledge if necessary), and show them
the results. Can't get the IT budget to allow for a source-control server or continuous
integration server? Use your desktop machine instead. Face the enemy, confront it,
and defeat it.
</p>
        <p>
Enemies are not evil, and should not be seen as something to avoid. Enemies give us
something against which to measure ourselves, to use as a foil against which to better
ourselves. They motivate and focus your beliefs. Have a co-worker who refuses to see
the benefits of dynamic languages? Avoiding him simply avoids an opportunity for you
to learn from him and to better your arguments and approaches. Have a boss who doesn't
see what the big deal behind a domain-specific language is? Have conversations on
the subject, to understand her reluctance and opposition, and build a small DSL to
show her the benefits of doing so. Don't avoid these people, for they offer you opportunities
to better yourself and your understanding.
</p>
        <p>
Enemies also give you a standard against which to judge yourself. It took Joe Frazier
to make Muhammad Ali a truly great boxer. The samurai of Japan had no guage of their
excellence unless they challenged the best swordsmen they could find. For the Indianapolis
Colts of last year, each victory was hollow unless they could beat their arch-rivals,
the New England Patriots. The bigger the opponent, the greater your reward, even in
defeat, for if you lose, you have opportunities to analyze the results and discover
how and why you lost, then correct your strategy for the next time. For there will <em>always</em> be
a next time.
</p>
        <p>
Don't seek to eschew enemies, either. Enemies give us options and purpose. Julius
Caesar identified Pompey as his enemy early in his rise to the throne. Everything
he did from then on was measured against Pompey, to put him in a stronger position
to meet his enemy. Once he defeated Pompey, however, Caesar lost his way, and eventually
fell because he viewed himself as a god and above all other men. Enemies force on
you a sense of realism and humility.
</p>
        <p>
Remember, enemies surround you and your project, and sometimes even within your project.
Keep a sharp eye out, so that once spotted, they can be identified, analyzed, and
handled. Show no quarter to those enemies: they must either join you to help you in
your quest to build great software, or be ruthlessly eliminated from your path. They
can either benefit from the project, or they can be removed from the battlefield entirely.
Some enemies--ignorance, apathy, sloth--are not easily defeated, nor once defeated
will they remain so. Never lay down your arms against them or trust your arms to someone
else--you are the last line of your own defense.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d3e893b9-3065-4a51-81ec-05f562e3b4eb" />
        <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>The First Strategy: Declare War on Your Enemies (The Polarity Strategy)</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,d3e893b9-3065-4a51-81ec-05f562e3b4eb.aspx</guid>
      <link>http://blogs.tedneward.com/2007/07/28/The+First+Strategy+Declare+War+On+Your+Enemies+The+Polarity+Strategy.aspx</link>
      <pubDate>Sat, 28 Jul 2007 22:42:31 GMT</pubDate>
      <description>&lt;em&gt;&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;Software is endless battle and conflict, and you cannot develop effectively unless
you can identify the enemies of your project. Obstacles are subtle and evasive, sometimes
appearing to be strengths and not distractions. You need clarity. Learn to smoke out
your obstacles, to spot them by the signs and patterns that reveal hostility and opposition
to your success. Then, once you have them in your sights, have your team declare war.
As the opposite poles of a magnet create motion, your enemies--your opposites--can
fill you with purpose and direction. As people and problems that stand in your way,
who represent what you loathe, oppositions to react against, they are a source of
energy. Do not be naive: with some problems, there can be no compromise, no middle
ground.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
In the early 1970s, Margaret Thatcher shook up British politics by refusing to take
the style of the politicians before her: where they were smooth and conciliatory,
she was confrontational, attacking her opponents directly. She bucked the conventional
wisdom, attacking her opponents mercilessly where historically politicians sought
to reassure and compromise. Her opponents had no choice but to respond in kind. Thatcher's
approach polarized the population, seizing the attention, attracting the undecided
and winning a sizable victory.
&lt;/p&gt;
&lt;p&gt;
But now she had to rule, and as she continued down her obstinate, all-in style of
"radicalism" politics, she seemed to gain more enemies than any one politician could
hold off. Then, in 1982, Argentina attacked the British Falkland Islands in the South
Atlantic. Despite the distance--the Falklands were almost diametrically opposite the
globe from the British home islands, off the tip of South America--Thatcher never
hesitated, dispatching the British armed forces to respond to the incursion with deadly
force, and the Argentinians were beaten. Suddenly, her obstinacy and radicalism were
seen in a different light: courage, nobility, resolute and confident.
&lt;/p&gt;
&lt;p&gt;
Thatcher, as an outsider (a middle-class woman and a right-wing radical), chose not
to try and "fit in" with the crowd, but to stake her territory clearly and loudly.&amp;nbsp;Life
as an outsider can be hard, but she knew that if&amp;nbsp;she&amp;nbsp;tried to blend in,
she could easily be replaced. Instead, she set herself&amp;nbsp;up at every turn as one
woman against an army of men.
&lt;/p&gt;
&lt;p&gt;
As Greene notes, 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
We live in an era&amp;nbsp;in which people are seldom directly&amp;nbsp;hostile. The rules
of engagement--social, political, military--have changed, and so must your notion
of the enemy. An up-front enemy is rare now and is actually a blessing. ... Although
the world &amp;nbsp;is more competitive than ever, outward aggression is discouraged,
so people have learned to go underground, to attack unpredictably and craftily. ...
Understand: the word 'enemy'--from the Latin &lt;em&gt;inimicus&lt;/em&gt;, "not a friend"--has
been demonized and politicized. Your first task as a strategist is to widen your concept
of the enemy, to include in that group those who are working against you, thwarting
you, even in subtle ways.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Software projects face much the same kind of problem: there are numerous forces that
are at work trying to drag the project down into failure. While agile books love to
assume an environment in which the agile methodology is widely accepted and embraced,
reality often intrudes in very rude ways.&amp;nbsp;Sometimes management's decision to
"go agile" is based not to try and&amp;nbsp;deliver software more successfully, but to
simply take the latest "fad" and throw it into the mix, such that when it fails, management
can say, "But we followed industry best practices, it clearly can't be &lt;em&gt;management&lt;/em&gt; at
fault." (This is the same idea behind the statement, "Nobody ever got fired for buying
IBM (or Microsoft or Java or ...)." Sometimes the users are not as committed to the
project as we might hope, and at times, the users are even contradictory to one another,
as each seeks to promote their own agenda within the project.
&lt;/p&gt;
&lt;p&gt;
As a software development lead (or architect, or technical lead, or project manager,
or agile coach, or whatever), you need to learn how to spot these enemies to your
project, identify them clearly, and make it clear that you see them as an enemy that
will not be tolerated. This doesn't mean always treat them openly hostile--sometimes
the worst enemies can be turned into the best friends, if you can identify what drives
them to the position that they take, and work to meet their needs. Case in point:
system administrators frequently find themselves at odds with developers, because
the developer seeks (by nature) to change the system, and sysadmins seek (by nature)
to keep everything &lt;em&gt;status quo&lt;/em&gt;. Recognizing that sysadmins have historically
been blindsided by projects that essentially ignored &lt;em&gt;their&lt;/em&gt; needs (such as
a need to know that the system is still running, or the need to be able to easily
add users, change security policies, or diagnose failures quickly at 3AM in the morning)
means that we as developers can either treat them as enemies to be overcome, or win
them as friends by incorporating their needs into the project. But they are either
"for us" or "against us", and not just a group to be ignored.
&lt;/p&gt;
&lt;p&gt;
Other enemies are not to be tolerated at any level: apathy, sloth, or ignorance are
all too common among developer teams. Ignorance of how underlying technologies work.
Apathy as to the correctness of the code being created. Sloth in the documentation
or tests. These are enemies that, given enough time and inattention, will drag the
project down into the tar pits of potential failure. They cannot be given any quarter.
Face them squarely, with no compromise. Your team, if they hold these qualities, must
be shown that there is no tolerance for them. Hold brown-bag lunches once a week to
talk about new technologies, and their poential impact on the team or company or project.
Conduct code reviews religiously, during active development (rather that at the end
as a token gesture), with no eye towards criticizing the author of the code, but the
code itself. Demand perfection in the surrounding artifacts of the project: the help
files, the user documentation, the graphics used for buttons and backdrops and menus.
&lt;/p&gt;
&lt;p&gt;
Do not wait for the enemies of your project to show themselves, either--actively seek
them out and crush them. Take ignorance, for example. Do not just "allow" each of
your developers to research new technologies, but demand it of them: have each one
give a brown-bag presentation in turn. In a four-man team, this means that each developer
will have a month in which to find something new to discover, analyze, discuss and
present. They do not have to have all the answers to the technology, and in fact,
if the technology is sufficiently large or interesting, they can spend the next month
investigating a new element or new use of the technology. Demanding this of your developers
means they are forced to educate themselves, and forced to raise their own awareness
of the changing world. (Naturally, developers must be given time to do this research;
anecdotally, giving them Friday afternoons to do this experimentation and research,
when energy and interest in the work week is already typically at an ebb, works well.)
&lt;/p&gt;
&lt;p&gt;
Wherever possible, avoid enemies that are large and hard to pinpoint. Simply saying
"We need to have better quality code" is too amorphous and too vague. Developers have
nothing to measure against. Personalize your enemies, eyeball to eyeball. Put names
to them, make them clearly visible to all involved. "We will have 100% code coverage
in our unit tests" is a clearly-defined goal, and anything that prevents that goal
from being reached will be clearly visible. "We will not ship code that fails to pass
any unit test" is another clear goal, but must be paired with&amp;nbsp;something that
avoids the natural "Well, then, we'll not write any unit tests, and we'll have met
that goal!" response. Demanding a ratio of unit-test-lines-to-lines ratio is a good
start: "We will have three lines of unit test code per line of code" now offers a
measurable, identifiable enemy that can be stared in the face. Go so far as to make
a ceremony out of it: call the developers into a room, put a poster on a wall, and
make your intentions clear. Motivate them. "When we presented the release of the payroll
system to the HR department last year, the users called it 'barely acceptable' and
'hard to use'. I &lt;em&gt;refuse&lt;/em&gt; to allow that to happen again. The system we build
for them this year will be amazing. It will be reliable. It will have those features
they need to get their job done &lt;em&gt;(and be specific here)&lt;/em&gt;, and we will accept
no excuse otherwise."
&lt;/p&gt;
&lt;p&gt;
One of the world's most successful software companies, Microsoft is no stranger to
the polarity strategy. The company as a whole as declared war on its enemies in a
variety of fields, and with few exceptions, has won in almost every conflict. Microsoft
actively courts conflict and confrontation. The presence of a well-established competitor
in a particular field is no barrier to entry; Microsoft has routinely entered fields
with dominant competitors and come out ahead in the end. Witness their entries into
the&amp;nbsp;word-processor and spreadsheet&amp;nbsp;markets held at the time by dominant
competitors WordPerfect and Lotus 1-2-3, their entry into the&amp;nbsp;video-game console
market against well-established competitors Sega and Nintendo, and more recently,
the mobile entertainment device market (the Zune) against the iPod. In the latter,
the battle has just begun, and the market remains firmly in the hands of the iPod,
but let it not be forgotten that Microsoft is not one to retreat quickly from a battle.
&lt;/p&gt;
&lt;p&gt;
Microsoft is also known to do this within their projects; developers who are committed
to a project yet seem hesitant or lax in their work are asked if they are really "on
board" with this project. The legends of Microsoft developers putting in 80-plus hours
a week on a project are somewhat true, but not because Microsoft management expects
it of them, but because developers have been willing to put that kind of time into
the project in order to succeed. 
&lt;/p&gt;
&lt;p&gt;
And Microsoft management itself has declared war on its enemies, time and again, looking
to eliminate any and all opposition the successful release of software. Distractions?
Every developer gets his own office. Household chores? Microsoft has been known to
offer their developers laundry services at work. Computing resources? It's not at
all uncommon to walk into a Microsoft developers' office and see multiple CPUs (under
desks, in corners, laptops, and so on) and monitors all over the room. Bodily needs?
Refrigerators on every floor, stocked with sodas of every variety, water, juices,
anything that the thirsty developer could need, all free for the taking. Even fatigue
is an enemy: Microsoft buildings have video game consoles, foosball tables, bean bag
chairs, and more&amp;nbsp;tools of relaxational&amp;nbsp;activities&amp;nbsp;to help the developer
take a break when necessary, so that they can resume the fight refreshed. 
&lt;/p&gt;
&lt;p&gt;
Greene notes further,
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
There are always hostile people and destructive relationships. The only way to break
out of a negative dynamic is to confront it.&amp;nbsp;Repressing your anger, avoiding
the person threatening you, always looking to conciliate--these common strategies
spell ruin.&amp;nbsp;Avoidance of conflict becomes a habit, and you lose the taste for
battle. Feeling guilty is pointless; it is not your fault you have enemies. Feeling
wronged or victimized is equally futile. In both cases you are looking inward, concentrating
on yourself and your feelings. Instead of internalizing a bad situation, externalize
it and face your enemy. It is the only way out.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
To adapt this to software, instead of simply talking about the hopeless situation
in which you find yourself--your company has no interest in agile, your team is just
too "inexperienced" to tackle the kinds of projects you are being given, and so on--externalize
it. Face the enemy. Your company has no interest in agile? Fine--instead of trying
to talk them into it, take the radical approach, &lt;em&gt;do&lt;/em&gt;&amp;nbsp;a project in an
agile fashion (even without upper management's knowledge if necessary), and show them
the results. Can't get the IT budget to allow for a source-control server or continuous
integration server? Use your desktop machine instead. Face the enemy, confront it,
and defeat it.
&lt;/p&gt;
&lt;p&gt;
Enemies are not evil, and should not be seen as something to avoid. Enemies give us
something against which to measure ourselves, to use as a foil against which to better
ourselves. They motivate and focus your beliefs. Have a co-worker who refuses to see
the benefits of dynamic languages? Avoiding him simply avoids an opportunity for you
to learn from him and to better your arguments and approaches. Have a boss who doesn't
see what the big deal behind a domain-specific language is? Have conversations on
the subject, to understand her reluctance and opposition, and build a small DSL to
show her the benefits of doing so. Don't avoid these people, for they offer you opportunities
to better yourself and your understanding.
&lt;/p&gt;
&lt;p&gt;
Enemies also give you a standard against which to judge yourself. It took Joe Frazier
to make Muhammad Ali a truly great boxer. The samurai of Japan had no guage of their
excellence unless they challenged the best swordsmen they could find. For the Indianapolis
Colts of last year, each victory was hollow unless they could beat their arch-rivals,
the New England Patriots. The bigger the opponent, the greater your reward, even in
defeat, for if you lose, you have opportunities to analyze the results and discover
how and why you lost, then correct your strategy for the next time. For there will &lt;em&gt;always&lt;/em&gt; be
a next time.
&lt;/p&gt;
&lt;p&gt;
Don't seek to eschew enemies, either. Enemies give us options and purpose. Julius
Caesar identified Pompey as his enemy early in his rise to the throne. Everything
he did from then on was measured against Pompey, to put him in a stronger position
to meet his enemy. Once he defeated Pompey, however, Caesar lost his way, and eventually
fell because he viewed himself as a god and above all other men. Enemies force on
you a sense of realism and humility.
&lt;/p&gt;
&lt;p&gt;
Remember, enemies surround you and your project, and sometimes even within your project.
Keep a sharp eye out, so that once spotted, they can be identified, analyzed, and
handled. Show no quarter to those enemies: they must either join you to help you in
your quest to build great software, or be ruthlessly eliminated from your path. They
can either benefit from the project, or they can be removed from the battlefield entirely.
Some enemies--ignorance, apathy, sloth--are not easily defeated, nor once defeated
will they remain so. Never lay down your arms against them or trust your arms to someone
else--you are the last line of your own defense.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d3e893b9-3065-4a51-81ec-05f562e3b4eb" /&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,d3e893b9-3065-4a51-81ec-05f562e3b4eb.aspx</comments>
      <category>Development Processes</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=1870dd5b-737b-4cca-9247-934d4e42918c</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,1870dd5b-737b-4cca-9247-934d4e42918c.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,1870dd5b-737b-4cca-9247-934d4e42918c.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1870dd5b-737b-4cca-9247-934d4e42918c</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For those who aren't familiar with the term, "yellow journalism" was a moniker
applied to journalism (newspapers, at the time) articles that were written with little
attention to the facts, and maximum attention to gathering attention and selling newspapers.
Articles were sensationalist, highly incorrect or unvalidated, seeking to draw at
the emotional strings the readers would fear or want pulled. Popular at the turn of
the last century, perhaps the most notable example of yellow journalism was the sinking
of the <em>Maine</em>, a US battleship that exploded in harbor while visiting Cuba
(then, ironically, a very US-friendly place). Papers at the time attributed the explosion
to sabotage work by Spain, despite the fact that no cause or proof of sabotage was
ever produced, leading the US to declare war on the Spanish, seize several Spanish
colonies (including the Phillipines in the Pacific, which would turn out to be important
to US Pacific Naval interests during World War Two), and in general pronouce anything
Spanish to be "enemies of the state" and all that.
</p>
        <p>
Vaguely reminiscent of Fox News, now that I think of it.
</p>
        <p>
In this case, however, yellow journalism meets the Web in two recent "IT magazine"
pieces that have come to my attention: <a href="http://www.pcworld.com/article/id,134570-page,1/article.html">this
one</a>, which blasts Sun for not rolling out updates in a more timely fashion to
its consumers, despite the many issues that constant update rollouts pose for those
same consumers, but more flagrantly, <a href="http://www.zdnetasia.com/news/security/0,39044215,62028389,00.htm">this
one</a>, which states that Google researchers have found a vulnerability in the Java
Runtime Environment that "threatens the security of all platforms, browsers,
and even mobile devices". As if that wasn't enough, check out these "sky-is-falling"
quotes:
</p>
        <blockquote>
          <p>
" 'It’s a pretty significant weakness, which will have a considerable impact if the
exploit codes come to fruition quickly. It could affect a lot of organizations and
users.'
</p>
          <p>
"... anyone using the Java Runtime Environment or Java Development Kit is at
risk.
</p>
          <p>
" 'Delivery of exploits in this manner is attractive to attackers because even though
the browser may be fully patched, some people neglect to also patch programs invoked
by browsers to render specific types of content.'
</p>
          <p>
"... the bugs threaten pretty much every modern device.
</p>
          <p>
" '... this exploit is browser independent, as long as it invokes a vulnerable Java
Runtime Environment.'
</p>
          <p>
"... the problem is compounded by the slim chance of an enterprise patching Java Runtime
vulnerabilities.
</p>
        </blockquote>
        <p>
Now, I have no problems with the media reporting security vulnerabilities; in fact,
I encourage it (as any security professional should), because consumers and administrators
can only take action to protect against vulnerabilities when we know about them. But
here's the thing: <em>nowhere</em>, not one place in the article, describes what the
vulnerability actually <em>is</em>. Is this a class verifier problem? Is this a buffer
overflow attack? A luring attack? A flaw in the platform security model? A flaw in
how Java parses and consumes image formats (a la the infamous "picture attachment
attack" that bedevils Outlook every so often)? 
</p>
        <p>
No details are given in this article, just fear, uncertainty and doubt. No quote,
no vague description of how the vulnerability can be exploited, not even a link to the
original report from Google's Security team.
</p>
        <p>
Folks, that is sensationalist journalism at its best. Or worst, if you prefer.
</p>
        <p>
Mr. Tung, who authored the article, should have titled it "The Sky is Falling! The
Sky is Falling!" instead. Frankly, if I were Mr. Tung's editor, this drivel would
never have been published. If I were given the editor's job tomorrow, I'd thank Mr.
Tung for his efforts and send him over to a competitor's publication. Blatant, irresponsible,
and reckless.
</p>
        <p>
Now, if you'll excuse me, I'm going to try and find some hard data on this vulnerability.
Any vulnerability that can somehow strike across every JVM ever written (according
to the article above) must be some kinda doozy. After all, I need to learn how to
defend myself before al Qaeda gets hold of this and takes over "pretty much every
modern device" and uses them to take over the world, which surely must be next....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=1870dd5b-737b-4cca-9247-934d4e42918c" />
        <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>Yellow Journalism Meets The Web... again...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,1870dd5b-737b-4cca-9247-934d4e42918c.aspx</guid>
      <link>http://blogs.tedneward.com/2007/07/15/Yellow+Journalism+Meets+The+Web+Again.aspx</link>
      <pubDate>Sun, 15 Jul 2007 06:07:48 GMT</pubDate>
      <description>&lt;p&gt;
For those who aren't familiar with the term, "yellow journalism" was&amp;nbsp;a moniker
applied to journalism (newspapers, at the time) articles that were written with little
attention to the facts, and maximum attention to gathering attention and selling newspapers.
Articles were sensationalist, highly incorrect or unvalidated, seeking to draw at
the emotional strings the readers would fear or want pulled. Popular at the turn of
the last century, perhaps the most notable example of yellow journalism was the sinking
of the &lt;em&gt;Maine&lt;/em&gt;, a US battleship that exploded in harbor while visiting Cuba
(then, ironically, a very US-friendly place). Papers at the time attributed the explosion
to sabotage work by Spain, despite the fact that no cause or proof of sabotage was
ever produced, leading the US to declare war on the Spanish, seize several Spanish
colonies (including the Phillipines in the Pacific, which would turn out to be important
to US Pacific Naval interests during World War Two), and in general pronouce anything
Spanish to be "enemies of the state" and all that.
&lt;/p&gt;
&lt;p&gt;
Vaguely reminiscent of Fox News, now that I think of it.
&lt;/p&gt;
&lt;p&gt;
In this case, however, yellow journalism meets the Web in two recent "IT magazine"
pieces that have come to my attention: &lt;a href="http://www.pcworld.com/article/id,134570-page,1/article.html"&gt;this
one&lt;/a&gt;, which blasts Sun for not rolling out updates in a more timely fashion to
its consumers, despite the many issues that constant update rollouts pose for those
same consumers, but more flagrantly, &lt;a href="http://www.zdnetasia.com/news/security/0,39044215,62028389,00.htm"&gt;this
one&lt;/a&gt;, which states that Google researchers have found a vulnerability in the Java
Runtime Environment that&amp;nbsp;"threatens the security of all platforms, browsers,
and even mobile devices". As if that wasn't enough, check out these "sky-is-falling"
quotes:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
" 'It’s a pretty significant weakness, which will have a considerable impact if the
exploit codes come to fruition quickly. It could affect a lot of organizations and
users.'
&lt;/p&gt;
&lt;p&gt;
"...&amp;nbsp;anyone using the Java Runtime Environment or Java Development Kit is at
risk.
&lt;/p&gt;
&lt;p&gt;
" 'Delivery of exploits in this manner is attractive to attackers because even though
the browser may be fully patched, some people neglect to also patch programs invoked
by browsers to render specific types of content.'
&lt;/p&gt;
&lt;p&gt;
"... the bugs threaten pretty much every modern device.
&lt;/p&gt;
&lt;p&gt;
" '... this exploit is browser independent, as long as it invokes a vulnerable Java
Runtime Environment.'
&lt;/p&gt;
&lt;p&gt;
"... the problem is compounded by the slim chance of an enterprise patching Java Runtime
vulnerabilities.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Now, I have no problems with the media reporting security vulnerabilities; in fact,
I encourage it (as any security professional should), because consumers and administrators
can only take action to protect against vulnerabilities when we know about them. But
here's the thing: &lt;em&gt;nowhere&lt;/em&gt;, not one place in the article, describes what the
vulnerability actually &lt;em&gt;is&lt;/em&gt;. Is this a class verifier problem? Is this a buffer
overflow attack? A luring attack? A flaw in the platform security model? A flaw in
how Java parses and consumes image formats (a la the infamous "picture attachment
attack" that bedevils Outlook every so often)? 
&lt;/p&gt;
&lt;p&gt;
No details are given in this article, just fear, uncertainty and doubt. No quote,
no vague description of how the vulnerability can be exploited, not even a link to&amp;nbsp;the
original&amp;nbsp;report from Google's Security team.
&lt;/p&gt;
&lt;p&gt;
Folks, that is sensationalist journalism at its best. Or worst, if you prefer.
&lt;/p&gt;
&lt;p&gt;
Mr. Tung, who authored the article, should have titled it "The Sky is Falling! The
Sky is Falling!" instead. Frankly, if I were Mr. Tung's editor, this drivel would
never have been published. If I were given the editor's job tomorrow, I'd thank Mr.
Tung for his efforts and send him over to a competitor's publication. Blatant, irresponsible,
and reckless.
&lt;/p&gt;
&lt;p&gt;
Now, if you'll excuse me, I'm going to try and find some hard data on this vulnerability.
Any vulnerability that can somehow strike across every JVM ever written (according
to the article above) must be some kinda doozy. After all, I need to learn how to
defend myself before al Qaeda gets hold of this and takes over "pretty much every
modern device" and uses them to take over the world, which surely must be next....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=1870dd5b-737b-4cca-9247-934d4e42918c" /&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,1870dd5b-737b-4cca-9247-934d4e42918c.aspx</comments>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=f03c0ea3-6c5e-48a1-884e-6e1f616290d6</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,f03c0ea3-6c5e-48a1-884e-6e1f616290d6.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,f03c0ea3-6c5e-48a1-884e-6e1f616290d6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f03c0ea3-6c5e-48a1-884e-6e1f616290d6</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At a software conference not too long ago, I was asked what book I was currently reading
that I'd recommend, and I responded, "Robert Greene's <em>The 33 Strategies of War"</em>.
When asked why I'd recommend this, the response was pretty simple: "Because I believe
that there's more parallels to what we do in military history than in constructing
buildings."
</p>
        <p>
Greene's book is an attempt at a distillation of what all the most successful generals
and military leaders throughout history used to make them so successful. A lot of
these concepts and ideas are just generally good practices, but a fair amount of them
actually apply pretty directly to software development (whether you call it "agile"
or not). Consider this excerpt from the Preface, for example:
</p>
        <blockquote>
          <p>
The war [that exists in the real world] exists on several levels. Most obviously,
we have our rivals on the other side. The world has become increasingly competitive
and nasty. In politics, business, even the arts, we face opponents who will do almost
anything to gain an edge. More troubling and complex, however, are the battles we
face with those who are supposedly on our side. There are those who outwardly play
the team game, who act very friendly and agreeable, but who sabotage us behind the
scenes, ues the group to promote their own agenda. Others, more difficult to spot,
play subtle games of passive aggression, offering help that never comes, instilling
guilt as a secret weapon. On the surface everything seems peaceful enough, but just
below it, it is every man and woman for him- or herself, this dynamic infecting even
families and relationships. The culture may deny this reality and promote a gentler
picture, but we know it and feel it, in our battle scars.
</p>
        </blockquote>
        <p>
Without trying to paint a paranoid picture, this "dynamic of war" frequently infects
software development teams and organizations; developers vs. management, developers
vs. system adminstrators, developers vs. DBAs, even developers vs. architects or developers
vs. developers. His book, then, suggests that we need to face this reality and learn
how to deal with it:
</p>
        <blockquote>
          <p>
What we need are not impossible and inhuman ideals of peace and cooperation to live
up to, and the confusion that brings us, but rather practical knowledge on how to
deal with conflict and the daily battles we face. And this knowledge is not about
how to be more forceful in getting what we want or defending ourselves but rather
how to be more rational and strategic when it comes to conflict, channeling our aggressive
impulses instead of denying or repressing them. If there is an ideal to aim for, it
should be that of the strategic warrior, the man or woman who manages difficult situations
and people through deft and intelligent maneuver.
</p>
        </blockquote>
        <p>
... and I want that man or woman heading up my project team.
</p>
        <p>
It may seem incongruous to draw parallels between war and software development, because
in war there is an obvious "enemy", an obvious target for our aggression and intentions
and strategies and tactics. It turns out, however, that the "enemy" in software development
is far more nebulous and amorphous, that of "failure", which can be just as tenacious
and subversive. This enemy won't ever try to storm your cubicles and kill you or try
to hold you for ransom, but a lot of the strategies that Greene talks about aren't
so much about how to kill people, but how to think strategically, which is, to my
mind, something we all of us have to do more of.
</p>
        <p>
Consider this, for example; Greene suggests "six fundamental ideals you should aim
for in transforming yourself into a strategic warrior in daily life":
</p>
        <ul>
          <li>
            <em>Look at things as they are, not as your emotions color them</em>. Too often, it's
easy to "lose your head" and see the situation in emotional terms, rather than rational
ones. "Fear will make you overestimate the enemy and act too defensively"; in other
words, fear will cause you to act too conservatively and resist taking the necessary
gamble on a technology or idea that will lead to success. "Anger and impatience will
draw you into rash actions that will cut off your options"; or, anger and impatience
will cause you to act rashly with respect to co-workers (such as DBAs and sysadmins)
or technology decisions that may leave you with no clear path forward. "The only remedy
is to be aware that the pull of emotion is inevitable, to notice it when it is happening,
and to compensate for it."</li>
          <li>
            <em>Judge people by their actions</em>. "What people say about themselves [on resumes,
in meetings, during conversations] does not matter; people will say anything. Look
at what they have done; deeds do not lie." Which means, you have to have a way by
which to measure those deeds, meaning you have to have a good "feel" for what's going
on in your department--simply listening to reports in meetings is often not enough.
"In looking back at a defeat [failed project], you must identify the things you could
have done differently. It is your own bad strategies, not the unfair opponent [or
management decisions or unhelpful IT department, or whatever], that are to blame for
your failures. You are responsible for the good and bad in your life."</li>
          <li>
            <em>Depend on your own arms</em>. "... people tend to rely on things that seem simple
and easy or that have worked before. ... But true strategy is psychological--a matter
of intelligence, not material force. ... But if your mind is armed with the art of
war, there is no power that can take that away. In the middle of a crisis, your mind
will find its way to the right solution. ... As Sun-tzu says, 'Being unconquerable
lies with yourself.' "</li>
          <li>
            <em>Worship Athena, not Ares</em>. This one probably doesn't translate directly; Athena
was the goddess of war in its form seen in guile, wisdom, and cleverness, whereas
Ares was the god of war in its direct and brutal form. Athena always fought with the
utmost intelligence and subtlety; Ares fought for the sheer joy of blood. Probably
the closest parallel here would be to suggest that we seek subtle solutions, not brute
force ones, meaning look for answers that don't require hiring thousands of consultants
and developers. But that's a stretch.</li>
          <li>
            <em>Elevate yourself above the battlefield</em>. "In war, strategy is the art of commanding
the entire miliary operation. Tactics, on the other hand, is the skill of forming
up the army for battle [project] itself and dealing with the immediate needs of the
battlefield. Most of us in life are tacticians, not strategists." Too many project
managers (and team members) never look beyond the immediate project in front of them
to consider the wider implications of their actions. "To have the power that only
strategy can bring, you must be able to elevate yourself above the battlefield, to
focus on your long-term objectives, to craft an entire campaign, to get out of the
reactive mode that so many battles in life lock you into. Keeping your overall goals
in mind, it becomes much easier to decide when to fight [or accept a job or accept
a project] and when to walk away."</li>
          <li>
            <em>Spiritualize your warfare</em>. "... the greatest battle is with yourself--your
weaknesses, your emotions, your lack of resolution in seeing things through to the
end. You must declare unceasing war on yourself. As a warrior in life, you welcome
combat and conflict as ways to prove yourself, to better your skills, to gain courage,
confidence and experience." That means we should never let fear or doubt stop us from
tackling a new challenge (but, similarly, we shouldn't risk others' welfare on wild
risks). "You want more challenges, and you invite more war [or projects]."</li>
        </ul>
        <p>
Granted, it's not a complete 1-to-1 match, but there's a lot that the average developer
can learn from the likes of Sun-Tzu, MacArthur, Julies Caesar, Genghis Khan, Miyamoto
Musashi, Erwin Rommel, or Carl von Clausewitz.
</p>
        <p>
Just for reference purposes, the original 33 strategies (some of which may not be
easy or even possible to adapt) are:
</p>
        <ol>
          <li>
Declare war on your enemies: The Polarity Strategy</li>
          <li>
Do not fight the last war: The Guerilla-War-of-the-Mind Strategy</li>
          <li>
Amidst the turmoil of events, do not lose your presence of mind: The Counterbalance
Strategy</li>
          <li>
Create a sense of urgency and desperation: The Death-Ground Strategy</li>
          <li>
Avoid the snares of groupthink: The Command-and-Control Strategy</li>
          <li>
Segment your forces: The Controlled-Chaos Strategy</li>
          <li>
Transform your war into a crusade: Morale Strategies</li>
          <li>
Pick your battles carefully: The Perfect-Economy Strategy</li>
          <li>
Turn the Tables: The Counterattack Strategy</li>
          <li>
Create a threatening presence: Deterrence Strategies</li>
          <li>
Trade space for time: The Nonengagement Strategy</li>
          <li>
Lose battles but win the war: Grand Strategy</li>
          <li>
Know your enemy: The Intelligence Strategy</li>
          <li>
Overwhelm resistance with speed and suddenness: The Blitzkrieg Strategy</li>
          <li>
Control the dynamic: Forcing Strategies</li>
          <li>
Hit them where it hurts: The Center-of-Gravity Strategy</li>
          <li>
Defeat them in detail: The Divide-and-Conquer Strategy</li>
          <li>
Expose and attack your opponent's soft flank: The Turning Strategy</li>
          <li>
Envelop the enemy: The Annihiliation Strategy</li>
          <li>
Maneuver them into weakness: The Ripening-for-the-sickle Strategy</li>
          <li>
Negotiate while advancing: The Diplomatic-War Strategy</li>
          <li>
Know how to end things: The Exit Strategy</li>
          <li>
Weave a seamless blend of fact and fiction: Misperception Strategies</li>
          <li>
Take the line of least expectation: The Ordinary Extraordinary Strategy</li>
          <li>
Occupy the moral high ground: The Righteous Strategy</li>
          <li>
Deny them targets: The Strategy of the Void</li>
          <li>
Seem to work for the interests of others while furthering your own: The Alliance Strategy</li>
          <li>
Give your rivals enough rope to hang themselves: The One-Upmanship Strategy</li>
          <li>
Take small bites: The Fait Accompli Strategy</li>
          <li>
Penetrate their minds: Communication Strategies</li>
          <li>
Destroy them from within: The Inner-Front Strategy</li>
          <li>
Dominate while seeming to submit: The Passive-Aggression Strategy</li>
          <li>
Sow uncertainty and panic through acts of terror: The Chain-Reaction Strategy</li>
        </ol>
        <p>
What I'm planning to do, then, is go through the 33 strategies of war, analogize as
necessary/possible, and publishthe results. Hopefully people find it useful, but even
if you don't think it's going to help, it'll help me internalize the elements I want
to through the process just for my own use. And, in the end, that's the point of "spiritualize
your warfare": trying to continuously enhance yourself.
</p>
        <p>
Naturally, I invite comment and debate; in fact, I'd really encourage it, because
I'm not going to promise that these are 100%-polished ideas or concepts, at least
as how they apply to software. So please, feel free to comment, either publicly on
the blog or privately through email, whether you agree or not. (Particularly
if you don't agree--the more the idea is tested, the better it stands, or the sooner
it gets refactored.)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f03c0ea3-6c5e-48a1-884e-6e1f616290d6" />
        <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>The Strategies of Software Development</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,f03c0ea3-6c5e-48a1-884e-6e1f616290d6.aspx</guid>
      <link>http://blogs.tedneward.com/2007/07/14/The+Strategies+Of+Software+Development.aspx</link>
      <pubDate>Sat, 14 Jul 2007 05:41:02 GMT</pubDate>
      <description>&lt;p&gt;
At a software conference not too long ago, I was asked what book I was currently reading
that I'd recommend, and I responded, "Robert Greene's &lt;em&gt;The 33 Strategies of War"&lt;/em&gt;.
When asked why I'd recommend this, the response was pretty simple: "Because I believe
that there's more parallels to what we do in military history than in constructing
buildings."
&lt;/p&gt;
&lt;p&gt;
Greene's book is an attempt at a distillation of what all the most successful generals
and military leaders throughout history used to make them so successful. A lot of
these concepts and ideas are just generally good practices, but a fair amount of them
actually apply pretty directly to software development (whether you call it "agile"
or not). Consider this excerpt from the Preface, for example:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The war [that exists in the real world] exists on several levels. Most obviously,
we have our rivals on the other side. The world has become increasingly competitive
and nasty. In politics, business, even the arts, we face opponents who will do almost
anything to gain an edge. More troubling and complex, however, are the battles we
face with those who are supposedly on our side. There are those who outwardly play
the team game, who act very friendly and agreeable, but who sabotage us behind the
scenes, ues the group to promote their own agenda. Others, more difficult to spot,
play subtle games of passive aggression, offering help that never comes, instilling
guilt as a secret weapon. On the surface everything seems peaceful enough, but just
below it, it is every man and woman for him- or herself, this dynamic infecting even
families and relationships. The culture may deny this reality and promote a gentler
picture, but we know it and feel it, in our battle scars.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Without trying to paint a paranoid picture, this "dynamic of war" frequently infects
software development teams and organizations; developers vs. management, developers
vs. system adminstrators, developers vs. DBAs, even developers vs. architects or developers
vs. developers. His book, then, suggests that we need to face this reality and learn
how to deal with it:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
What we need are not impossible and inhuman ideals of peace and cooperation to live
up to, and the confusion that brings us, but rather practical knowledge on how to
deal with conflict and the daily battles we face. And this knowledge is not about
how to be more forceful in getting what we want or defending ourselves but rather
how to be more rational and strategic when it comes to conflict, channeling our aggressive
impulses instead of denying or repressing them. If there is an ideal to aim for, it
should be that of the strategic warrior, the man or woman who manages difficult situations
and people through deft and intelligent maneuver.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
... and I want that man or woman heading up my project team.
&lt;/p&gt;
&lt;p&gt;
It may seem incongruous to draw parallels between war and software development, because
in war there is an obvious "enemy", an obvious target for our aggression and intentions
and strategies and tactics. It turns out, however, that the "enemy" in software development
is far more nebulous and amorphous, that of "failure", which can be just as tenacious
and subversive. This enemy won't ever try to storm your cubicles and kill you or try
to hold you for ransom, but a lot of the strategies that Greene talks about aren't
so much about how to kill people, but how to think strategically, which is, to my
mind, something we all of us have to do more of.
&lt;/p&gt;
&lt;p&gt;
Consider this, for example; Greene suggests "six fundamental ideals you should aim
for in transforming yourself into a strategic warrior in daily life":
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Look at things as they are, not as your emotions color them&lt;/em&gt;. Too often, it's
easy to "lose your head" and see the situation in emotional terms, rather than rational
ones. "Fear will make you overestimate the enemy and act too defensively"; in other
words, fear will cause you to act too conservatively and resist taking the necessary
gamble on a technology or idea that will lead to success. "Anger and impatience will
draw you into rash actions that will cut off your options"; or, anger and impatience
will cause you to act rashly with respect to co-workers (such as DBAs and sysadmins)
or technology decisions that may leave you with no clear path forward. "The only remedy
is to be aware that the pull of emotion is inevitable, to notice it when it is happening,
and to compensate for it."&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Judge people by their actions&lt;/em&gt;. "What people say about themselves [on resumes,
in meetings, during conversations] does not matter; people will say anything. Look
at what they have done; deeds do not lie." Which means, you have to have a way by
which to measure those deeds, meaning you have to have a good "feel" for what's going
on in your department--simply listening to reports in meetings is often not enough.
"In looking back at a defeat [failed project], you must identify the things you could
have done differently. It is your own bad strategies, not the unfair opponent [or
management decisions or unhelpful IT department, or whatever], that are to blame for
your failures. You are responsible for the good and bad in your life."&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Depend on your own arms&lt;/em&gt;. "... people tend to rely on things that seem simple
and easy or that have worked before. ... But true strategy is psychological--a matter
of intelligence, not material force. ... But if your mind is armed with the art of
war, there is no power that can take that away. In the middle of a crisis, your mind
will find its way to the right solution. ... As Sun-tzu says, 'Being unconquerable
lies with yourself.' "&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Worship Athena, not Ares&lt;/em&gt;. This one probably doesn't translate directly; Athena
was the goddess of war in its form seen in guile, wisdom, and cleverness, whereas
Ares was the god of war in its direct and brutal form. Athena always fought with the
utmost intelligence and subtlety; Ares fought for the sheer joy of blood. Probably
the closest parallel here would be to suggest that we seek subtle solutions, not brute
force ones, meaning look for answers that don't require hiring thousands of consultants
and developers. But that's a stretch.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Elevate yourself above the battlefield&lt;/em&gt;. "In war, strategy is the art of commanding
the entire miliary operation. Tactics, on the other hand, is the skill of forming
up the army for battle [project] itself and dealing with the immediate needs of the
battlefield. Most of us in life are tacticians, not strategists." Too many project
managers (and team members) never look beyond the immediate project in front of them
to consider the wider implications of their actions. "To have the power that only
strategy can bring, you must be able to elevate yourself above the battlefield, to
focus on your long-term objectives, to craft an entire campaign, to get out of the
reactive mode that so many battles in life lock you into. Keeping your overall goals
in mind, it becomes much easier to decide when to fight [or accept a job or accept
a project] and when to walk away."&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Spiritualize your warfare&lt;/em&gt;. "... the greatest battle is with yourself--your
weaknesses, your emotions, your lack of resolution in seeing things through to the
end. You must declare unceasing war on yourself. As a warrior in life, you welcome
combat and conflict as ways to prove yourself, to better your skills, to gain courage,
confidence and experience." That means we should never let fear or doubt stop us from
tackling a new challenge (but, similarly, we shouldn't risk others' welfare on wild
risks). "You want more challenges, and you invite more war [or projects]."&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Granted, it's not a complete 1-to-1 match, but there's a lot that the average developer
can learn from the likes of Sun-Tzu, MacArthur, Julies Caesar, Genghis Khan, Miyamoto
Musashi, Erwin Rommel, or Carl von Clausewitz.
&lt;/p&gt;
&lt;p&gt;
Just for reference purposes, the original 33 strategies (some of which may not be
easy or even possible to adapt) are:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Declare war on your enemies: The Polarity Strategy&lt;/li&gt;
&lt;li&gt;
Do not fight the last war: The Guerilla-War-of-the-Mind Strategy&lt;/li&gt;
&lt;li&gt;
Amidst the turmoil of events, do not lose your presence of mind: The Counterbalance
Strategy&lt;/li&gt;
&lt;li&gt;
Create a sense of urgency and desperation: The Death-Ground Strategy&lt;/li&gt;
&lt;li&gt;
Avoid the snares of groupthink: The Command-and-Control Strategy&lt;/li&gt;
&lt;li&gt;
Segment your forces: The Controlled-Chaos Strategy&lt;/li&gt;
&lt;li&gt;
Transform your war into a crusade: Morale Strategies&lt;/li&gt;
&lt;li&gt;
Pick your battles carefully: The Perfect-Economy Strategy&lt;/li&gt;
&lt;li&gt;
Turn the Tables: The Counterattack Strategy&lt;/li&gt;
&lt;li&gt;
Create a threatening presence: Deterrence Strategies&lt;/li&gt;
&lt;li&gt;
Trade space for time: The Nonengagement Strategy&lt;/li&gt;
&lt;li&gt;
Lose battles but win the war: Grand Strategy&lt;/li&gt;
&lt;li&gt;
Know your enemy: The Intelligence Strategy&lt;/li&gt;
&lt;li&gt;
Overwhelm resistance with speed and suddenness: The Blitzkrieg Strategy&lt;/li&gt;
&lt;li&gt;
Control the dynamic: Forcing Strategies&lt;/li&gt;
&lt;li&gt;
Hit them where it hurts: The Center-of-Gravity Strategy&lt;/li&gt;
&lt;li&gt;
Defeat them in detail: The Divide-and-Conquer Strategy&lt;/li&gt;
&lt;li&gt;
Expose and attack your opponent's soft flank: The Turning Strategy&lt;/li&gt;
&lt;li&gt;
Envelop the enemy: The Annihiliation Strategy&lt;/li&gt;
&lt;li&gt;
Maneuver them into weakness: The Ripening-for-the-sickle Strategy&lt;/li&gt;
&lt;li&gt;
Negotiate while advancing: The Diplomatic-War Strategy&lt;/li&gt;
&lt;li&gt;
Know how to end things: The Exit Strategy&lt;/li&gt;
&lt;li&gt;
Weave a seamless blend of fact and fiction: Misperception Strategies&lt;/li&gt;
&lt;li&gt;
Take the line of least expectation: The Ordinary Extraordinary Strategy&lt;/li&gt;
&lt;li&gt;
Occupy the moral high ground: The Righteous Strategy&lt;/li&gt;
&lt;li&gt;
Deny them targets: The Strategy of the Void&lt;/li&gt;
&lt;li&gt;
Seem to work for the interests of others while furthering your own: The Alliance Strategy&lt;/li&gt;
&lt;li&gt;
Give your rivals enough rope to hang themselves: The One-Upmanship Strategy&lt;/li&gt;
&lt;li&gt;
Take small bites: The Fait Accompli Strategy&lt;/li&gt;
&lt;li&gt;
Penetrate their minds: Communication Strategies&lt;/li&gt;
&lt;li&gt;
Destroy them from within: The Inner-Front Strategy&lt;/li&gt;
&lt;li&gt;
Dominate while seeming to submit: The Passive-Aggression Strategy&lt;/li&gt;
&lt;li&gt;
Sow uncertainty and panic through acts of terror: The Chain-Reaction Strategy&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
What I'm planning to do, then, is go through the 33 strategies of war, analogize as
necessary/possible, and publishthe results. Hopefully people find it useful, but even
if you don't think it's going to help, it'll help me internalize the elements I want
to through the process just for my own use. And, in the end, that's the point of "spiritualize
your warfare": trying to continuously enhance yourself.
&lt;/p&gt;
&lt;p&gt;
Naturally, I invite comment and debate; in fact, I'd really encourage it, because
I'm not going to promise that these are 100%-polished ideas or concepts, at least
as how they apply to software. So please, feel free to comment, either publicly on
the blog or privately through email, whether you agree or not.&amp;nbsp;(Particularly
if you don't agree--the more the idea is tested, the better it stands, or the sooner
it gets refactored.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=f03c0ea3-6c5e-48a1-884e-6e1f616290d6" /&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,f03c0ea3-6c5e-48a1-884e-6e1f616290d6.aspx</comments>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Reading</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c74fbf6e-d500-4260-a195-ca4400498bfc</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c74fbf6e-d500-4260-a195-ca4400498bfc.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c74fbf6e-d500-4260-a195-ca4400498bfc.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c74fbf6e-d500-4260-a195-ca4400498bfc</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
From Bruce Schneier's latest <a href="http://www.schneier.com/crypto-gram-0704.html">Crypto-Gram</a>:
</p>
        <blockquote>
          <p>
JavaScript Hijacking
</p>
          <p>
JavaScript hijacking is a new type of eavesdropping attack against Ajax-style Web
applications.  I'm pretty sure it's the first type of attack that specifically
targets Ajax code.  The attack is possible because Web browsers don't protect
JavaScript the same way they protect HTML; if a Web application transfers confidential
data using messages written in JavaScript, in some cases the messages can be read
by an attacker.
</p>
          <p>
The authors show that many popular Ajax programming frameworks do nothing to prevent
JavaScript hijacking.  Some actually *require* a programmer to create a vulnerable
server in order to function.
</p>
          <p>
Like so many of these sorts of vulnerabilities, preventing the class of attacks is
easy.  In many cases, it requires just a few additional lines of code. 
And like so many software security problems, programmers need to understand the security
implications of their work so they can mitigate the risks they face.  But my
guess is that JavaScript hijacking won't be solved so easily, because programmers
don't understand the security implications of their work and won't prevent the attacks.
</p>
          <p>
Paper:<br /><a href="http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf">http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf</a><br />
or <a href="http://tinyurl.com/28nzje">http://tinyurl.com/28nzje</a></p>
          <p>
Responses to many of the blog comments, by one of the paper's co-authors:<br /><a href="http://www.schneier.com/blog/archives/2007/04/javascript_hija_1.html#c160667">http://www.schneier.com/blog/archives/2007/04/javascript_hija_1.html#c160667</a><br />
or <a href="http://tinyurl.com/yqaoz5">http://tinyurl.com/yqaoz5</a></p>
        </blockquote>
        <p>
It would be an interesting comparison, to see a rich-client app using "traditional"
calls back to a server (via RMI, .NET Remoting, or some kind of messaging system like
JMS or MSMQ) weighed against an AJAX app, compared on security holes. My gut instinct
tells me that the rich client app would be more secure, but only because using the
binary RPC/messaging toolkit obfuscates the wire traffic enough to dissuade the 'casual'
attacker, not because it's inherently more secure.
</p>
        <p>
By the way, if you're not receiving Crypto-Gram via email or RSS, you are seriously
at risk of writing insecure apps. Think it's all dry and boring security threat
alerts? Hardly--check out the "Second Annual Move-Plot Threat Contest". Then tell
me whether you think it's funny--or just sad--that there will not only be a real winner
to this contest, but that the TSA will, in all likelihood, react the way Bruce predicts,
particularly when the major news outlets report the story and it joins the list of
fears the public already receives on a daily basis.
</p>
        <p>
More people die every day from automobile accidents than from terrorism. Hell, I'd
even bet that on September 11, 2001, more people died from automobile accidents that
day than from the Twin Towers attack. (I don't have the statistics to verify that,
but I imagine it's fairly easy to find out; right or wrong, kudos to whomever takes
the ten or fifteen minutes to research it and send it to me for posting here.)
</p>
        <p>
Ban the automobile! Protect your children from the evil terrorists at Ford, GM, Saturn,
Toyota, DaimlerChryseler, and more! Send in the troops to arrest these fiendish perpetrators
of unnecessary and senseless deaths to innocent American citizens! (And for God's
sake, don't ask how many people die from peanut allergies each year, or we'll lose
Skippy and Reese's Peanut Butter Cups too!)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c74fbf6e-d500-4260-a195-ca4400498bfc" />
        <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>Would you still love AJAX if you knew it was insecure?</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c74fbf6e-d500-4260-a195-ca4400498bfc.aspx</guid>
      <link>http://blogs.tedneward.com/2007/04/15/Would+You+Still+Love+AJAX+If+You+Knew+It+Was+Insecure.aspx</link>
      <pubDate>Sun, 15 Apr 2007 08:46:33 GMT</pubDate>
      <description>&lt;p&gt;
From Bruce Schneier's latest &lt;a href="http://www.schneier.com/crypto-gram-0704.html"&gt;Crypto-Gram&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
JavaScript Hijacking
&lt;/p&gt;
&lt;p&gt;
JavaScript hijacking is a new type of eavesdropping attack against Ajax-style Web
applications.&amp;nbsp; I'm pretty sure it's the first type of attack that specifically
targets Ajax code.&amp;nbsp; The attack is possible because Web browsers don't protect
JavaScript the same way they protect HTML; if a Web application transfers confidential
data using messages written in JavaScript, in some cases the messages can be read
by an attacker.
&lt;/p&gt;
&lt;p&gt;
The authors show that many popular Ajax programming frameworks do nothing to prevent
JavaScript hijacking.&amp;nbsp; Some actually *require* a programmer to create a vulnerable
server in order to function.
&lt;/p&gt;
&lt;p&gt;
Like so many of these sorts of vulnerabilities, preventing the class of attacks is
easy.&amp;nbsp; In many cases, it requires just a few additional lines of code.&amp;nbsp;
And like so many software security problems, programmers need to understand the security
implications of their work so they can mitigate the risks they face.&amp;nbsp; But my
guess is that JavaScript hijacking won't be solved so easily, because programmers
don't understand the security implications of their work and won't prevent the attacks.
&lt;/p&gt;
&lt;p&gt;
Paper:&lt;br&gt;
&lt;a href="http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf"&gt;http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf&lt;/a&gt; 
&lt;br&gt;
or &lt;a href="http://tinyurl.com/28nzje"&gt;http://tinyurl.com/28nzje&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Responses to many of the blog comments, by one of the paper's co-authors:&lt;br&gt;
&lt;a href="http://www.schneier.com/blog/archives/2007/04/javascript_hija_1.html#c160667"&gt;http://www.schneier.com/blog/archives/2007/04/javascript_hija_1.html#c160667&lt;/a&gt; 
&lt;br&gt;
or &lt;a href="http://tinyurl.com/yqaoz5"&gt;http://tinyurl.com/yqaoz5&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
It would be an interesting comparison, to see a rich-client app using "traditional"
calls back to a server (via RMI, .NET Remoting, or some kind of messaging system like
JMS or MSMQ) weighed against an AJAX app, compared on security holes. My gut instinct
tells me that the rich client app would be more secure, but only because using the
binary RPC/messaging toolkit obfuscates the wire traffic enough to dissuade the 'casual'
attacker, not because it's inherently more secure.
&lt;/p&gt;
&lt;p&gt;
By the way, if you're not receiving Crypto-Gram via email or RSS, you are seriously
at risk&amp;nbsp;of writing insecure apps. Think it's all dry and boring security threat
alerts? Hardly--check out the "Second Annual Move-Plot Threat Contest". Then tell
me whether you think it's funny--or just sad--that there will not only be a real winner
to this contest, but that the TSA will, in all likelihood, react the way Bruce predicts,
particularly when the major news outlets report the story and it joins the list of
fears the public already receives on a daily basis.
&lt;/p&gt;
&lt;p&gt;
More people die every day from automobile accidents than from terrorism. Hell, I'd
even bet that on September 11, 2001, more people died from automobile accidents that
day than from the Twin Towers attack. (I don't have the statistics to verify that,
but I imagine it's fairly easy to find out; right or wrong, kudos to whomever takes
the ten or fifteen minutes to research it and send it to me for posting here.)
&lt;/p&gt;
&lt;p&gt;
Ban the automobile! Protect your children from the evil terrorists at Ford, GM, Saturn,
Toyota, DaimlerChryseler, and more! Send in the troops to arrest these fiendish perpetrators
of unnecessary and senseless deaths to innocent American citizens! (And for God's
sake, don't ask how many people die from peanut allergies each year, or we'll lose
Skippy and Reese's Peanut Butter Cups too!)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c74fbf6e-d500-4260-a195-ca4400498bfc" /&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,c74fbf6e-d500-4260-a195-ca4400498bfc.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=31f27c88-e3c7-48cb-bc12-13505f4993ba</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,31f27c88-e3c7-48cb-bc12-13505f4993ba.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,31f27c88-e3c7-48cb-bc12-13505f4993ba.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=31f27c88-e3c7-48cb-bc12-13505f4993ba</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://softarc.blogspot.com/">Frank Kelly</a> posted some good ideas on his
entry, <a href="http://softarc.blogspot.com/2006/12/java-are-we-worrying-about-wrong-things.html">"Java:
Are we worrying about the wrong things?"</a>, but more interestingly, he suggested
(implicitly) a new format for weighing in on trends and such, his "Important/Not-so-important"
style. For example,
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <strong>NOT SO IMPORTANT</strong>: Web 2.0<br /><strong>IMPORTANT</strong>: Giving users a good, solid user experience. Web 2.0 doesn't
make sites better by itself - it provides powerful technologies but it's no silver
bullet. There are so many terrible web sites out there with issues such as<br />
- Too much content / too cluttered <a href="http://jdj.sys-con.com/"><font color="#338888">http://jdj.sys-con.com/</font></a><br />
- Too heavy for the many folks still on dial-up<br />
- Inconsistent labeling- etc. (See <a href="http://www.useit.com/alertbox/"><font color="#338888">Jakob
Nielsen's site </font></a>for some great articles )<br />
Sometimes you have to wonder if some web site designers actually care about their
intended audience?
</p>
        </blockquote>
        <p>
I love this format--it helps cut through the B/S and get to the point. Frank, I freely
admit that I'm going to steal this idea from you, so I hope you're watching Trackbacks
or blog links or whatever. :)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=31f27c88-e3c7-48cb-bc12-13505f4993ba" />
        <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>Important/Not-so-important</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,31f27c88-e3c7-48cb-bc12-13505f4993ba.aspx</guid>
      <link>http://blogs.tedneward.com/2007/01/30/ImportantNotsoimportant.aspx</link>
      <pubDate>Tue, 30 Jan 2007 11:17:23 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://softarc.blogspot.com/"&gt;Frank Kelly&lt;/a&gt; posted some good ideas on his
entry, &lt;a href="http://softarc.blogspot.com/2006/12/java-are-we-worrying-about-wrong-things.html"&gt;"Java:
Are we worrying about the wrong things?"&lt;/a&gt;, but more interestingly, he suggested
(implicitly) a new format for weighing in on trends and such, his "Important/Not-so-important"
style. For example,
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;strong&gt;NOT SO IMPORTANT&lt;/strong&gt;: Web 2.0&lt;br&gt;
&lt;strong&gt;IMPORTANT&lt;/strong&gt;: Giving users a good, solid user experience. Web 2.0 doesn't
make sites better by itself - it provides powerful technologies but it's no silver
bullet. There are so many terrible web sites out there with issues such as&lt;br&gt;
- Too much content / too cluttered &lt;a href="http://jdj.sys-con.com/"&gt;&lt;font color=#338888&gt;http://jdj.sys-con.com/&lt;/font&gt;&lt;/a&gt;
&lt;br&gt;
- Too heavy for the many folks still on dial-up&lt;br&gt;
- Inconsistent labeling- etc. (See &lt;a href="http://www.useit.com/alertbox/"&gt;&lt;font color=#338888&gt;Jakob
Nielsen's site &lt;/font&gt;&lt;/a&gt;for some great articles )&lt;br&gt;
Sometimes you have to wonder if some web site designers actually care about their
intended audience?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I love this format--it helps cut through the B/S and get to the point. Frank, I freely
admit that I'm going to steal this idea from you, so I hope you're watching Trackbacks
or blog links or whatever. :)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=31f27c88-e3c7-48cb-bc12-13505f4993ba" /&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,31f27c88-e3c7-48cb-bc12-13505f4993ba.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=8bb98382-dc28-442a-ab8b-6b61a8794bd4</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,8bb98382-dc28-442a-ab8b-6b61a8794bd4.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,8bb98382-dc28-442a-ab8b-6b61a8794bd4.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8bb98382-dc28-442a-ab8b-6b61a8794bd4</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
While traveling not too long ago, I saw a great piece on ethics, and wished I'd kept
the silly magazine (I couldn't remember which one) because it was just a really good
summation of how to live the ethical life. While wandering around the Web with Google
tonight, <a href="http://www.hemispheresmagazine.com/nov06/cybersidebar.html">I found
it</a> (scroll down a bit, to after the bits on Prohibition and Laughable Laws);
in summary, the author advocates a life around five basic points:
</p>
        <ol>
          <li>
Do no harm</li>
          <li>
Make things better</li>
          <li>
Respect others</li>
          <li>
Be fair</li>
          <li>
Be loving</li>
        </ol>
        <p>
Seems pretty simple, no? The problems occur, of course, in the interpretation and
execution. For example, how exactly do we define "better", when we seek to make things
better? Had I the power, I would create a world where all people are free to practice
whatever religious beliefs they hold, but clearly if those religious beliefs involve
human sacrifice, then it's of dubious belief that my actions made the world "better".
(Of course, said practitioners would probably disagree.)
</p>
        <p>
It's also pretty hard to actually follow through on these on a daily basis. The author,
Bruce Weinstein, makes this pretty clear in this example:
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
For example, how often do we really keep “do no harm” in mind during our daily interactions
with people? If a clerk at the grocery store is nasty to us, don’t we return the nastiness
and tell ourselves, “Serves them right?”  We may, but if we do, we harm the other
person. In so doing, we harm our own soul—and this is one of the reasons why we shouldn’t
return nastiness with more of the same.
</p>
        </blockquote>
        <p>
Ouch. Guilty as charged.
</p>
        <p>
There's a quiz attached to the article, and I highly suggest anyone who cares about
their own ethical behavior take it; some of the questions are pretty clear-cut (at
least to me), but some of them fall into that category of "Well, I know what I *should*
say I would do, but...", and some of them are just downright surprising.
</p>
        <p>
Personally, I think these five points are points that every developer should also
advocate and life their life by, since, quite honestly, I think we as an industry
do a pretty poor job on all five points. Clearly we violate #1 when we're not careful
with security measures in the code; too many programmers (and projects) fail
to realize that "better" in #2 is from the customers' perspective, not our own; too
many programmers look down on anyone who's not technical in some way, or even those
who disagree with them, thus violating #3; too many consultants I've met (thankfully
none I can call "friends") will take any excuse to overbill a client (#4); and so
on, and so on, and so on.
</p>
        <p>
Maybe I'm getting negative in my old age, but it just seems to me that there's too
much shouting and posturing going on (*cough* Fleury *cough*) and not enough focus
on the people to whom we are ultimately beholden: our customers. Do what's right for
them, even if it's not the easy thing to do, even when they don't think they need
it (such as the incapcitated friend in the quiz), and you can never go wrong.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8bb98382-dc28-442a-ab8b-6b61a8794bd4" />
        <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 Ethics</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,8bb98382-dc28-442a-ab8b-6b61a8794bd4.aspx</guid>
      <link>http://blogs.tedneward.com/2007/01/27/More+On+Ethics.aspx</link>
      <pubDate>Sat, 27 Jan 2007 01:34:23 GMT</pubDate>
      <description>&lt;p&gt;
While traveling not too long ago, I saw a great piece on ethics, and wished I'd kept
the silly magazine (I couldn't remember which one) because it was just a really good
summation of how to live the ethical life. While wandering around the Web with Google
tonight, &lt;a href="http://www.hemispheresmagazine.com/nov06/cybersidebar.html"&gt;I found
it&lt;/a&gt;&amp;nbsp;(scroll down a bit, to after the bits on Prohibition and Laughable Laws);
in summary, the author advocates a life around five basic points:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Do no harm&lt;/li&gt;
&lt;li&gt;
Make things better&lt;/li&gt;
&lt;li&gt;
Respect others&lt;/li&gt;
&lt;li&gt;
Be fair&lt;/li&gt;
&lt;li&gt;
Be loving&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Seems pretty simple, no? The problems occur, of course, in the interpretation and
execution. For example, how exactly do we define "better", when we seek to make things
better? Had I the power, I would create a world where all people are free to practice
whatever religious beliefs they hold, but clearly if those religious beliefs involve
human sacrifice, then it's of dubious belief that my actions made the world "better".
(Of course, said practitioners would probably disagree.)
&lt;/p&gt;
&lt;p&gt;
It's also pretty hard to actually follow through on these on a daily basis. The author,
Bruce Weinstein, makes this pretty clear in this example:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
For example, how often do we really keep “do no harm” in mind during our daily interactions
with people? If a clerk at the grocery store is nasty to us, don’t we return the nastiness
and tell ourselves, “Serves them right?”&amp;nbsp; We may, but if we do, we harm the other
person. In so doing, we harm our own soul—and this is one of the reasons why we shouldn’t
return nastiness with more of the same.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ouch. Guilty as charged.
&lt;/p&gt;
&lt;p&gt;
There's a quiz attached to the article, and I highly suggest anyone who cares about
their own ethical behavior take it; some of the questions are pretty clear-cut (at
least to me), but some of them fall into that category of "Well, I know what I *should*
say I would do, but...", and some of them are just downright surprising.
&lt;/p&gt;
&lt;p&gt;
Personally, I think these five points are points that every developer should also
advocate and life their life by, since, quite honestly, I think we as an industry
do a pretty poor job on all five points. Clearly we violate #1 when we're not careful
with security measures in the code; too many&amp;nbsp;programmers (and projects)&amp;nbsp;fail
to realize that "better" in #2 is from the customers' perspective, not our own; too
many programmers look down on anyone who's not technical in some way, or even those
who disagree with them, thus violating #3; too many consultants I've met (thankfully
none I can call "friends") will take any excuse to overbill a client (#4); and so
on, and so on, and so on.
&lt;/p&gt;
&lt;p&gt;
Maybe I'm getting negative in my old age, but it just seems to me that there's too
much shouting and posturing going on (*cough* Fleury *cough*) and not enough focus
on the people to whom we are ultimately beholden: our customers. Do what's right for
them, even if it's not the easy thing to do, even when they don't think they need
it (such as the incapcitated friend in the quiz), and you can never go wrong.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8bb98382-dc28-442a-ab8b-6b61a8794bd4" /&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,8bb98382-dc28-442a-ab8b-6b61a8794bd4.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=17a2b01b-f398-4033-b914-d10418fb0a53</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,17a2b01b-f398-4033-b914-d10418fb0a53.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,17a2b01b-f398-4033-b914-d10418fb0a53.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=17a2b01b-f398-4033-b914-d10418fb0a53</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Michael.NET, apparently inspired by my "Check Your Politics At The Door" post, and
equally peeved at <a href="http://blogs.msdn.com/reedme/archive/2007/01/10/is-your-daylight-going-to-be-saved-this-year.aspx">another
post on blogs.msdn.com</a>, hit a note of pure inspiration when he created his list
of <a href="http://michaeldotnet.blogspot.com/2007/01/programming-promises.html">"Programming
Promises"</a>, which I repeat below:
</p>
        <ul>
          <li>
I promise to get the job done. 
</li>
          <li>
I promise to use whatever tools I need to, regardless of politics. 
</li>
          <li>
I promise to listen to the Closed Source and Open Source zealots equally, and then
dismiss them. 
</li>
          <li>
I promise to support, as long as I am able, any closed source applications I may release. 
</li>
          <li>
I promise to release open source any applications I can not, or will not, support. 
</li>
          <li>
I promise to learn as many languages and libraries as possible, regardless of politics. 
</li>
          <li>
I promise to engage with as many other programmers as possible, both in person and
online, in order to learn from them; regardless of politics. 
</li>
          <li>
I promise to not bash Microsoft nor GNU, nor others like them, everyone has a place
in our industry. 
</li>
          <li>
I promise to use both Windows and Linux, both have their uses. 
</li>
          <li>
I promise to ask questions when I don't know the answer, and answer questions when
I do. 
</li>
          <li>
I promise to learn from my mistakes, and to try to the first time. 
</li>
          <li>
I promise to listen to any idea, however crazy it may sound.</li>
        </ul>
        <p>
In many ways, this strikes me as fundamentally similar to the <a href="http://en.wikipedia.org/wiki/Hippocratic_Oath">Hippocratic
Oath</a> that all doctors must take as part of their acceptance into the ranks of
the medical profession. For most, this isn't just a bunch of words they recite as
entry criteria, this is something they firmly believe and adhere to, almost religiously.
It seems to me that our discipline could use something similar. Thus, do I swear by,
and encourage others to similarly adopt, the Oath of the Conscientious Programmer: 
</p>
        <blockquote>
          <p>
I swear to fulfill, to the best of my ability and judgment, this covenant: 
</p>
          <p>
I will respect the hard-won scientific gains of those programmers and researchers in
whose steps I walk, and gladly share such knowledge as is mine with those who are
to follow. That includes respect for both those who prefer to keep their work to themselves,
as well as those who seek improvement through the open community.
</p>
          <p>
I will apply, for the benefit of the customer, all measures [that] are required, avoiding
those twin traps of gold-plating and computing nihilism. 
</p>
          <p>
I will remember that there is humanity to programming as well as science, and
that warmth, sympathy, and understanding will far outweigh the programmer's editor
or the vendor's tool.
</p>
          <p>
I will not be ashamed to say "I know not," nor will I fail to call in my colleagues
when the skills of another are needed for a system's development, nor will I hold
in lower estimation those colleagues who ask of my opinions or skills.
</p>
          <p>
I will respect the privacy of my customers, for their problems are not disclosed to
me that the world may know. Most especially must I tread with care in matters of life
and death, or of customers' perceptions of the same. If it is given me to save a project
or a company, all thanks. But it may also be within my power to kill a project, for
the company's greater good; this awesome responsibility must be faced with great humbleness
and awareness of my own frailty. Above all, I must not play at God, and remain open
to others' ideas or opinions.
</p>
          <p>
I will remember that I do not create a report, or a data entry screen, but tools
for human beings, whose problems may affect the person's family and economic
stability. My responsibility includes these related problems, if I am to care adequately
for those who are technologically impaired.
</p>
          <p>
I will actively seek to avoid problems that are time-locked, for I know that software
written today will still be running long after I was told it would be replaced.
</p>
          <p>
I will remember that I remain a member of society, both our own and of the one surrounding
all of us, with special obligations to all my fellow human beings, those sound of
mind and body as well as the clueless.
</p>
          <p>
If I do not violate this oath, may I enjoy life and art, respected while I live and
remembered with affection thereafter. May I always act so as to preserve the finest
traditions of my calling and may I long experience the joy of the thanks and
praise from those who seek my help. 
</p>
        </blockquote>
        <p>
        </p>
        <p>
I, Ted Neward, so solemnly swear.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=17a2b01b-f398-4033-b914-d10418fb0a53" />
        <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 Promises (or, the Professional Programmer's Hippocratic Oath)</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,17a2b01b-f398-4033-b914-d10418fb0a53.aspx</guid>
      <link>http://blogs.tedneward.com/2007/01/27/Programming+Promises+Or+The+Professional+Programmers+Hippocratic+Oath.aspx</link>
      <pubDate>Sat, 27 Jan 2007 00:51:53 GMT</pubDate>
      <description>&lt;p&gt;
Michael.NET, apparently inspired by my "Check Your Politics At The Door" post, and
equally peeved at &lt;a href="http://blogs.msdn.com/reedme/archive/2007/01/10/is-your-daylight-going-to-be-saved-this-year.aspx"&gt;another
post on blogs.msdn.com&lt;/a&gt;, hit a note of pure inspiration when he created his list
of &lt;a href="http://michaeldotnet.blogspot.com/2007/01/programming-promises.html"&gt;"Programming
Promises"&lt;/a&gt;, which I repeat below:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
I promise to get the job done. 
&lt;li&gt;
I promise to use whatever tools I need to, regardless of politics. 
&lt;li&gt;
I promise to listen to the Closed Source and Open Source zealots equally, and then
dismiss them. 
&lt;li&gt;
I promise to support, as long as I am able, any closed source applications I may release. 
&lt;li&gt;
I promise to release open source any applications I can not, or will not, support. 
&lt;li&gt;
I promise to learn as many languages and libraries as possible, regardless of politics. 
&lt;li&gt;
I promise to engage with as many other programmers as possible, both in person and
online, in order to learn from them; regardless of politics. 
&lt;li&gt;
I promise to not bash Microsoft nor GNU, nor others like them, everyone has a place
in our industry. 
&lt;li&gt;
I promise to use both Windows and Linux, both have their uses. 
&lt;li&gt;
I promise to ask questions when I don't know the answer, and answer questions when
I do. 
&lt;li&gt;
I promise to learn from my mistakes, and to try to the first time. 
&lt;li&gt;
I promise to listen to any idea, however crazy it may sound.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In many ways, this strikes me as fundamentally similar to the &lt;a href="http://en.wikipedia.org/wiki/Hippocratic_Oath"&gt;Hippocratic
Oath&lt;/a&gt; that all doctors must take as part of their acceptance into the ranks of
the medical profession. For most, this isn't just a bunch of words they recite as
entry criteria, this is something they firmly believe and adhere to, almost religiously.
It seems to me that our discipline could use something similar. Thus, do I swear by,
and encourage others to similarly adopt, the Oath of the Conscientious Programmer: &lt;blockquote&gt; 
&lt;p&gt;
I swear to fulfill, to the best of my ability and judgment, this covenant: 
&lt;/p&gt;
&lt;p&gt;
I will respect the hard-won scientific gains of those&amp;nbsp;programmers and researchers&amp;nbsp;in
whose steps I walk, and gladly share such knowledge as is mine with those who are
to follow. That includes respect for both those who prefer to keep their work to themselves,
as well as those who seek improvement through the open community.
&lt;/p&gt;
&lt;p&gt;
I will apply, for the benefit of the customer, all measures [that] are required, avoiding
those twin traps of&amp;nbsp;gold-plating and&amp;nbsp;computing nihilism. 
&lt;/p&gt;
&lt;p&gt;
I will remember that there is humanity to&amp;nbsp;programming as well as science, and
that warmth, sympathy, and understanding&amp;nbsp;will far&amp;nbsp;outweigh the programmer's&amp;nbsp;editor
or the vendor's tool.
&lt;/p&gt;
&lt;p&gt;
I will not be ashamed to say "I know not," nor will I fail to call in my colleagues
when the skills of another are needed for a system's development, nor will I hold
in lower estimation those colleagues who ask of my opinions or skills.
&lt;/p&gt;
&lt;p&gt;
I will respect the privacy of my customers, for their problems are not disclosed to
me that the world may know. Most especially must I tread with care in matters of life
and death, or of customers' perceptions of the same. If it is given me to save a project
or a company, all thanks. But it may also be within my power to kill a project, for
the company's greater good; this awesome responsibility must be faced with great humbleness
and awareness of my own frailty. Above all, I must not play at God, and remain open
to others' ideas or opinions.
&lt;/p&gt;
&lt;p&gt;
I will remember that I do not create a report, or a data entry screen, but&amp;nbsp;tools
for&amp;nbsp;human beings, whose&amp;nbsp;problems may affect the person's family and economic
stability. My responsibility includes these related problems, if I am to care adequately
for those who are technologically impaired.
&lt;/p&gt;
&lt;p&gt;
I will actively seek to avoid problems that are time-locked, for I know that software
written today will still be running long after I was told it would be replaced.
&lt;/p&gt;
&lt;p&gt;
I will remember that I remain a member of society, both our own and of the one surrounding
all of us, with special obligations to all my fellow human beings, those sound of
mind and body as well as the clueless.
&lt;/p&gt;
&lt;p&gt;
If I do not violate this oath, may I enjoy life and art, respected while I live and
remembered with affection thereafter. May I always act so as to preserve the finest
traditions of my calling and may I long experience the joy of&amp;nbsp;the thanks and
praise from those who seek my help. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
I, Ted Neward,&amp;nbsp;so solemnly swear.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=17a2b01b-f398-4033-b914-d10418fb0a53" /&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,17a2b01b-f398-4033-b914-d10418fb0a53.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=8d24764a-f4c4-477e-b894-e3e1ec591a05</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,8d24764a-f4c4-477e-b894-e3e1ec591a05.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,8d24764a-f4c4-477e-b894-e3e1ec591a05.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8d24764a-f4c4-477e-b894-e3e1ec591a05</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At a No Fluff Just Stuff conference not that long ago, Brian Goetz and I
were hosting a BOF on "Java Internals" (I think it was), and he tossed off a one-liner
that just floored me; I forget the exact phrasology, but it went something like:
</p>
        <blockquote>
          <p>
Remember that part about premature optimization being the root of all evil? He was
referring to programmer career lifecycle, not software development lifecycle. 
</p>
        </blockquote>
        <p>
... and the more I thought about it, the more I think Brian was absolutely right.
There are some projects, no matter how mature or immature, that I simply don't want
any developer on the team to "optimize", because I know what their optimizations will
be like: trying to avoid method calls because "they're expensive", trying to avoid
allocating objects because "it's more work for the GC", and completely ignoring network
traversals because they just don't realize the cost of going across the wire (or else
they think it really can't be all <em>that</em> bad). And then there are those programmers
I've met who are "optimizing" from the very get-go, because they work to avoid network
round-trips, or write SQL statements that don't need later optimization, simply because
they got it right the first time (where "right" means "correct" <em>and</em> "fast").
</p>
        <p>
It made me wish there was a "Developer Skill" setting I could throw on the compiler/IDE,
something that would pick up the following keystrokes...
</p>
        <blockquote>
          <p>
for (int x = 10; x &gt; 0; x--)
</p>
        </blockquote>
        <p>
... and immediately pop Clippy up (yes, the annoying paperclip from Office) who then
says, "It looks like you're doing a decrementing loop count as a premature optimization--would
you like me to help you out?" and promptly rewrites the code as...
</p>
        <blockquote>
          <p>
// QUIT BEING STUPID, STUPID!
</p>
          <p>
for (int x = 0; x &lt; 10; x++)
</p>
        </blockquote>
        <p>
... because the JVM and CLR actually better understand and therefore JIT better code
when your code is more clear than "hand-optimized".
</p>
        <p>
And before any of those thirty-year crusty old curmudgeons start to stand up and shout
"See? I <em>told</em> you young whippersnappers to start listening to me, we should
have wrote it all in COBOL and we would have <em>liked</em> it!", let me be very quick
to point out that years of experience in a developer are very subjective things--I've
met developers with less than two years experience that I would qualify as "senior",
and I've met developers with more than thirty that I wouldn't feel safe to code "Hello
World".
</p>
        <p>
Which, naturally, then brings up the logical question, "How do I know if I'm ready
to start optimizing?" For our answer, we turn to that ancient Master, Yoda:
</p>
        <blockquote>
          <p>
YODA: Yes, a Jedi's strength flows from the Force. But beware of the dark side. Anger,
fear, aggression; the dark side of the Force are they. Easily they flow, quick to
join you in a fight. If once you start down the dark path, forever will it dominate
your destiny, consume you it will, as it did Obi-Wan's apprentice. 
<br />
LUKE: Vader... Is the dark side stronger? 
<br />
YODA: No, no, no. Quicker, easier, more seductive. 
<br />
LUKE: But how am I to know the good side from the bad? 
<br />
YODA: You will know... when you are calm, at peace, passive. A Jedi uses the Force
for knowledge and defense, never for attack. 
</p>
        </blockquote>
        <p>
What he refers to, of course, is that most ancient of all powers, the Source. When
you feel calm, at peace, while you look through the Source, and aren't scrambling
through it looking for a quick and easy answer to your performance problem, then you
know you are channelling the Light Side of the Source. Remember, a Master uses the
Source for knowledge and defense, never for a hack.
</p>
        <p>
          <em>(Few people realize that Yoda, in addition to being a great Jedi Master, was
also a great Master of the Source. Go back and read your Empire Strikes Back if you
don't believe me--most of his teaching to Luke applies to programming just as much
as it does to righting evils in the galaxy.)</em>
        </p>
        <p>
All humor bits aside, the time to learn about performance and JIT compilation is <em>not</em> the
eleventh hour; spend some time cruisng the Hotspot FAQ and the various performance-tuning
books, and most importantly, if you see a result that doesn't jibe with your experience,
ask yourself "why".
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8d24764a-f4c4-477e-b894-e3e1ec591a05" />
        <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>The Root of All Evil</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,8d24764a-f4c4-477e-b894-e3e1ec591a05.aspx</guid>
      <link>http://blogs.tedneward.com/2007/01/15/The+Root+Of+All+Evil.aspx</link>
      <pubDate>Mon, 15 Jan 2007 22:26:29 GMT</pubDate>
      <description>&lt;p&gt;
At&amp;nbsp;a No Fluff Just Stuff&amp;nbsp;conference not that long ago, Brian Goetz and I
were hosting a BOF on "Java Internals" (I think it was), and he tossed off a one-liner
that just floored me; I forget the exact phrasology, but it went something like:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Remember that part about premature optimization being the root of all evil? He was
referring to programmer career lifecycle, not software development lifecycle. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
... and the more I thought about it, the more I think Brian was absolutely right.
There are some projects, no matter how mature or immature, that I simply don't want
any developer on the team to "optimize", because I know what their optimizations will
be like: trying to avoid method calls because "they're expensive", trying to avoid
allocating objects because "it's more work for the GC", and completely ignoring network
traversals because they just don't realize the cost of going across the wire (or else
they think it really can't be all &lt;em&gt;that&lt;/em&gt; bad). And then there are those programmers
I've met who are "optimizing" from the very get-go, because they work to avoid network
round-trips, or write SQL statements that don't need later optimization, simply because
they got it right the first time (where "right" means "correct" &lt;em&gt;and&lt;/em&gt; "fast").
&lt;/p&gt;
&lt;p&gt;
It made me wish there was a "Developer Skill" setting I could throw on the compiler/IDE,
something that would pick up the following keystrokes...
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
for (int x = 10; x &amp;gt; 0; x--)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
... and immediately pop Clippy up (yes, the annoying paperclip from Office) who then
says, "It looks like you're doing a decrementing loop count as a premature optimization--would
you like me to help you out?" and promptly rewrites the code as...
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
// QUIT BEING STUPID, STUPID!
&lt;/p&gt;
&lt;p&gt;
for (int x = 0; x &amp;lt; 10; x++)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
... because the JVM and CLR actually better understand and therefore JIT better code
when your code is more clear than "hand-optimized".
&lt;/p&gt;
&lt;p&gt;
And before any of those thirty-year crusty old curmudgeons start to stand up and shout
"See? I &lt;em&gt;told&lt;/em&gt; you young whippersnappers to start listening to me, we should
have wrote it all in COBOL and we would have &lt;em&gt;liked&lt;/em&gt; it!", let me be very quick
to point out that years of experience in a developer are very subjective things--I've
met developers with less than two years experience that I would qualify as "senior",
and I've met developers with more than thirty that I wouldn't feel safe to code "Hello
World".
&lt;/p&gt;
&lt;p&gt;
Which, naturally, then brings up the logical question, "How do I know if I'm ready
to start optimizing?" For our answer, we turn to that ancient Master, Yoda:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
YODA: Yes, a Jedi's strength flows from the Force. But beware of the dark side. Anger,
fear, aggression; the dark side of the Force are they. Easily they flow, quick to
join you in a fight. If once you start down the dark path, forever will it dominate
your destiny, consume you it will, as it did Obi-Wan's apprentice. 
&lt;br&gt;
LUKE: Vader... Is the dark side stronger? 
&lt;br&gt;
YODA: No, no, no. Quicker, easier, more seductive. 
&lt;br&gt;
LUKE: But how am I to know the good side from the bad? 
&lt;br&gt;
YODA: You will know... when you are calm, at peace, passive. A Jedi uses the Force
for knowledge and defense, never for attack. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
What he refers to, of course, is that most ancient of all powers, the Source. When
you feel calm, at peace, while you look through the Source, and aren't scrambling
through it looking for a quick and easy answer to your performance problem, then you
know you are channelling the Light Side of the Source. Remember, a Master uses the
Source for knowledge and defense, never for a hack.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;(Few people realize that Yoda, in addition to being a great Jedi Master,&amp;nbsp;was
also a great Master of the Source. Go back and read your Empire Strikes Back if you
don't believe me--most of his teaching to Luke applies to programming just as much
as it does to righting evils in the galaxy.)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
All humor bits aside, the time to learn about performance and JIT compilation is &lt;em&gt;not&lt;/em&gt; the
eleventh hour; spend some time cruisng the Hotspot FAQ and the various performance-tuning
books, and most importantly, if you see a result that doesn't jibe with your experience,
ask yourself "why".
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=8d24764a-f4c4-477e-b894-e3e1ec591a05" /&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,8d24764a-f4c4-477e-b894-e3e1ec591a05.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=0cadbc56-68c7-44d5-a00c-f9269dbb75d2</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,0cadbc56-68c7-44d5-a00c-f9269dbb75d2.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,0cadbc56-68c7-44d5-a00c-f9269dbb75d2.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0cadbc56-68c7-44d5-a00c-f9269dbb75d2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've had The Blog Ride up for almost two years now, and it seems the latest fad to
change your blog title to match whatever your particular focus is at the moment. Given
my tech predictions for 2007, and how I believe that interoperability is going to
become a Big Deal (well, I guess in one sense it was already, but now I think it's
going to become a Bigger Deal), and that hey, this is my schtick anyway, I've decided
to rename the blog from "The Blog Ride" (which was kinda a lame name to begin with)
to ...
</p>
        <p>
Truth be told, I thought about squatting on Jason Whittington's old blog title ("Managed
Space"), given that a lot of where my focus centers these days is around managed environments
(Java and .NET, principally), but I didn't like that idea because (a) it was his idea
first, and I don't like "me-too" kinds of faked creativity, and (b) I do a lot more
than just managed code, so...
</p>
        <p>
Welcome to "Interoperability Happens".
</p>
        <p>
One of the things I've set as a resolution for the new year is to post some concrete
interoperability tips (very similar to the ones I'd been posting to TechTarget's "tssblog"
site) ranging on all sorts of interop topics from XML services, to using the proprietary
communication toolkits, to using IKVM, to some concrete examples (authenticating from
Java against a Microsoft Active Directory or ADAM service, hosting Workflow inside
of Spring, or writing Office Action Panes that talk to Java back-end servers, and
so on) of interoperability "in the field". I won't promise that I'll have a new one
up every other week or so, but that's the goal. And the interop hopefully won't be
limited to just Java and .NET; I plan to start exploring the Java/Ruby and .NET/Ruby
interop space, as well as other pairings (Python, Tcl, maybe a few other languages
or environments, like perhaps Parrot) that appeal to me. (That said, I've got a
list of about 20 or 30 or so topics on just Java/.NET, so any delays or significant
pauses aren't for lack of material or ideas.)
</p>
        <p>
And if there's any particular interoperability topic or question you've got, you know
how to reach me.
</p>
        <p>
Catch ya around in 2007.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0cadbc56-68c7-44d5-a00c-f9269dbb75d2" />
        <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>A Time for a Change</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,0cadbc56-68c7-44d5-a00c-f9269dbb75d2.aspx</guid>
      <link>http://blogs.tedneward.com/2007/01/05/A+Time+For+A+Change.aspx</link>
      <pubDate>Fri, 05 Jan 2007 22:04:53 GMT</pubDate>
      <description>&lt;p&gt;
I've had The Blog Ride up for almost two years now, and it seems the latest fad to
change your blog title to match whatever your particular focus is at the moment. Given
my tech predictions for 2007, and how I believe that interoperability is going to
become a Big Deal (well, I guess in one sense it was already, but now I think it's
going to become a Bigger Deal), and that hey, this is my schtick anyway, I've decided
to rename the blog from "The Blog Ride" (which was kinda a lame name to begin with)
to ...
&lt;/p&gt;
&lt;p&gt;
Truth be told, I thought about squatting on Jason Whittington's old blog title ("Managed
Space"), given that a lot of where my focus centers these days is around managed environments
(Java and .NET, principally), but I didn't like that idea because (a) it was his idea
first, and I don't like "me-too" kinds of faked creativity, and (b) I do a lot more
than just managed code, so...
&lt;/p&gt;
&lt;p&gt;
Welcome to "Interoperability Happens".
&lt;/p&gt;
&lt;p&gt;
One of the things I've set as a resolution for the new year is to post some concrete
interoperability tips (very similar to the ones I'd been posting to TechTarget's "tssblog"
site) ranging on all sorts of interop topics from XML services, to using the proprietary
communication toolkits, to using IKVM, to some concrete examples (authenticating from
Java against a Microsoft Active Directory or ADAM service, hosting Workflow inside
of Spring, or writing Office Action Panes that talk to Java back-end servers, and
so on) of interoperability "in the field". I won't promise that I'll have a new one
up every other week or so, but that's the goal. And the interop hopefully won't be
limited to just Java and .NET; I plan to start exploring the Java/Ruby and .NET/Ruby
interop space, as well as other pairings (Python, Tcl, maybe a few other languages
or environments, like perhaps Parrot) that appeal to me. (That said, I've got&amp;nbsp;a
list of about 20 or 30 or so topics on just Java/.NET, so&amp;nbsp;any delays or significant
pauses aren't for lack of material or ideas.)
&lt;/p&gt;
&lt;p&gt;
And if there's any particular interoperability topic or question you've got, you know
how to reach me.
&lt;/p&gt;
&lt;p&gt;
Catch ya around in 2007.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0cadbc56-68c7-44d5-a00c-f9269dbb75d2" /&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,0cadbc56-68c7-44d5-a00c-f9269dbb75d2.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
      <category>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=faec9013-cbab-4438-863b-4e155a76af8c</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,faec9013-cbab-4438-863b-4e155a76af8c.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,faec9013-cbab-4438-863b-4e155a76af8c.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=faec9013-cbab-4438-863b-4e155a76af8c</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently, while engaging in my other passion (international relations), I was reading
the latest issue of Foreign Affairs, and ran across an interesting essay regarding
the increasing outsourcing--or, the term they introduce which I prefer in this case,
"offshoring"--of technical work, and I found some interesting analysis there that
I think solidifies why I think programmers shouldn't fear offshoring, but instead
embrace it and ride the wave to a better life for both us and consumers. Permit me
to explain.
</p>
        <p>
The essay, entitled "Offshoring: The Next Industrial Revolution?" (by Alan S. Blinder),
opens with an interesting point, made subtly, that offshoring (or "offshore outsourcing"),
is really a natural economic consequence: 
</p>
        <blockquote>
          <p>
In February 2004, when N. Gregory Mankiw, a Harvard professor then serving as chairman
of the White House Council of Economic Advisers, caused a national uproar with a "textbook"
statement about trade, economists rushed to his defense. Mankiw was commenting on
the phenomenon that has been clumsily dubbed "offshoring" (or "offshore outsourcing")--the
migration of jobs, but not the people who perform them, from rich countries to poor
ones. Offshoring, Mankiw said, is only "the latest manifestation of the gains from
trade that economists have talked about at least since Adam Smith. ... More things
are tradable than were tradable in the past, and that's a good thing." Although Democratic
and Republican politicians alike excoriated Mankiw for his callous attitude toward
American jobs, economists lined up to support his claim that offshoring is simply
international business as usual.
</p>
          <p>
Their economics were basically sound: the well-known principle of comparative advantage
implies that trade in new kinds of products will bring overall improvements in productivity
and well-being. But Mankiw and his defenders underestimated both the importance of
offshoring and its disruptive effect on wealthy countries. Sometimes a quantitative
change is so large that it brings qualitative changes, as offshoring likely will.
We have so far barely seen the tip of the offshoring iceberg, the eventual dimensions
of which may be staggering.
</p>
        </blockquote> So far, you're not likely convinced that this is a good thing, and Blinder's
article doesn't really offer much reassurance as you go on: <blockquote><p>
To be sure, the furor over Mankiw's remark was grotesquely out of proportion to the
current importance of offshoring, which is still largely a prospective phenomenon.
Although there are no reliable national data, fragmentary studies indicate that well
under a million service-sector jobs have been lost to offshoring to date. (A million
seems impressive, but in the gigantic and rapidly churning U.S. labor market, a million
jobs is less than two weeks' worth of normal gross job losses.)<sup>1</sup> However,
constant improvements in technology and global communications will bring much more
offshoring of "impersonal services"--that is, services that can be delivered electronically
over long distances, with little or no degradation in quality.
</p><p>
That said, we should not view the coming wave of offshoring as an impending catastrophe.
Nor should we try to stop it. The normal gains from trade mean that the world as a
whole cannot lose from increases in productivity, and the United States and other
industrial countries have not only weathered but also benefited from comparable changes
in the past. But in order to do so again, the governments and societies of the developed
world must face up to the massive, complex, and multifaceted challenges that offshoring
will bring. National data systems, trade policies, educational systems, social welfare
programs, and politics must all adapt to new realities. Unfortunately, none of this
is happening now.
</p></blockquote> Phrases like "the world cannot lose from increases in productivity"
are hardly comforting to programmers who are concerned about their jobs, and hearing
"nor should we try to stop" the impending wave of offshoring is not what most programmers
want to hear. But there's an interesting analytical point that I think Blinder misses
about the software industry, and in order to make the point I have to walk through
his argument a bit to get to it. I'm not going to quote the entirety of the article
to you, don't worry, but I do have to walk through a few points to get there. Bear
with me, it's worth the ride, I think.
<h3>Why Offshoring
</h3><p>
Blinder first describes the basics of "comparative advantage" and why it's important
in this context: 
</p><blockquote><p>
Countries trade with one another for the same reasons that individuals, businesses
and regions do: to exploit their comparative advantages. Some advantages are "natural":
Texas and Saudi Arabia sit atop massive deposits of oil that are entirely lacking
in New York and Japan, and nature has conspired to make Hawaii a more attractive tourist
destination than Greenland. Ther eis not much anyone can do about such natural advantages.
</p><p>
But in modern economics, nature's whimsy is far less important than it was in the
past. Today, much comparative advantage derives from human effort rather than natural
conditions. The concentration of computer companies around Silicon Valley, for example,
has nothing to do with bountiful natural deposits of silicon; it has to do with Xerox's
fabled Palo Alto Research Center, the proximity of Stanford University, and the arrival
of two young men named Hewlett and Packard. Silicon Valley could have sprouted up
anywhere.
</p><p>
One important aspect of this modern reality is that patterns of man-made comparative
advantage can and do change over time. The economist Jagdish Bhagwait has labeled
this phenomenon "kaleidoscopic comparative advantage", and it is critical to understanding
offshoring. Once upon a time, the United Kingdom had a comparative advantage in textile
manufacturing. Then that advantage shifted to New England, and so jobs were moved
from the United Kingdom to the United States.<sup>2</sup> Then the comparative advantage
in textile manufacturing shifted once again--this time to the Carolinas--and jobs
migrated south within the United States.<sup>3</sup> Now the comparative advantage
in textile manufacturing resides in China and other low-wage countries, and what many
are wont to call "American jobs" have been moved there as a result.
</p><p>
Of course, not everything can be traded across long distances. At any point in time,
the available technology--especially in transportation and communications<sup>4</sup>--largely
determines what can be traded internationally and what cannot. Economic theorists
accordingly divide the world's goods and services into two bins: tradable and non-tradable.
Traditionally, any item that could be put in a box and shipped (roughly, manufactured
goods) was considered tradable, and anything that could not be put into a box (such
as services) or was too heavy to ship (such as houses) was thought of as nontradable.
But because technology is always improving and transportation is becoming cheaper
and easier, the boundary between what is tradable and what is not is constantly shifting.
And unlike comparative advantage, this change is not kaleidoscopic; it moves in only
one direction, with more and more items becoming tradable.
</p><p>
The old assumption that if you cannot put it in a box, you cannot trade it is thus
hopelessly obsolete. Because packets of digitized information play the role that boxes
used to play, many more services are now tradable and many more will surely become
so. In the future, and to a great extent already, the key distinction will no longer
be between things that can be put in a box and things that cannot. Rather, it will
be between services that can be delivered electronically and those that cannot.
</p></blockquote> Blinder goes on to describe the three industrial revolutions, the first
being the one we all learned in school, coming at the end of the 18th century and
marked by Adam Smith's <i>The Wealth of Nations</i> in 1776. It was a massive shift
in the economic system, as workers in industrializing countries migrated from farm
to factory. "It has been estimated that in 1810, 84 percent of the U.S. work force
was engaged in agriculture, compared to a paltry 3 percent in manufacturing. By 1960,
manufacturing's share had rised to almost 25 percent and agriculture's had dwindled
to just 8 percent. (Today, agriculture's share is under 2 percent.)" (This statistic
is important, by the way--keep it in mind as we go.) He goes on to point out the second
Revolution, the shift from manufacturing to services: <blockquote><p>
Then came the second Industrial Revolution, and jobs shifted once again--this time
away from manufacturing and toward services. The shift to services is still viewed
with alarm in the United States and other rich countries, where people bemoan rather
than welcome the resulting loss of manufacturing jobs<sup>5</sup>. But in reality,
new service-sector jobs have been created far more rapidly than old manufacturing
jobs have disappeared. In 1960, about 35 percent of nonagricultural workers in the
United States produced goods and 65 percent produced services. By 2004, only about
one-sixth of the United States' nonagricultural jobs were in goods-producing industries,
while five-sixths produced services. This trend is worldwide and continuing.
</p></blockquote> It's also important to point out that the years from 1960 to 2004 saw
a meteoric rise in the average standard of living for the United States, on a scale
that's basically unheard of in history. In fact, it was SUCH a huge rise that it became
an expectation that your children would live better than you did, and the inability
to keep that basic expectation in place (which has become a core part of the so-called
"American Dream") that creates major societal angst on the part of the United States
today. <blockquote><p>
We are now i nthe arly stages of a third Industrial Revolution--the information age.
The cheap and easy flow of information around the globe has vastly expanded the scope
of tradable services, and there is much more to come. Industrial revolutions are big
deals. And just like the previous two, the third Industrial Revolution will require
vast and usettling adjustments in the way Americans and residents of other developed
countries work, live, and educate their children.
</p></blockquote> Wow, nothing unsettles people more than statements like "the world you
know will cease to exist" and the like. But think about this for a second: despite
the basic "growing pains" that accompanied the transitions themselves, on just about
every quantifiable scale imaginable, we live a much better life today than our forebears
did just two hundred years ago, and orders of magnitude better than our forebears
did three hundred or more years ago (before the first Industrial Revolution). And
if you still hearken back to the days of the "American farmer" with some kind of nostalgia,
you never worked on a farm. Trust me on this. 
<h3>So what does this mean?
</h3><p>
But now we start to come to the interesting part of the article. 
</p><blockquote> But a bit of historical perspective should help temper fears of offshoring.
The first Industrial Revolution did not spell the end of agriculture, or even the
end of food production, in the United States. It jus tmean that a much smaller percentage
of Americans had to work on farms to feed the population. (By charming historical
coincidence, the actual number of Americans working on farms today--around 2 million--is
about what it was in 1810.) The main reason for this shift was not foreign trade,
but soaring farm productivity. And most important, the massive movement of labor off
the farms did not result in mass unemployment. Rather, it led to a large-scale reallocation
of labor to factories. </blockquote> Here's where we get to the "hole" in the argument.
Most readers will read that paragraph, do the simple per-capita math, and conclude
that thanks to soaring productivity gains in the programming industry (cite whatever
technology you want here--Ruby, objects, hardware gains, it really doesn't matter
what), the percentage of programmers in the country is about to fall into a black
hole. After all, if we can go from 84 percent of the population involved in agriculture
to less than 2% or so, thanks to that soaring productivity, why wouldn't it happen
here again?
<p>
Therein lies the flaw in the argument: <i>the amount of productivity required to achieve
the desired ends is constant in the agriculture industry, yet a constantly-changing
dynamic value in software</i>. This is also known as what I will posit as the Groves-Gates
Maxim: "What Andy Groves giveth, Bill Gates taketh away."
</p><h3>The Groves-Gates Maxim
</h3><p>
The argument here is simple: the process of growing food is a pretty constant one:
put seed in ground, wait until it comes up, then harvest the results and wait until
next year to start again. Although we might have numerous tools that can help make
it easier to put seeds into the ground, or harvesting the results, or even helping
to increase the yield of the crop when it comes up, the basic amount of productivity
required is pretty much constant. (My cousin, the FFA Farmer of the Year from some
years back and a seed hybrid researcher in Iowa might disagree with me, mind you.)
Compare this with the software industry: the basic differences between what's an acceptable
application to our users today, compared to even ten years ago, is an order of magnitude
different. Gains in productivity have not yielded the ability to build applications
faster and faster, but instead have created a situation where users and managers ask
more of us with each successive application.
</p><p>
The Groves-Gates Maxim is an example of that: every time Intel (where Andy Groves
is CEO) releases new hardware that accelerates the power and potential of what the
"average" computer (meaning, priced at somewhere between $1500-$2000) is capable of,
it seems that Microsoft (Mr. Gates' little firm) releases a new version of Windows
that sucks up that power by providing a spiffier user interface and "eye-candy" features,
be they useful/important or not. In other words, the more the hardware creates possibilities,
the more software is created to exploit and explore those possibilities. The additional
productivity is spent not in reducing the time required to produce the thing desired
(food in the case of agriculture, an operating system or other non-trivial program
in the case of software), but in the expansion of the functionality of the product.
</p><p>
This basic fact, the Groves-Gates Maxim, is what saves us from the bloody axe of forced
migration. Because what's expected of software is constantly on the same meteoric
rise as what productivity gains provide us, the need for programmer time remains pretty
close to constant. Now, once the desire for exponentially complicated features starts
to level off, the exponentially increasing gains in productivity will have the same
effect as they did in the agricultural industry, and we will start seeing a migration
of programmers into other, "personal service" industries (which are hard to offshore,
as opposed to "impersonal service" industries which can be easily shipped overseas).
</p><h3>Implications
</h3><p>
What does this mean for programmers? For starters, as Dave Thomas has already frequently
pointed out on NFJS panels, programmers need to start finding ways to make their service
a "personal service" position rather than an "impersonal service" one. Blinder points
out that the services industry is facing a split down the middle along this distinction,
and it's not necessarily a high-paying vs low-paying divide: 
</p><blockquote><p>
Many people blithely assume that the critical labor-market distinction is, and will
remain, between highly educated (or highly-skilled) people and less-educated (or less-skilled)
people--doctors versus call-center operators, for example. The supposed remedy for
the rich countries, accordingly, is more education and a general "upskilling" of the
work force. But this view may be mistaken. Other things being equal, education and
skills are, of course, good things; education yields higher returns in advanced societies,
and more schooling probably makes workers more flexible and more adaptable to change.
But the problem with relying on education as the remedy for potential job losses is
that "other things" are not remotely close to equal. The critical divide in the future
may instead be between those types are work that are easily deliverable through a
wire (or via wireless connections) with little or no diminution in quality and those
that are not. And this unconventional divide does not correspond well to traditional
distinctions between jobs that require high levels of education and jobs that do not.
</p><p>
A few disparate examples will illustrate just how complex--or, rather, how untraditional--the
new divide is. It is unlikely that the services of either taxi drivers or airline
pilots will ever be delivered electronically over long distances. The first is a "bad
job" with negligible educational requirements; the second is quite the reverse. On
the other hand, typing services (a low-skill job) and security analysis (a high-skill
job) are already being delivered electronically from India--albeit on a small scale
so far. Most physicians need not fear that their jobs will be moved offshore, but
radiologists are beginning to see this happening already. Police officers will not
be replaced by electronic monitoring, but some security guards will be. Janitors and
crane operators are probably immune to foreign competition; accountants and computer
programmers are not. In short, the dividing line between the jobs that produce services
that are suitable for electronic delivery (and are thus threatened by offshoring)
and those that do not does not correspond to traditional distinctions between high-end
and low-end work.
</p></blockquote> What's the implications here for somebody deep in our industry? Pay
close attention to Blinder's conclusion, that computer programmers are highly vulnerable
to foreign competition, based on the assumption that the product we deliver is easily
transferable across electronic media. But there is hope: <blockquote><p>
There is currently not even a vocabulary, much less any systematic data, to help society
come to grips with the coming labor-market reality. So here is some suggested nomenclature.
Service that cannot be delivered electronically, or that are notably inferior when
so delivered, have one essential characteristic: personal, face-to-face contact is
either imperative or highly desirable. Think of hte waiter who serves you dinner,
the doctor you gives you your annual physical, or the cop on the beat. Now think of
any of those tasks being performed by robots controlled from India--not quite the
same. But such face-to-face human contact is not necessary in the relationship you
have with the telephone operator who arranges your conference call or the clerk who
takes your airline reservation over the phone. He or she may be in India already.
</p><p>
The first group of tasks can be called personally-delivered services, or simply personal
services, and the second group of impersonally delivered services, or impersonal services.
In the brave new world of globalized electronic commerce, impersonal services have
more in common with manufactured goods that can be put in boxes than they do with
personal services. Thus, many impersonal services are destined to become tradable
and therefore vulnerable to offshoring. By contrast, most personal services have attributes
that cannot be transmitted through a wire. Some require face-to-face contact (child
care), some are inherently "high-risk" (nursing), some involve high levels of personal
trust (psychotherapy), and some depend on location-specific attributes (lobbying).
</p></blockquote> In other words, programmers that want to remain less vulnerable to foreign
competition need to find ways to stress the personal, face-to-face contact between
themselves and their clients, regardless of whether you are a full-time employee of
a company, a contractor, or a consultant (or part of a team of consultants) working
on a project for a client. Look for ways to maximize the four cardinalities he points
out: 
<ul><li><b>Face-to-face contact.</b> Agile methodologies demand that customers be easily accessible
in order to answer questions regarding implementation decisions or to resolve lack
of understanding of the requirements. Instead of demanding customers be present at
your site, you may find yourself in a better position if you put yourself close to
your customers.</li><li><b>"High-risk".</b> This is a bit harder to do with software projects--either the
project is inherently high-risk in its makeup (perhaps this is a mission-critical
app that the company depends on, such as the e-commerce portal for an online e-tailer),
or it's not. There's not much you can do to change this, unless you are politically
savvy enough to "sell" your project to a group that would make it mission-critical.</li><li><b>High levels of personal trust.</b> This is actually easier than you might think--trust
in this case refers not to the privileged nature of therapist-patient communication,
but in the credibility the organization has in you to carry out the work required.
One way to build this trust is to understand the business domain of the client, rather
than remaining aloof and "staying focused on the technology". This trust-based approach
is already present in a variety of forms outside our industry--regardless of the statistical
ratings that might be available, most people find that they have a favorite auto repair
mechanic or shop not for any quantitatively-measurable reason, but beceause the mechanic
"understands" them somehow. The best customer-service shops understand this, and have
done so for years. The restaurant that recognizes me as a regular after just a few
visits and has my Diet Coke ready for me at my favorite table is far likelier to get
my business on a regular basis than the one that never does. Learn your customers,
learn their concerns, learn their business model and business plan, and get yourself
into the habit of trying to predict what they might need next--not so you can build
it already, but so that you can demonstrate to them that you understand <i>them</i>,
and by extension, their needs.</li><li><b>Location-specific attributes.</b> Sometimes, the software being built is localized
to a particular geographic area, and simply being in that same area can yield significant
benefits, particularly when heroic efforts are called for. (It's very hard to flip
the reset switch on a server in Indiana from a console in India, for example.) 
</li></ul>
In general, what you're looking to do is demonstrate how your value to the company
arises out of more than just your technical skill, but also some other qualities that
you can provide in better and more valuable form than somebody in India (or China,
or Brazil, or across the country for that matter, wherever the offshoring goes). It's
not a guarantee that you might still be offshored--some management folks will just
see bottom-line dollars and not recognize the intangible value-add that high levels
of personal trust or locality provides--but it'll minimize it on the whole.
<p>
But even if this analysis doesn't make you feel a little more comfortable, consider
this: there are 1 billion people in China alone, and close to the same in India. Instead
of seeing them as potential competition, imagine what happens when the wages from
the offshored jobs start to create a demand for goods and services in those countries--if
you think the software market in the U.S. was hot a decade ago, where only a half-billion
(across both the U.S. and Europe) people were demanding software, now think about
it when four <i>times</i> that many start looking for it.
</p><hr /><h3>Footnotes
</h3><p><sup>1</sup> Which in of itself is an interesting statistic--it implies that offshoring
is far less prevalent than some of people worried about it believe it to be, including
me.
</p><p><sup>2</sup> Interesting bit of trivia--part of the reason that advantage shifted
was because the US stole (yes, stole, as in industrial espionage, one of the first
recorded cases of modern industrial espionage) the plans for modern textile machinery
from the UK. Remember that, next time you get upset at China's rather loose grip of
intellectual property law....
</p><p><sup>3</sup> Which, by the way, was a large part of the reason we fought the Civil
War (the "War Between the States" to some, or the "War of Northern Aggression" to
others)--the Carolinas depended on slave labor to pick their cotton cheaply, and couldn't
acquire Northern-made machinery cheaply to replace the slaves. Hence, for that (and
a lot of other reasons), war followed.
</p><p><sup>4</sup> An interesting argument--is there any real difference between transportation
and communications? One ships "stuff", the other "data", beyond that, is there any
difference?
</p><p><sup>5</sup> And, I'd like to point out, the shrinking environmental damage that can
arise from a manufacturing-based economy. Services rarely generate pollution, which
is part of the clash between the industrialized "Western" nations and the developing
"Southern" ones over environmental issues.
</p><h3>Resources
</h3><p><i>"Offshoring: The Next Industrial Revolutoin?"</i>, by Alan S. Blinder, Foreign
Affairs (March/April 2006), pp 113 - 128.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=faec9013-cbab-4438-863b-4e155a76af8c" /><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>Why programmers shouldn't fear offshoring</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,faec9013-cbab-4438-863b-4e155a76af8c.aspx</guid>
      <link>http://blogs.tedneward.com/2006/03/24/Why+Programmers+Shouldnt+Fear+Offshoring.aspx</link>
      <pubDate>Fri, 24 Mar 2006 09:43:00 GMT</pubDate>
      <description>&lt;p&gt;
Recently, while engaging in my other passion (international relations), I was reading
the latest issue of Foreign Affairs, and ran across an interesting essay regarding
the increasing outsourcing--or, the term they introduce which I prefer in this case,
"offshoring"--of technical work, and I found some interesting analysis there that
I think solidifies why I think programmers shouldn't fear offshoring, but instead
embrace it and ride the wave to a better life for both us and consumers. Permit me
to explain.
&lt;/p&gt;
&lt;p&gt;
The essay, entitled "Offshoring: The Next Industrial Revolution?" (by Alan S. Blinder),
opens with an interesting point, made subtly, that offshoring (or "offshore outsourcing"),
is really a natural economic consequence: &lt;blockquote&gt; 
&lt;p&gt;
In February 2004, when N. Gregory Mankiw, a Harvard professor then serving as chairman
of the White House Council of Economic Advisers, caused a national uproar with a "textbook"
statement about trade, economists rushed to his defense. Mankiw was commenting on
the phenomenon that has been clumsily dubbed "offshoring" (or "offshore outsourcing")--the
migration of jobs, but not the people who perform them, from rich countries to poor
ones. Offshoring, Mankiw said, is only "the latest manifestation of the gains from
trade that economists have talked about at least since Adam Smith. ... More things
are tradable than were tradable in the past, and that's a good thing." Although Democratic
and Republican politicians alike excoriated Mankiw for his callous attitude toward
American jobs, economists lined up to support his claim that offshoring is simply
international business as usual.
&lt;/p&gt;
&lt;p&gt;
Their economics were basically sound: the well-known principle of comparative advantage
implies that trade in new kinds of products will bring overall improvements in productivity
and well-being. But Mankiw and his defenders underestimated both the importance of
offshoring and its disruptive effect on wealthy countries. Sometimes a quantitative
change is so large that it brings qualitative changes, as offshoring likely will.
We have so far barely seen the tip of the offshoring iceberg, the eventual dimensions
of which may be staggering.
&lt;/p&gt;
&lt;/blockquote&gt; So far, you're not likely convinced that this is a good thing, and Blinder's
article doesn't really offer much reassurance as you go on: &lt;blockquote&gt; 
&lt;p&gt;
To be sure, the furor over Mankiw's remark was grotesquely out of proportion to the
current importance of offshoring, which is still largely a prospective phenomenon.
Although there are no reliable national data, fragmentary studies indicate that well
under a million service-sector jobs have been lost to offshoring to date. (A million
seems impressive, but in the gigantic and rapidly churning U.S. labor market, a million
jobs is less than two weeks' worth of normal gross job losses.)&lt;sup&gt;1&lt;/sup&gt; However,
constant improvements in technology and global communications will bring much more
offshoring of "impersonal services"--that is, services that can be delivered electronically
over long distances, with little or no degradation in quality.
&lt;/p&gt;
&lt;p&gt;
That said, we should not view the coming wave of offshoring as an impending catastrophe.
Nor should we try to stop it. The normal gains from trade mean that the world as a
whole cannot lose from increases in productivity, and the United States and other
industrial countries have not only weathered but also benefited from comparable changes
in the past. But in order to do so again, the governments and societies of the developed
world must face up to the massive, complex, and multifaceted challenges that offshoring
will bring. National data systems, trade policies, educational systems, social welfare
programs, and politics must all adapt to new realities. Unfortunately, none of this
is happening now.
&lt;/p&gt;
&lt;/blockquote&gt; Phrases like "the world cannot lose from increases in productivity"
are hardly comforting to programmers who are concerned about their jobs, and hearing
"nor should we try to stop" the impending wave of offshoring is not what most programmers
want to hear. But there's an interesting analytical point that I think Blinder misses
about the software industry, and in order to make the point I have to walk through
his argument a bit to get to it. I'm not going to quote the entirety of the article
to you, don't worry, but I do have to walk through a few points to get there. Bear
with me, it's worth the ride, I think.&gt;
&lt;h3&gt;Why Offshoring
&lt;/h3&gt;
&lt;p&gt;
Blinder first describes the basics of "comparative advantage" and why it's important
in this context: &lt;blockquote&gt; 
&lt;p&gt;
Countries trade with one another for the same reasons that individuals, businesses
and regions do: to exploit their comparative advantages. Some advantages are "natural":
Texas and Saudi Arabia sit atop massive deposits of oil that are entirely lacking
in New York and Japan, and nature has conspired to make Hawaii a more attractive tourist
destination than Greenland. Ther eis not much anyone can do about such natural advantages.
&lt;/p&gt;
&lt;p&gt;
But in modern economics, nature's whimsy is far less important than it was in the
past. Today, much comparative advantage derives from human effort rather than natural
conditions. The concentration of computer companies around Silicon Valley, for example,
has nothing to do with bountiful natural deposits of silicon; it has to do with Xerox's
fabled Palo Alto Research Center, the proximity of Stanford University, and the arrival
of two young men named Hewlett and Packard. Silicon Valley could have sprouted up
anywhere.
&lt;/p&gt;
&lt;p&gt;
One important aspect of this modern reality is that patterns of man-made comparative
advantage can and do change over time. The economist Jagdish Bhagwait has labeled
this phenomenon "kaleidoscopic comparative advantage", and it is critical to understanding
offshoring. Once upon a time, the United Kingdom had a comparative advantage in textile
manufacturing. Then that advantage shifted to New England, and so jobs were moved
from the United Kingdom to the United States.&lt;sup&gt;2&lt;/sup&gt; Then the comparative advantage
in textile manufacturing shifted once again--this time to the Carolinas--and jobs
migrated south within the United States.&lt;sup&gt;3&lt;/sup&gt; Now the comparative advantage
in textile manufacturing resides in China and other low-wage countries, and what many
are wont to call "American jobs" have been moved there as a result.
&lt;/p&gt;
&lt;p&gt;
Of course, not everything can be traded across long distances. At any point in time,
the available technology--especially in transportation and communications&lt;sup&gt;4&lt;/sup&gt;--largely
determines what can be traded internationally and what cannot. Economic theorists
accordingly divide the world's goods and services into two bins: tradable and non-tradable.
Traditionally, any item that could be put in a box and shipped (roughly, manufactured
goods) was considered tradable, and anything that could not be put into a box (such
as services) or was too heavy to ship (such as houses) was thought of as nontradable.
But because technology is always improving and transportation is becoming cheaper
and easier, the boundary between what is tradable and what is not is constantly shifting.
And unlike comparative advantage, this change is not kaleidoscopic; it moves in only
one direction, with more and more items becoming tradable.
&lt;/p&gt;
&lt;p&gt;
The old assumption that if you cannot put it in a box, you cannot trade it is thus
hopelessly obsolete. Because packets of digitized information play the role that boxes
used to play, many more services are now tradable and many more will surely become
so. In the future, and to a great extent already, the key distinction will no longer
be between things that can be put in a box and things that cannot. Rather, it will
be between services that can be delivered electronically and those that cannot.
&lt;/p&gt;
&lt;/blockquote&gt; Blinder goes on to describe the three industrial revolutions, the first
being the one we all learned in school, coming at the end of the 18th century and
marked by Adam Smith's &lt;i&gt;The Wealth of Nations&lt;/i&gt; in 1776. It was a massive shift
in the economic system, as workers in industrializing countries migrated from farm
to factory. "It has been estimated that in 1810, 84 percent of the U.S. work force
was engaged in agriculture, compared to a paltry 3 percent in manufacturing. By 1960,
manufacturing's share had rised to almost 25 percent and agriculture's had dwindled
to just 8 percent. (Today, agriculture's share is under 2 percent.)" (This statistic
is important, by the way--keep it in mind as we go.) He goes on to point out the second
Revolution, the shift from manufacturing to services: &lt;blockquote&gt; 
&lt;p&gt;
Then came the second Industrial Revolution, and jobs shifted once again--this time
away from manufacturing and toward services. The shift to services is still viewed
with alarm in the United States and other rich countries, where people bemoan rather
than welcome the resulting loss of manufacturing jobs&lt;sup&gt;5&lt;/sup&gt;. But in reality,
new service-sector jobs have been created far more rapidly than old manufacturing
jobs have disappeared. In 1960, about 35 percent of nonagricultural workers in the
United States produced goods and 65 percent produced services. By 2004, only about
one-sixth of the United States' nonagricultural jobs were in goods-producing industries,
while five-sixths produced services. This trend is worldwide and continuing.
&lt;/p&gt;
&lt;/blockquote&gt; It's also important to point out that the years from 1960 to 2004 saw
a meteoric rise in the average standard of living for the United States, on a scale
that's basically unheard of in history. In fact, it was SUCH a huge rise that it became
an expectation that your children would live better than you did, and the inability
to keep that basic expectation in place (which has become a core part of the so-called
"American Dream") that creates major societal angst on the part of the United States
today. &lt;blockquote&gt; 
&lt;p&gt;
We are now i nthe arly stages of a third Industrial Revolution--the information age.
The cheap and easy flow of information around the globe has vastly expanded the scope
of tradable services, and there is much more to come. Industrial revolutions are big
deals. And just like the previous two, the third Industrial Revolution will require
vast and usettling adjustments in the way Americans and residents of other developed
countries work, live, and educate their children.
&lt;/p&gt;
&lt;/blockquote&gt; Wow, nothing unsettles people more than statements like "the world you
know will cease to exist" and the like. But think about this for a second: despite
the basic "growing pains" that accompanied the transitions themselves, on just about
every quantifiable scale imaginable, we live a much better life today than our forebears
did just two hundred years ago, and orders of magnitude better than our forebears
did three hundred or more years ago (before the first Industrial Revolution). And
if you still hearken back to the days of the "American farmer" with some kind of nostalgia,
you never worked on a farm. Trust me on this. &gt;
&lt;h3&gt;So what does this mean?
&lt;/h3&gt;
&lt;p&gt;
But now we start to come to the interesting part of the article. &lt;blockquote&gt; But
a bit of historical perspective should help temper fears of offshoring. The first
Industrial Revolution did not spell the end of agriculture, or even the end of food
production, in the United States. It jus tmean that a much smaller percentage of Americans
had to work on farms to feed the population. (By charming historical coincidence,
the actual number of Americans working on farms today--around 2 million--is about
what it was in 1810.) The main reason for this shift was not foreign trade, but soaring
farm productivity. And most important, the massive movement of labor off the farms
did not result in mass unemployment. Rather, it led to a large-scale reallocation
of labor to factories. &lt;/blockquote&gt; Here's where we get to the "hole" in the argument.
Most readers will read that paragraph, do the simple per-capita math, and conclude
that thanks to soaring productivity gains in the programming industry (cite whatever
technology you want here--Ruby, objects, hardware gains, it really doesn't matter
what), the percentage of programmers in the country is about to fall into a black
hole. After all, if we can go from 84 percent of the population involved in agriculture
to less than 2% or so, thanks to that soaring productivity, why wouldn't it happen
here again?&gt;
&lt;p&gt;
Therein lies the flaw in the argument: &lt;i&gt;the amount of productivity required to achieve
the desired ends is constant in the agriculture industry, yet a constantly-changing
dynamic value in software&lt;/i&gt;. This is also known as what I will posit as the Groves-Gates
Maxim: "What Andy Groves giveth, Bill Gates taketh away."
&lt;/p&gt;
&lt;h3&gt;The Groves-Gates Maxim
&lt;/h3&gt;
&lt;p&gt;
The argument here is simple: the process of growing food is a pretty constant one:
put seed in ground, wait until it comes up, then harvest the results and wait until
next year to start again. Although we might have numerous tools that can help make
it easier to put seeds into the ground, or harvesting the results, or even helping
to increase the yield of the crop when it comes up, the basic amount of productivity
required is pretty much constant. (My cousin, the FFA Farmer of the Year from some
years back and a seed hybrid researcher in Iowa might disagree with me, mind you.)
Compare this with the software industry: the basic differences between what's an acceptable
application to our users today, compared to even ten years ago, is an order of magnitude
different. Gains in productivity have not yielded the ability to build applications
faster and faster, but instead have created a situation where users and managers ask
more of us with each successive application.
&lt;/p&gt;
&lt;p&gt;
The Groves-Gates Maxim is an example of that: every time Intel (where Andy Groves
is CEO) releases new hardware that accelerates the power and potential of what the
"average" computer (meaning, priced at somewhere between $1500-$2000) is capable of,
it seems that Microsoft (Mr. Gates' little firm) releases a new version of Windows
that sucks up that power by providing a spiffier user interface and "eye-candy" features,
be they useful/important or not. In other words, the more the hardware creates possibilities,
the more software is created to exploit and explore those possibilities. The additional
productivity is spent not in reducing the time required to produce the thing desired
(food in the case of agriculture, an operating system or other non-trivial program
in the case of software), but in the expansion of the functionality of the product.
&lt;/p&gt;
&lt;p&gt;
This basic fact, the Groves-Gates Maxim, is what saves us from the bloody axe of forced
migration. Because what's expected of software is constantly on the same meteoric
rise as what productivity gains provide us, the need for programmer time remains pretty
close to constant. Now, once the desire for exponentially complicated features starts
to level off, the exponentially increasing gains in productivity will have the same
effect as they did in the agricultural industry, and we will start seeing a migration
of programmers into other, "personal service" industries (which are hard to offshore,
as opposed to "impersonal service" industries which can be easily shipped overseas).
&lt;/p&gt;
&lt;h3&gt;Implications
&lt;/h3&gt;
&lt;p&gt;
What does this mean for programmers? For starters, as Dave Thomas has already frequently
pointed out on NFJS panels, programmers need to start finding ways to make their service
a "personal service" position rather than an "impersonal service" one. Blinder points
out that the services industry is facing a split down the middle along this distinction,
and it's not necessarily a high-paying vs low-paying divide: &lt;blockquote&gt; 
&lt;p&gt;
Many people blithely assume that the critical labor-market distinction is, and will
remain, between highly educated (or highly-skilled) people and less-educated (or less-skilled)
people--doctors versus call-center operators, for example. The supposed remedy for
the rich countries, accordingly, is more education and a general "upskilling" of the
work force. But this view may be mistaken. Other things being equal, education and
skills are, of course, good things; education yields higher returns in advanced societies,
and more schooling probably makes workers more flexible and more adaptable to change.
But the problem with relying on education as the remedy for potential job losses is
that "other things" are not remotely close to equal. The critical divide in the future
may instead be between those types are work that are easily deliverable through a
wire (or via wireless connections) with little or no diminution in quality and those
that are not. And this unconventional divide does not correspond well to traditional
distinctions between jobs that require high levels of education and jobs that do not.
&lt;/p&gt;
&lt;p&gt;
A few disparate examples will illustrate just how complex--or, rather, how untraditional--the
new divide is. It is unlikely that the services of either taxi drivers or airline
pilots will ever be delivered electronically over long distances. The first is a "bad
job" with negligible educational requirements; the second is quite the reverse. On
the other hand, typing services (a low-skill job) and security analysis (a high-skill
job) are already being delivered electronically from India--albeit on a small scale
so far. Most physicians need not fear that their jobs will be moved offshore, but
radiologists are beginning to see this happening already. Police officers will not
be replaced by electronic monitoring, but some security guards will be. Janitors and
crane operators are probably immune to foreign competition; accountants and computer
programmers are not. In short, the dividing line between the jobs that produce services
that are suitable for electronic delivery (and are thus threatened by offshoring)
and those that do not does not correspond to traditional distinctions between high-end
and low-end work.
&lt;/p&gt;
&lt;/blockquote&gt; What's the implications here for somebody deep in our industry? Pay
close attention to Blinder's conclusion, that computer programmers are highly vulnerable
to foreign competition, based on the assumption that the product we deliver is easily
transferable across electronic media. But there is hope: &lt;blockquote&gt; 
&lt;p&gt;
There is currently not even a vocabulary, much less any systematic data, to help society
come to grips with the coming labor-market reality. So here is some suggested nomenclature.
Service that cannot be delivered electronically, or that are notably inferior when
so delivered, have one essential characteristic: personal, face-to-face contact is
either imperative or highly desirable. Think of hte waiter who serves you dinner,
the doctor you gives you your annual physical, or the cop on the beat. Now think of
any of those tasks being performed by robots controlled from India--not quite the
same. But such face-to-face human contact is not necessary in the relationship you
have with the telephone operator who arranges your conference call or the clerk who
takes your airline reservation over the phone. He or she may be in India already.
&lt;/p&gt;
&lt;p&gt;
The first group of tasks can be called personally-delivered services, or simply personal
services, and the second group of impersonally delivered services, or impersonal services.
In the brave new world of globalized electronic commerce, impersonal services have
more in common with manufactured goods that can be put in boxes than they do with
personal services. Thus, many impersonal services are destined to become tradable
and therefore vulnerable to offshoring. By contrast, most personal services have attributes
that cannot be transmitted through a wire. Some require face-to-face contact (child
care), some are inherently "high-risk" (nursing), some involve high levels of personal
trust (psychotherapy), and some depend on location-specific attributes (lobbying).
&lt;/p&gt;
&lt;/blockquote&gt; In other words, programmers that want to remain less vulnerable to foreign
competition need to find ways to stress the personal, face-to-face contact between
themselves and their clients, regardless of whether you are a full-time employee of
a company, a contractor, or a consultant (or part of a team of consultants) working
on a project for a client. Look for ways to maximize the four cardinalities he points
out: 
&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Face-to-face contact.&lt;/b&gt; Agile methodologies demand that customers be easily accessible
in order to answer questions regarding implementation decisions or to resolve lack
of understanding of the requirements. Instead of demanding customers be present at
your site, you may find yourself in a better position if you put yourself close to
your customers.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;"High-risk".&lt;/b&gt; This is a bit harder to do with software projects--either the
project is inherently high-risk in its makeup (perhaps this is a mission-critical
app that the company depends on, such as the e-commerce portal for an online e-tailer),
or it's not. There's not much you can do to change this, unless you are politically
savvy enough to "sell" your project to a group that would make it mission-critical.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;High levels of personal trust.&lt;/b&gt; This is actually easier than you might think--trust
in this case refers not to the privileged nature of therapist-patient communication,
but in the credibility the organization has in you to carry out the work required.
One way to build this trust is to understand the business domain of the client, rather
than remaining aloof and "staying focused on the technology". This trust-based approach
is already present in a variety of forms outside our industry--regardless of the statistical
ratings that might be available, most people find that they have a favorite auto repair
mechanic or shop not for any quantitatively-measurable reason, but beceause the mechanic
"understands" them somehow. The best customer-service shops understand this, and have
done so for years. The restaurant that recognizes me as a regular after just a few
visits and has my Diet Coke ready for me at my favorite table is far likelier to get
my business on a regular basis than the one that never does. Learn your customers,
learn their concerns, learn their business model and business plan, and get yourself
into the habit of trying to predict what they might need next--not so you can build
it already, but so that you can demonstrate to them that you understand &lt;i&gt;them&lt;/i&gt;,
and by extension, their needs.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Location-specific attributes.&lt;/b&gt; Sometimes, the software being built is localized
to a particular geographic area, and simply being in that same area can yield significant
benefits, particularly when heroic efforts are called for. (It's very hard to flip
the reset switch on a server in Indiana from a console in India, for example.) 
&lt;/li&gt;
&lt;/ul&gt;
In general, what you're looking to do is demonstrate how your value to the company
arises out of more than just your technical skill, but also some other qualities that
you can provide in better and more valuable form than somebody in India (or China,
or Brazil, or across the country for that matter, wherever the offshoring goes). It's
not a guarantee that you might still be offshored--some management folks will just
see bottom-line dollars and not recognize the intangible value-add that high levels
of personal trust or locality provides--but it'll minimize it on the whole.&gt;
&lt;p&gt;
But even if this analysis doesn't make you feel a little more comfortable, consider
this: there are 1 billion people in China alone, and close to the same in India. Instead
of seeing them as potential competition, imagine what happens when the wages from
the offshored jobs start to create a demand for goods and services in those countries--if
you think the software market in the U.S. was hot a decade ago, where only a half-billion
(across both the U.S. and Europe) people were demanding software, now think about
it when four &lt;i&gt;times&lt;/i&gt; that many start looking for it.
&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Footnotes
&lt;/h3&gt;
&lt;p&gt;
&lt;sup&gt;1&lt;/sup&gt; Which in of itself is an interesting statistic--it implies that offshoring
is far less prevalent than some of people worried about it believe it to be, including
me.
&lt;/p&gt;
&lt;p&gt;
&lt;sup&gt;2&lt;/sup&gt; Interesting bit of trivia--part of the reason that advantage shifted
was because the US stole (yes, stole, as in industrial espionage, one of the first
recorded cases of modern industrial espionage) the plans for modern textile machinery
from the UK. Remember that, next time you get upset at China's rather loose grip of
intellectual property law....
&lt;/p&gt;
&lt;p&gt;
&lt;sup&gt;3&lt;/sup&gt; Which, by the way, was a large part of the reason we fought the Civil
War (the "War Between the States" to some, or the "War of Northern Aggression" to
others)--the Carolinas depended on slave labor to pick their cotton cheaply, and couldn't
acquire Northern-made machinery cheaply to replace the slaves. Hence, for that (and
a lot of other reasons), war followed.
&lt;/p&gt;
&lt;p&gt;
&lt;sup&gt;4&lt;/sup&gt; An interesting argument--is there any real difference between transportation
and communications? One ships "stuff", the other "data", beyond that, is there any
difference?
&lt;/p&gt;
&lt;p&gt;
&lt;sup&gt;5&lt;/sup&gt; And, I'd like to point out, the shrinking environmental damage that can
arise from a manufacturing-based economy. Services rarely generate pollution, which
is part of the clash between the industrialized "Western" nations and the developing
"Southern" ones over environmental issues.
&lt;/p&gt;
&lt;h3&gt;Resources
&lt;/h3&gt;
&lt;p&gt;
&lt;i&gt;"Offshoring: The Next Industrial Revolutoin?"&lt;/i&gt;, by Alan S. Blinder, Foreign
Affairs (March/April 2006), pp 113 - 128.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=faec9013-cbab-4438-863b-4e155a76af8c" /&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,faec9013-cbab-4438-863b-4e155a76af8c.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=d99ad089-f96c-479f-9be1-77910ce4fa49</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,d99ad089-f96c-479f-9be1-77910ce4fa49.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,d99ad089-f96c-479f-9be1-77910ce4fa49.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d99ad089-f96c-479f-9be1-77910ce4fa49</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The <a href="http://www.tedneward.com">new home page</a> is alive and kicking...
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d99ad089-f96c-479f-9be1-77910ce4fa49" />
        <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>Check it out...</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,d99ad089-f96c-479f-9be1-77910ce4fa49.aspx</guid>
      <link>http://blogs.tedneward.com/2006/03/05/Check+It+Out.aspx</link>
      <pubDate>Sun, 05 Mar 2006 15:35:08 GMT</pubDate>
      <description>&lt;p&gt;
The &lt;a href="http://www.tedneward.com"&gt;new home page&lt;/a&gt; is alive and kicking...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=d99ad089-f96c-479f-9be1-77910ce4fa49" /&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,d99ad089-f96c-479f-9be1-77910ce4fa49.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=3541bd6b-c6c5-4d58-9481-92e37925cbed</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,3541bd6b-c6c5-4d58-9481-92e37925cbed.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,3541bd6b-c6c5-4d58-9481-92e37925cbed.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3541bd6b-c6c5-4d58-9481-92e37925cbed</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My father, whom I've often used (somewhat disparagingly...) as an example of the classic
"power user", meaning "he-thinks-he-knows-what-he's-doing-but-usually-ends-up-needing-me-to-fix-his-computer-afterwards"
(sorry Dad, but it's true...), often forwards me emails that turn out to be one hoax
or another. This time, though, he found a winner--he sent me <a href="http://www.snopes.com/crime/fraud/juryduty.asp" target="_blank">this
article</a>, warning against the latest caller identity scam: this time, they call
claiming to be clerks of the local court, threatening that because the victim hasn't
reported in for jury duty, arrest warrants have been issued. When the victim protests,
the "clerk" asks for confidential info to verify the records. Highly credible attack,
if you ask me.
</p>
        <p>
Net result (from the article): 
</p>
        <ul>
          <li>
            <font size="3">Court workers will not telephone to say you've missed jury duty or
that they are assembling juries and need to pre-screen those who might be selected
to serve on them, so dismiss as fraudulent phones call of this nature. About the only
time you would hear by telephone (rather than by mail) about anything having to do
with jury service would be <u>after</u> you have mailed back your completed questionnaire,
and even then only rarely. </font>
          </li>
          <li>
            <font size="3">Do not give out bank account, social security, or credit card numbers
over the phone if you didn't initiate the call, whether it be to someone trying to
sell you something or to someone who claims to be from a bank or government department.
If such callers insist upon "verifying" such information with you, have them read
the data to you from their notes, with you saying yea or nay to it rather than the
other way around. </font>
          </li>
          <li>
            <font size="3">Examine your credit card and bank account statements every month, keeping
an eye peeled for unauthorized charges. Immediately challenge items you did not approve. </font>
          </li>
        </ul>
In other words, don't assume the voice on the other end of the phone is actually who
they say they are. I think it's fairly reasonable to ask to speak to a supervisor
or ask for a phone # to call back on after you've "assembled the appropriate records"
and what-not. Who knows? Some scammers might even be dumb enough to give you the phone
# back, and then it's "Hello, Police...?", baby....
<p>
Remember, it's always acceptable to ask for verification of THEIR identity if they're
asking for confidential information. And most credible organizations are taking great
pains to not ask for that information over the phone in the first place. Practice
the same discretion over the phone that you would over IM or email; the phone can
be just as anonymous as the Internet can.
</p><img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=3541bd6b-c6c5-4d58-9481-92e37925cbed" /><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>Don't fall prey to the latest social engineering attack</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,3541bd6b-c6c5-4d58-9481-92e37925cbed.aspx</guid>
      <link>http://blogs.tedneward.com/2006/03/04/Dont+Fall+Prey+To+The+Latest+Social+Engineering+Attack.aspx</link>
      <pubDate>Sat, 04 Mar 2006 06:00:57 GMT</pubDate>
      <description>&lt;p&gt;
My father, whom I've often used (somewhat disparagingly...) as an example of the classic
"power user", meaning "he-thinks-he-knows-what-he's-doing-but-usually-ends-up-needing-me-to-fix-his-computer-afterwards"
(sorry Dad, but it's true...), often forwards me emails that turn out to be one hoax
or another. This time, though, he found a winner--he sent me &lt;a href="http://www.snopes.com/crime/fraud/juryduty.asp" target="_blank"&gt;this
article&lt;/a&gt;, warning against the latest caller identity scam: this time, they call
claiming to be clerks of the local court, threatening that because the victim hasn't
reported in for jury duty, arrest warrants have been issued. When the victim protests,
the "clerk" asks for confidential info to verify the records. Highly credible attack,
if you ask me.
&lt;/p&gt;
&lt;p&gt;
Net result (from the article): 
&lt;ul&gt;
&lt;li&gt;
&lt;font size=3&gt;Court workers will not telephone to say you've missed jury duty or that
they are assembling juries and need to pre-screen those who might be selected to serve
on them, so dismiss as fraudulent phones call of this nature. About the only time
you would hear by telephone (rather than by mail) about anything having to do with
jury service would be &lt;u&gt;after&lt;/u&gt; you have mailed back your completed questionnaire,
and even then only rarely. &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Do not give out bank account, social security, or credit card numbers
over the phone if you didn't initiate the call, whether it be to someone trying to
sell you something or to someone who claims to be from a bank or government department.
If such callers insist upon "verifying" such information with you, have them read
the data to you from their notes, with you saying yea or nay to it rather than the
other way around. &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Examine your credit card and bank account statements every month, keeping
an eye peeled for unauthorized charges. Immediately challenge items you did not approve. &lt;/font&gt;
&lt;/li&gt;
&lt;/ul&gt;
In other words, don't assume the voice on the other end of the phone is actually who
they say they are. I think it's fairly reasonable to ask to speak to a supervisor
or ask for a phone # to call back on after you've "assembled the appropriate records"
and what-not. Who knows? Some scammers might even be dumb enough to give you the phone
# back, and then it's "Hello, Police...?", baby....&gt;
&lt;p&gt;
Remember, it's always acceptable to ask for verification of THEIR identity if they're
asking for confidential information. And most credible organizations are taking great
pains to not ask for that information over the phone in the first place. Practice
the same discretion over the phone that you would over IM or email; the phone can
be just as anonymous as the Internet can.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=3541bd6b-c6c5-4d58-9481-92e37925cbed" /&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,3541bd6b-c6c5-4d58-9481-92e37925cbed.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49</wfw:commentRss>
      <slash:comments>97</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In keeping with the tradition, I'm suggesting the following will take place for 2006: 
</p>
        <ol>
          <li>
The hype surrounding Ajax will slowly fade, as people come to realize that there's
really nothing new here, just that DHTML is cool again. As <a href="http://www.almaer.com/blog/archives/001122.html" target="_blank">Dion
points out</a>, Ajax will become a toolbox that you use in web development without
thinking that "I am doing Ajax". Just as we don't think about "doing HTML" vs "doing
DOM".</li>
          <li>
The release of EJB 3 may actually start people thinking about EJB again, but hopefully
this time in a more pragmatic and less hype-driven fashion. (Yes, EJB does have its
place in the world, folks--it's just a much smaller place than most of the EJB vendors
and book authors wanted it to be.)</li>
          <li>
Vista will be slipped to 2007, despite Microsoft's best efforts. In the meantime,
however, WinFX (which is effectively .NET 3.0) will ship, and people will discover
that Workflow (WWF) is by far the more interesting of the WPF/WCF/WWF triplet. Notice
that I don't say "powerful" or "important", but "interesting".</li>
          <li>
Scripting languages will hit their peak interest period in 2006; Ruby conversions
will be at its apogee, and its likely that somewhere in the latter half of 2006 we'll
hear about the first major Ruby project failure, most likely from a large consulting
firm that tries to duplicate the success of Ruby's evangelists (Dave Thomas, David
Geary, and the other Rubyists I know of from the NFJS tour) by throwing Ruby at a
project without really understanding it. In other words, same story, different technology,
same result. By 2007 the Ruby Backlash will have begun.</li>
          <li>
Interest in building languages that somehow bridge the gap between static and dynamic
languages will start to grow, most likely beginning with E4X, the variant of ECMAScript
(Javascript to those of you unfamiliar with the standards) that integrates XML into
the language.</li>
          <li>
Java developers will start gaining interest in building rich Java apps again. (Freely
admit, this is a long shot, but the work being done by the Swing researchers at Sun,
not least of which is Romain Guy, will by the middle of 2006 probably be ready for
prime-time consumption, and there's some seriously interesting sh*t in there.)</li>
          <li>
Somebody at Microsoft starts seriously hammering on the CLR team to support continuations.
Talk emerges about supporting it in the 4.0 (post-WinFX) release.</li>
          <li>
            <i>Effective Java</i> (2nd Edition) will ship. (Hardly a difficult prediction to make--Josh
said as much in the Javapolis interview I did with him and Neal Gafter.)</li>
          <li>
            <i>Effective .NET</i> will ship.</li>
          <li>
            <i>Pragmatic XML Services</i> will ship.</li>
          <li>
JDK 6 will ship, and a good chunk of the Java community self-proclaimed experts and
cognoscente will claim it sucks.</li>
          <li>
Java developers will seriously begin to talk about what changes we want/need to Java
for JDK 7 ("Dolphin"). Lots of ideas will be put forth. Hopefully most will be shot
down. With any luck, Joshua Bloch and Neal Gafter will still be involved in the process,
and will keep tight rein on the more... aggressive... ideas and turn them into useful
things that won't break the spirit of the platform.</li>
          <li>
My long-shot hope, rather than prediction, for 2006: Sun comes to realize that the
Java platform isn't about the <i>language</i>, but the <i>platform</i>, and begin
to give serious credence and hope behind a multi-linguistic JVM ecosystem.</li>
          <li>
My long-shot dream: JBoss goes out of business, the JBoss source code goes back to
being maintained by developers whose principal interest is in maintaining open-source
projects rather than making money, and it all gets folded together with what the Geronimo
folks are doing. In other words, the open-source community stops the infighting and
starts pulling oars in the same direction at the same time. For once.</li>
        </ol>
Flame away....
<img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49" /><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>2006 Tech Predictions</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49.aspx</guid>
      <link>http://blogs.tedneward.com/2006/01/01/2006+Tech+Predictions.aspx</link>
      <pubDate>Sun, 01 Jan 2006 08:25:56 GMT</pubDate>
      <description>&lt;p&gt;
In keeping with the tradition, I'm suggesting the following will take place for 2006: 
&lt;ol&gt;
&lt;li&gt;
The hype surrounding Ajax will slowly fade, as people come to realize that there's
really nothing new here, just that DHTML is cool again. As &lt;a href="http://www.almaer.com/blog/archives/001122.html" target="_blank"&gt;Dion
points out&lt;/a&gt;, Ajax will become a toolbox that you use in web development without
thinking that "I am doing Ajax". Just as we don't think about "doing HTML" vs "doing
DOM".&lt;/li&gt;
&lt;li&gt;
The release of EJB 3 may actually start people thinking about EJB again, but hopefully
this time in a more pragmatic and less hype-driven fashion. (Yes, EJB does have its
place in the world, folks--it's just a much smaller place than most of the EJB vendors
and book authors wanted it to be.)&lt;/li&gt;
&lt;li&gt;
Vista will be slipped to 2007, despite Microsoft's best efforts. In the meantime,
however, WinFX (which is effectively .NET 3.0) will ship, and people will discover
that Workflow (WWF) is by far the more interesting of the WPF/WCF/WWF triplet. Notice
that I don't say "powerful" or "important", but "interesting".&lt;/li&gt;
&lt;li&gt;
Scripting languages will hit their peak interest period in 2006; Ruby conversions
will be at its apogee, and its likely that somewhere in the latter half of 2006 we'll
hear about the first major Ruby project failure, most likely from a large consulting
firm that tries to duplicate the success of Ruby's evangelists (Dave Thomas, David
Geary, and the other Rubyists I know of from the NFJS tour) by throwing Ruby at a
project without really understanding it. In other words, same story, different technology,
same result. By 2007 the Ruby Backlash will have begun.&lt;/li&gt;
&lt;li&gt;
Interest in building languages that somehow bridge the gap between static and dynamic
languages will start to grow, most likely beginning with E4X, the variant of ECMAScript
(Javascript to those of you unfamiliar with the standards) that integrates XML into
the language.&lt;/li&gt;
&lt;li&gt;
Java developers will start gaining interest in building rich Java apps again. (Freely
admit, this is a long shot, but the work being done by the Swing researchers at Sun,
not least of which is Romain Guy, will by the middle of 2006 probably be ready for
prime-time consumption, and there's some seriously interesting sh*t in there.)&lt;/li&gt;
&lt;li&gt;
Somebody at Microsoft starts seriously hammering on the CLR team to support continuations.
Talk emerges about supporting it in the 4.0 (post-WinFX) release.&lt;/li&gt;
&lt;li&gt;
&lt;i&gt;Effective Java&lt;/i&gt; (2nd Edition) will ship. (Hardly a difficult prediction to make--Josh
said as much in the Javapolis interview I did with him and Neal Gafter.)&lt;/li&gt;
&lt;li&gt;
&lt;i&gt;Effective .NET&lt;/i&gt; will ship.&lt;/li&gt;
&lt;li&gt;
&lt;i&gt;Pragmatic XML Services&lt;/i&gt; will ship.&lt;/li&gt;
&lt;li&gt;
JDK 6 will ship, and a good chunk of the Java community self-proclaimed experts and
cognoscente will claim it sucks.&lt;/li&gt;
&lt;li&gt;
Java developers will seriously begin to talk about what changes we want/need to Java
for JDK 7 ("Dolphin"). Lots of ideas will be put forth. Hopefully most will be shot
down. With any luck, Joshua Bloch and Neal Gafter will still be involved in the process,
and will keep tight rein on the more... aggressive... ideas and turn them into useful
things that won't break the spirit of the platform.&lt;/li&gt;
&lt;li&gt;
My long-shot hope, rather than prediction, for 2006: Sun comes to realize that the
Java platform isn't about the &lt;i&gt;language&lt;/i&gt;, but the &lt;i&gt;platform&lt;/i&gt;, and begin
to give serious credence and hope behind a multi-linguistic JVM ecosystem.&lt;/li&gt;
&lt;li&gt;
My long-shot dream: JBoss goes out of business, the JBoss source code goes back to
being maintained by developers whose principal interest is in maintaining open-source
projects rather than making money, and it all gets folded together with what the Geronimo
folks are doing. In other words, the open-source community stops the infighting and
starts pulling oars in the same direction at the same time. For once.&lt;/li&gt;
&lt;/ol&gt;
Flame away....&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49" /&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,771ab347-c3ba-4a0a-b5ed-cd4dd7b73d49.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Ruby</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf</wfw:commentRss>
      <slash:comments>19</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://weblogs.asp.net/mdavey/archive/2005/10/26/428610.aspx" target="_blank">Matt
Davey poses an interesting question</a>: 
</p>
        <blockquote>
          <font size="3">The problem:</font>
          <br />
          <ul>
            <li>
              <font size="3">C++ Corba legacy codebase (5+ years old, 1 million lines) </font>
            </li>
            <li>
              <font size="3">No unit tests </font>
            </li>
            <li>
              <font size="3">Little test data </font>
            </li>
            <li>
              <font size="3">Limited knowledge transfer from the original development team. </font>
            </li>
            <li>
              <font size="3">A flake environment to run the application in.</font>
            </li>
          </ul>
          <font size="3">The requirement:</font>
          <br />
          <ul>
            <li>
              <font size="3">Port the C++ result accumulation and session management code to Java</font>
            </li>
          </ul>
          <font size="3">Do you: </font>
          <br />
          <ol>
            <li>
              <font size="3">Write C+ unit tests to understand the current system, then write Java
equivalent code using TDD </font>
            </li>
            <li>
              <font size="3">Write Java tests using TDD based on your understanding of the C++ code </font>
            </li>
            <li>
              <font size="3">Hope you understand the C++ code, and </font>
              <font color="#0000FF" size="3">
                <u>JFDI</u>
              </font>
              <font size="3"> in
Java </font>
            </li>
            <li>
              <font size="3">Give up and go home </font>
            </li>
            <li>
              <font size="3">Get the original development team to do the work</font>
            </li>
          </ol>
        </blockquote> Ah, I love the smell of legacy code in the morning. :-)
<p>
My answer: depends. (Typical.) Here's what I mean: 
</p><ul><li>
Option 1 is clearly the "best" answer if the goal is to produce code that will most
accurately match what the current C++ code is doing, but also represents the greatest
time and energy commitment, as well as making the fundamental assumption that what
the C++ code does today is correct in the first place.</li><li>
Option 2 is the approach to take if the time crunch is a bit tighter and/or if the
C++ unit tests can't be sold to management ("You're just going to throw them away
anyway!"), particularly if the team working on the port has many or all of the original
C++ devs. It also allows for the inevitable "You know, we always wanted to change
how that code worked, so why don't we...." requirements changes.</li><li>
Option 3 is probably appropriate in those shops where WHISKEY (Why the Hell Isn't
Somebody Koding Everything Yet) is considered an acceptable development methodology,
but the lack of unit tests for the Java port will catch up to you someday (as it always
does).</li><li>
Option 4 is probably best if the company you work for is seriously considering Option
3. :-)</li><li>
Option 5 is only viable if the original development team is available (not going to
happen if you outsourced it, by the way), able to work on it (meaning they've flipped
the switch to Java at <i>both</i> a syntactic and semantic level), and isn't otherwise
engaged on another project (which is probably the dealbreaker).</li></ul>
Matt also left out a few options: 
<ul><li>
6. Let management believe in the whizzy-bang code conversion wizard that such-and-such
company is trying to sell them on that "guarantees" 99% code translation and compatibility</li><li>
7. Let management outsource the port, and let <i>them</i> worry about it</li><li>
8. Give it all up and start from scratch--who needs that system anyway? It's not like
anybody ever really <i>used</i> it, right?</li></ul><p>
Porting legacy code is one of the least-favorite projects of any software developer,
but what few developers seem to realize is that they're also the least-favorite of
management, too: it's a project that has no discernible ROI beyond that of "getting
us out of the Stone Age". You might argue that the code becomes more maintainable
if it's written in whatever-the-latest-technology-flavor-is-today, but the truth of
the matter is, today's hot language is tomorrow's legacy language, subject to being
rewritten in tommorrow's hot language. (Any programmer who's been writing code for
more than five years probably already knows this, and any programmer who's been writing
code for more than 10 years almost certainly knows this.)
</p><p>
Companies have been on this hamster wheel for far too long. Having gone through several
transitions, particularly the C++-to-COM/CORBA-to-Java/EJB transitions over the last
decade--and they're starting to resist if not outright reject the idea. Instead, they're
preferring to find ways to create interoperable solutions rather than ported solutions--hence
the huge interest in Web services when they first came out (and the interest in CORBA
when it first came out, and the interest in middleware products in general like Tuxedo
when they first came out, and so on). Integration still remains the "hard problem"
of our industry, one that none of the new languages or platforms seem to want to address
until they have to. Witness, for example, Sun's reluctance to really adopt any sort
of external-facing technology into Java until they had to (meaning the Java Connector
Architecture; their adoption of CORBA was half-hearted at best and a PR move at worst).
.NET suffers the same problem, though fortunately Microsoft was wise enogh to realize
that shipping .NET without a good Win32/COM interop story was going to kill it before
it left the gate. C++ at least had the advantage of being call-compatible with C (if
you declared the prototypes correctly), and so could automatically interop against
the operating system's libraries pretty easily. In fact, it could be argued that C
has long been the de-facto call-level compatibility interoperability standard (Python
has C bindings, Ruby has C bindings, Java reluctantly, it seems, support C bindings
through JNI, and so on), but of course that only works to a given platform/OS, since
C offers so little by way of standardization and the operating systems have never
been able to create a portable OS layer beyond the simple stuff; POSIX was arguably
the closest they came, and many's the POSIX programmer who will tell you just how
successful THAT was.
</p><p>
My point? I hereby declare a rule that any new language developed should think <i>first</i> about
its interoperability bindings, and developers contemplating the adoption of a new
language must flesh out, in concrete form, how they will integrate the hot new language
into their existing architecture, or else they can't use it. (Yes, this applies equally
to Ruby, Java, .NET, C++, and all the rest, even FORTRAN--no exceptions.) If you can't
describe how it'll integrate into your current stuff, then you're just fascinated
with the bright shiny new toy and need to grow up. It doesn't really matter to me <i>how</i> it
integrates--through a database, through files on a filesystem, through a message-passing
interface like JMS, or through a call-level interface, just have SOME kind of plan
for hooking your new &lt;technology X&gt; project into the rest of the enterprise.
(And yes, those answers are there for each of those languages/platforms; the test
is not whether such answers exist, but how they map into <i>your</i> existing infrastructure.)
</p><p>
What's more, I hereby rededicate this blog to finding interoperabilty solutions across
the technology spectrum--got an interop problem you're not sure how to solve? Email
me and (with your permission) I'll post the response--sort of an "Ann Landers" for
interop geeks. :-)
</p><p>
By the way, this conundrum can be genericized pretty easily using generics/templates: 
</p><blockquote><pre>
enum Q
{
  No, Bad, Little, Flakey, Untouchable
};
enum technology
{
  C, C++, Java, C#, C++/CLI, VB 6, VB 7, VB 8, FORTRAN, COBOL, Smalltalk, Lisp, ...
};

Problem&lt;technology X, technology Y, type T extends AbstractTest, enum Q&gt;:
{

<ul><li>
&lt;X&gt; legacy codebase (&lt;int N where N &gt; 1&gt; years old, &lt;int L where L
&gt; 1000&gt; lines)</li><li>
No &lt;type T&gt; tests</li><li>
&lt;Q&gt; test data</li><li>
&lt;Q&gt; knowledge transfer from the original development team</li><li>
&lt;Q&gt; environment to run the application in.</li></ul>
} returning requirement: 
<ul><li>
Port the &lt;X&gt; project to &lt;Y&gt;</li></ul></pre></blockquote> (I thought about doing it in Schema, but this seemed geekier... and
easier, given all the angle-brackets XSD would require. ;-) )
<img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf" /><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>Porting legacy code</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf.aspx</guid>
      <link>http://blogs.tedneward.com/2005/10/30/Porting+Legacy+Code.aspx</link>
      <pubDate>Sun, 30 Oct 2005 20:17:33 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://weblogs.asp.net/mdavey/archive/2005/10/26/428610.aspx" target="_blank"&gt;Matt
Davey poses an interesting question&lt;/a&gt;: &lt;blockquote&gt; &lt;font size=3&gt;The problem:&lt;/font&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;font size=3&gt;C++ Corba legacy codebase (5+ years old, 1 million lines) &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;No unit tests &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Little test data &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Limited knowledge transfer from the original development team. &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;A flake environment to run the application in.&lt;/font&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;font size=3&gt;The requirement:&lt;/font&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;font size=3&gt;Port the C++ result accumulation and session management code to Java&lt;/font&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;font size=3&gt;Do you: &lt;/font&gt;
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;font size=3&gt;Write C+ unit tests to understand the current system, then write Java
equivalent code using TDD &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Write Java tests using TDD based on your understanding of the C++ code &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Hope you understand the C++ code, and &lt;/font&gt;&lt;font color="#0000FF" size=3&gt;&lt;u&gt;JFDI&lt;/u&gt;&lt;/font&gt;&lt;font size=3&gt; in
Java &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Give up and go home &lt;/font&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;font size=3&gt;Get the original development team to do the work&lt;/font&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt; Ah, I love the smell of legacy code in the morning. :-)&gt;
&lt;p&gt;
My answer: depends. (Typical.) Here's what I mean: 
&lt;ul&gt;
&lt;li&gt;
Option 1 is clearly the "best" answer if the goal is to produce code that will most
accurately match what the current C++ code is doing, but also represents the greatest
time and energy commitment, as well as making the fundamental assumption that what
the C++ code does today is correct in the first place.&lt;/li&gt;
&lt;li&gt;
Option 2 is the approach to take if the time crunch is a bit tighter and/or if the
C++ unit tests can't be sold to management ("You're just going to throw them away
anyway!"), particularly if the team working on the port has many or all of the original
C++ devs. It also allows for the inevitable "You know, we always wanted to change
how that code worked, so why don't we...." requirements changes.&lt;/li&gt;
&lt;li&gt;
Option 3 is probably appropriate in those shops where WHISKEY (Why the Hell Isn't
Somebody Koding Everything Yet) is considered an acceptable development methodology,
but the lack of unit tests for the Java port will catch up to you someday (as it always
does).&lt;/li&gt;
&lt;li&gt;
Option 4 is probably best if the company you work for is seriously considering Option
3. :-)&lt;/li&gt;
&lt;li&gt;
Option 5 is only viable if the original development team is available (not going to
happen if you outsourced it, by the way), able to work on it (meaning they've flipped
the switch to Java at &lt;i&gt;both&lt;/i&gt; a syntactic and semantic level), and isn't otherwise
engaged on another project (which is probably the dealbreaker).&lt;/li&gt;
&lt;/ul&gt;
Matt also left out a few options: 
&lt;ul&gt;
&lt;li&gt;
6. Let management believe in the whizzy-bang code conversion wizard that such-and-such
company is trying to sell them on that "guarantees" 99% code translation and compatibility&lt;/li&gt;
&lt;li&gt;
7. Let management outsource the port, and let &lt;i&gt;them&lt;/i&gt; worry about it&lt;/li&gt;
&lt;li&gt;
8. Give it all up and start from scratch--who needs that system anyway? It's not like
anybody ever really &lt;i&gt;used&lt;/i&gt; it, right?&lt;/li&gt;
&lt;/ul&gt;
&gt;
&lt;p&gt;
Porting legacy code is one of the least-favorite projects of any software developer,
but what few developers seem to realize is that they're also the least-favorite of
management, too: it's a project that has no discernible ROI beyond that of "getting
us out of the Stone Age". You might argue that the code becomes more maintainable
if it's written in whatever-the-latest-technology-flavor-is-today, but the truth of
the matter is, today's hot language is tomorrow's legacy language, subject to being
rewritten in tommorrow's hot language. (Any programmer who's been writing code for
more than five years probably already knows this, and any programmer who's been writing
code for more than 10 years almost certainly knows this.)
&lt;/p&gt;
&lt;p&gt;
Companies have been on this hamster wheel for far too long. Having gone through several
transitions, particularly the C++-to-COM/CORBA-to-Java/EJB transitions over the last
decade--and they're starting to resist if not outright reject the idea. Instead, they're
preferring to find ways to create interoperable solutions rather than ported solutions--hence
the huge interest in Web services when they first came out (and the interest in CORBA
when it first came out, and the interest in middleware products in general like Tuxedo
when they first came out, and so on). Integration still remains the "hard problem"
of our industry, one that none of the new languages or platforms seem to want to address
until they have to. Witness, for example, Sun's reluctance to really adopt any sort
of external-facing technology into Java until they had to (meaning the Java Connector
Architecture; their adoption of CORBA was half-hearted at best and a PR move at worst).
.NET suffers the same problem, though fortunately Microsoft was wise enogh to realize
that shipping .NET without a good Win32/COM interop story was going to kill it before
it left the gate. C++ at least had the advantage of being call-compatible with C (if
you declared the prototypes correctly), and so could automatically interop against
the operating system's libraries pretty easily. In fact, it could be argued that C
has long been the de-facto call-level compatibility interoperability standard (Python
has C bindings, Ruby has C bindings, Java reluctantly, it seems, support C bindings
through JNI, and so on), but of course that only works to a given platform/OS, since
C offers so little by way of standardization and the operating systems have never
been able to create a portable OS layer beyond the simple stuff; POSIX was arguably
the closest they came, and many's the POSIX programmer who will tell you just how
successful THAT was.
&lt;/p&gt;
&lt;p&gt;
My point? I hereby declare a rule that any new language developed should think &lt;i&gt;first&lt;/i&gt; about
its interoperability bindings, and developers contemplating the adoption of a new
language must flesh out, in concrete form, how they will integrate the hot new language
into their existing architecture, or else they can't use it. (Yes, this applies equally
to Ruby, Java, .NET, C++, and all the rest, even FORTRAN--no exceptions.) If you can't
describe how it'll integrate into your current stuff, then you're just fascinated
with the bright shiny new toy and need to grow up. It doesn't really matter to me &lt;i&gt;how&lt;/i&gt; it
integrates--through a database, through files on a filesystem, through a message-passing
interface like JMS, or through a call-level interface, just have SOME kind of plan
for hooking your new &amp;lt;technology X&amp;gt; project into the rest of the enterprise.
(And yes, those answers are there for each of those languages/platforms; the test
is not whether such answers exist, but how they map into &lt;i&gt;your&lt;/i&gt; existing infrastructure.)
&lt;/p&gt;
&lt;p&gt;
What's more, I hereby rededicate this blog to finding interoperabilty solutions across
the technology spectrum--got an interop problem you're not sure how to solve? Email
me and (with your permission) I'll post the response--sort of an "Ann Landers" for
interop geeks. :-)
&lt;/p&gt;
&lt;p&gt;
By the way, this conundrum can be genericized pretty easily using generics/templates: &lt;blockquote&gt; &lt;pre&gt;
enum Q
{
  No, Bad, Little, Flakey, Untouchable
};
enum technology
{
  C, C++, Java, C#, C++/CLI, VB 6, VB 7, VB 8, FORTRAN, COBOL, Smalltalk, Lisp, ...
};

Problem&amp;lt;technology X, technology Y, type T extends AbstractTest, enum Q&amp;gt;:
{

&lt;ul&gt;
&lt;li&gt;
&amp;lt;X&amp;gt; legacy codebase (&amp;lt;int N where N &gt; 1&amp;gt; years old, &amp;lt;int L where L
&gt; 1000&amp;gt; lines)&lt;/li&gt;
&lt;li&gt;
No &amp;lt;type T&amp;gt; tests&lt;/li&gt;
&lt;li&gt;
&amp;lt;Q&amp;gt; test data&lt;/li&gt;
&lt;li&gt;
&amp;lt;Q&amp;gt; knowledge transfer from the original development team&lt;/li&gt;
&lt;li&gt;
&amp;lt;Q&amp;gt; environment to run the application in.&lt;/li&gt;
&lt;/ul&gt;
} returning requirement: 
&lt;ul&gt;
&lt;li&gt;
Port the &amp;lt;X&amp;gt; project to &amp;lt;Y&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/pre&gt;
&lt;/blockquote&gt; (I thought about doing it in Schema, but this seemed geekier... and
easier, given all the angle-brackets XSD would require. ;-) )&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf" /&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,c62e0fc1-1fd3-41c5-baf7-bc6094a87ecf.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Development Processes</category>
      <category>Java/J2EE</category>
      <category>Ruby</category>
      <category>XML Services</category>
    </item>
  </channel>
</rss>