<?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 - Security</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=0e5b971c-8dd4-48ef-b47c-b9b0611607dd</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,0e5b971c-8dd4-48ef-b47c-b9b0611607dd.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,0e5b971c-8dd4-48ef-b47c-b9b0611607dd.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=0e5b971c-8dd4-48ef-b47c-b9b0611607dd</wfw:commentRss>
      <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>
This one is from the <a href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=3&amp;page=show_problem&amp;problem=37" target="_blank">UVa
online programming contest judge system</a>, which I discovered after picking up the
book <em>Programming Challenges</em>, which is highly recommended as a source of code
katas, by the way. Much of the advice parts of the book can be skimmed or ignored
by the long-time professional developer, but it's still worth a read, since it can
be an interesting source of ideas and approaches when solving real-world scenarios.
</p>
        <p>
 
</p>
        <p>
          <strong>Problem:</strong> You work for a manufacturing company, and they have just
received their newest piece of super-modern hardware, a highly efficient assembly-line
mechanized pneumatic item manipulator, also known in some circles as a "robotic
arm". It is driven by a series of commands, and your job is to write the software
to drive the arm. The initial test will be to have the arm move a series of blocks
around.
</p>
        <p>
 
</p>
        <p>
          <strong>Context:</strong> The test begins with <em>n</em> number of blocks, laid out
sequentially next to each other, each block with a number on it. (You may safely assume
that <em>n</em> never exceeds 25.) So, if <em>n</em> is 4, then the blocks are laid
out (starting from 0) as:
</p>
        <blockquote>
          <p>
0: 0
</p>
          <p>
1: 1
</p>
          <p>
2: 2
</p>
          <p>
3: 3
</p>
        </blockquote>
        <p>
The display output here is the block-numbered "slot", then a colon, then
the block(s) that are stacked in that slot, lowest to highest in left to right order.
Thus, in the following display:
</p>
        <blockquote>
          <p>
0:
</p>
          <p>
1:
</p>
          <p>
2: 0 1 2 3
</p>
          <p>
3:
</p>
        </blockquote>
        <p>
The 3 block is stacked on top of the 2 block is stacked on top of the 1 block is stacked
on top of the 0 block, all in slot 2. This can be shortened to the representation
[0:, 1:, 2: 0 1 2 3, 3:] for conciseness.
</p>
        <p>
 
</p>
        <p>
The arm understands a number of different commands, as well as an optic sensor. (Yeah,
the guys who created the arm were good enough to write code that knows how to read
the number off a block, but not to actually drive the arm. Go figure.) The commands
are as follows, where <em>a</em> and <em>b</em> are valid block numbers (meaning they
are between 0 and <em>n</em>-1):
</p>
        <ul>
          <li>
"move <em>a</em> onto <em>b</em>" This command orders the arm to find block <em>a</em>,
and return any blocks stacked on top of it to their original position. Do the same
for block <em>b</em>, then stack block <em>a</em> on top of <em>b</em>.</li>
          <li>
"move <em>a</em> over <em>b</em>" This command orders the arm to find block <em>a</em>,
and return any blocks stacked on top of it to their original position. Then stack
block <em>a</em> on top of the stack of blocks containing <em>b</em>.</li>
          <li>
"pile <em>a</em> onto <em>b</em>" This command orders the arm to find the
stack of blocks containing block <em>b</em>, and return any blocks stacked on top
of it to their original position. Then the arm must find the stack of blocks containing
block <em>a</em>, and take the stack of blocks starting from <em>a</em> on upwards
(in other words, don't do anything with any blocks on top of <em>a</em>) and put that
stack on top of block <em>b</em>.</li>
          <li>
"pile <em>a</em> over <em>b</em>" This command orders the arm to find the
stack of blocks containing block <em>a</em> and take the stack of blocks starting
from <em>a</em> on upwards (in other words, don't do anything with any blocks on top
of <em>a</em>) and put that stack on top of the stack of blocks containing block <em>b</em> (in
other words, don't do anything with the stack of blocks containing <em>b</em>, either).</li>
          <li>
"quit" This command tells the arm to shut down (and thus terminates the
simulation).</li>
        </ul>
        <p>
Note that if the input command sequence accidentally offers a command where <em>a</em> and <em>b</em> are
the same value, that command is illegal and should be ignored.
</p>
        <p>
 
</p>
        <p>
As an example, then, if we have 4 blocks in the state [0: 0, 1: 1, 2: 2, 3: 3], and
run a "move 2 onto 3", we get [0: 0, 1: 1, 2:, 3: 3 2]. If we then run a
"pile 3 over 1", we should end up with [0: 0, 1: 1 3 2, 2:, 3:]. And so
on.
</p>
        <p>
 
</p>
        <p>
          <strong>Input:</strong> n = 10. Run these commands:
</p>
        <ol>
          <li>
move 9 onto 1</li>
          <li>
move 8 over 1</li>
          <li>
move 7 over 1</li>
          <li>
move 6 over 1</li>
          <li>
pile 8 over 6</li>
          <li>
pile 8 over 5</li>
          <li>
move 2 over 1</li>
          <li>
move 4 over 9</li>
          <li>
quit</li>
        </ol>
        <p>
The result should be [0: 0, 1: 1 9 2 4, 2:, 3: 3, 4:, 5: 5 8 7 6, 6:, 7:, 8:, 9:]
</p>
        <p>
 
</p>
        <p>
          <strong>Challenges:</strong>
        </p>
        <ul>
          <li>
Implement the Towers of Hanoi (or as close to it as you can get) using this system.</li>
          <li>
Add an optimizer to the arm, in essence reading in the entire program (up to "quit"),
finding shorter paths and/or different commands to achieve the same result.</li>
          <li>
Add a visual component to the simulation, displaying the arm as it moves over each
block and moves blocks around.</li>
          <li>
Add another robotic arm, and allow commands to be given simultaneously. This will
require some thought—does each arm execute a complete command before allowing the
other arm to execute (which reduces the performance having two arms might offer),
or can each arm act entirely independently? The two (or more) arms will probably need
separate command streams, but you might try running them with one command stream just
for grins. Note that deciding how to synchronized the arms so they don't conflict
with one another will probably require adding some kind of synchronization instructions
into the stream as well.</li>
        </ul>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0e5b971c-8dd4-48ef-b47c-b9b0611607dd" />
        <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: RoboStack</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,0e5b971c-8dd4-48ef-b47c-b9b0611607dd.aspx</guid>
      <link>http://blogs.tedneward.com/2010/05/10/Code+Kata+RoboStack.aspx</link>
      <pubDate>Mon, 10 May 2010 07:01:36 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;
This one is from the &lt;a href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;amp;Itemid=8&amp;amp;category=3&amp;amp;page=show_problem&amp;amp;problem=37" target="_blank"&gt;UVa
online programming contest judge system&lt;/a&gt;, which I discovered after picking up the
book &lt;em&gt;Programming Challenges&lt;/em&gt;, which is highly recommended as a source of code
katas, by the way. Much of the advice parts of the book can be skimmed or ignored
by the long-time professional developer, but it's still worth a read, since it can
be an interesting source of ideas and approaches when solving real-world scenarios.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Problem:&lt;/strong&gt; You work for a manufacturing company, and they have just
received their newest piece of super-modern hardware, a highly efficient assembly-line
mechanized pneumatic item manipulator, also known in some circles as a &amp;quot;robotic
arm&amp;quot;. It is driven by a series of commands, and your job is to write the software
to drive the arm. The initial test will be to have the arm move a series of blocks
around.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Context:&lt;/strong&gt; The test begins with &lt;em&gt;n&lt;/em&gt; number of blocks, laid out
sequentially next to each other, each block with a number on it. (You may safely assume
that &lt;em&gt;n&lt;/em&gt; never exceeds 25.) So, if &lt;em&gt;n&lt;/em&gt; is 4, then the blocks are laid
out (starting from 0) as:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
0: 0
&lt;/p&gt;
&lt;p&gt;
1: 1
&lt;/p&gt;
&lt;p&gt;
2: 2
&lt;/p&gt;
&lt;p&gt;
3: 3
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The display output here is the block-numbered &amp;quot;slot&amp;quot;, then a colon, then
the block(s) that are stacked in that slot, lowest to highest in left to right order.
Thus, in the following display:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
0:
&lt;/p&gt;
&lt;p&gt;
1:
&lt;/p&gt;
&lt;p&gt;
2: 0 1 2 3
&lt;/p&gt;
&lt;p&gt;
3:
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The 3 block is stacked on top of the 2 block is stacked on top of the 1 block is stacked
on top of the 0 block, all in slot 2. This can be shortened to the representation
[0:, 1:, 2: 0 1 2 3, 3:] for conciseness.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
The arm understands a number of different commands, as well as an optic sensor. (Yeah,
the guys who created the arm were good enough to write code that knows how to read
the number off a block, but not to actually drive the arm. Go figure.) The commands
are as follows, where &lt;em&gt;a&lt;/em&gt; and &lt;em&gt;b&lt;/em&gt; are valid block numbers (meaning they
are between 0 and &lt;em&gt;n&lt;/em&gt;-1):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&amp;quot;move &lt;em&gt;a&lt;/em&gt; onto &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find block &lt;em&gt;a&lt;/em&gt;,
and return any blocks stacked on top of it to their original position. Do the same
for block &lt;em&gt;b&lt;/em&gt;, then stack block &lt;em&gt;a&lt;/em&gt; on top of &lt;em&gt;b&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&amp;quot;move &lt;em&gt;a&lt;/em&gt; over &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find block &lt;em&gt;a&lt;/em&gt;,
and return any blocks stacked on top of it to their original position. Then stack
block &lt;em&gt;a&lt;/em&gt; on top of the stack of blocks containing &lt;em&gt;b&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&amp;quot;pile &lt;em&gt;a&lt;/em&gt; onto &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find the
stack of blocks containing block &lt;em&gt;b&lt;/em&gt;, and return any blocks stacked on top
of it to their original position. Then the arm must find the stack of blocks containing
block &lt;em&gt;a&lt;/em&gt;, and take the stack of blocks starting from &lt;em&gt;a&lt;/em&gt; on upwards
(in other words, don't do anything with any blocks on top of &lt;em&gt;a&lt;/em&gt;) and put that
stack on top of block &lt;em&gt;b&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&amp;quot;pile &lt;em&gt;a&lt;/em&gt; over &lt;em&gt;b&lt;/em&gt;&amp;quot; This command orders the arm to find the
stack of blocks containing block &lt;em&gt;a&lt;/em&gt; and take the stack of blocks starting
from &lt;em&gt;a&lt;/em&gt; on upwards (in other words, don't do anything with any blocks on top
of &lt;em&gt;a&lt;/em&gt;) and put that stack on top of the stack of blocks containing block &lt;em&gt;b&lt;/em&gt; (in
other words, don't do anything with the stack of blocks containing &lt;em&gt;b&lt;/em&gt;, either).&lt;/li&gt;
&lt;li&gt;
&amp;quot;quit&amp;quot; This command tells the arm to shut down (and thus terminates the
simulation).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Note that if the input command sequence accidentally offers a command where &lt;em&gt;a&lt;/em&gt; and &lt;em&gt;b&lt;/em&gt; are
the same value, that command is illegal and should be ignored.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
As an example, then, if we have 4 blocks in the state [0: 0, 1: 1, 2: 2, 3: 3], and
run a &amp;quot;move 2 onto 3&amp;quot;, we get [0: 0, 1: 1, 2:, 3: 3 2]. If we then run a
&amp;quot;pile 3 over 1&amp;quot;, we should end up with [0: 0, 1: 1 3 2, 2:, 3:]. And so
on.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Input:&lt;/strong&gt; n = 10. Run these commands:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
move 9 onto 1&lt;/li&gt;
&lt;li&gt;
move 8 over 1&lt;/li&gt;
&lt;li&gt;
move 7 over 1&lt;/li&gt;
&lt;li&gt;
move 6 over 1&lt;/li&gt;
&lt;li&gt;
pile 8 over 6&lt;/li&gt;
&lt;li&gt;
pile 8 over 5&lt;/li&gt;
&lt;li&gt;
move 2 over 1&lt;/li&gt;
&lt;li&gt;
move 4 over 9&lt;/li&gt;
&lt;li&gt;
quit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The result should be [0: 0, 1: 1 9 2 4, 2:, 3: 3, 4:, 5: 5 8 7 6, 6:, 7:, 8:, 9:]
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Challenges:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Implement the Towers of Hanoi (or as close to it as you can get) using this system.&lt;/li&gt;
&lt;li&gt;
Add an optimizer to the arm, in essence reading in the entire program (up to &amp;quot;quit&amp;quot;),
finding shorter paths and/or different commands to achieve the same result.&lt;/li&gt;
&lt;li&gt;
Add a visual component to the simulation, displaying the arm as it moves over each
block and moves blocks around.&lt;/li&gt;
&lt;li&gt;
Add another robotic arm, and allow commands to be given simultaneously. This will
require some thought—does each arm execute a complete command before allowing the
other arm to execute (which reduces the performance having two arms might offer),
or can each arm act entirely independently? The two (or more) arms will probably need
separate command streams, but you might try running them with one command stream just
for grins. Note that deciding how to synchronized the arms so they don't conflict
with one another will probably require adding some kind of synchronization instructions
into the stream as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=0e5b971c-8dd4-48ef-b47c-b9b0611607dd" /&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,0e5b971c-8dd4-48ef-b47c-b9b0611607dd.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Mac OS</category>
      <category>Objective-C</category>
      <category>Parrot</category>
      <category>Python</category>
      <category>Ruby</category>
      <category>Security</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=3026e434-b1c8-4525-816a-2efcd5d2a6e6</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,3026e434-b1c8-4525-816a-2efcd5d2a6e6.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,3026e434-b1c8-4525-816a-2efcd5d2a6e6.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3026e434-b1c8-4525-816a-2efcd5d2a6e6</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently, an email crossed my Inbox from a friend who was concerned about some questionable
practices involving my content (as well as a few others'); apparently, I have been
listed as an "author" for SysCon, I have a "domain" with them,
and that I've been writing for them since 10 January, 2003, including two articles,
"Effective Enterprise Java" and "Java/.NET Interoperability".
</p>
        <p>
Given that both of those "articles" are summaries from <em>presentations</em> I've
done at conferences past, I'm a touch skeptical. In fact, it feels like those summaries
were scraped from conferences I've done in the past, and I <em>certainly</em> don't
remember ever giving Sys-Con (or any other conference) the right to reprint my presentation
as an article.
</p>
        <p>
Then it turns out that apparently <a href="http://aralbalkan.com/2284" target="_blank">I'm
not the only one suffering this problem</a>. Go. Read that article, then come back.
I promise, I'll wait.
</p>
        <p>
(Seriously, go read it.)
</p>
        <p>
Wow. Just... wow. If even <em>half</em> of what Aral's story is true (and I'm inclined
to believe at least part of it, given that he's done some pretty meticulous documentation
of at least his side of the story), then this is beyond outrageous, and squarely into
"completely unethical".
</p>
        <p>
Now, I'll be the first to admit, I've not heard back from Sys-Con about any of this,
so if I get any sort of response I'll be sure to update this blog post. But...
</p>
        <p>
          <em>Calling anyone a "homosexual son of a bitch", "terrorist"
or "fag" is so unbelievably offensive it staggers the mind.</em> Normally,
I'd be a bit hesitant to just give either party the benefit of the doubt on that one,
given just how ludicrous the accusation sounds, but Aral includes screen shots of
the articles, which in of itself lends an air of credibility to the accusation—either
Aral is the world's worst Turkish translator, or Sys-Con's translation into Turkish
is a bit on the "edgy" side, or Sys-Con really did call him that. Which
implies that whichever way this goes, doesn't look good for one of the two parties.
But even if we leave that to one side....
</p>
        <p>
          <em>Sys-Con is playing with fire by collecting my content and claiming me as an author.</em> Sys-Con
never contacted me about becoming a part of their "Ulitzer" website. They
never asked me for permission to reprint my articles, though, I'll admit, I can't
find where the articles actually exist, nor links to the articles, so maybe they didn't,
actually, reprint the article, but just link to them... except I can't find the links
to the articles or the presentations, either. They never asked me for an updated bio
or photo, and in fact, they pretty clearly grabbed both bio, photo and "summaries"
from an old location, because that bio lists me as a DevelopMentor instructor (which
I haven't been for two years or so), and as living in Sacramento, CA (which I haven't
been for about three years or so). Let me be very clear about this: <strong>I do not
write for Sys-Con Media. I never have. They have never asked permission to reuse any
of the content I have produced. I am appalled at being included in such a fashion.</strong></p>
        <p>
Note that I'm not opposed to being linked to, mind you—if I put material on my blog,
I generally expect (and hope) that people will link to it, and I don't demand permission
or even notification when it happens. But to claim that I've written material for
an entity <em>does</em> mean I expect to at least be asked if it's OK to use my likeness,
name, or material. No such request was ever made of me, so far as I can remember or
find (through my own email archives, which stretch back to 2001).
</p>
        <p>
And I can say that I've thought about this issue before, from the other side of the
story—back when I was editor at TheServerSide.NET, we began a "blogger's program"
that would take interesting blog posts from around the Internet and "collect"
them in some fashion for TSS.NET readers. Originally, the thought was to simply reproduce
the content directly on our site, and I hated that idea, for the same reasons as I
dislike it when somebody does it to me. Regardless of the licensing model the blog
entries are published under, to me, a publication or media firm owes the author at
least the right of refusal, and a chance to be notified when their material is reused.
(In the end, we chose to ask authors if we could reproduce their material in the program,
and we never (to my knowledge) had an author refuse.) It doesn't take a real rocket
scientist's brain to figure out that asking permission is never a bad thing to do
if you want to maintain good will with your sources of material.
</p>
        <p>
This is an open and public request to Sys-Con media: either contact me about using
my name, likeness and material on your website, or remove it. (I have emailed their
editorial and asked them to acknowledge receipt of my request.)
</p>
        <p>
In the meantime, I will be making every effort to make sure that other content-producers
I know are aware of Sys-Con's practices, so they can act as they see fit.
</p>
        <p>
If you are a reader, and find this distasteful as well, then I suggest you follow
some of the suggestions mentioned in Aral's blog post:
</p>
        <ul>
          <ul>
            <li>
Tell everyone you know about what Sys-Con is doing (but don't link to them so as not
to give them Google Juice). If tweeting, leave out the http:// bit so that your URL
is not automatically made into a link. 
</li>
            <li>
Sys-Con feeds upon the work of authors and speakers to live. If all authors had their
content removed from Sys-Con and Ulitzer, they would not have pages to put ads on.
So go through their list of authors and notify the ones you know. If they are unaware
that they're listed there, they will most likely want themselves removed. <strong>Update:</strong> I've
created a single list of all Sys-Con's Ulitzer authors. <a href="http://aralbalkan.com/2303">More
information and the full list are in this post</a>. The original list of authors is
at http://www.ulitzer.com/?q=authors. You can ask for your Ulitzer/Sys-Con author
page to be removed by emailing <a href="mailto:editorial@sys-con.com">editorial@sys-con.com</a>. 
</li>
            <li>
Contact their advertisers and tell them what you think of their association with Sys-Con. 
</li>
            <li>
If you know any speakers speaking at Sys-Con events, make sure they know the kind
of company they are associating themselves with. Do the same with anyone you know
who is thinking of attending one of their events. Raise awareness about their events
at your place of work. 
</li>
            <li>
Make sure Google knows that Sys-Con/Ulitzer is spamming Google with tons of duplicate
content. <a href="http://www.google.com/contact/spamreport.html">Report them on Google's
spam page for posting duplicate content</a>. According to their terms and conditions,
Google should stop indexing Sys-Con/Ulitzer. <a href="http://aralbalkan.com/2284#comment-256711">See
this comment for a template you can use when reporting them.</a></li>
            <li>
Make sure Google News knows that they are syndicating libelous articles from Sys-Con.
Use the <a href="http://www.google.com/support/news_pub/bin/request.py?contact_type=report_an_issue">Google
News Report an Issue form</a> to report the following articles: http://internetvideo.sys-con.com/node/1017038,
http://internetvideo.sys-con.com/node/1028923, http://www.sys-con.com/node/1035252,
http://air.ulitzer.com/node/1038383, http://openwebdeveloper.sys-con.com/node/1039556,
and http://cloudcomputing.sys-con.com/node/1047589 
</li>
          </ul>
        </ul>
        <p>
Meanwhile, I'm going to be talking about this to everybody I know at Microsoft, desperately
seeking to find out which department engaged the advertising with Sys-Con, and looking
to convince them that they don't need this kind of press or association. Ditto for
the contacts (far fewer in number) I have with IBM, and any other Sys-Con advertiser
I find.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=3026e434-b1c8-4525-816a-2efcd5d2a6e6" />
        <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 journalistic integrity: Sys-Con, Ulitzer, theft and libel</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,3026e434-b1c8-4525-816a-2efcd5d2a6e6.aspx</guid>
      <link>http://blogs.tedneward.com/2009/07/29/More+On+Journalistic+Integrity+SysCon+Ulitzer+Theft+And+Libel.aspx</link>
      <pubDate>Wed, 29 Jul 2009 01:58:00 GMT</pubDate>
      <description>&lt;p&gt;
Recently, an email crossed my Inbox from a friend who was concerned about some questionable
practices involving my content (as well as a few others'); apparently, I have been
listed as an &amp;quot;author&amp;quot; for SysCon, I have a &amp;quot;domain&amp;quot; with them,
and that I've been writing for them since 10 January, 2003, including two articles,
&amp;quot;Effective Enterprise Java&amp;quot; and &amp;quot;Java/.NET Interoperability&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
Given that both of those &amp;quot;articles&amp;quot; are summaries from &lt;em&gt;presentations&lt;/em&gt; I've
done at conferences past, I'm a touch skeptical. In fact, it feels like those summaries
were scraped from conferences I've done in the past, and I &lt;em&gt;certainly&lt;/em&gt; don't
remember ever giving Sys-Con (or any other conference) the right to reprint my presentation
as an article.
&lt;/p&gt;
&lt;p&gt;
Then it turns out that apparently &lt;a href="http://aralbalkan.com/2284" target="_blank"&gt;I'm
not the only one suffering this problem&lt;/a&gt;. Go. Read that article, then come back.
I promise, I'll wait.
&lt;/p&gt;
&lt;p&gt;
(Seriously, go read it.)
&lt;/p&gt;
&lt;p&gt;
Wow. Just... wow. If even &lt;em&gt;half&lt;/em&gt; of what Aral's story is true (and I'm inclined
to believe at least part of it, given that he's done some pretty meticulous documentation
of at least his side of the story), then this is beyond outrageous, and squarely into
&amp;quot;completely unethical&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
Now, I'll be the first to admit, I've not heard back from Sys-Con about any of this,
so if I get any sort of response I'll be sure to update this blog post. But...
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Calling anyone a &amp;quot;homosexual son of a bitch&amp;quot;, &amp;quot;terrorist&amp;quot;
or &amp;quot;fag&amp;quot; is so unbelievably offensive it staggers the mind.&lt;/em&gt; Normally,
I'd be a bit hesitant to just give either party the benefit of the doubt on that one,
given just how ludicrous the accusation sounds, but Aral includes screen shots of
the articles, which in of itself lends an air of credibility to the accusation—either
Aral is the world's worst Turkish translator, or Sys-Con's translation into Turkish
is a bit on the &amp;quot;edgy&amp;quot; side, or Sys-Con really did call him that. Which
implies that whichever way this goes, doesn't look good for one of the two parties.
But even if we leave that to one side....
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Sys-Con is playing with fire by collecting my content and claiming me as an author.&lt;/em&gt; Sys-Con
never contacted me about becoming a part of their &amp;quot;Ulitzer&amp;quot; website. They
never asked me for permission to reprint my articles, though, I'll admit, I can't
find where the articles actually exist, nor links to the articles, so maybe they didn't,
actually, reprint the article, but just link to them... except I can't find the links
to the articles or the presentations, either. They never asked me for an updated bio
or photo, and in fact, they pretty clearly grabbed both bio, photo and &amp;quot;summaries&amp;quot;
from an old location, because that bio lists me as a DevelopMentor instructor (which
I haven't been for two years or so), and as living in Sacramento, CA (which I haven't
been for about three years or so). Let me be very clear about this: &lt;strong&gt;I do not
write for Sys-Con Media. I never have. They have never asked permission to reuse any
of the content I have produced. I am appalled at being included in such a fashion.&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
Note that I'm not opposed to being linked to, mind you—if I put material on my blog,
I generally expect (and hope) that people will link to it, and I don't demand permission
or even notification when it happens. But to claim that I've written material for
an entity &lt;em&gt;does&lt;/em&gt; mean I expect to at least be asked if it's OK to use my likeness,
name, or material. No such request was ever made of me, so far as I can remember or
find (through my own email archives, which stretch back to 2001).
&lt;/p&gt;
&lt;p&gt;
And I can say that I've thought about this issue before, from the other side of the
story—back when I was editor at TheServerSide.NET, we began a &amp;quot;blogger's program&amp;quot;
that would take interesting blog posts from around the Internet and &amp;quot;collect&amp;quot;
them in some fashion for TSS.NET readers. Originally, the thought was to simply reproduce
the content directly on our site, and I hated that idea, for the same reasons as I
dislike it when somebody does it to me. Regardless of the licensing model the blog
entries are published under, to me, a publication or media firm owes the author at
least the right of refusal, and a chance to be notified when their material is reused.
(In the end, we chose to ask authors if we could reproduce their material in the program,
and we never (to my knowledge) had an author refuse.) It doesn't take a real rocket
scientist's brain to figure out that asking permission is never a bad thing to do
if you want to maintain good will with your sources of material.
&lt;/p&gt;
&lt;p&gt;
This is an open and public request to Sys-Con media: either contact me about using
my name, likeness and material on your website, or remove it. (I have emailed their
editorial and asked them to acknowledge receipt of my request.)
&lt;/p&gt;
&lt;p&gt;
In the meantime, I will be making every effort to make sure that other content-producers
I know are aware of Sys-Con's practices, so they can act as they see fit.
&lt;/p&gt;
&lt;p&gt;
If you are a reader, and find this distasteful as well, then I suggest you follow
some of the suggestions mentioned in Aral's blog post:
&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
Tell everyone you know about what Sys-Con is doing (but don't link to them so as not
to give them Google Juice). If tweeting, leave out the http:// bit so that your URL
is not automatically made into a link. 
&lt;/li&gt;
&lt;li&gt;
Sys-Con feeds upon the work of authors and speakers to live. If all authors had their
content removed from Sys-Con and Ulitzer, they would not have pages to put ads on.
So go through their list of authors and notify the ones you know. If they are unaware
that they're listed there, they will most likely want themselves removed. &lt;strong&gt;Update:&lt;/strong&gt; I've
created a single list of all Sys-Con's Ulitzer authors. &lt;a href="http://aralbalkan.com/2303"&gt;More
information and the full list are in this post&lt;/a&gt;. The original list of authors is
at http://www.ulitzer.com/?q=authors. You can ask for your Ulitzer/Sys-Con author
page to be removed by emailing &lt;a href="mailto:editorial@sys-con.com"&gt;editorial@sys-con.com&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;
Contact their advertisers and tell them what you think of their association with Sys-Con. 
&lt;/li&gt;
&lt;li&gt;
If you know any speakers speaking at Sys-Con events, make sure they know the kind
of company they are associating themselves with. Do the same with anyone you know
who is thinking of attending one of their events. Raise awareness about their events
at your place of work. 
&lt;/li&gt;
&lt;li&gt;
Make sure Google knows that Sys-Con/Ulitzer is spamming Google with tons of duplicate
content. &lt;a href="http://www.google.com/contact/spamreport.html"&gt;Report them on Google's
spam page for posting duplicate content&lt;/a&gt;. According to their terms and conditions,
Google should stop indexing Sys-Con/Ulitzer. &lt;a href="http://aralbalkan.com/2284#comment-256711"&gt;See
this comment for a template you can use when reporting them.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Make sure Google News knows that they are syndicating libelous articles from Sys-Con.
Use the &lt;a href="http://www.google.com/support/news_pub/bin/request.py?contact_type=report_an_issue"&gt;Google
News Report an Issue form&lt;/a&gt; to report the following articles: http://internetvideo.sys-con.com/node/1017038,
http://internetvideo.sys-con.com/node/1028923, http://www.sys-con.com/node/1035252,
http://air.ulitzer.com/node/1038383, http://openwebdeveloper.sys-con.com/node/1039556,
and http://cloudcomputing.sys-con.com/node/1047589 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;
Meanwhile, I'm going to be talking about this to everybody I know at Microsoft, desperately
seeking to find out which department engaged the advertising with Sys-Con, and looking
to convince them that they don't need this kind of press or association. Ditto for
the contacts (far fewer in number) I have with IBM, and any other Sys-Con advertiser
I find.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=3026e434-b1c8-4525-816a-2efcd5d2a6e6" /&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,3026e434-b1c8-4525-816a-2efcd5d2a6e6.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>F#</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Reading</category>
      <category>Review</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Social</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=dd85708f-48d8-47dc-a9c6-cc4a1287ad31</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,dd85708f-48d8-47dc-a9c6-cc4a1287ad31.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,dd85708f-48d8-47dc-a9c6-cc4a1287ad31.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=dd85708f-48d8-47dc-a9c6-cc4a1287ad31</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <blockquote>
          <p>
            <strong>Update:</strong> See below, but I wanted to include the text Mike Abercrombie
(DM's owner) posted as a comment to this post, in the body of the blog post itself. <em>"Ted
- All of us at DevelopMentor greatly appreciate your admiration. We're also grateful
for your contributions to DevelopMentor when you were part of our staff. However,
all of us that work here, especially our technical staff that write and delivery our
courses today, would appreciate it if you would check your sources before writing
our eulogy. DevelopMentor is open for business and delivering courses this week and
we intend to remain doing so."</em> Duly noted, Mike. Apology offered (and hopefully
accepted).
</p>
        </blockquote>
        <p>
An email crossed my desk today, announcing that DevelopMentor, home to so many good
people and fond memories, has (at least temporarily) closed its doors.
</p>
        <p>
I admit to a small, carefully-cushioned place in my heart where I mourn over this.
</p>
        <p>
DevelopMentor was such a transcendent place for me. Much, if not most or all, of the
acceleration that came in my career came not only while I was there, but <em>because</em> I
was there.
</p>
        <p>
          <em>So</em> much of my speaking persona and skill I owe to Ron Sumida, who took a
half-baked neophyte of intermediate speaking skill, and in an eight-hour marathon
session still referred to in my mental memoirs as my "Night with Scary Ron",
shaped me and taught me tricks about speaking that I continue to use to this day.
That I got to know him as a friend and confidant later still to this day ranks as
one of my greatest blessings.
</p>
        <p>
I remember my first DM Instructor Retreat, where I met so many of the names I'd read
about or heard about, and feeling "Oh, my God" fanboy-ish. I remember Tim
Ewald giving a talk on transactions at that retreat that left me agape—I seriously
didn't understand half of what he was saying, and rather than feeling overwhelmed
or ashamed, I remember distinctly thinking, "Wow—I have found a home where I
can learn SO much more." It was like waking up one morning to find that your
writing workshop group suddenly included Neal Stephenson, Stephen Pinker, C.S. Lewis
and Ernest Hemingway. (Yes, I know those last two are dead. Work with me here.)
</p>
        <p>
I remember the day that Lorie (the ops manager at the time) called me to say that
Don Box wanted me to work with him on the C# course. I was convinced that she'd called
the wrong Ted, meaning instead to reach for Ted Pattison in her Rolodex and coming
up a few letters shy. She tartly informed me, "No, I know exactly who I'm talking
to, and are you interested or not?" How could I refuse? Help the Diety of COM
write DM's flagship course on Microsoft's flagship technology for the next decade?
"Hmm...", I say out loud, not because I needed time to think about it, but
because a thread in the back of my head says, "Is there <em>any</em> scenario
here where I say no?"
</p>
        <p>
I still fondly recall doing a Guerilla .NET at the Torrance Hilton shortly after the
.NET 1.0 release, and having a conversation with Don in my hotel room later that night;
that was when he told me "Microsoft is working on an open-source version of the
CLR". I was stunned—I had no idea that said version would factor pretty largely
in my life later. But it opened my eyes, in a very practical way, to how deeply-connected
DevelopMentor was to Microsoft, and how that could play out in a direct fashion.
</p>
        <p>
When Peter Drayton joined, he asked me to do a quick review pass on the reference
section of his <em>C# in a Nutshell</em>, and I agreed because Peter was a good guy
(and somebody I'd hoped would become a friend), and wanted to see the book do well.
That went from informal review to formal review to "well, could you maybe make
it an editing pass?" to "Would you like to write a few chapters?" to
"Well, let's sign you up as a co-author...". That project is what introduced
me to John Osborn, which in turn led him to call me one day and say, "Some guys
at Microsoft are working on an open-source version of the CLR, and would like to have
a 'professional writer' help them write a book on it. Interested?" That led to <em>SSCLI
Internals</em>, working with David Stutz, and wow, did I learn a helluvalot from <em>that</em> project,
too.
</p>
        <p>
          <em>Effective Enterprise Java</em> came through DevelopMentor, thanks again to Don
Box, who introduced me to the folks at Addison-Wesley that put the contract (and Scott
Meyers, another blessing) in front of me.
</p>
        <p>
DM got me my start in the conference circuit, as well. In 2002, John Lam pinged me
over email—he'd recently become track chair for Connections down in Orlando, and was
I interested in speaking there? I was such a newbie to the whole idea, but having
taught classes roughly twice every month, I wasn't worried about the speaking part,
but the rest of the process. John walked me through the process, and in doing so,
set me down a path that would almost completely redefine my career within a year or
so.
</p>
        <p>
Even my Java chops got built up—the head of our Java curriculum was Stu Halloway (recently
of Clojure fame), and between him, Kevin Jones, Si Horrell, Brian Maso and Owen Tallman,
man, did I feel simultaneously like a small child among giants and like a kid in a
candy store. Every time I turned around, they'd discovered something new about the
Java platform that floored me. Bob Beauchemin has forgotten more about databases in
general than I will ever learn, and he had some insights on the intersection of Java
+ databases that still hang with me today.
</p>
        <p>
And my start with No Fluff Just Stuff came through DevelopMentor, too. Jason Whittington
heard through a mutual friend (Erik Hatcher, of Ant fame) about this cool little conference
being held in Denver, and maybe I should look into it. That led to an email intro
to Jay Zimmerman, a dinner together while I was teaching in Denver a few weeks later,
and before I knew it, I was on the Denver NFJS schedule, including the speaker panel,
where I uttered the then-infamous line, "Swing sucks. Get over it."
</p>
        <p>
DevelopMentor, you shaped my career—and my life—in so many ways, you will always be
a source of pleasant memories and a group of friends and acquaintances that I would
never have had otherwise. Thank you <em>so</em> much.
</p>
        <p>
Rest in peace.
</p>
        <p>
          <strong>Update:</strong> Well, as it turns out, I have to rescind at least part of
my eulogy, as the post itself generated quite a stir—the folks at DevelopMentor were
pretty quick to email me, pointing out that they're still alive and well. In fact,
as one of them (a friend of mine still working there) put it, "We were all kinda
surprised when we came to work this morning and discovered that we could go home."
Fortunately, the DevelopMentor folks were pretty gracious about what could've been
a <em>very</em> ugly situation, and I apologize for to them for the misunderstanding—all
I can say is that my "source" must've also been mistaken, and I'm glad that
we're all still good. And lest it need to be said out loud, I <em>heartily</em> want
nothing but the best for DM, and hope that I never have to write this message again.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=dd85708f-48d8-47dc-a9c6-cc4a1287ad31" />
        <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 eulogy: DevelopMentor, RIP</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,dd85708f-48d8-47dc-a9c6-cc4a1287ad31.aspx</guid>
      <link>http://blogs.tedneward.com/2009/06/01/A+Eulogy+DevelopMentor+RIP.aspx</link>
      <pubDate>Mon, 01 Jun 2009 06:32:07 GMT</pubDate>
      <description>&lt;blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; See below, but I wanted to include the text Mike Abercrombie
(DM's owner) posted as a comment to this post, in the body of the blog post itself. &lt;em&gt;&amp;quot;Ted
- All of us at DevelopMentor greatly appreciate your admiration. We're also grateful
for your contributions to DevelopMentor when you were part of our staff. However,
all of us that work here, especially our technical staff that write and delivery our
courses today, would appreciate it if you would check your sources before writing
our eulogy. DevelopMentor is open for business and delivering courses this week and
we intend to remain doing so.&amp;quot;&lt;/em&gt; Duly noted, Mike. Apology offered (and hopefully
accepted).
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
An email crossed my desk today, announcing that DevelopMentor, home to so many good
people and fond memories, has (at least temporarily) closed its doors.
&lt;/p&gt;
&lt;p&gt;
I admit to a small, carefully-cushioned place in my heart where I mourn over this.
&lt;/p&gt;
&lt;p&gt;
DevelopMentor was such a transcendent place for me. Much, if not most or all, of the
acceleration that came in my career came not only while I was there, but &lt;em&gt;because&lt;/em&gt; I
was there.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;So&lt;/em&gt; much of my speaking persona and skill I owe to Ron Sumida, who took a
half-baked neophyte of intermediate speaking skill, and in an eight-hour marathon
session still referred to in my mental memoirs as my &amp;quot;Night with Scary Ron&amp;quot;,
shaped me and taught me tricks about speaking that I continue to use to this day.
That I got to know him as a friend and confidant later still to this day ranks as
one of my greatest blessings.
&lt;/p&gt;
&lt;p&gt;
I remember my first DM Instructor Retreat, where I met so many of the names I'd read
about or heard about, and feeling &amp;quot;Oh, my God&amp;quot; fanboy-ish. I remember Tim
Ewald giving a talk on transactions at that retreat that left me agape—I seriously
didn't understand half of what he was saying, and rather than feeling overwhelmed
or ashamed, I remember distinctly thinking, &amp;quot;Wow—I have found a home where I
can learn SO much more.&amp;quot; It was like waking up one morning to find that your
writing workshop group suddenly included Neal Stephenson, Stephen Pinker, C.S. Lewis
and Ernest Hemingway. (Yes, I know those last two are dead. Work with me here.)
&lt;/p&gt;
&lt;p&gt;
I remember the day that Lorie (the ops manager at the time) called me to say that
Don Box wanted me to work with him on the C# course. I was convinced that she'd called
the wrong Ted, meaning instead to reach for Ted Pattison in her Rolodex and coming
up a few letters shy. She tartly informed me, &amp;quot;No, I know exactly who I'm talking
to, and are you interested or not?&amp;quot; How could I refuse? Help the Diety of COM
write DM's flagship course on Microsoft's flagship technology for the next decade?
&amp;quot;Hmm...&amp;quot;, I say out loud, not because I needed time to think about it, but
because a thread in the back of my head says, &amp;quot;Is there &lt;em&gt;any&lt;/em&gt; scenario
here where I say no?&amp;quot;
&lt;/p&gt;
&lt;p&gt;
I still fondly recall doing a Guerilla .NET at the Torrance Hilton shortly after the
.NET 1.0 release, and having a conversation with Don in my hotel room later that night;
that was when he told me &amp;quot;Microsoft is working on an open-source version of the
CLR&amp;quot;. I was stunned—I had no idea that said version would factor pretty largely
in my life later. But it opened my eyes, in a very practical way, to how deeply-connected
DevelopMentor was to Microsoft, and how that could play out in a direct fashion.
&lt;/p&gt;
&lt;p&gt;
When Peter Drayton joined, he asked me to do a quick review pass on the reference
section of his &lt;em&gt;C# in a Nutshell&lt;/em&gt;, and I agreed because Peter was a good guy
(and somebody I'd hoped would become a friend), and wanted to see the book do well.
That went from informal review to formal review to &amp;quot;well, could you maybe make
it an editing pass?&amp;quot; to &amp;quot;Would you like to write a few chapters?&amp;quot; to
&amp;quot;Well, let's sign you up as a co-author...&amp;quot;. That project is what introduced
me to John Osborn, which in turn led him to call me one day and say, &amp;quot;Some guys
at Microsoft are working on an open-source version of the CLR, and would like to have
a 'professional writer' help them write a book on it. Interested?&amp;quot; That led to &lt;em&gt;SSCLI
Internals&lt;/em&gt;, working with David Stutz, and wow, did I learn a helluvalot from &lt;em&gt;that&lt;/em&gt; project,
too.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Effective Enterprise Java&lt;/em&gt; came through DevelopMentor, thanks again to Don
Box, who introduced me to the folks at Addison-Wesley that put the contract (and Scott
Meyers, another blessing) in front of me.
&lt;/p&gt;
&lt;p&gt;
DM got me my start in the conference circuit, as well. In 2002, John Lam pinged me
over email—he'd recently become track chair for Connections down in Orlando, and was
I interested in speaking there? I was such a newbie to the whole idea, but having
taught classes roughly twice every month, I wasn't worried about the speaking part,
but the rest of the process. John walked me through the process, and in doing so,
set me down a path that would almost completely redefine my career within a year or
so.
&lt;/p&gt;
&lt;p&gt;
Even my Java chops got built up—the head of our Java curriculum was Stu Halloway (recently
of Clojure fame), and between him, Kevin Jones, Si Horrell, Brian Maso and Owen Tallman,
man, did I feel simultaneously like a small child among giants and like a kid in a
candy store. Every time I turned around, they'd discovered something new about the
Java platform that floored me. Bob Beauchemin has forgotten more about databases in
general than I will ever learn, and he had some insights on the intersection of Java
+ databases that still hang with me today.
&lt;/p&gt;
&lt;p&gt;
And my start with No Fluff Just Stuff came through DevelopMentor, too. Jason Whittington
heard through a mutual friend (Erik Hatcher, of Ant fame) about this cool little conference
being held in Denver, and maybe I should look into it. That led to an email intro
to Jay Zimmerman, a dinner together while I was teaching in Denver a few weeks later,
and before I knew it, I was on the Denver NFJS schedule, including the speaker panel,
where I uttered the then-infamous line, &amp;quot;Swing sucks. Get over it.&amp;quot;
&lt;/p&gt;
&lt;p&gt;
DevelopMentor, you shaped my career—and my life—in so many ways, you will always be
a source of pleasant memories and a group of friends and acquaintances that I would
never have had otherwise. Thank you &lt;em&gt;so&lt;/em&gt; much.
&lt;/p&gt;
&lt;p&gt;
Rest in peace.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; Well, as it turns out, I have to rescind at least part of
my eulogy, as the post itself generated quite a stir—the folks at DevelopMentor were
pretty quick to email me, pointing out that they're still alive and well. In fact,
as one of them (a friend of mine still working there) put it, &amp;quot;We were all kinda
surprised when we came to work this morning and discovered that we could go home.&amp;quot;
Fortunately, the DevelopMentor folks were pretty gracious about what could've been
a &lt;em&gt;very&lt;/em&gt; ugly situation, and I apologize for to them for the misunderstanding—all
I can say is that my &amp;quot;source&amp;quot; must've also been mistaken, and I'm glad that
we're all still good. And lest it need to be said out loud, I &lt;em&gt;heartily&lt;/em&gt; want
nothing but the best for DM, and hope that I never have to write this message again.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=dd85708f-48d8-47dc-a9c6-cc4a1287ad31" /&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,dd85708f-48d8-47dc-a9c6-cc4a1287ad31.aspx</comments>
      <category>.NET</category>
      <category>C#</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Industry</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Reading</category>
      <category>Scala</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=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=44481f40-dbca-438c-9398-2ed93a3d62d8</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,44481f40-dbca-438c-9398-2ed93a3d62d8.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,44481f40-dbca-438c-9398-2ed93a3d62d8.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=44481f40-dbca-438c-9398-2ed93a3d62d8</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven">Roy
Fielding has weighed in</a> on the recent "buzzwordiness" (hey, if Colbert can make
up "truthiness", then I can make up "buzzwordiness") of calling everything a "REST
API", a tactic that has become more <em>en vogue</em> of late as vendors discover
that the general programming population is finding the WSDL-based XML services stack
too complex to navigate successfully for all but the simplest of projects. Contrary
to what many RESTafarians may be hoping, Roy doesn't gather all these wayward children
to his breast and praise their anti-vendor/anti-corporate/anti-proprietary efforts,
but instead, blasts them pretty seriously for mangling his term:
</p>
        <blockquote>
          <p>
I am getting frustrated by the number of people calling any HTTP-based interface a
REST API. Today’s example is the <a href="http://wikis.glassfish.org/socialsite/Wiki.jsp?page=FinalizeRESTAPI">SocialSite
REST API</a>. That is RPC. It screams RPC. There is so much coupling on display that
it should be given an X rating.
</p>
        </blockquote>
        <p>
Ouch. "So much coupling on display that it should be given an X rating." I have to
remember that phrase--that's a keeper. And I'm shocked that Roy even knows what an
X rating is; he's such a mellow guy with such an innocent-looking face, I would've
bet money he'd never run into one before. <em>(Yes, people, that's a joke.)</em></p>
        <blockquote>
          <p>
What needs to be done to make the REST architectural style clear on the notion that
hypertext is a constraint? In other words, if the engine of application state (and
hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot
be a REST API. Period. Is there some broken manual somewhere that needs to be fixed?
</p>
        </blockquote>
        <p>
Go Roy!
</p>
        <p>
For those of you who've <em>not</em> read Roy's thesis, and are thinking that this
is some kind of betrayal or trick, let's first of all point out that at no point is
Roy saying that your nifty HTTP-based API is not <em>useful</em> or <em>simple</em>.
He's simply saying that it isn't <em>RESTful</em>. That's a key differentiation. REST
has a specific set of goals and constraints it was trying to meet, and as such prescribes
a particular kind of architectural style to fit within those constraints. (Yes, REST
is essentially an architectural pattern: a solution to a problem within a certain
context that yields certain consequences.)
</p>
        <p>
Assuming you haven't tuned me out completely already, allow me to elucidate. In Chapter
5 of <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm">Roy's
thesis</a>, Roy begins to build up the style that will ultimately be considered REST.
I'm not going to quote each and every step here--that's what the hyperlink above is
for--but simply call out certain parts. For example, in section 5.1.3, "Stateless",
he suggests that this architectural style should be stateless in nature, and explains
why; the emphasis/italics are mine:
</p>
        <blockquote>
          <p>
We next add a constraint to the client-server interaction: communication must be stateless
in nature, as in the client-stateless-server (CSS) style of Section 3.4.3 (Figure
5-3), such that <em>each request from client to server must contain all of the information
necessary to understand the request</em>, and cannot take advantage of any stored
context on the server. <em>Session state is therefore kept entirely on the client</em>. 
</p>
          <p>
This constraint induces the properties of visibility, reliability, and scalability.
Visibility is improved because a monitoring system does not have to look beyond a
single request datum in order to determine the full nature of the request. Reliability
is improved because it eases the task of recovering from partial failures [133]. Scalability
is improved because not having to store state between requests allows the server component
to quickly free resources, and further simplifies implementation because the server
doesn't have to manage resource usage across requests. 
</p>
          <p>
Like most architectural choices, the stateless constraint reflects a design trade-off.
The disadvantage is that it may decrease network performance by increasing the repetitive
data (per-interaction overhead) sent in a series of requests, since that data cannot
be left on the server in a shared context. In addition, placing the application state
on the client-side reduces the server's control over consistent application behavior,
since the application becomes dependent on the correct implementation of semantics
across multiple client versions.
</p>
        </blockquote>
        <p>
In the HTTP case, the state is contained entirely in the document itself, the hypertext.
This has a couple of implications for those of us building "distributed applications",
such as the very real consideration that there's a <em>lot</em> of state we don't
necessarily want to be sending back to the client, such as voluminous information
(the user's e-commerce shopping cart contents) or sensitive information (the user's
credentials or single-signon authentication/authorization token). This is a bitter
pill to swallow for the application development world, because much of the applications
we develop have some pretty hefty notions of server-based state management that we
want or need to preserve, either for legacy support reasons, for legitimate concerns
(network bandwidth or security), or just for ease-of-understanding. Fielding isn't
apologetic about it, though--look at the third paragraph above. "[T]he stateless constraint
reflects a design trade-off."
</p>
        <p>
In other words, if you don't like it, fine, don't follow it, but understand that if
you're not leaving all the application state on the client, you're not doing REST.
</p>
        <p>
By the way, note that technically, HTTP is not tied to HTML, since the document sent
back and forth could easily be a PDF document, too, particularly since PDF supports
hyperlinks to other PDF documents. Nowhere in the thesis do we see the idea that it <em>has</em> to
be HTML flying back and forth.
</p>
        <p>
Roy's thesis continues on in the same vein; in section 5.1.4 he describes how "client-cache-stateless-server"
provides some additional reliability and performance, but only if the data in the
cache is consistent and not stale, which was fine for static documents, but not for
dynamic content such as image maps. Extensions were necessary in order to accomodate
the new ideas.
</p>
        <p>
In section 5.1.5 ("Uniform Interface") we get to another stinging rebuke of REST as
a generalized distributed application scheme; again, the emphasis is mine:
</p>
        <blockquote>
          <p>
The central feature that distinguishes the REST architectural style from other network-based
styles is its emphasis on a uniform interface between components (Figure 5-6). By
applying the software engineering principle of generality to the component interface,
the overall system architecture is simplified and the visibility of interactions is
improved. Implementations are decoupled from the services they provide, which encourages
independent evolvability. The trade-off, though, is that a uniform interface degrades
efficiency, since information is transferred in a standardized form rather than one
which is specific to an application's needs. The REST interface is designed to be
efficient for large-grain hypermedia data transfer, optimizing for the common case
of the Web, but resulting in an interface that is not optimal for other forms of architectural
interaction. 
</p>
          <p>
In order to obtain a uniform interface, multiple architectural constraints are needed
to guide the behavior of components. <em>REST is defined by four interface constraints</em>:
identification of resources; manipulation of resources through representations; self-descriptive
messages; and, <em>hypermedia as the engine of application state</em>. These constraints
will be discussed in Section 5.2.
</p>
        </blockquote>
        <p>
In other words, in order to be doing something that Fielding considers RESTful, you
have to be using hypermedia (that is to say, hypertext documents of some form) as
the core of your application state. It might seem like this implies that you have
to be building a Web application in order to be considered building something RESTful,
so therefore all Web apps are RESTful by nature, but pay close attention to the wording:
hypermedia must be the <em>core</em> of your application state. The way most Web apps
are built today, HTML is clearly not the core of the state, but merely a way to render
it. This is the accidental consequence of treating Web applications and desktop client
applications as just pale reflections of one another.
</p>
        <p>
The next section, 5.1.6 ("Layered System") again builds on the notion of stateless-server
architecture to provide additional flexibility and power:
</p>
        <blockquote>
          <p>
In order to further improve behavior for Internet-scale requirements, we add layered
system constraints (Figure 5-7). As described in Section 3.4.2, the layered system
style allows an architecture to be composed of hierarchical layers by constraining
component behavior such that each component cannot "see" beyond the immediate layer
with which they are interacting. By restricting knowledge of the system to a single
layer, we place a bound on the overall system complexity and promote substrate independence.
Layers can be used to encapsulate legacy services and to protect new services from
legacy clients, simplifying components by moving infrequently used functionality to
a shared intermediary. Intermediaries can also be used to improve system scalability
by enabling load balancing of services across multiple networks and processors. 
</p>
          <p>
The primary disadvantage of layered systems is that they add overhead and latency
to the processing of data, reducing user-perceived performance [32].<em> For a network-based
system that supports cache constraints, this can be offset by the benefits of shared
caching at intermediaries.</em> Placing shared caches at the boundaries of an organizational
domain can result in significant performance benefits [136]. Such layers also allow
security policies to be enforced on data crossing the organizational boundary, as
is required by firewalls [79]. 
</p>
          <p>
The combination of layered system and uniform interface constraints induces architectural
properties similar to those of the uniform pipe-and-filter style (Section 3.2.2).
Although REST interaction is two-way, the large-grain data flows of hypermedia interaction
can each be processed like a data-flow network, with filter components selectively
applied to the data stream in order to transform the content as it passes [26]. <em>Within
REST, intermediary components can actively transform the content of messages because
the messages are self-descriptive and their semantics are visible to intermediaries.</em></p>
        </blockquote>
        <p>
The potential of layered systems (itself not something that people building RESTful
approaches seem to think much about) is only realized if the entirety of the state
being transferred is self-descriptive and visible to the intermediaries--in other
words, intermediaries can only be helpful and/or non-performance-inhibitive if they
have free reign to make decisions based on the state they see being transferred. If
something isn't present in the state being transferred, usually because there is server-side
state being maintained, then they have to be concerned about silently changing the
semantics of what is happening in the interaction, and intermediaries--and layers
as a whole--become a liability. (Which is probably why so few systems seem to do it.)
</p>
        <p>
And if the notion of visible, transported state is not yet made clear in his dissertation,
Fielding dissects the discussion even further in section 5.2.1, "Data Elements". It's
too long to reprint here in its entirety, and frankly, reading the whole thing is
necessary to see the point of hypermedia and its place in the whole system. (The same
could be said of the entire chapter, in fact.) But it's pretty clear, once you read
the dissertation, that hypermedia/hypertext is a core, critical piece to the whole
REST construction. Clients are expected, in a RESTful system, to have <em>no</em> preconceived
notions of structure or relationship between resources, and discover all of that through
the state of the hypertext documents that are sent back to them. In the HTML case,
that discovery occurs inside the human brain; in the SOA/services case, that discovery
is much harder to define and describe. RDF and Semantic Web ideas may be of some help
here, but JSON can't, and simple XML can't, unless the client has some preconceived
notion of what the XML structure looks like, which violates Fielding's rules:
</p>
        <blockquote>
          <p>
A REST API should be entered with no prior knowledge beyond the initial URI (bookmark)
and set of standardized media types that are appropriate for the intended audience
(i.e., expected to be understood by any client that might use the API). From that
point on, all application state transitions must be driven by client selection of
server-provided choices that are present in the received representations or implied
by the user’s manipulation of those representations. The transitions may be determined
(or limited by) the client’s knowledge of media types and resource communication mechanisms,
both of which may be improved on-the-fly (e.g., code-on-demand). [Failure here implies
that out-of-band information is driving interaction instead of hypertext.]
</p>
        </blockquote>
        <p>
An interesting "fuzzy gray area" here is whether or not the client's knowledge of
a variant or schematic structure of XML could be considered to be a "standardized
media type", but I'm willing to bet that Fielding will argue against it on the grounds
that your application's XML schema is not "standardized" (unless, of course, it is,
through a national/international/industry standardization effort).
</p>
        <p>
But in case you'd missed it, let me summarize the past twenty or so paragraphs: <em>hypermedia
is a core requirement to being RESTful.</em> If you ain't slinging all of your application
state back and forth in hypertext, you ain't REST. Period. Fielding said it, he defined
it, and that settles it.
</p>
        <p>
 
</p>
        <p>
Before the hate mail comes a-flyin', let me reiterate one vitally important point: <em>if
you're not doing REST, it doesn't mean that your API sucks.</em> Fielding may have
his definition of what REST is, and the idealist in me wants to remain true to his
definitions of it (after all, if we can't agree on a common set of definitions, a
common lexicon, then we can't really make much progress as an industry), but...
</p>
        <p>
... the pragmatist in me keeps saying, "so what"?
</p>
        <p>
Look, at the end of the day, if your system wants to misuse HTTP, abuse HTML, and
carnally violate the principles of loose coupling and resource representation that
underlie REST, who cares? Do you get special bonus points from the Apache Foundation
if you use HTTP in the way Fielding intended? Will Microsoft and Oracle and Sun and
IBM offer you discounts on your next software purchases if you create a REST-faithful
system? Will the partisan politics in Washington, or the tribal conflicts in the Middle
East, or even the widely-misnamed "REST-vs-SOAP" debates come to an end if you only
figure out a way to make hypermedia the core engine of your application state?
</p>
        <p>
Yeah, I didn't think so, either.
</p>
        <p>
Point is, REST is <em>just</em> an architectural style. It is nothing more than another
entry alongside such things as client-server, <em>n</em>-tier, distributed objects,
service-oriented, and embedded systems. REST is just a tool for thinking about how
to build an application, and it's high time we kick it off the pedastal on which we've
placed it and let it come back down to earth with the rest of us mortals. HTTP is
useful, but not sufficient, so solve our problems. REST is as well.
</p>
        <p>
And at the end of the day, when we put one tool from our tool belt "above all others",
we end up building some truly horrendous crap.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=44481f40-dbca-438c-9398-2ed93a3d62d8" />
        <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>REST != HTTP</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,44481f40-dbca-438c-9398-2ed93a3d62d8.aspx</guid>
      <link>http://blogs.tedneward.com/2008/11/07/REST+HTTP.aspx</link>
      <pubDate>Fri, 07 Nov 2008 05:34:23 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven"&gt;Roy
Fielding has weighed in&lt;/a&gt; on the recent "buzzwordiness" (hey, if Colbert can make
up "truthiness", then I can make up "buzzwordiness") of calling everything a "REST
API", a tactic that has become more &lt;em&gt;en vogue&lt;/em&gt; of late as vendors discover
that the general programming population is finding the WSDL-based XML services stack
too complex to navigate successfully for all but the simplest of projects. Contrary
to what many RESTafarians may be hoping, Roy doesn't gather all these wayward children
to his breast and praise their anti-vendor/anti-corporate/anti-proprietary efforts,
but instead, blasts them pretty seriously for mangling his term:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I am getting frustrated by the number of people calling any HTTP-based interface a
REST API. Today’s example is the &lt;a href="http://wikis.glassfish.org/socialsite/Wiki.jsp?page=FinalizeRESTAPI"&gt;SocialSite
REST API&lt;/a&gt;. That is RPC. It screams RPC. There is so much coupling on display that
it should be given an X rating.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ouch. "So much coupling on display that it should be given an X rating." I have to
remember that phrase--that's a keeper. And I'm shocked that Roy even knows what an
X rating is; he's such a mellow guy with such an innocent-looking face, I would've
bet money he'd never run into one before. &lt;em&gt;(Yes, people, that's a joke.)&lt;/em&gt; &lt;blockquote&gt; 
&lt;p&gt;
What needs to be done to make the REST architectural style clear on the notion that
hypertext is a constraint? In other words, if the engine of application state (and
hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot
be a REST API. Period. Is there some broken manual somewhere that needs to be fixed?
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Go Roy!
&lt;/p&gt;
&lt;p&gt;
For those of you who've &lt;em&gt;not&lt;/em&gt; read Roy's thesis, and are thinking that this
is some kind of betrayal or trick, let's first of all point out that at no point is
Roy saying that your nifty HTTP-based API is not &lt;em&gt;useful&lt;/em&gt; or &lt;em&gt;simple&lt;/em&gt;.
He's simply saying that it isn't &lt;em&gt;RESTful&lt;/em&gt;. That's a key differentiation. REST
has a specific set of goals and constraints it was trying to meet, and as such prescribes
a particular kind of architectural style to fit within those constraints. (Yes, REST
is essentially an architectural pattern: a solution to a problem within a certain
context that yields certain consequences.)
&lt;/p&gt;
&lt;p&gt;
Assuming you haven't tuned me out completely already, allow me to elucidate. In Chapter
5 of &lt;a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"&gt;Roy's
thesis&lt;/a&gt;, Roy begins to build up the style that will ultimately be considered REST.
I'm not going to quote each and every step here--that's what the hyperlink above is
for--but simply call out certain parts. For example, in section 5.1.3, "Stateless",
he suggests that this architectural style should be stateless in nature, and explains
why; the emphasis/italics are mine:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
We next add a constraint to the client-server interaction: communication must be stateless
in nature, as in the client-stateless-server (CSS) style of Section 3.4.3 (Figure
5-3), such that &lt;em&gt;each request from client to server must contain all of the information
necessary to understand the request&lt;/em&gt;, and cannot take advantage of any stored
context on the server. &lt;em&gt;Session state is therefore kept entirely on the client&lt;/em&gt;. 
&lt;p&gt;
This constraint induces the properties of visibility, reliability, and scalability.
Visibility is improved because a monitoring system does not have to look beyond a
single request datum in order to determine the full nature of the request. Reliability
is improved because it eases the task of recovering from partial failures [133]. Scalability
is improved because not having to store state between requests allows the server component
to quickly free resources, and further simplifies implementation because the server
doesn't have to manage resource usage across requests. 
&lt;p&gt;
Like most architectural choices, the stateless constraint reflects a design trade-off.
The disadvantage is that it may decrease network performance by increasing the repetitive
data (per-interaction overhead) sent in a series of requests, since that data cannot
be left on the server in a shared context. In addition, placing the application state
on the client-side reduces the server's control over consistent application behavior,
since the application becomes dependent on the correct implementation of semantics
across multiple client versions.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In the HTTP case, the state is contained entirely in the document itself, the hypertext.
This has a couple of implications for those of us building "distributed applications",
such as the very real consideration that there's a &lt;em&gt;lot&lt;/em&gt; of state we don't
necessarily want to be sending back to the client, such as voluminous information
(the user's e-commerce shopping cart contents) or sensitive information (the user's
credentials or single-signon authentication/authorization token). This is a bitter
pill to swallow for the application development world, because much of the applications
we develop have some pretty hefty notions of server-based state management that we
want or need to preserve, either for legacy support reasons, for legitimate concerns
(network bandwidth or security), or just for ease-of-understanding. Fielding isn't
apologetic about it, though--look at the third paragraph above. "[T]he stateless constraint
reflects a design trade-off."
&lt;/p&gt;
&lt;p&gt;
In other words, if you don't like it, fine, don't follow it, but understand that if
you're not leaving all the application state on the client, you're not doing REST.
&lt;/p&gt;
&lt;p&gt;
By the way, note that technically, HTTP is not tied to HTML, since the document sent
back and forth could easily be a PDF document, too, particularly since PDF supports
hyperlinks to other PDF documents. Nowhere in the thesis do we see the idea that it &lt;em&gt;has&lt;/em&gt; to
be HTML flying back and forth.
&lt;/p&gt;
&lt;p&gt;
Roy's thesis continues on in the same vein; in section 5.1.4 he describes how "client-cache-stateless-server"
provides some additional reliability and performance, but only if the data in the
cache is consistent and not stale, which was fine for static documents, but not for
dynamic content such as image maps. Extensions were necessary in order to accomodate
the new ideas.
&lt;/p&gt;
&lt;p&gt;
In section 5.1.5 ("Uniform Interface") we get to another stinging rebuke of REST as
a generalized distributed application scheme; again, the emphasis is mine:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
The central feature that distinguishes the REST architectural style from other network-based
styles is its emphasis on a uniform interface between components (Figure 5-6). By
applying the software engineering principle of generality to the component interface,
the overall system architecture is simplified and the visibility of interactions is
improved. Implementations are decoupled from the services they provide, which encourages
independent evolvability. The trade-off, though, is that a uniform interface degrades
efficiency, since information is transferred in a standardized form rather than one
which is specific to an application's needs. The REST interface is designed to be
efficient for large-grain hypermedia data transfer, optimizing for the common case
of the Web, but resulting in an interface that is not optimal for other forms of architectural
interaction. 
&lt;p&gt;
In order to obtain a uniform interface, multiple architectural constraints are needed
to guide the behavior of components. &lt;em&gt;REST is defined by four interface constraints&lt;/em&gt;:
identification of resources; manipulation of resources through representations; self-descriptive
messages; and, &lt;em&gt;hypermedia as the engine of application state&lt;/em&gt;. These constraints
will be discussed in Section 5.2.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In other words, in order to be doing something that Fielding considers RESTful, you
have to be using hypermedia (that is to say, hypertext documents of some form) as
the core of your application state. It might seem like this implies that you have
to be building a Web application in order to be considered building something RESTful,
so therefore all Web apps are RESTful by nature, but pay close attention to the wording:
hypermedia must be the &lt;em&gt;core&lt;/em&gt; of your application state. The way most Web apps
are built today, HTML is clearly not the core of the state, but merely a way to render
it. This is the accidental consequence of treating Web applications and desktop client
applications as just pale reflections of one another.
&lt;/p&gt;
&lt;p&gt;
The next section, 5.1.6 ("Layered System") again builds on the notion of stateless-server
architecture to provide additional flexibility and power:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
In order to further improve behavior for Internet-scale requirements, we add layered
system constraints (Figure 5-7). As described in Section 3.4.2, the layered system
style allows an architecture to be composed of hierarchical layers by constraining
component behavior such that each component cannot "see" beyond the immediate layer
with which they are interacting. By restricting knowledge of the system to a single
layer, we place a bound on the overall system complexity and promote substrate independence.
Layers can be used to encapsulate legacy services and to protect new services from
legacy clients, simplifying components by moving infrequently used functionality to
a shared intermediary. Intermediaries can also be used to improve system scalability
by enabling load balancing of services across multiple networks and processors. 
&lt;p&gt;
The primary disadvantage of layered systems is that they add overhead and latency
to the processing of data, reducing user-perceived performance [32].&lt;em&gt; For a network-based
system that supports cache constraints, this can be offset by the benefits of shared
caching at intermediaries.&lt;/em&gt; Placing shared caches at the boundaries of an organizational
domain can result in significant performance benefits [136]. Such layers also allow
security policies to be enforced on data crossing the organizational boundary, as
is required by firewalls [79]. 
&lt;p&gt;
The combination of layered system and uniform interface constraints induces architectural
properties similar to those of the uniform pipe-and-filter style (Section 3.2.2).
Although REST interaction is two-way, the large-grain data flows of hypermedia interaction
can each be processed like a data-flow network, with filter components selectively
applied to the data stream in order to transform the content as it passes [26]. &lt;em&gt;Within
REST, intermediary components can actively transform the content of messages because
the messages are self-descriptive and their semantics are visible to intermediaries.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The potential of layered systems (itself not something that people building RESTful
approaches seem to think much about) is only realized if the entirety of the state
being transferred is self-descriptive and visible to the intermediaries--in other
words, intermediaries can only be helpful and/or non-performance-inhibitive if they
have free reign to make decisions based on the state they see being transferred. If
something isn't present in the state being transferred, usually because there is server-side
state being maintained, then they have to be concerned about silently changing the
semantics of what is happening in the interaction, and intermediaries--and layers
as a whole--become a liability. (Which is probably why so few systems seem to do it.)
&lt;/p&gt;
&lt;p&gt;
And if the notion of visible, transported state is not yet made clear in his dissertation,
Fielding dissects the discussion even further in section 5.2.1, "Data Elements". It's
too long to reprint here in its entirety, and frankly, reading the whole thing is
necessary to see the point of hypermedia and its place in the whole system. (The same
could be said of the entire chapter, in fact.) But it's pretty clear, once you read
the dissertation, that hypermedia/hypertext is a core, critical piece to the whole
REST construction. Clients are expected, in a RESTful system, to have &lt;em&gt;no&lt;/em&gt; preconceived
notions of structure or relationship between resources, and discover all of that through
the state of the hypertext documents that are sent back to them. In the HTML case,
that discovery occurs inside the human brain; in the SOA/services case, that discovery
is much harder to define and describe. RDF and Semantic Web ideas may be of some help
here, but JSON can't, and simple XML can't, unless the client has some preconceived
notion of what the XML structure looks like, which violates Fielding's rules:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
A REST API should be entered with no prior knowledge beyond the initial URI (bookmark)
and set of standardized media types that are appropriate for the intended audience
(i.e., expected to be understood by any client that might use the API). From that
point on, all application state transitions must be driven by client selection of
server-provided choices that are present in the received representations or implied
by the user’s manipulation of those representations. The transitions may be determined
(or limited by) the client’s knowledge of media types and resource communication mechanisms,
both of which may be improved on-the-fly (e.g., code-on-demand). [Failure here implies
that out-of-band information is driving interaction instead of hypertext.]
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
An interesting "fuzzy gray area" here is whether or not the client's knowledge of
a variant or schematic structure of XML could be considered to be a "standardized
media type", but I'm willing to bet that Fielding will argue against it on the grounds
that your application's XML schema is not "standardized" (unless, of course, it is,
through a national/international/industry standardization effort).
&lt;/p&gt;
&lt;p&gt;
But in case you'd missed it, let me summarize the past twenty or so paragraphs: &lt;em&gt;hypermedia
is a core requirement to being RESTful.&lt;/em&gt; If you ain't slinging all of your application
state back and forth in hypertext, you ain't REST. Period. Fielding said it, he defined
it, and that settles it.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Before the hate mail comes a-flyin', let me reiterate one vitally important point: &lt;em&gt;if
you're not doing REST, it doesn't mean that your API sucks.&lt;/em&gt; Fielding may have
his definition of what REST is, and the idealist in me wants to remain true to his
definitions of it (after all, if we can't agree on a common set of definitions, a
common lexicon, then we can't really make much progress as an industry), but...
&lt;/p&gt;
&lt;p&gt;
... the pragmatist in me keeps saying, "so what"?
&lt;/p&gt;
&lt;p&gt;
Look, at the end of the day, if your system wants to misuse HTTP, abuse HTML, and
carnally violate the principles of loose coupling and resource representation that
underlie REST, who cares? Do you get special bonus points from the Apache Foundation
if you use HTTP in the way Fielding intended? Will Microsoft and Oracle and Sun and
IBM offer you discounts on your next software purchases if you create a REST-faithful
system? Will the partisan politics in Washington, or the tribal conflicts in the Middle
East, or even the widely-misnamed "REST-vs-SOAP" debates come to an end if you only
figure out a way to make hypermedia the core engine of your application state?
&lt;/p&gt;
&lt;p&gt;
Yeah, I didn't think so, either.
&lt;/p&gt;
&lt;p&gt;
Point is, REST is &lt;em&gt;just&lt;/em&gt; an architectural style. It is nothing more than another
entry alongside such things as client-server, &lt;em&gt;n&lt;/em&gt;-tier, distributed objects,
service-oriented, and embedded systems. REST is just a tool for thinking about how
to build an application, and it's high time we kick it off the pedastal on which we've
placed it and let it come back down to earth with the rest of us mortals. HTTP is
useful, but not sufficient, so solve our problems. REST is as well.
&lt;/p&gt;
&lt;p&gt;
And at the end of the day, when we put one tool from our tool belt "above all others",
we end up building some truly horrendous crap.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=44481f40-dbca-438c-9398-2ed93a3d62d8" /&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,44481f40-dbca-438c-9398-2ed93a3d62d8.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>F#</category>
      <category>Flash</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Reading</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=97495cb3-1448-4b63-a607-8472d5d2a159</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,97495cb3-1448-4b63-a607-8472d5d2a159.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,97495cb3-1448-4b63-a607-8472d5d2a159.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=97495cb3-1448-4b63-a607-8472d5d2a159</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently, a blog reader asked me if I wasn't doing any speaking any more since I'd
joined ThoughtWorks, and that's when I realized I'd been bad about updating my speaking
calendar on the website. Sorry, all; no, ThoughtWorks didn't pull my conference visa
or anything, I've just been bad about keeping it up to date. I'll fix that ASAP, but
in the meantime, three events that I'll be at in the coming wintry months include:
</p>
        <h3>
          <a href="http://www.oredev.org/">Øredev 2008</a>: 19 - 21 November, Malmoe, Sweden
</h3>
        <p>
Øredev will be a first for me, and I've ben invited to give a keynote there, along
with a few technical sessions. I'm also told that .NET Rocks! will be on hand, and
that they want to record a session, on whichever topic happens to cross the curious,
crafty and cunning Carl, or the uh... the uh... sorry, Richard, there's just no good
"R" adjectives I can use here. I mean, "rough" and "ready" don't exactly sound flattering
in this context, right? Sorry, man.
</p>
        <p>
In any event, I'm looking forward to this event, because it's a curious mix of technologies
and ideas (agile, ALT.NET, Java, core .NET, languages, and so on), and because I've
never been to Sweden before. One more European country, off my bucket list! :-)
</p>
        <p>
(Yes, I had to cut-and-paste the Ø wherever I needed it. *grin*)
</p>
        <h3>
        </h3>
        <h3>
          <a href="http://www.devteach.com">DevTeach 2008</a>: 1 - 5 December, Montreal,
Quebec (Canada)
</h3>
        <p>
This has been one of my favorite shows since it began, way back in 2003, and a large
part of that love has to do with the cast and crew of characters that I see there
every year: Julie Lerman, Peter DeBetta, Carl and Richard (again!), Beth Massi, "Yag"
Griver, Mario Cardinal and the rest of the Quebecois posse, Ayende, plus some new
faces and friends, like Jessica Moss and James Kovacs. (Oh, and for the record, folks,
for those of you who are <em>still</em> talking about it, the O/R-M smackdown of a
year ago was staged. It was all fake. Ayende and I are really actually friends, we
were paid a great deal of money by Carl and Richard to make it sound good, and in
fact, we both agree that the only place anybody should really ever store their data
is in an XML database.)
</p>
        <p>
If you're near Montreal, and you're a .NET dev, you really owe it to yourself to check
this show out.
</p>
        <p>
          <strong>Update:</strong> I just got this email from Jean-Rene, the guy who runs DevTeach:
</p>
        <blockquote>
          <p>
Every attendees will get Visual Studio 2008 Pro, Expression Web 2 and Tech-Ed DEV
set in their bag! 
</p>
          <p>
DevTeach believe that all developers need the right tool to be productive. This is
what we will give you, free software, when you register to DevTeach or SQLTeach. Yes
that right! We’re pleased to announce that we’re giving over a 1000$ of software when
you register to DevTeach. You will find in your conference bag a version of Visual
Studio 2008 Professional, ExpressionTM Web 2 and the Tech-Ed Conference DVD Set. Is
this a good deal or what? DevTeach and SQLTeach are really the training you can’t
get any other way. 
</p>
        </blockquote>
        <p>
Not bad. Not bad at all.
</p>
        <h3>
          <a href="http://www.devoxx.com/display/JV08/Home">DeVoxx 2008</a>: 8 - 12 December,
Antwerp, Belgium
</h3>
        <p>
DeVoxx, the recently-renamed-formerly-named-JavaPolis conference, has brought me back
to team up with Bill Venners to do a University session on Scala, and to record a
few more of those Parlays videos that people can't seem to get enough of. Given that
this show always seems to draw some of the Java world's best and brightest, I'm definitely
looking forward to the chance to point the mike at somebody's grill and give 'em hell!
Plus, I love Belgium, and I'm looking forward to getting back there. The fact that
it's going to be the middle of winter is only a bonus, as... wait... Belgium, in the
middle of winter? Whose bright idea was that?
</p>
        <p>
(And finally, a show that Carl and Richard won't be at!)
</p>
        <p>
 
</p>
        <p>
Meanwhile, I promise to keep the "Upcoming Events" up to date for 2009. Seriously.
I mean it. :-)
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=97495cb3-1448-4b63-a607-8472d5d2a159" />
        <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>Winter Travels: &amp;Oslash;redev, DevTeach, DeVoxx</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,97495cb3-1448-4b63-a607-8472d5d2a159.aspx</guid>
      <link>http://blogs.tedneward.com/2008/11/06/Winter+Travels+Oslashredev+DevTeach+DeVoxx.aspx</link>
      <pubDate>Thu, 06 Nov 2008 08:14:17 GMT</pubDate>
      <description>&lt;p&gt;
Recently, a blog reader asked me if I wasn't doing any speaking any more since I'd
joined ThoughtWorks, and that's when I realized I'd been bad about updating my speaking
calendar on the website. Sorry, all; no, ThoughtWorks didn't pull my conference visa
or anything, I've just been bad about keeping it up to date. I'll fix that ASAP, but
in the meantime, three events that I'll be at in the coming wintry months include:
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.oredev.org/"&gt;Øredev 2008&lt;/a&gt;: 19 - 21 November, Malmoe, Sweden
&lt;/h3&gt;
&lt;p&gt;
Øredev will be a first for me, and I've ben invited to give a keynote there, along
with a few technical sessions. I'm also told that .NET Rocks! will be on hand, and
that they want to record a session, on whichever topic happens to cross the curious,
crafty and cunning Carl, or the uh... the uh... sorry, Richard, there's just no good
"R" adjectives I can use here. I mean, "rough" and "ready" don't exactly sound flattering
in this context, right? Sorry, man.
&lt;/p&gt;
&lt;p&gt;
In any event, I'm looking forward to this event, because it's a curious mix of technologies
and ideas (agile, ALT.NET, Java, core .NET, languages, and so on), and because I've
never been to Sweden before. One more European country, off my bucket list! :-)
&lt;/p&gt;
&lt;p&gt;
(Yes, I had to cut-and-paste the Ø wherever I needed it. *grin*)
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;&lt;a href="http://www.devteach.com"&gt;DevTeach 2008&lt;/a&gt;: 1 - 5 December, Montreal,
Quebec (Canada)
&lt;/h3&gt;
&lt;p&gt;
This has been one of my favorite shows since it began, way back in 2003, and a large
part of that love has to do with the cast and crew of characters that I see there
every year: Julie Lerman, Peter DeBetta, Carl and Richard (again!), Beth Massi, "Yag"
Griver, Mario Cardinal and the rest of the Quebecois posse, Ayende, plus some new
faces and friends, like Jessica Moss and James Kovacs. (Oh, and for the record, folks,
for those of you who are &lt;em&gt;still&lt;/em&gt; talking about it, the O/R-M smackdown of a
year ago was staged. It was all fake. Ayende and I are really actually friends, we
were paid a great deal of money by Carl and Richard to make it sound good, and in
fact, we both agree that the only place anybody should really ever store their data
is in an XML database.)
&lt;/p&gt;
&lt;p&gt;
If you're near Montreal, and you're a .NET dev, you really owe it to yourself to check
this show out.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; I just got this email from Jean-Rene, the guy who runs DevTeach:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Every attendees will get Visual Studio 2008 Pro, Expression Web 2 and Tech-Ed DEV
set in their bag! 
&lt;p&gt;
DevTeach believe that all developers need the right tool to be productive. This is
what we will give you, free software, when you register to DevTeach or SQLTeach. Yes
that right! We’re pleased to announce that we’re giving over a 1000$ of software when
you register to DevTeach. You will find in your conference bag a version of Visual
Studio 2008 Professional, ExpressionTM Web 2 and the Tech-Ed Conference DVD Set. Is
this a good deal or what? DevTeach and SQLTeach are really the training you can’t
get any other way. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Not bad. Not bad at all.
&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.devoxx.com/display/JV08/Home"&gt;DeVoxx 2008&lt;/a&gt;: 8 - 12 December,
Antwerp, Belgium
&lt;/h3&gt;
&lt;p&gt;
DeVoxx, the recently-renamed-formerly-named-JavaPolis conference, has brought me back
to team up with Bill Venners to do a University session on Scala, and to record a
few more of those Parlays videos that people can't seem to get enough of. Given that
this show always seems to draw some of the Java world's best and brightest, I'm definitely
looking forward to the chance to point the mike at somebody's grill and give 'em hell!
Plus, I love Belgium, and I'm looking forward to getting back there. The fact that
it's going to be the middle of winter is only a bonus, as... wait... Belgium, in the
middle of winter? Whose bright idea was that?
&lt;/p&gt;
&lt;p&gt;
(And finally, a show that Carl and Richard won't be at!)
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Meanwhile, I promise to keep the "Upcoming Events" up to date for 2009. Seriously.
I mean it. :-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=97495cb3-1448-4b63-a607-8472d5d2a159" /&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,97495cb3-1448-4b63-a607-8472d5d2a159.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>F#</category>
      <category>Java/J2EE</category>
      <category>Languages</category>
      <category>Ruby</category>
      <category>Security</category>
      <category>Visual Basic</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=94fda66c-4dda-438c-af27-a53a8e0692c8</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=94fda66c-4dda-438c-af27-a53a8e0692c8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently, a former student asked me,
</p>
        <blockquote>
          <p>
I was in a .NET web services training class that you gave probably 4 or so years ago
on-site at a <em>[company name]</em> office in <em>[city]</em>, north of Atlanta. 
At that time I asked you for a list of the technical blogs that you read, and I am
curious which blogs you are reading now.  I am now with a small company where
I have to be a jack of all trades, in the last year I have worked in C++ and Perl
backend type projects and web frontend projects with Java, C#, and RoR, so I find
your perspective interesting since you also work with various technologies and aren't
a zealot for a specific one.
</p>
          <p>
Any way, please either respond by email or in your blog, because I think that others
may be interested in the list also.
</p>
        </blockquote>
        <p>
As one might expect, my blog list is a bit eclectic, but I suppose that's part of
the charm of somebody looking to study Java, .NET, C++, Smalltalk, Ruby, Parrot, LLVM,
and other languages and environments. So, without further ado, I've pasted in the
contents of my OPML file for cut&amp;paste and easy import.
</p>
        <p>
Having said that, though, I would strongly suggest <em>not</em> just blindly importing
the whole set of feeds into your nearest RSS reader, but take a moment and go visit
each one before you add it. It takes longer, granted, but the time spent is a worthy
investment--you don't want to have to declare "blog bankruptcy".
</p>
        <blockquote>
          <p>
            <em>Editor's note: We pause here as readers look at each other and go... "WTF?!?"</em>
          </p>
        </blockquote>
        <p>
"Blog bankruptcy" is a condition similar to "email bankruptcy", when otherwise perfectly
high-functioning people give up on trying to catch up to the flood of messages in
their email client's Inbox and delete the whole mess (usually with some kind of public
apology explaining why and asking those who've emailed them in the past to resend
something if it was really important), effectively trying to "start over" with their
email in much the same way that Chapter Seven or Chapter Eleven allows companies to
"start over" with their creditors, or declaring bankruptcy allows private citizens
to do the same with theirs. "Blog bankruptcy" is a similar kind of condition: your
RSS reader becomes so full of stuff that you can't keep up, and you can't even remember
which blogs were the interesting ones, so you nuke the whole thing and get away from
the blog-reading thing for a while.
</p>
        <p>
This happened to me, in fact: a few years ago, when I became the editor-in-chief of
TheServerSide.NET, I asked a few folks for their OPML lists, so that I could quickly
and easily build a list of blogs that would "tune me in" to the software industry
around me, and many of them quite agreeably complied. I took my RSS reader (Newsgator,
at the time) and dutifully imported all of them, and ended up with a collection of
blogs that was easily into the hundreds of feeds long. And, over time, I found myself
reading fewer and fewer blogs, mostly because the whole set was so... <em>intimidating</em>.
I mean, I would pick at the list of blogs and their entries in the same way that I
picked at vegetables on my plate as a child--half-heartedly, with no real enthusiasm,
as if this was something my parents were forcing me to do. That just ruined the experience
of blog-reading for me, and eventually (after I left TSS.NET for other pastures),
I nuked the whole thing--even going so far as to uninstall my copy of Newsgator--and
gave up.
</p>
        <p>
Naturally, I missed it, and slowly over time began to rebuild the list, this time,
taking each feed one at a time, carefully weighing what value the feed was to me and
selecting only those that I thought had a high signal-to-noise ratio. (This is partly
why I don't include much "personal" info in this blog--I found myself routinely stripping
away those blogs that had more personal content and less technical content, and I
figured if I didn't want to read it, others probably felt the same way.) Over the
last year or two, I've rebuilt the list to the point where I probably need to prune
a bit and close a few of them back down, but for now, I'm happy with the list I've
got.
</p>
        <p>
And speaking of which....
</p>
        <div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum1" style="color: #606060"> 1:</span>
              <span style="color: #0000ff">&lt;?</span>
              <span style="color: #800000">xml</span>
              <span style="color: #ff0000">version</span>
              <span style="color: #0000ff">="1.0"</span>?<span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum2" style="color: #606060"> 2:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">opml</span>
              <span style="color: #ff0000">version</span>
              <span style="color: #0000ff">="1.0"</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum3" style="color: #606060"> 3:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">head</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum4" style="color: #606060"> 4:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">title</span>
              <span style="color: #0000ff">&gt;</span>OPML
exported from Outlook<span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum5" style="color: #606060"> 5:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">dateCreated</span>
              <span style="color: #0000ff">&gt;</span>Thu,
15 May 2008 20:55:19 -0700<span style="color: #0000ff">&lt;/</span><span style="color: #800000">dateCreated</span><span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum6" style="color: #606060"> 6:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">dateModified</span>
              <span style="color: #0000ff">&gt;</span>Thu,
15 May 2008 20:55:19 -0700<span style="color: #0000ff">&lt;/</span><span style="color: #800000">dateModified</span><span style="color: #0000ff">&gt;</span></pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum7" style="color: #606060"> 7:</span>
              <span style="color: #0000ff">&lt;/</span>
              <span style="color: #800000">head</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum8" style="color: #606060"> 8:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">body</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum9" style="color: #606060"> 9:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="If
broken it is, fix it you should"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum10" style="color: #606060"> 10:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/tess/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum11" style="color: #606060"> 11:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Artima
Developer Buzz"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum12" style="color: #606060"> 12:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.artima.com/news/feeds/news.rss"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum13" style="color: #606060"> 13:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Artima
Weblogs"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum14" style="color: #606060"> 14:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.artima.com/weblogs/feeds/weblogs.rss"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum15" style="color: #606060"> 15:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Artima
Chapters Library"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum16" style="color: #606060"> 16:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.artima.com/chapters/feeds/chapters.rss"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum17" style="color: #606060"> 17:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Neal
Gafter's blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum18" style="color: #606060"> 18:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://gafter.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum19" style="color: #606060"> 19:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Room
101"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum20" style="color: #606060"> 20:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://gbracha.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum21" style="color: #606060"> 21:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Kelly
O'Hair's Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum22" style="color: #606060"> 22:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://weblogs.java.net/blog/kellyohair/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum23" style="color: #606060"> 23:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="John
Rose @ Sun"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum24" style="color: #606060"> 24:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.sun.com/jrose/feed/entries/atom"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum25" style="color: #606060"> 25:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="The
Daily WTF"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum26" style="color: #606060"> 26:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://syndication.thedailywtf.com/TheDailyWtf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum27" style="color: #606060"> 27:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Brad
Wilson"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum28" style="color: #606060"> 28:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/BradWilson"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum29" style="color: #606060"> 29:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Mike
Stall's .NET Debugging Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum30" style="color: #606060"> 30:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/jmstall/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum31" style="color: #606060"> 31:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Stevey's
Blog Rants"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum32" style="color: #606060"> 32:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://steve-yegge.blogspot.com/atom.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum33" style="color: #606060"> 33:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Brendan's
Roadmap Updates"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum34" style="color: #606060"> 34:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://weblogs.mozillazine.org/roadmap/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum35" style="color: #606060"> 35:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="pl
patterns"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum36" style="color: #606060"> 36:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://plpatterns.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum37" style="color: #606060"> 37:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Joel
Pobar's weblog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum38" style="color: #606060"> 38:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/callvirt"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum39" style="color: #606060"> 39:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Let&amp;amp;#39;s
Kill Dave!"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum40" style="color: #606060"> 40:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://letskilldave.com/rss.aspx"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum41" style="color: #606060"> 41:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Why
does everything suck?"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum42" style="color: #606060"> 42:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://whydoeseverythingsuck.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum43" style="color: #606060"> 43:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="cdiggins.com"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://cdiggins.com/feed"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum44" style="color: #606060"> 44:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="LukeH's
WebLog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum45" style="color: #606060"> 45:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/lukeh/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum46" style="color: #606060"> 46:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Jomo
Fisher -- Sharp Things"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum47" style="color: #606060"> 47:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/jomo_fisher/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum48" style="color: #606060"> 48:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Chance
Coble"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum49" style="color: #606060"> 49:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://leibnizdream.wordpress.com/feed/"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum50" style="color: #606060"> 50:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Don
Syme's WebLog on F# and Other Research Projects"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum51" style="color: #606060"> 51:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/dsyme/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum52" style="color: #606060"> 52:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="David
Broman's CLR Profiling API Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum53" style="color: #606060"> 53:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/davbr/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum54" style="color: #606060"> 54:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="JScript
Blog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum55" style="color: #606060"> 55:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/jscript/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum56" style="color: #606060"> 56:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Yet
Another Language Geek"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum57" style="color: #606060"> 57:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://blogs.msdn.com/wesdyer/rss.xml"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum58" style="color: #606060"> 58:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">=".NET
Languages Weblog"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum59" style="color: #606060"> 59:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.dotnetlanguages.net/DNL/Rss.aspx"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum60" style="color: #606060"> 60:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="DevHawk"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum61" style="color: #606060"> 61:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/Devhawk"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum62" style="color: #606060"> 62:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="The
Cobra Programming Language"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum63" style="color: #606060"> 63:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://cobralang.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum64" style="color: #606060"> 64:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Code
Miscellany"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum65" style="color: #606060"> 65:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://codemiscellany.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum66" style="color: #606060"> 66:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Fred,
Let it go!"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum67" style="color: #606060"> 67:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://freddy33.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum68" style="color: #606060"> 68:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Codedependent"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum69" style="color: #606060"> 69:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://graphics-geek.blogspot.com/feeds/posts/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum70" style="color: #606060"> 70:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Presentation
Zen"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum71" style="color: #606060"> 71:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://www.presentationzen.com/presentationzen/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum72" style="color: #606060"> 72:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="The
Extreme Presentation(tm) Method"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum73" style="color: #606060"> 73:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://extremepresentation.typepad.com/blog/index.rdf"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum74" style="color: #606060"> 74:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="ZapThink"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum75" style="color: #606060"> 75:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/zapthink"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum76" style="color: #606060"> 76:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Chris
Smith's completely unique view"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum77" style="color: #606060"> 77:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.feedburner.com/ChrisSmithsCompletelyUniqueView"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum78" style="color: #606060"> 78:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Code
Commit"</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum79" style="color: #606060"> 79:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://feeds.codecommit.com/codecommit"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum80" style="color: #606060"> 80:</span>
              <span style="color: #0000ff">&lt;</span>
              <span style="color: #800000">outline</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum81" style="color: #606060"> 81:</span>
              <span style="color: #ff0000">text</span>
              <span style="color: #0000ff">="Comments
on Ola Bini: Programming Language Synchronicity: A New Hope: Polyglotism"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum82" style="color: #606060"> 82:</span>
              <span style="color: #ff0000">type</span>
              <span style="color: #0000ff">="rss"</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum83" style="color: #606060"> 83:</span>
              <span style="color: #ff0000">xmlUrl</span>
              <span style="color: #0000ff">="http://ola-bini.blogspot.com/feeds/5778383724683099288/comments/default"</span>
              <span style="color: #0000ff">/&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum84" style="color: #606060"> 84:</span>
              <span style="color: #0000ff">&lt;/</span>
              <span style="color: #800000">body</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span id="lnum85" style="color: #606060"> 85:</span>
              <span style="color: #0000ff">&lt;/</span>
              <span style="color: #800000">opml</span>
              <span style="color: #0000ff">&gt;</span>
            </pre>
            <!--CRLF-->
          </div>
        </div>
        <p>
Happy reading.....
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=94fda66c-4dda-438c-af27-a53a8e0692c8" />
        <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>Blogs I'm currently reading</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</guid>
      <link>http://blogs.tedneward.com/2008/05/16/Blogs+Im+Currently+Reading.aspx</link>
      <pubDate>Fri, 16 May 2008 07:08:07 GMT</pubDate>
      <description>&lt;p&gt;
Recently, a former student asked me,
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
I was in a .NET web services training class that you gave probably 4 or so years ago
on-site at a &lt;em&gt;[company name]&lt;/em&gt; office in &lt;em&gt;[city]&lt;/em&gt;, north of Atlanta.&amp;nbsp;
At that time I asked you for a list of the technical blogs that you read, and I am
curious which blogs you are reading now.&amp;nbsp; I am now with a small company where
I have to be a jack of all trades, in the last year I have worked in C++ and Perl
backend type projects and web frontend projects with Java, C#, and RoR, so I find
your perspective interesting since you also work with various technologies and aren't
a zealot for a specific one.
&lt;/p&gt;
&lt;p&gt;
Any way, please either respond by email or in your blog, because I think that others
may be interested in the list also.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As one might expect, my blog list is a bit eclectic, but I suppose that's part of
the charm of somebody looking to study Java, .NET, C++, Smalltalk, Ruby, Parrot, LLVM,
and other languages and environments. So, without further ado, I've pasted in the
contents of my OPML file for cut&amp;amp;paste and easy import.
&lt;/p&gt;
&lt;p&gt;
Having said that, though, I would strongly suggest &lt;em&gt;not&lt;/em&gt; just blindly importing
the whole set of feeds into your nearest RSS reader, but take a moment and go visit
each one before you add it. It takes longer, granted, but the time spent is a worthy
investment--you don't want to have to declare "blog bankruptcy".
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Editor's note: We pause here as readers look at each other and go... "WTF?!?"&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
"Blog bankruptcy" is a condition similar to "email bankruptcy", when otherwise perfectly
high-functioning people give up on trying to catch up to the flood of messages in
their email client's Inbox and delete the whole mess (usually with some kind of public
apology explaining why and asking those who've emailed them in the past to resend
something if it was really important), effectively trying to "start over" with their
email in much the same way that Chapter Seven or Chapter Eleven allows companies to
"start over" with their creditors, or declaring bankruptcy allows private citizens
to do the same with theirs. "Blog bankruptcy" is a similar kind of condition: your
RSS reader becomes so full of stuff that you can't keep up, and you can't even remember
which blogs were the interesting ones, so you nuke the whole thing and get away from
the blog-reading thing for a while.
&lt;/p&gt;
&lt;p&gt;
This happened to me, in fact: a few years ago, when I became the editor-in-chief of
TheServerSide.NET, I asked a few folks for their OPML lists, so that I could quickly
and easily build a list of blogs that would "tune me in" to the software industry
around me, and many of them quite agreeably complied. I took my RSS reader (Newsgator,
at the time) and dutifully imported all of them, and ended up with a collection of
blogs that was easily into the hundreds of feeds long. And, over time, I found myself
reading fewer and fewer blogs, mostly because the whole set was so... &lt;em&gt;intimidating&lt;/em&gt;.
I mean, I would pick at the list of blogs and their entries in the same way that I
picked at vegetables on my plate as a child--half-heartedly, with no real enthusiasm,
as if this was something my parents were forcing me to do. That just ruined the experience
of blog-reading for me, and eventually (after I left TSS.NET for other pastures),
I nuked the whole thing--even going so far as to uninstall my copy of Newsgator--and
gave up.
&lt;/p&gt;
&lt;p&gt;
Naturally, I missed it, and slowly over time began to rebuild the list, this time,
taking each feed one at a time, carefully weighing what value the feed was to me and
selecting only those that I thought had a high signal-to-noise ratio. (This is partly
why I don't include much "personal" info in this blog--I found myself routinely stripping
away those blogs that had more personal content and less technical content, and I
figured if I didn't want to read it, others probably felt the same way.) Over the
last year or two, I've rebuilt the list to the point where I probably need to prune
a bit and close a few of them back down, but for now, I'm happy with the list I've
got.
&lt;/p&gt;
&lt;p&gt;
And speaking of which....
&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
&lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.0"&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt; 2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;opml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt; 4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;OPML
exported from Outlook&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;dateCreated&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Thu,
15 May 2008 20:55:19 -0700&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;dateCreated&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;dateModified&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Thu,
15 May 2008 20:55:19 -0700&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;dateModified&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="If
broken it is, fix it you should"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt; 10:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/tess/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Artima
Developer Buzz"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt; 12:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.artima.com/news/feeds/news.rss"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt; 13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Artima
Weblogs"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt; 14:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.artima.com/weblogs/feeds/weblogs.rss"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Artima
Chapters Library"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum16" style="color: #606060"&gt; 16:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.artima.com/chapters/feeds/chapters.rss"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum17" style="color: #606060"&gt; 17:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Neal
Gafter's blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum18" style="color: #606060"&gt; 18:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://gafter.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum19" style="color: #606060"&gt; 19:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Room
101"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum20" style="color: #606060"&gt; 20:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://gbracha.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum21" style="color: #606060"&gt; 21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Kelly
O'Hair's Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum22" style="color: #606060"&gt; 22:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://weblogs.java.net/blog/kellyohair/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum23" style="color: #606060"&gt; 23:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="John
Rose @ Sun"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum24" style="color: #606060"&gt; 24:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.sun.com/jrose/feed/entries/atom"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum25" style="color: #606060"&gt; 25:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="The
Daily WTF"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum26" style="color: #606060"&gt; 26:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://syndication.thedailywtf.com/TheDailyWtf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum27" style="color: #606060"&gt; 27:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Brad
Wilson"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum28" style="color: #606060"&gt; 28:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/BradWilson"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum29" style="color: #606060"&gt; 29:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Mike
Stall's .NET Debugging Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum30" style="color: #606060"&gt; 30:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/jmstall/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum31" style="color: #606060"&gt; 31:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Stevey's
Blog Rants"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum32" style="color: #606060"&gt; 32:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://steve-yegge.blogspot.com/atom.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum33" style="color: #606060"&gt; 33:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Brendan's
Roadmap Updates"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum34" style="color: #606060"&gt; 34:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://weblogs.mozillazine.org/roadmap/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum35" style="color: #606060"&gt; 35:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="pl
patterns"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum36" style="color: #606060"&gt; 36:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://plpatterns.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum37" style="color: #606060"&gt; 37:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Joel
Pobar's weblog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum38" style="color: #606060"&gt; 38:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/callvirt"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum39" style="color: #606060"&gt; 39:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Let&amp;amp;amp;#39;s
Kill Dave!"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum40" style="color: #606060"&gt; 40:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://letskilldave.com/rss.aspx"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum41" style="color: #606060"&gt; 41:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Why
does everything suck?"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum42" style="color: #606060"&gt; 42:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://whydoeseverythingsuck.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum43" style="color: #606060"&gt; 43:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="cdiggins.com"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://cdiggins.com/feed"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum44" style="color: #606060"&gt; 44:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="LukeH's
WebLog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum45" style="color: #606060"&gt; 45:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/lukeh/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum46" style="color: #606060"&gt; 46:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Jomo
Fisher -- Sharp Things"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum47" style="color: #606060"&gt; 47:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/jomo_fisher/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum48" style="color: #606060"&gt; 48:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Chance
Coble"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum49" style="color: #606060"&gt; 49:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://leibnizdream.wordpress.com/feed/"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum50" style="color: #606060"&gt; 50:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Don
Syme's WebLog on F# and Other Research Projects"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum51" style="color: #606060"&gt; 51:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/dsyme/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum52" style="color: #606060"&gt; 52:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="David
Broman's CLR Profiling API Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum53" style="color: #606060"&gt; 53:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/davbr/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum54" style="color: #606060"&gt; 54:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="JScript
Blog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum55" style="color: #606060"&gt; 55:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/jscript/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum56" style="color: #606060"&gt; 56:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Yet
Another Language Geek"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum57" style="color: #606060"&gt; 57:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://blogs.msdn.com/wesdyer/rss.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum58" style="color: #606060"&gt; 58:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".NET
Languages Weblog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum59" style="color: #606060"&gt; 59:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.dotnetlanguages.net/DNL/Rss.aspx"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum60" style="color: #606060"&gt; 60:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DevHawk"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum61" style="color: #606060"&gt; 61:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/Devhawk"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum62" style="color: #606060"&gt; 62:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="The
Cobra Programming Language"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum63" style="color: #606060"&gt; 63:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://cobralang.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum64" style="color: #606060"&gt; 64:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Code
Miscellany"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum65" style="color: #606060"&gt; 65:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://codemiscellany.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum66" style="color: #606060"&gt; 66:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Fred,
Let it go!"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum67" style="color: #606060"&gt; 67:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://freddy33.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum68" style="color: #606060"&gt; 68:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Codedependent"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum69" style="color: #606060"&gt; 69:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://graphics-geek.blogspot.com/feeds/posts/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum70" style="color: #606060"&gt; 70:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Presentation
Zen"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum71" style="color: #606060"&gt; 71:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.presentationzen.com/presentationzen/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum72" style="color: #606060"&gt; 72:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="The
Extreme Presentation(tm) Method"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum73" style="color: #606060"&gt; 73:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://extremepresentation.typepad.com/blog/index.rdf"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum74" style="color: #606060"&gt; 74:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ZapThink"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum75" style="color: #606060"&gt; 75:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/zapthink"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum76" style="color: #606060"&gt; 76:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Chris
Smith's completely unique view"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum77" style="color: #606060"&gt; 77:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.feedburner.com/ChrisSmithsCompletelyUniqueView"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum78" style="color: #606060"&gt; 78:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Code
Commit"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum79" style="color: #606060"&gt; 79:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://feeds.codecommit.com/codecommit"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum80" style="color: #606060"&gt; 80:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;outline&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum81" style="color: #606060"&gt; 81:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Comments
on Ola Bini: Programming Language Synchronicity: A New Hope: Polyglotism"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum82" style="color: #606060"&gt; 82:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="rss"&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum83" style="color: #606060"&gt; 83:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://ola-bini.blogspot.com/feeds/5778383724683099288/comments/default"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum84" style="color: #606060"&gt; 84:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span id="lnum85" style="color: #606060"&gt; 85:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;opml&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Happy reading.....
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=94fda66c-4dda-438c-af27-a53a8e0692c8" /&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,94fda66c-4dda-438c-af27-a53a8e0692c8.aspx</comments>
      <category>.NET</category>
      <category>C++</category>
      <category>Conferences</category>
      <category>F#</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>Windows</category>
      <category>XML Services</category>
    </item>
    <item>
      <trackback:ping>http://blogs.tedneward.com/Trackback.aspx?guid=c69ffbd1-5107-4a2a-aa34-6419dd855035</trackback:ping>
      <pingback:server>http://blogs.tedneward.com/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.tedneward.com/PermaLink,guid,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</pingback:target>
      <dc:creator>Ted Neward</dc:creator>
      <wfw:comment>http://blogs.tedneward.com/CommentView,guid,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.tedneward.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c69ffbd1-5107-4a2a-aa34-6419dd855035</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Apparently, I'm drawing enough of an audience through this blog that various folks
have started to send me press releases and notifications and requests for... well,
I dunno exactly, but I'm assuming some blogging love of some kind. I'm always a little
leery about that particular subject, because it always has this dangerous potential
to turn the blog into a less-credible marketing device, but people at conferences
have suggested that they really are interested in what I think about various products
and tools, so perhaps it's time to amend my stance on this.
</p>
        <p>
With that in mind, if you are a vendor and have a product that you'd like me to take
a look at and (possibly) offer up a review here, here's the basic rules:
</p>
        <ol>
          <li>
No guarantees. Sending me something will in no way guarantee that I will review your
product, for several reasons, two of which being (a) I get really busy sometimes,
and (b) I may have no interest whatsoever in your product and I refuse to pretend
to do so. (Readers can usually tell when the reviewer isn't all that excited about
the subject, I've found.)</li>
          <li>
If you're not going to send me a "real" version (meaning not the time-locked or feature-crippled
demo), don't bother. I have no idea when I will get around to a review, and I have
no desire to review something that isn't "the real deal". I will in turn promise that
the licensed version you send me (if necessary) will not be used for any purpose other
than my own research and exploration (signing contract if necessary to give you that
"fresh-from-the-lawyer's-office" warm and fuzzy feeling).</li>
          <li>
I say what I think, pro and con. I will not edit my review to suit your marketing
purpose, and if you ask me to do so I will simply note in the review that you have
asked me to do so. I retain full editorial control over what I say about your product.</li>
          <li>
Having established #1, I will try to be as fair as I can about your product, and point
out things that I liked and things that I didn't. (Of course, if I hated it from top
to bottom, I may end up with the only positive thing being "It didn't set the atmosphere
on fire when I started the app", but hey, that's something positive, right?)</li>
          <li>
Also in the spirit of #1, if you send me mail answering questions or complaints in
my review, I will of course amend the review with your comments. You are always welcome
to post comments to the blog entry itself, too. Unless you insult my grandmother,
then I will have to get all DELETE-key on you.</li>
        </ol>
        <p>
The reason I'm posting this here is twofold: one, so my faithful audience of four
blog readers will know the rules under which I'm looking at these products and (hopefully)
realize that I'm not financially vested in any of these products, and two, so the
various vendor folks can read this and know what the rules are up front before even
asking.
</p>
        <p>
I know it sounds a little cheeky to lay this out. The image I get in my head is that
of the kid at Christmas declaring to his grandparents as they walk through the door,
presents in hand, "Make sure it's not a scratchy sweater, I hate scratchy sweaters.
And G.I. Joe was only popular when my Dad was a kid. And if you give me another lunchbox
I will scream until you buy me something cool, like a new GameBoy." Ugh. But I value
the trust that people seem to have in me, and so I risk the perception of cheekiness
for this tiny window in time in order to (hopefully) establish full disclosure over
the reviews that come to pass (which, by the way, will always have the category "review"
applied to them, so you know which is an official review and which is just me exploring,
like the LLVM and Parrot posts of recent time).
</p>
        <p>
We now return you to the regularly-scheduled blog.
</p>
        <img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c69ffbd1-5107-4a2a-aa34-6419dd855035" />
        <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>Rules for Review</title>
      <guid isPermaLink="false">http://blogs.tedneward.com/PermaLink,guid,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</guid>
      <link>http://blogs.tedneward.com/2008/03/28/Rules+For+Review.aspx</link>
      <pubDate>Fri, 28 Mar 2008 11:18:12 GMT</pubDate>
      <description>&lt;p&gt;
Apparently, I'm drawing enough of an audience through this blog that various folks
have started to send me press releases and notifications and requests for... well,
I dunno exactly, but I'm assuming some blogging love of some kind. I'm always a little
leery about that particular subject, because it always has this dangerous potential
to turn the blog into a less-credible marketing device, but people at conferences
have suggested that they really are interested in what I think about various products
and tools, so perhaps it's time to amend my stance on this.
&lt;/p&gt;
&lt;p&gt;
With that in mind, if you are a vendor and have a product that you'd like me to take
a look at and (possibly) offer up a review here, here's the basic rules:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
No guarantees. Sending me something will in no way guarantee that I will review your
product, for several reasons, two of which being (a) I get really busy sometimes,
and (b) I may have no interest whatsoever in your product and I refuse to pretend
to do so. (Readers can usually tell when the reviewer isn't all that excited about
the subject, I've found.)&lt;/li&gt;
&lt;li&gt;
If you're not going to send me a "real" version (meaning not the time-locked or feature-crippled
demo), don't bother. I have no idea when I will get around to a review, and I have
no desire to review something that isn't "the real deal". I will in turn promise that
the licensed version you send me (if necessary) will not be used for any purpose other
than my own research and exploration (signing contract if necessary to give you that
"fresh-from-the-lawyer's-office" warm and fuzzy feeling).&lt;/li&gt;
&lt;li&gt;
I say what I think, pro and con. I will not edit my review to suit your marketing
purpose, and if you ask me to do so I will simply note in the review that you have
asked me to do so. I retain full editorial control over what I say about your product.&lt;/li&gt;
&lt;li&gt;
Having established #1, I will try to be as fair as I can about your product, and point
out things that I liked and things that I didn't. (Of course, if I hated it from top
to bottom, I may end up with the only positive thing being "It didn't set the atmosphere
on fire when I started the app", but hey, that's something positive, right?)&lt;/li&gt;
&lt;li&gt;
Also in the spirit of #1, if you send me mail answering questions or complaints in
my review, I will of course amend the review with your comments. You are always welcome
to post comments to the blog entry itself, too. Unless you insult my grandmother,
then I will have to get all DELETE-key on you.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The reason I'm posting this here is twofold: one, so my faithful audience of four
blog readers will know the rules under which I'm looking at these products and (hopefully)
realize that I'm not financially vested in any of these products, and two, so the
various vendor folks can read this and know what the rules are up front before even
asking.
&lt;/p&gt;
&lt;p&gt;
I know it sounds a little cheeky to lay this out. The image I get in my head is that
of the kid at Christmas declaring to his grandparents as they walk through the door,
presents in hand, "Make sure it's not a scratchy sweater, I hate scratchy sweaters.
And G.I. Joe was only popular when my Dad was a kid. And if you give me another lunchbox
I will scream until you buy me something cool, like a new GameBoy." Ugh. But I value
the trust that people seem to have in me, and so I risk the perception of cheekiness
for this tiny window in time in order to (hopefully) establish full disclosure over
the reviews that come to pass (which, by the way, will always have the category "review"
applied to them, so you know which is an official review and which is just me exploring,
like the LLVM and Parrot posts of recent time).
&lt;/p&gt;
&lt;p&gt;
We now return you to the regularly-scheduled blog.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.tedneward.com/aggbug.ashx?id=c69ffbd1-5107-4a2a-aa34-6419dd855035" /&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,c69ffbd1-5107-4a2a-aa34-6419dd855035.aspx</comments>
      <category>.NET</category>
      <category>C++</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>VMWare</category>
      <category>Windows</category>
      <category>XML Services</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=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=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>
  </channel>
</rss>