<?xml version="1.0"?>
<!-- name="generator" content="blosxom/2.0rc2" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>Potential Differences   </title>
    <link>http://gigavolt.net/blog</link>
    <description>Greg Vaughn on Java, Agile methodologies, OS X, whatever piques my interest!</description>
    <language>en</language>

  <item>
    <title>Inheritable Attributes in Rails</title>
    <link>http://gigavolt.net/blog/2008/07/29#inheritableAttributesInRails</link>
    <description>&lt;p /&gt;
During a debugging session the other day, I found myself digging into how Rails implements inheritable 
attributes. These are an extension to the Class class and deeply intertwined in the inner workings of 
Rails. They&amp;#8217;re part of ActiveSupport. I haven&amp;#8217;t seen much on the net discussing them, and I don&amp;#8217;t know
whether that&amp;#8217;s because few people have to deal with them directly, they&amp;#8217;re mundane, or my search skills
are failing. In any case, I decided to jot down my discoveries.
&lt;p /&gt;
Inheritable attributes are kind of like class variables, except they&amp;#8217;re copy-on-subclass. The subclass
gets a copy of these from the superclass, but the subclass can further modify them independently. One
major use of them in Rails is for STI (Single Table Inheritance) subclasses to inherit the superclass&amp;#8217;
associations. The actual association declarations in the superclass (such as has_many, belongs_to, etc.)
create an object stored in an inheritable attribute called reflections. Then once a subclass is created
it gets a copy of this array of reflections and can further refine or extend them. Cool stuff.
&lt;p /&gt;
But there&amp;#8217;s a dark side. I mentioned above that this was found in a debugging session, not just a random
exploration through the Rails source. The way these work depends on the Class#inherited method, which
is called on a superclass whenever a subclass is defined and the subclass is passed as a parameter.
This is where the actual copy-on-subclass logic occurs. If another monkey-patcher messes with the
inherited method, weird things can happen, like a STI subclass losing access to the superclass&amp;#8217; 
associations.
&lt;p /&gt;
However, once they&amp;#8217;re understood, it&amp;#8217;s not so mysterious. Not only that, but they&amp;#8217;re a useful item
to keep in your bag of tricks. There are analogs to attr_accessor and similar methods called
class_inheritable_accessor as well as special methods for array and hash versions for those occasions
when you want a subclass to have copy-on-subclass class variables.
</description>
  </item>
  <item>
    <title>Joined Relevance</title>
    <link>http://gigavolt.net/blog/2008/06/19#joiningrelevance</link>
    <description>&lt;p/&gt;
I&amp;#8217;ve made a career change and joined the great folks at &lt;a href=&quot;http://thinkrelevance.com&quot;&gt;Relevance&lt;/a&gt;.
After doing a JRuby on Rails project at my last job, I knew that going back to Java would be like putting
on a straitjacket. I&amp;#8217;m spending this week at Relevance World Domination Headquarters learning how to shave yaks,
and I expect to get back into blogging since I&amp;#8217;ll be working on interesting technical challenges again.
</description>
  </item>
  <item>
    <title>On Craftsmanship</title>
    <link>http://gigavolt.net/blog/2007/04/04#oncraftsmanship</link>
    <description>&lt;p /&gt;
OK. I haven&amp;#8217;t blogged in quite some time (for both of you that care), but I ran into something that really struck me today. Some of you may know that I have a hobby of woodworking, and not surprisingly, the idea of software as craftsmanship resonates with me. I&amp;#8217;ve also found myself in an Architect role at work, and there&amp;#8217;s some amount of cognitive dissonance I work to resolve. I found the text of a book from 1914 (now public domain) entitled &lt;em&gt;Carpentry for Boys&lt;/em&gt; (I read &amp;#8220;boys&amp;#8221; as &amp;#8220;apprentices&amp;#8221;) and I was attracted to the chapter called &lt;a href=&quot;http://doit101.com/boycarpentry/chapter16.html&quot;&gt;&amp;#8220;The Carpenter and the Architect.&amp;#8221;&lt;/a&gt; Go ahead and read it. It&amp;#8217;s not long, but full of metaphor to software craftsmanship and architecture.
&lt;p /&gt;
I love the concluding career advice the author offers the apprentices: &lt;em&gt;Know for yourself the reasons for things.&lt;/em&gt;</description>
  </item>
  <item>
    <title>Eunuch Test Antipattern</title>
    <link>http://gigavolt.net/blog/2006/11/03#eunuchtest</link>
    <description>&lt;p /&gt;
I ran across a horrible anti-pattern today &amp;#8212; JUnit test class methods called &amp;#8220;doNotTest&amp;#8230;&amp;#8221; I think I&amp;#8217;ll call them
Eunuch tests. It&amp;#8217;s pretty clear that either a) the team is not doing TDD because they can&amp;#8217;t figure out how to test
the code they already wrote or b) some &amp;#8220;refactoring&amp;#8221; wasn&amp;#8217;t a refactoring but instead a code word for &amp;#8220;dangerous
unknown swath of changes to code&amp;#8221;.
&lt;p /&gt;
I don&amp;#8217;t know whether to laugh or cry, but it&amp;#8217;s Friday, so I choose to laugh today.</description>
  </item>
  <item>
    <title>The Meaning of Agility in 20 Words or Less</title>
    <link>http://gigavolt.net/blog/2005/08/10#agilein20words</link>
    <description>&lt;p&gt;
Thanks to &lt;a href=&quot;http://blog.alancfrancis.com/2005/08/imagesdlcgif_wi.html&quot;&gt;Alan Francis&lt;/a&gt; for this insight.

&lt;blockquote&gt;
Agile methods are a response to Waterfall methods so that verification of decisions can happen sooner.&lt;/blockquote&gt;

That&amp;#8217;s brilliant, and quite useful when I find myself in a position to advocate agility to executives and business people.
&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Laws are Childish</title>
    <link>http://gigavolt.net/blog/2004/12/20#lawsarechildish</link>
    <description>
&lt;p&gt;
Ah, serendipity. I&amp;#8217;ll share the steps that brought me to the point of writing this entry. Last Friday, I noticed that two people I knew through entirely different channels and have worked with started getting into a blog debate. Now &lt;a href=&quot;http://integralpath.blogs.com/thinkingoutloud/&quot;&gt;Jef (with one &amp;#8216;f&amp;#8217;) Newsom&lt;/a&gt; has outed me near the end of &lt;a href=&quot;http://integralpath.blogs.com/thinkingoutloud/2004/12/autonomy_ai_and.html&quot;&gt;this&lt;/a&gt; entry. That, plus another point below, got me to write this up. On the other side of the debating table is &lt;a href=&quot;http://schneider.blogspot.com/&quot;&gt;Jeff (with two &amp;#8216;f&amp;#8217;s) Schneider&lt;/a&gt;. I wasn&amp;#8217;t aware Jef (with one &amp;#8216;f&amp;#8217;) had a blog until Jeff (with two &amp;#8216;f&amp;#8217;s) had linked to it. I thought it was a good excuse to get back in touch with each of them and comment on what a small world it is.
&lt;/p&gt;
&lt;p&gt;
Now I find out that Jeff (with two &amp;#8216;f&amp;#8217;s) has &lt;a href=&quot;http://schneider.blogspot.com/archives/2004_12_19_schneider_archive.html#110350580289550879&quot;&gt;brought the bible into the discussion&lt;/a&gt;. Well, I just happened to hear something in this Sunday&amp;#8217;s sermon that&amp;#8217;s quite relevant. Ah, but before I explore that, for those who may not have followed the above links, I should mention just what it is that Jeff and Jef are &lt;s&gt;arguing&lt;/s&gt; discussing with gusto: Service Oriented Architectures, their definition, rules, tenets, precepts, best practices, etc. (pick your term). Well, the sermon quote that struck me was &amp;#8220;laws are childish&amp;#8221;.
&lt;/p&gt;
&lt;p&gt;
What does that mean? Well, that laws/rules are for those who are lacking knowledge and maturity, ie children. Those who have matured and internalized the fundamentals of a subject do not need them. This applies not only in the religious sense of how to live your life, but also to the technical sense of SOA. If you have an internalized understanding of good software design and distributed systems, you&amp;#8217;re bound to come up with a SOA.
&lt;/p&gt;
&lt;p&gt;
I mean no offense to those who are trying to nail down the fundamentals of what makes an architecture &amp;#8220;service oriented&amp;#8221;. For some it is a very handy way to organize their own knowledge. And there&amp;#8217;s certainly a need to have laws for any developers on a project who have not reached the required maturity and experience levels, but in my opinion these should be more project specific rather than broad architectural category laws. Frankly, I&amp;#8217;m not sure if my post adds anything to either side of the debate; I haven&amp;#8217;t digested the details of the debate enough to really know.
&lt;/p&gt;
&lt;p&gt;I do like the slogan &amp;#8220;laws are childish&amp;#8221;. I&amp;#8217;ll have to keep testing that to see where else it applies. I wonder if it explains why the people most suited to run a country are the ones least likely to want to run for office.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Alan Kay&amp;#8217;s Turing Lecture</title>
    <link>http://gigavolt.net/blog/2004/10/27#alankayturinglecture</link>
    <description>&lt;p&gt;
I didn&amp;#8217;t take extensive notes during the talk, but here&amp;#8217;s a transcription and elaboration of what I did take while it&amp;#8217;s fresh on my mind. The title was &lt;em&gt;First Courses in Computing Should be Child&amp;#8217;s Play&lt;/em&gt;. Some of the notes I took down weren&amp;#8217;t necessarily major points of his, but something that personally struck me.&lt;/p&gt;
&lt;p&gt;
He explored the dichotomy of the terms &amp;#8220;Computer Science&amp;#8221; and &amp;#8220;Software Engineering&amp;#8221; as well as the times the terms were invented. He discussed the relative youth of the computing field compared to other endeavors. Compared the builidng of the Egyptian pyramids, to Medieval cathedrals, to the Empire State Building. He also brought up the humorous sidebar of &amp;#8220;physics envy&amp;#8221;: topics that want to be taken seriously so they put &amp;#8216;science&amp;#8217; in their name (eg Political Science, Library Science) &amp;#8212; even though none of physics, chemistry, and biology have &amp;#8216;science&amp;#8217; in their names.&lt;/p&gt;
&lt;p&gt;
Choice quote: &amp;#8220;Our field is the next great 500 year goal after the printing press.&amp;#8221;&lt;/p&gt;
&lt;p&gt;
He discussed personality types. I&amp;#8217;m not sure where his terminology came from, but I mentally mapped it to Myers-Briggs style, since that&amp;#8217;s what I&amp;#8217;m familiar with. It takes about two-thirds of the &amp;#8220;normal people&amp;#8221; (sensing extroverts) to be on the cusp of an idea for it to be truly accepted. It explains everything from wearing baseball caps backwards to bare midriffs. He demonstrated this sort of meme propogation with a simulation comparable to forest fires. There&amp;#8217;s about 30 years for good ideas to be accepted by the mainstream &amp;#8212; gave unix as an example. He hopes the good Xerox Parc technologies will soon be widespread since their 30 years are almost up. He did say that MS Windows is a terrible caricature of Parc technologies. He compared the Windows UI to a nuclear power plant control panel. That wasn&amp;#8217;t the only disparaging remark about  MS, but the most blatant. Other digs were against C++ and Java.&lt;/p&gt;
&lt;p&gt;
He see&amp;#8217;s a major problem in CS being our delight in complexity, and most is unnecessary. We need more of a joy of simplicity. A first college English course is not aimed at people who will become professional writers. Why is CS different?&lt;/p&gt;
&lt;p&gt;
He went into his inspiration as a grad student when learning about Ivan Sutherland&amp;#8217;s Sketchpad application. He showed a video of Sketchpad, and discussed the hardware it ran on and how advanced it was for it&amp;#8217;s time. Not only could Sketchpad do engineering drawings, but with its constraints system it could even simulate bridges, surpassing Ivan&amp;#8217;s expectations. He named Ivan Sutherland the Isaac Newton of CS &amp;#8212; first graphic UI, first object oriented system, and a two handed UI (as they should all be). One of Ivan Sutherland&amp;#8217;s points in his dissertation was that he hopes the system is surpassed in the future.&lt;/p&gt;
&lt;p&gt;
Around the same time he learned of Simula. From these influences, and his background in molecular biology, the key insight for him was that messages are the central abstraction of OOP (which he pronounced like &amp;#8216;oops&amp;#8217; minus the &amp;#8217;s&amp;#8217;). From there he discussed a point made by one of his advisors (long name I couldn&amp;#8217;t write quick enough) about learning styles. If you look at a two dimensional graph with Abilities along the X and Challenges along the Y, you find a state of &amp;#8220;Flow&amp;#8221; along the diagonal. We enjoy learning when the challenges we face are close to our abilities to overcome. Above and left of this diagonal is Anxiety. Below and to the right is Boredom. Safety features such as undo in UIs expand that flow stream into the anxiety area. Attention features such as an easy to use and engaging UI expand the flow stream down into the boredom area.&lt;/p&gt;
&lt;p&gt;
No surprise, but his entire presentation was running out of a Squeak image. At this point he went into more of a demo of Squeak, focusing on how to engage students in that flow stream with it. He drew a car, animated it with scripts, then tied the script to a drawn steering wheel. He mentioned squeakland.org for more information on Squeak in education. From that he segued into a demo of Croquet. In there he built a bridge, then relaxed the spring constant and added wind gusts to simulate the Tacoma Narrows bridge. That then morphed into a Canadian flag for the climax of the talk.&lt;/p&gt;
&lt;p&gt;
The bridge simulation tying back to Sketchpad was not lost on me, but was not a point he explicitly made. His final point was our responsibility to get kids interested in computing to further the development of our field.&lt;/p&gt;
&lt;p&gt;
It ended with a standing ovation &amp;#8212; a great talk, well orchestrated, expertly delivered. I&amp;#8217;m privileged to have gotten to see it in person. It definitely got me thinking about Squeak as a way to introduce my 4 year old homeschooled daughter to computing.&lt;/p&gt;</description>
  </item>
  <item>
    <title>OOPSLA Day 3</title>
    <link>http://gigavolt.net/blog/2004/10/26#oopsla2000day3</link>
    <description>&lt;p&gt;
No, you didn&amp;#8217;t miss the day 1 and 2 entries. I didn&amp;#8217;t write any. Rather than trying to go through each particular session I attend, I&amp;#8217;d rather give a general overview at nearly the halfway point. It&amp;#8217;s subject to revision by the end of the conference though.&lt;/p&gt;
&lt;p&gt;
It&amp;#8217;s been my observation that OOPSLA is a great place to come to get a feel for where software development is going on a 5+ year horizon. I recall back at the 2000 OOPSLA in Minneapolis getting a hallway demo of AspectJ from Gregor Kiczales after a BoF. This year, AOP is much more prevalent and has progressed well beyond the typical logging example. I attended a tutorial by Ron Bodkin and Nick Lesiecki that focused on real enterprise applicability of Aspects. They had examples of using it to transition a system from EJB Entity Beans to Hibernate. I was intrigued by an example of adding JMX management to a system via Aspects. I do believe AOP is in the mainstream&amp;#8217;s future.&lt;/p&gt;
&lt;p&gt;
Another topic I&amp;#8217;m seeing in various places, tutorials, practitioner reports, etc., is an analysis of what Architecture really is. One tongue in cheek definition given by Douglas Schmidt at a tutorial about the Forgotten Craft of Software Architecture is that architects are those people whose development skills are too oudated to still be developers, but don&amp;#8217;t look good enough in suits to be managers. I&amp;#8217;m following the thought that architects act as a bit of an O/R mapping layer. Their main job is to handle the impedence mismatch between customers and developers. They work at the highest layer of abstraction, and delegate much of the intra-component design to experienced developers.&lt;/p&gt;
&lt;p&gt;
That brings up another point &amp;#8212; I&amp;#8217;ve heard the best definition of the difference between a component and an object here. A component can have more than one interface, while an object has only one. I like that.&lt;/p&gt;
&lt;p&gt;
More later. Alan Kay&amp;#8217;s Turing lecture is this evening. There&amp;#8217;s also a BoF about Michael Feather&amp;#8217;s &lt;em&gt;Working Effectively with Legacy Code&lt;/em&gt; book that I plan to attend. Then there&amp;#8217;s also a &amp;#8220;party&amp;#8221; celebrating the 10th anniversary of the GoF &lt;em&gt; Design Patterns&lt;/em&gt; book.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Organic Software Metaphors</title>
    <link>http://gigavolt.net/blog/2004/06/11#Untitled</link>
    <description>&lt;p&gt;
It&amp;#8217;s become somewhat fashionable to use organic metaphors in imagining what software will be like in the future. I most lately ran into it at Brian Marick&amp;#8217;s &lt;a href=&quot;http://www.testing.com/cgi-bin/blog/2004/06/10#kludge&quot;&gt;Your body is a gross kludge&lt;/a&gt; post. It&amp;#8217;s a thought provoking post, but ultimately I just can&amp;#8217;t get behind organic arguments about software. Sure, I&amp;#8217;ll admit that in the distant future software might become like living organisms, but that&amp;#8217;s too far in the future to be useful. I can&amp;#8217;t imagine how to get there from here. There has to be an intermediate stage.&lt;/p&gt;
&lt;p&gt;
The most striking difference in my mind is that software does not reproduce. The closest thing we have are &lt;strike&gt;CASE&lt;/strike&gt; Model Driven Architecture (MDA) tools (aside: I wonder why someone picked an abbreviation that matches the Muscular Dystrophy Association). And I&amp;#8217;m highly skeptical of those. Plus, they don&amp;#8217;t truly reproduce. They don&amp;#8217;t write other improved MDA tools. To be able do that independently, they&amp;#8217;d be closely approaching strong AI. From reading Douglas Hofstadter and Roger Penrose, I highly doubt that strong AI is even possible. Suspending my disbelief for a moment, I do think the kludgy designs Brian talks about would be a remarkable achievement for organic software &amp;#8212; after all that is how most human written software is! &lt;/p&gt;
&lt;p&gt;
To be fair though, I do think there are some features of organic systems we would do well to better incorporate into software, such as resiliency. Recent interests have gotten me thinking about instrumentation and monitoring. Monitoring allows us to know what&amp;#8217;s going on inside our systems, and instrumentation allows us to tweak parameters on running systems. The real power comes when you programmatically tie the monitoring back into the instrumentation to create a feedback loop for the system to modify itself in response to the situation at hand. I did this in one particular instance a year ago to great effect, and I&amp;#8217;m looking into more general practices. However, contrary to the kludgy designs of organic systems, mine was a well encapsulated, reused, JMX component, configured and installed independently of the business system.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Anachronism</title>
    <link>http://gigavolt.net/blog/2004/05/27#anachronism</link>
    <description>
&lt;p&gt;I&amp;#8217;ve got their weirdest sense of vuja de &amp;#8212; the feeling that nothing like this has ever happened to anyone ever before. I&amp;#8217;m surfing the Internet looking for information about a current power outage. I&amp;#8217;m doing it via the battery of my Powerbook. Oh, yeah, and I decided to blog about it. Am I the first to blog to the light of a kerosene lamp? :-)
&lt;/p&gt;
&lt;p&gt;
The Dallas area got some nasty thunderstorms this evening. We saw lightning and heard thunder simultaneously (never a good sign) and then the power went out. Five minutes later we heard fire engine sirens. There&amp;#8217;s a fire station about 5 blocks away, but it sounded like they were coming into the area. I hope everyone is alright.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Embarrassing Cost of Poor Design</title>
    <link>http://gigavolt.net/blog/2004/04/24#embarrass_poor_design</link>
    <description>&lt;p&gt;
Design of everyday things complaint of the day: within a building, the men and women&amp;#8217;s restrooms should be in the same relative position (i.e. men always on the right, or always on the left). I suspect most people will agree with this on priciple, but do you want to know how bad it bit me?
&lt;/p&gt;
&lt;p&gt;
The restooms nearest me (with men on the right) were closed 
by the janitor for cleaning, so I went to another set on the same floor and went in the right hand door. The restrooms in my office building are divided with the sinks by the door and the stalls in the back behind a divider. Luckily I just had to wash some 
ink off my hands, which I was doing when I heard a flush and then a woman came around the divider to the sink next to me. She gave me a funny look and it took me about a half a second to figure out what had happened, then I profusely apologized and left.
&lt;/p&gt;
&lt;p&gt;
Finished laughing yet? :-) 
&lt;/p&gt;
&lt;p&gt;
Please consider the everyday folks who are going to have to live with the design decisions you make in software. Please, please, be consistent.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Source Control Tension</title>
    <link>http://gigavolt.net/blog/2004/03/31#sourceControlTension</link>
    <description>&lt;p&gt;
After reading Glenn&amp;#8217;s blog on &lt;a href=&quot;http://www.vanderburg.org/Blog/Software/Development/koan.blog&quot;&gt;Six of One, a Half Dozen of the Other&lt;/a&gt; I started thinking about source control systems as another example of these opposing tensions. As Glenn notes, this is tied into Martin Fowler&amp;#8217;s &lt;a href=&quot;http://www.martinfowler.com/bliki/SoftwareDevelopmentAttitude.html&quot;&gt;directing vs. enabling attitudes&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
On the one hand you&amp;#8217;ve got the more traditional style of source control such as PVCS that uses an exclusive check-out model. Only one person is allowed to modify a file at once. It&amp;#8217;s a safe pessimistic locking model (directing). On the other hand there&amp;#8217;s systems such as CVS that allow multiple users to edit the same file at the same time. It&amp;#8217;s an optimistic locking model (enabling). Yes, there can be merge problems. That alone keeps some people from using them.
&lt;/p&gt;
&lt;p&gt;
I&amp;#8217;ve used both forms of source control. Merge errors can and do happen with optimistic locking, but they&amp;#8217;re not usually a problem. You&amp;#8217;re notified right away and the fix is usually obvious. On the other hand, when I&amp;#8217;ve used pessimistic locking systems, I&amp;#8217;m often having to go talk to other developers to ask when they can check a file in because I also need to make an edit to it. In the meantime my flow is broken and I have a choice to work on something else until they can check in, or work around the source control system to make edits on a local version. Then I&amp;#8217;ll have to remember what I changed and re-create it later when I can check the file out.
&lt;/p&gt;
&lt;p&gt;
This draws a nice parallel to the perennial favorite blogging topic of static vs. dynamic typing. Static typing is like an exclusive locking source control system. It is safer, but it can get in your way &amp;#8212; how frequently is open to debate, but I say it often does. Dynamic typing plus unit tests is like an optimistic locking source control system. It doesn&amp;#8217;t get in your way and you can go faster, but it will sometimes have problems that your unit tests should catch right away and allow you to fix.
&lt;/p&gt;
&lt;p&gt;
This brings into question Glenn&amp;#8217;s whole premise that neither side is really right &amp;#8212; it&amp;#8217;s just about tradeoffs. I feel much more comfortable saying that optimistic locking in a source control system is categorically better than pessimistic locking than I am saying that dynamic typing is categorically better than static typing, but why? Is it a limit in the metaphor or in the industry&amp;#8217;s experience with dynamic typing? Also, is there a corelation between fans of static typing and fans of pessimistic locking?
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Automate Plist Verification</title>
    <link>http://gigavolt.net/blog/2004/03/10#plistverification</link>
    <description>&lt;p&gt;
Mac OS X can have some hard to diagnose problems if preference files become corrupted. Based on an initial idea on Macintouch, I read a couple of man pages and came up with an &lt;tt&gt;/etc/weekly.local&lt;/tt&gt; file that looks like this.
&lt;/p&gt;
&lt;pre&gt;
#!/bin/sh

echo &quot;Checking preference plist integrity&quot;
find /Users/gvaughn/Library -name '*.plist' -print0 | xargs -0 /usr/bin/plutil -s

&lt;/pre&gt;
&lt;p&gt;
In detail, we&amp;#8217;re finding all the *.plist files under your home directory&amp;#8217;s Library subdirectory (substitute your username for &amp;#8216;gvaughn&amp;#8217;). The 0 on the print and xargs uses a NULL separator so we can handle files with spaces in their name. Then all the found files are passed to plutil for syntax checking. The -s option says to be quiet unless there&amp;#8217;s a problem.
&lt;/p&gt;
&lt;p&gt;
I hope someone finds this useful. If you find ways to beef it up, please let &lt;a href=&quot;mailto:gvaughn@gigavolt.net&quot;&gt;me&lt;/a&gt; know.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Re: Best Practice vs. Useful Practice</title>
    <link>http://gigavolt.net/blog/2004/02/24#bestvsusefulPractice</link>
    <description>&lt;p&gt;
Gee, it&amp;#8217;s been a long time since my last entry. For both of my readers, I guess now you know I haven&amp;#8217;t fallen off the end of the earth. I&amp;#8217;ve been buried at work and with personal projects, and I&amp;#8217;m afraid writing has fallen by the wayside for the time being. I hope things are slowing down enough that I can get back into it. I&amp;#8217;ve got a backlog of ideas for posts. I had some time and was really struck by some synchronicity today.
&lt;/p&gt;
&lt;p&gt;
Esther Derby&amp;#8217;s great observation on &lt;a href=&quot;http://www.estherderby.com/weblog/archive/2004_02_01_archive.html#107754269570768322&quot;&gt;Best Practice vs. Useful Practice&lt;/a&gt; reminds me of an experience I had back in grad school. I was studying physics and taking a course in Solid State physics. There was also an Electrical Enginnering student taking the class as an elective. He was in our study group. I think it was a homework assignment we were discussing and he asked for help. I began to discuss the physics principles involved, but he quickly interrupted me and said that he didn&amp;#8217;t care about that, he just wanted to know what formula to use. My jaw dropped as I wondered why in the world he was taking this physics course that wasn&amp;#8217;t a requirement.
&lt;/p&gt;
&lt;p&gt;
In light of Esther&amp;#8217;s discussion, he wanted the &amp;#8220;best&amp;#8221; practice. I was offering a useful one. I wonder if there&amp;#8217;s a correlation between an engineering and scientific mindset in approaching programming.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Naked Objects Exposed</title>
    <link>http://gigavolt.net/blog/2003/10/23#nakedobjectsexposed</link>
    <description>&lt;p&gt;I think I now have a handle on what makes &lt;a 
href=&quot;http://www.nakedobjects.org/&quot;&gt;Naked Objects&lt;/a&gt; interesting. I had 
previously perused the site and came to the preliminary conclusion that 
it&amp;#8217;s just a generic UI framework. Last night at the &lt;a 
href=&quot;http://www.pragmaticprogrammer.com/cgi-local/pragprog?DallasPractitioners&quot;&gt;DFWPP&lt;/a&gt; 
(Dallas-Ft.Worth Pragmatic Practitioners) meeting I got to hear &lt;a 
href=&quot;http://pragprog.com/pragdave&quot;&gt;Dave Thomas&lt;/a&gt; talk about Naked 
Objects (and believe me, it is a topic rich with double entendres). It 
helps me to think of Naked Objects in a parallel manner to TDD (Test 
Driven Development).
&lt;/p&gt;
&lt;p&gt;On the surface TDD looks like it is primarily a means of testing. The 
&amp;#8216;aha&amp;#8217; moment happens when you invert your thinking. TDD is primarily a 
design tool, and secondarily a testing method. It ends up that testable 
code is more cohesive and loosely coupled, and that&amp;#8217;s the major benefit. 
My &amp;#8216;aha&amp;#8217; moment with Naked Objects happened when I began to see it as 
primarily a design and requirements gathering tool, and secondarily a UI 
framework. Coding in Naked Objects style promotes minimal temporal 
coupling (the GUI is modeless), complete business rules in the business 
objects (none of it hanging in the GUI layer), and explicit relationships 
between business objects (so the GUI knows what can be dragged and dropped 
onto what).
&lt;/p&gt;
&lt;p&gt;So, just as TDD taught us that &lt;em&gt;testable&lt;/em&gt; code is well designed 
code, so now Naked Objects are teaching us that &lt;em&gt;naked&lt;/em&gt; (or maybe 
&lt;em&gt;strippable&lt;/em&gt;?) code is well designed code. Also in a parallel vein, 
we know that the unit tests from TDD are rarely going to be a sufficient 
amount of testing, so also the GUI of Naked Objects is rarely going to be 
a sufficient GUI. Just as the more traditional functional, system, and 
user acceptance tests can be added to a TDD-built system, so too can a 
more traditional menued, or script-driven GUI be added to a Naked 
Objects-built system.
&lt;/p&gt;
&lt;p&gt;Dave will be giving that Naked Objects talk (and also one on Coupling! 
I warned you about the double entendres) at the &lt;a 
href=&quot;http://www.nofluffjuststuff.com/2003-10-atlanta/index.jsp&quot;&gt;Atlanta 
Java Software Symposium&lt;/a&gt; this coming weekend. Come if you can! 
&amp;lt;shameless-plug&gt;You can even hear me speak on JMX, IO Performance 
Tuning, and Expressive Code there too.&amp;lt;/shameless-plug&gt;
&lt;/p&gt;
&lt;p&gt;
Note: This is crossposted to my &lt;a href=&quot;http://today.java.net/pub/au/70&quot;&gt;java.net&lt;/a&gt; weblog.</description>
  </item>
  <item>
    <title>NoFluffJustStuff</title>
    <link>http://gigavolt.net/blog/2003/10/16#nofluffjuststuff</link>
    <description>&lt;p&gt;
I had a great time at last weekend&amp;#8217;s &lt;a href=&quot;http://www.nofluffjuststuff.com/2003-10-dallas/index.jsp&quot;&gt;Dallas&lt;/a&gt; &lt;a href=&quot;http://nofluffjuststuff.com&quot;&gt;NoFluffJustStuff&lt;/a&gt; symposium. I was so busy putting together the presentations, I didn&amp;#8217;t have a chance to mention it ahead of time here. I&amp;#8217;m also slated for the &lt;a href=&quot;http://www.nofluffjuststuff.com/2003-10-atlanta/index.jsp&quot;&gt;Atlanta&lt;/a&gt; and &lt;a href=&quot;http://www.nofluffjuststuff.com/2003-11-denver/index.jsp&quot;&gt;Denver&lt;/a&gt; instances. The three talks in my current set are on Expressive Code, a JMX case study, and I/O performance tuning.&lt;/p&gt;
&lt;p&gt;
One of the best things about these conferences are the hallway discussions. All the speakers are very accessible both in and out of the sessions. I almost gave away &lt;a href=&quot;http://www.relevancellc.com/halloway/weblog/&quot;&gt;Stuart Halloway&amp;#8217;s&lt;/a&gt; classloading talk (good thing he shut me up quickly :-) and &lt;a href=&quot;http://www.neward.net/ted/weblog/index.jsp&quot;&gt;Ted Neward&lt;/a&gt; had some great input during the QA of my JMX talk when a question was asked about some overlap between the things JMX and Aspects are good at.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://kirk.blog-city.com/&quot;&gt;Kirk Pepperdine 
&lt;/a&gt; has talked me into preparing an article for an upcoming issue of the &lt;a href=&quot;http://www.javaperformancetuning.com/&quot;&gt;Java Performance Tuning&lt;/a&gt; newsletter based on a performance hack I talked about in that talk. I&amp;#8217;ll put a note here once it&amp;#8217;s published, but you could always go get yourself subscribed in the meantime.</description>
  </item>
  <item>
    <title>Another Software Development Analogy</title>
    <link>http://gigavolt.net/blog/2003/10/03#movieanalogy</link>
    <description>&lt;p&gt;
There&amp;#8217;s much discussion of different analogies for software development. Some like to think of it as engineering such as building a bridge. Others like to compare it to building construction. The Pragmatic Programmers compare it to &lt;a href=&quot;http://www.artima.com/intv/garden.html&quot;&gt;gardening&lt;/a&gt;. But none of those really resonate with me.&lt;/p&gt;
&lt;p&gt;
James Robertson compares it to &lt;a href=&quot;http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;entry=3241415384&quot;&gt;movie production&lt;/a&gt;. Now that&amp;#8217;s an interesting concept. We always hear about movies missing time/budget projections. Producers are the financial sponsors. The director has creative control. Various tradespeople (craftsmen?) do the acting, camera, sound, editing, special effects, etc. Most of those are organized around unions or guilds. Each movie is unique, but may be formulaic, and the cost of copies is miniscule compared to the cost of the development in the first place. I think this analogy has legs.&lt;/p&gt;
&lt;p&gt;
It gets me thinking about a guild or union structure for developers. Could it work? A few years ago during the dot-com boom it certainly wouldn&amp;#8217;t, but I wonder if it would these days. Fred Brooks talked about a 20X difference in productivity between developers in &lt;em&gt;The Mythical Man Month&lt;/em&gt; and Pete McBreen talked about compensating developers based upon that in &lt;em&gt;Software Craftsmanship&lt;/em&gt;. You see an even broader range among actors, yet they are all members of the Screen Actors Guild. It sure would be nice to be a Mel Gibson equivalent in a Software Developers Guild :-)</description>
  </item>
  <item>
    <title>Generalist vs. Specialist</title>
    <link>http://gigavolt.net/blog/2003/10/03#generalistvsspecialist</link>
    <description>&lt;p&gt;
I&amp;#8217;m playing some blog catchup right now, but there&amp;#8217;s another entry of Brian Marrick&amp;#8217;s I want to comment on: &lt;a href=&quot;http://www.testing.com/cgi-bin/blog/2003/09/25#agile-testing-project-6&quot;&gt;Technology-facing Product Critiques &lt;/a&gt;. In it he explores the need for specialists even in an Agile project. I&amp;#8217;m not certain I can completely agree.&lt;/p&gt;
&lt;p&gt;
I submit myself as a counter-example to his argument. I&amp;#8217;m a developer, and Agile-minded. I&amp;#8217;m interested in &lt;a href=&quot;http://gigavolt.net/blog/2003/04/23#maxsecinterview&quot;&gt;security&lt;/a&gt;, UI design, and even testing (why I started reading his blog in the first place :-)  I guess that makes me a jack of all trades and a master of none. While I may not feel qualified to be the sole person in charge of security, UI design or testing on a project, I do think that with a group of developers that are as much of a generalist as I am, we could collectively get the job done.&lt;/p&gt;
&lt;p&gt;
I suppose pragmatically there&amp;#8217;s the question of how many projects have a group of generalists this broad. Maybe I&amp;#8217;m just a singular oddity. I&amp;#8217;ve been accused of that before.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Hardest Part of Software Development</title>
    <link>http://gigavolt.net/blog/2003/10/02#hardestpartofsoftwaredev</link>
    <description>&lt;p&gt;
Over time I&amp;#8217;ve come to realization that the hardest part about software development is human psychology and sociology. That was the farthest thing from my mind when I was a bright-eyed and bushy-tailed newbie professional programmer (mumble) years ago. Maybe I&amp;#8217;m just getting old, or maybe this is specific to software development inside enterprises, where the majority of my experience is.&lt;/p&gt;
&lt;p&gt;
In so many cases it seems the most frustrating parts are getting people to care &amp;#8212; mostly to get developers to care about honing their craft and their own skills. But I could take it in many other directions &amp;#8212; different sets of people, different things they should care about. Anyway, this puts me squarely behind Brian Marick&amp;#8217;s position paper to the NSF on &lt;a href=&quot;http://www.testing.com/cgi-bin/blog/2003/10/01#science-of-design&quot;&gt;the science of design&lt;/a&gt;. I agree with his stance completely.&lt;/p&gt;
&lt;p&gt;
I hope this isn&amp;#8217;t pushing me toward the path of &amp;#8230; management !&lt;/p&gt;</description>
  </item>
  <item>
    <title>JMX and Jini</title>
    <link>http://gigavolt.net/blog/2003/09/09#jmxandjini</link>
    <description>&lt;p&gt;
About a month ago, I wrote about &lt;a href=&quot;http://weblogs.java.net/pub/wlg/286&quot;&gt;using JMX to manage JavaSpaces and Jini services.&lt;/a&gt; Now I&amp;#8217;ve found an article by Frank Jennings doing it inside out. He&amp;#8217;s &lt;a href=&quot;http://www.sys-con.com/java/articleprint.cfm?id=2201&quot;&gt;discovering a JMX server via Jini&lt;/a&gt;. I&amp;#8217;m glad to see people combining Jini with J2EE.
&lt;/p&gt;
&lt;p&gt;
I wonder&amp;#8230;. if you combined both approaches, would that create a tear in the fabric of spacetime?&lt;/p&gt;</description>
  </item>
  <item>
    <title>So, What &lt;em&gt;Are&lt;/em&gt; Web Services?</title>
    <link>http://gigavolt.net/blog/2003/09/04#whatarewebservices</link>
    <description>&lt;p&gt;
Werner Vogels tells us that &lt;a href=&quot;http://weblogs.cs.cornell.edu/AllThingsDistributed/Archives/000120.html&quot;&gt;Web Services are not Distributed Objects&lt;/a&gt;. I was going to comment on his blog, but as I started writing, I began a spiral of asking more and more fundamental questions and thought it would be more appropriate here.
&lt;/p&gt;
&lt;p&gt;
I&amp;#8217;m still trying to figure out what web services &lt;em&gt;are&lt;/em&gt;. OK, so they&amp;#8217;re not distributed objects in general, but how are they different from a well-designed, stateless, message-based distributed object system that uses XML as a serialization mechanism? Are they just a means of talking about good distributed object architecture in a different context?&lt;/p&gt;
&lt;p&gt;
To address some of Werner&amp;#8217;s points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Just because distributed objects &lt;em&gt;enable&lt;/em&gt; stateful interactions, 
doesn&amp;#8217;t mean that they are inseparable concepts. I prefer stateless 
architectures whenever possible, and the experience people have with web 
applications have taught them how to work around a stateless protocol 
(HTTP) to add state where needed (and even where it&amp;#8217;s not needed in many 
cases).&lt;/li&gt;
&lt;li&gt;
Werner&amp;#8217;s insistence on the transport agnostic aspect reminds me of Java 
servlets. They are not technically tied to HTTP either. I&amp;#8217;ve worked on a 
servlet system based around SMTP. However, for all practical purposes 
servlets and HTTP are inseparable in 99.9% of techologists&amp;#8217; minds. Will it be different for web services?&lt;/li&gt;
&lt;li&gt;
In my mind the service nature is at the architectural level. Distributed 
objects will be the predominant implementation technology. But OO folks 
have been doing distributed service based technologies (Jini) and message 
oriented systems for years. What sort of productivity gains can web 
services supply above these?&lt;/li&gt;
&lt;li&gt;
I am glad to hear about the reduction in status of XML-RPC. It&amp;#8217;s just a 
buzzword-induced performance throttle. Even sticking to the message model, 
how are web services fundamentally different from a stateless distributed 
object with a single processDocument method that accepts a parameter that 
is a rich data structure?&lt;/li&gt;
&lt;li&gt;
It&amp;#8217;s still not clear to me that web services are anything other than a 
subset of functionality that distributed objects offer, assuming the same 
architectural considerations. Their only distinction is that via XML 
they get cheap language interoperability at the expense of 
performance, which is not the appropriate tradeoff in all situations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I&amp;#8217;m not trying to be harsh. I really do want to understand what sort 
of problems web services help me solve that I can&amp;#8217;t already do as easily 
with existing tools.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Breaking Down Test Driven Development</title>
    <link>http://gigavolt.net/blog/2003/08/28#breakingdownunittests</link>
    <description>&lt;p&gt;
Brian Marick analyzes &lt;a href=&quot;http://www.testing.com/cgi-bin/blog/2003/08/27#agile-testing-project-3&quot;&gt;the different uses of unit tests&lt;/a&gt;. It&amp;#8217;s something I&amp;#8217;ve been thinking about too. On one project when I was refactoring TDD written code, I found myself deleting quite a few unit tests. Keeping them all up to date was a source of inertia that was slowing down progress after we had higher, component-level, tests in place.
&lt;/p&gt;
&lt;p&gt;
Brian&amp;#8217;s using a number of terms that may not be familiar, but it&amp;#8217;s a valuable exercise. The term &amp;#8216;test&amp;#8217; has so many overloaded usages, especially when testers and developers try to communicate. He&amp;#8217;s calling unit tests &amp;#8216;checked examples&amp;#8217; and &amp;#8216;change detectors&amp;#8217; to elucidate the two major purposes of TDD. Unit tests that help drive design and development are &amp;#8216;checked examples&amp;#8217;. The built up test suite that serve a regression function he&amp;#8217;s calling &amp;#8216;change detectors&amp;#8217;.&lt;/p&gt;
&lt;p&gt;
This distinction has helped me to understand my instinct in my situation. The unit tests had already served their function as &amp;#8216;checked examples&amp;#8217; that drove the design, and their function as &amp;#8216;change detectors&amp;#8217; were redundant. Now I can feel less guilty about hitting that delete key.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Fundamental Problem with Extreme Programming</title>
    <link>http://gigavolt.net/blog/2003/08/11#problemwithxp</link>
    <description>&lt;p&gt;
Matt Stephens gives some &lt;a href=&quot;http://www.softwarereality.com/lifecycle/xp/case_against_xp.jsp&quot;&gt;strong arguments against Extreme Programming&lt;/a&gt;. It&amp;#8217;s a long article, but worth a read if there&amp;#8217;s just something about XP that doesn&amp;#8217;t &lt;em&gt;feel&lt;/em&gt; right to you. Now, I think he does go off into rant mode in places (and he&amp;#8217;s also trying to sell you something), but the article was helpful to me to really put my finger on the fundamental problem with XP.&lt;/p&gt;
&lt;p&gt;
XP requires too much of an investment from the business. Even aside from the obvious on-site customer that XP requires (and Mr. Stephens makes a good case that the best you&amp;#8217;ll get is a junior person) there&amp;#8217;s the regular unfinished (and unpolished?) versions of the software they&amp;#8217;re expected to use and give feedback about in the Planning Game every few weeks. There&amp;#8217;s also the ideal of the business users working to develop the acceptance tests.&lt;/p&gt;
&lt;p&gt;
It&amp;#8217;s like watching sausage being made. Business users are not techies, and generally don&amp;#8217;t want to become techies. They want the software, and they want it with a minimum of &lt;em&gt;their&lt;/em&gt; effort. The overall development efficiency that XP is built around actually decreases the business users&amp;#8217; efficiency in doing their own job during the development. They find it tiring to think like a techie and answer all the detailed questions about how various requirements interact and handling all sorts of &amp;#8216;what if&amp;#8217; scenarios.&lt;/p&gt;
&lt;p&gt;
Please, don&amp;#8217;t misunderstand me, gentle reader. I do respect XP. It has served as the spark that got people (me included) thinking more about Agile methods in general (though the &lt;a href=&quot;http://bossavit.com/thoughts/archives/000115.html&quot;&gt;ideas go back much further than that&lt;/a&gt;). I&amp;#8217;ve written in more detail about &lt;a href=&quot;http://gigavolt.net/blog/2003/04/30#xporagile&quot;&gt;why I choose to associate myself with the Agile movement rather than XP&lt;/a&gt; before. The gist of which is best explained by comparing XP to Free Software (FS) and Agility to Open Source Software (OSS). XP/FS adhere to uncompromising purity of their ideal. Agility/OSS agree with those ideals, but realize compromises must be made in the name of practicality. XP/FS have actually become special cases of the broader Agility/OSS categories.&lt;/p&gt;
&lt;p&gt;
I guess I&amp;#8217;m just a practical sort of guy.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Doomsday Algorithm</title>
    <link>http://gigavolt.net/blog/2003/08/04#doomsdayalgorithm</link>
    <description>&lt;p&gt;
Ever wanted to &lt;a href=&quot;http://rudy.ca/doomsday.html&quot;&gt;calculate the day of the week of any date in your head?&lt;/a&gt; Me 
neither, but it&amp;#8217;s fun to read about this memorizable algorithm, albeit with a rather gloomy name.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>The &amp;#8220;do do&amp;#8221; Guy</title>
    <link>http://gigavolt.net/blog/2003/07/31#dodoguy</link>
    <description>&lt;p&gt;
&lt;a href=&quot;http://pragprog.com/pragdave&quot;&gt;Dave Thomas&lt;/a&gt; graciously accepted my invitation to a book discussion of &lt;a href=&quot;http://www.pragmaticprogrammer.com/ppbook/index.html&quot;&gt;The Pragmatic Programmer&lt;/a&gt; today. I hope we at least provided some entertainment for him. At one point there was a discussion about whether a peculiar behavior was truly a bug. Dave asked &amp;#8220;and the business people say&amp;#8230;&amp;#8221; with the same cadence as the Lou Reed song, &lt;a href=&quot;http://www.sing365.com/music/lyric.nsf/SongUnid/9FA083321DB91BCE48256988002FB62B&quot;&gt;&amp;#8220;Walk on the Wild Side&amp;#8221;&lt;/a&gt;. Mike Schaefer recognized this and immediately answered with &amp;#8220;doo do doo, doo, doot do doo&amp;#8230;&amp;#8221; Everyone in the room nearly doubled over in laughter. I think Dave will forever remember him as &amp;#8220;the do do guy&amp;#8221; :-)
&lt;/p&gt;</description>
  </item>
  <item>
    <title>The Ideal Programmer</title>
    <link>http://gigavolt.net/blog/2003/07/22#ideal_programmer</link>
    <description>&lt;p /&gt;
Bruce Eckel has &lt;a href=&quot;http://mindview.net/WebLog/log-0038&quot;&gt;some great stuff about programming&lt;/a&gt;. I suppose I think it&amp;#8217;s great because it mirrors some similar thoughts I&amp;#8217;ve had for a while. It&amp;#8217;s nice to be validated by someone well known and respected :-)
&lt;blockquote&gt;

Programming is about communication between humans. &lt;/blockquote&gt;
This mirrors the opening quotes for an Expressive Code talk I have. I gave it at the local Java Users Group back in February and I&amp;#8217;ll be taking it on the road for a few dates of the &lt;a href=&quot;http://nofluffjuststuff.com&quot;&gt;NoFluffJustStuff&lt;/a&gt; conferences in a couple of months.

&lt;blockquote&gt;Programming is not about racing to throw together a solution. It&amp;#8217;s about  changeable systems. &lt;/blockquote&gt;
This I would love to agree completely with, but I can&amp;#8217;t. To draw in the concept of craftsmanship, let&amp;#8217;s think about a wood furniture craftsman. He lovingly makes heirloom quality furniture by hand. The furniture is beautiful, resilient, and adaptable to changes in decor over the years. You expect to hand it down to your grandchildren one day. Contrast that with particle board furniture sold by the local discount warehouse. It&amp;#8217;s much less expensive, available right now, and functional for a while &amp;#8212; until the particle boards start sagging, and the adhesive veneer starts peeling, etc.
&lt;p /&gt;
If you&amp;#8217;re a college student who expects furniture to receive abuse, only expects it to last only a few years, needs it right now, and has limited income, then that particle board bookshelf is probably your best bet. However, it also makes sense to you if you know next to nothing about furniture, you&amp;#8217;re caught up by the pretty pictures of it in a catalog, you&amp;#8217;re cheap, and you&amp;#8217;re not prone to thinking in the long term (oh, and you&amp;#8217;re an executive at a large company).
&lt;p /&gt;
Bruce Eckel is thinking of that second case by saying that programming is not a sprint to finish in that the &amp;#8220;executive&amp;#8221; needs an eduction, but I think that sometimes the &amp;#8220;college student&amp;#8221; case applies, when a quick solution thrown together best fits the situation. That being said, I&amp;#8217;d personally rather be crafting than hacking (in the bad sense), but we need to recognize that it&amp;#8217;s not always appropriate. Programming in the real world is not always craftsmanship.
&lt;p /&gt;
The &amp;#8220;Love It or Leave It&amp;#8221; section reminds me of an experiment I&amp;#8217;ve been running in the self-selecting nature of programmers of like mind being drawn together. I guess the results are conclusive enough that I can let the cat out of the bag now. In my first &lt;a href=&quot;http://weblogs.java.net/pub/wlg/252&quot;&gt;weblogs.java.net post&lt;/a&gt; I talked about people needing to take some pride in their craft and keep themselves informed of what going on, even for things that aren&amp;#8217;t directly relevant to their task at hand. In it I referenced an incident here at work where some people could use a bit more broad of an exposure to Java technologies. That weblog is much higher profile than mine here, so I was wondering if any of those people would comment to me about it. They haven&amp;#8217;t.</description>
  </item>
  <item>
    <title>Distinctions of an Agile Developer</title>
    <link>http://gigavolt.net/blog/2003/07/10#distinctionsofagiledev</link>
    <description>&lt;p /&gt;
Warning: risk of stereotypes and psychobabble ahead
&lt;p /&gt;
I&amp;#8217;ve been experiencing resistance to Agile methods lately and I&amp;#8217;m trying 
to figure out why. A few other bloggers have begun discussing this and I 
hope I can add something useful to the conversation. Brian Marick &lt;a 
href=&quot;http://www.testing.com/cgi-bin/blog/2003/06/26#adc1&quot;&gt;touches&lt;/a&gt; on 
several issues relating personality type/thinking style to testers and 
Agile methods in general. He references Bret Pettichord&amp;#8217;s &lt;a 
href=&quot;http://www.io.com/~wazmo/papers/testers_and_developers.pdf&quot;&gt;&amp;#8220;Testers 
and Developers Think Differently&amp;#8221;&lt;/a&gt; which initially made me wonder if 
I&amp;#8217;d fit better as a tester than as a developer. Brian also ties it in with 
&lt;a href=&quot;http://alistair.cockburn.us/&quot;&gt;Alistair Cockburn&amp;#8217;s&lt;/a&gt; 
investigation of what sort of personality a business coach needs. 
&lt;p /&gt;
Now, I&amp;#8217;ve long been fascinated with the &lt;a 
href=&quot;http://keirsey.com/&quot;&gt;Myers-Briggs&lt;/a&gt; style of personality 
assessments since first being exposed in college (interestingly, it was a 
Physics class, not Psychology). I&amp;#8217;m &lt;a 
href=&quot;http://keirsey.com/personality/ntij.html&quot;&gt;INTJ&lt;/a&gt; with &lt;a 
href=&quot;http://keirsey.com/personality/ntip.html&quot;&gt;INTP&lt;/a&gt; leanings (now you 
can all pigeonhole me :-) This personality type (or really the more 
general &amp;#8216;NT&amp;#8217; &amp;#8212; the middle two initials) is a small percentage of the 
general community, but a large percentage of the software development 
community, so I believe that the differences between Agile and un-Agile 
(for lack of a better, non-perjorative term) developers must be a second 
order effect.
&lt;p /&gt;
These &amp;#8216;NT&amp;#8217; (&lt;a href=&quot;http://keirsey.com/personality/nt.html&quot;&gt;Rational&lt;/a&gt;) 
types learn to trust in their intelligence, often basing their own 
self-image around it, which is usually compounded by their awkwardness in 
social situations and the corresponding belittling during adolescence. 
Though we don&amp;#8217;t like to admit it, we &amp;#8216;rationals&amp;#8217; do carry emotional 
baggage as Chrisitan Sepulveda &lt;a 
href=&quot;http://christiansepulveda.com/blog/archives/000018.html&quot;&gt;explores&lt;/a&gt;. 
As a friend, Paul Holser, put it &amp;#8220;we all want to be Spock, but are really 
McCoy underneath all that.&amp;#8221;
&lt;p /&gt;
Agile development requires a large amount of humility. We have to trust 
that practices such as TDD (Test Driven Development) might lead to better 
software than what we could develop purely via our own creative processes. 
And if it doesn&amp;#8217;t then the problem might be us rather than the method. To 
someone who&amp;#8217;s self-image is largely centered on their own intelligence, 
this hits mighty close to home and evokes emotional defenses. Ironic in 
such rationally centered people. My working model is that it takes 
maturity to reach humility, but I&amp;#8217;m not particularly satisfied with that 
because I can envision the argument &amp;#8220;you don&amp;#8217;t agree with me because 
you&amp;#8217;re immature and I&amp;#8217;m not, so nyah.&amp;#8221; I also wonder if there&amp;#8217;s a faith 
aspect too because it can cause one to re-center their self image on 
something beyond themself thereby avoiding that emotional threat, but that&amp;#8217;s not 
something we &amp;#8216;rationals&amp;#8217; talk about much, so it&amp;#8217;s tough to tell.
&lt;p /&gt;
One of the keys of the &lt;a href=&quot;http://agilemanifesto.org/&quot;&gt;Agile 
Manifesto&lt;/a&gt; is valuing &amp;#8220;individuals and interactions over processes and 
tools&amp;#8221;. It&amp;#8217;s people oriented. That&amp;#8217;s what has been leading me down this 
path of trying to understand people and their resistance. The manifesto 
makes it sound so common-sensical, so adaptable, and so applicable in all 
circumstances, but I&amp;#8217;m starting to discover that valuing individuals 
includes knowing when to stop pushing. So at what point to I stop trying 
to convince people that Agile development would improve their situation 
and simply look for a new situation for myself? Is Agile Methodology just 
a &amp;#8220;birds of a feather flock together&amp;#8221; sort of mindset? Anybody know of some healthy flocks?</description>
  </item>
  <item>
    <title>A New Name for TDD</title>
    <link>http://gigavolt.net/blog/2003/07/01#renamingtdd</link>
    <description>&lt;p /&gt;
Brian Marick &lt;a href=&quot;http://www.testing.com/cgi-bin/blog/2003/06/30#agile-context&quot;&gt;writes&lt;/a&gt; Things Agilists Want to be True. It&amp;#8217;s a great start, but I have the gut feeling there&amp;#8217;s more to it. I can&amp;#8217;t point to any specifics right now, but the synergy is quite interesting. I just purchased the Scrum &lt;a href=&quot;http://store.yahoo.com/cgi-bin/clink?softpro+AXQPf4+0-13-067634-9.html&quot;&gt;book&lt;/a&gt; he refers to last week, and I also just told a group of testers this morning that I predict that TDD will be renamed within the next year. I don&amp;#8217;t know how many times I&amp;#8217;ve had to explain to people that the validation aspect of TDD is secondary to the way it drives the design of the code (including this morning right after reading Brian&amp;#8217;s blog).
&lt;p /&gt;
So maybe it&amp;#8217;s time to start brainstorming other terms. I&amp;#8217;ve had a few come to mind:
&lt;ul&gt;
&lt;li&gt;Usage Driven Development&lt;/li&gt;
&lt;li&gt;Client Driven Development&lt;/li&gt;
&lt;li&gt;Outside-In Development&lt;/li&gt;
&lt;/ul&gt;
I think Client Driven is my preference at this point, but that may be a result of my affection for plays on words. I&amp;#8217;m not sure how common of a usage it is for a client of a class to be another class that calls it. It also brings up the issue of it being a human client of the software who defines the requirements that get refined into unit tests.
&lt;p /&gt;
I&amp;#8217;m also going to be observing the team dynamics as our department takes on more of an agile philosphy. Without much authority behind me this morning, I was trying to explain to the testers that developers are encroaching on their &amp;#8216;territory&amp;#8217;, and they should be responding in kind by expanding their test automation and styles of testing.</description>
  </item>
  <item>
    <title>Software Engineering Certification</title>
    <link>http://gigavolt.net/blog/2003/06/25#swebok</link>
    <description>&lt;p /&gt;
Cem Kaner &lt;a href=&quot;http://blackbox.cs.fit.edu/blog/kaner/archives/000056.html&quot;&gt;writes&lt;/a&gt; about &lt;a href=&quot;http://www.swebok.org/&quot;&gt;Software Engineering&amp;#8217;s Body of Knowledge&lt;/a&gt;. Martin Fowler has some good &lt;a href=&quot;http://martinfowler.com/bliki/Swebok.html&quot;&gt;commentary&lt;/a&gt;. The basic point is that these practices could be codified into a certification program in which certified software engineers could be sued for malpractice for not following them. The thing that is a problem for Agile thinkers is that SWEBOK is very waterfall-ish. However, the document is open for public review. So feel free to give it a bad one.
&lt;p /&gt;
Software engineering certification will come one day, so we should take some time to think about how to make it work. There are good arguments in favor of certification and even the sort of document-heavy, big-design-up-front style SWEBOK current promotes. The best explanation I&amp;#8217;ve read was from Alistair Cockburn about the failure modes of a piece of software. In the extreme case when software failure could result in loss of life, a heavy process with all of its checks and balances makes good sense.
&lt;p /&gt;
If this is the sort of process that software engineering certification requires, then we must make sure that the market is free to hire non-certified software developers depending on their needs. For truly critical software, certified engineers can be hired, but most software doesn&amp;#8217;t need this level of rigor. For these projects companies should be free to give up the ability to sue for malpractice and hire non-certified developers. Agile developers will be cheaper and/or faster in this sort of market.
&lt;p /&gt;
This might even be the key to publicizing the fact that different software projects require different approaches. One size does not fit all. Sometimes you&amp;#8217;ve got to make it come down to dollars and cents for business to take notice.</description>
  </item>
  <item>
    <title>Props to JavaMUG</title>
    <link>http://gigavolt.net/blog/2003/06/14#javamugtop25</link>
    <description>&lt;p /&gt;
The Dallas area Java users group, of which I&amp;#8217;m a member, was named one of the &lt;a href=&quot;http://servlet.java.sun.com/jugs/top25.jsp&quot;&gt;top 25&lt;/a&gt; in the world. One of the upsides is that it means that we&amp;#8217;ll have access to alpha and beta versions of Sun products such as Rave. I don&amp;#8217;t know details, and I&amp;#8217;m not even sure they&amp;#8217;ve been ironed out yet. If it&amp;#8217;s going to be allowable, I&amp;#8217;ll write up my experiences here in upcoming months.</description>
  </item>
  <item>
    <title>More Rsync Fun</title>
    <link>http://gigavolt.net/blog/2003/06/07#rsyncreferer2</link>
    <description>&lt;p /&gt;
As I &lt;a href=&quot;http://gigavolt.net/blog/2003/05/05#rsyncreferer&quot;&gt;wrote&lt;/a&gt; before, I&amp;#8217;ve been using rsync to update my blog entries between my laptop and web host. I finally got around to debugging a problem I had with my previous shell script that allowed me to download a referrer.log at the same time I uploaded my blog entries. It ended up that on second and subsequent uses, the symlink to referrer.log on the webhost got overwritten with the actual file that was on my laptop. So I added an exclusion of *.log going from my laptop to the webhost. Here&amp;#8217;s the updated script:
&lt;pre&gt;&lt;code&gt;
#! /bin/sh
rsync -Cavz -e ssh --delete --exclude=&quot;*.log&quot; \
/Users/gvaughn/Sites/gigavolt.net/blosxom/ \
userid@webhost.com:/WebSite/gigavolt/blosxom/

rsync -urptgovLz -e ssh --copy-unsafe-links \
userid@webhost.com:/WebSite/gigavolt/blosxom/ \
/Users/gvaughn/Sites/gigavolt.net/blosxom/ &lt;/code&gt;&lt;/pre&gt;
&lt;/code&gt;&lt;/pre&gt;
In general, if you&amp;#8217;re not working directly on your web server, you owe it to yourself to learn about rsync. It&amp;#8217;s so much better than ftp for those sorts of synchronizations you&amp;#8217;ll want to do on a regular basis.</description>
  </item>
  <item>
    <title>Raising the Bar?</title>
    <link>http://gigavolt.net/blog/2003/06/05#raisingTheBar</link>
    <description>&lt;p /&gt;
I started asking myself some new questions today. I&amp;#8217;m going to try to capture the thought process that led me to it here, so bear with me. I&amp;#8217;ll get to the point eventually.
&lt;p /&gt;
In response to a question today, I said that once someone has truly embraced unit testing on a decent sized project, they&amp;#8217;d be forced to either re-invent mock objects if they hadn&amp;#8217;t been exposed to the concept, or give up unit testing as too difficult. I&amp;#8217;ve found myself using mock objects regularly in my unit tests. On the first project I used unit tests, I&amp;#8217;d independantly decided to use lightweight inner classes within my test classes for the collaborators of the test class. I&amp;#8217;m enough of a researcher that I soon learned and read about mock objects. I&amp;#8217;ve heard similar stories from others. The point being that mock objects are a natural consequence of TDD (Test Driven Development) or even unit testing after writing the subject code.
&lt;p /&gt;
The reason mock objects are a natural consequence is that using unit testing as a design tool leads us to loosely coupled code, just to make unit testing bearable. This has led me to rely less on static methods including the Singleton pattern. To make up for this, I find myself using JNDI and JMX more, as they provide a way to find collaborators without being tightly coupled. I&amp;#8217;ve even written trivial partial implementations of each for use during unit testing. For actual deployment I&amp;#8217;ve been using JBoss lately.
&lt;p /&gt;
This week I&amp;#8217;ve written a small system using JMX, MessageDrivenBeans, and utility classes stored in the JNDI tree. Each component has a good suite of unit tests and I have high confidence in the actual code. However, the next step of assembling these components into a useful application has been troublesome.
&lt;p /&gt;
It was a good thing I was already writing a JMX MBean, because that&amp;#8217;s apparently the only way to bind objects into the JNDI tree. Then it seems that the objects bound must be Serializable, even in the &amp;#8216;java&amp;#8217; context. Then there were deployment order issues about whether I had to manually create an application specific sub-context, or whether the DataSource config file ran first and created the sub-context for me. Then I had to make sure I had all the JNDI mappings correct. The MessageDrivenBean looks up simple names, that are in a context specific to the bean, and the deployment descriptor maps those to where the real object is bound &amp;#8212; this causes more order dependencies.
&lt;p /&gt;
Now to my question. Is this really making our lives any simpler as developers? Are we truly raising the bar? I feel that I&amp;#8217;m having to learn an additional programming language that is a mixture of Java, XML, properties, and general app server understanding in order to assemble my components. I&amp;#8217;m worried that even though unit tests gave me confidence in each component in isolation, I have little confidence is the entire application assembly process.
&lt;p /&gt;
The J2EE docs speak of those different roles of bean developer, deployer, assembler, administrator, etc. but in practice I&amp;#8217;ve never seen those roles taken by different people. The developers are called upon to do them all. I&amp;#8217;ve wondered for a while whether software development would reach the point where there&amp;#8217;s a distinction between developers that write components, and people (developers, technical business analysts, users) who wire the components together into applications. Is the widespread use of unit testing going to bring us closer to this? And then the biggie: is it a desirable outcome?</description>
  </item>
  <item>
    <title>A New Job for John Cleese</title>
    <link>http://gigavolt.net/blog/2003/05/22#sillywalks</link>
    <description>&lt;p /&gt;
The Ministry of Silly Walks is my favorite Monty Python sketch. I would try to lookup a link to a transcript, but it&amp;#8217;s such visual humor that the transcript would be useless to anyone who hasn&amp;#8217;t seen it. Well, as an example of life imitating humor, the Pentagon is &lt;a href=&quot;http://www.guardian.co.uk/uslatest/story/0,1282,-2694090,00.html&quot;&gt;researching&lt;/a&gt; how to identify people by analyzing the way they walk. Note the irony of finding this story about the US government at a British news source.
&lt;p /&gt;
Well, maybe if John Cleese did get involved, Total Information Awareness could have &lt;em&gt;some&lt;/em&gt; entertainment value.</description>
  </item>
  <item>
    <title>Forgiveness or Permission</title>
    <link>http://gigavolt.net/blog/2003/05/22#staticvsdynamic2</link>
    <description>&lt;p /&gt;
Dan Steinberg got me thinking along the lines of the old saying &amp;#8220;it&amp;#8217;s easier to ask for forgiveness than permission&amp;#8221; with a side remark in his &lt;a href=&quot;http://www.macdevcenter.com/pub/a/mac/2003/05/20/osx_java.html&quot;&gt;article&lt;/a&gt; on iCal. What he actually wrote was &amp;#8220;With exceptions and strong typing, Java makes you say &amp;#8216;please&amp;#8217; while Perl makes you say &amp;#8216;sorry&amp;#8217;&amp;#8221; A static typed language makes you ask &amp;#8216;please&amp;#8217; ahead of time, while a dynamic language makes you say &amp;#8216;sorry&amp;#8217; by waiting until runtime to find some errors. But, of course, a good unit test suite reduces that significantly.
&lt;p /&gt;
My last &lt;a href=&quot;http://gigavolt.net/blog/2003/05/05#staticvsdynamiclanguages&quot;&gt;entry&lt;/a&gt; on this topic discussed the idea of using the &amp;#8216;safe&amp;#8217; aspects of static typing for writing robust system facilities, while using the &amp;#8216;easy&amp;#8217; aspects of dynamic typing for business logic that will probably need to change over time. Ted Neward recently &lt;a href=&quot;http://www.neward.net/ted/weblog/index.jsp?date=20030522#1053617115876&quot;&gt;wrote&lt;/a&gt; about using static and dynamic languages for these different purposes.
&lt;p /&gt;
In my opinion, one of the generating functions for the whole Agile movement is that requirements from non-technical people are unavoidably vague. These are the people we get the business logic requirements from. However, it is typically other developers that define what the system facilities must do. Recently I wrote a JMX MBean that had to handle retrying communication with an external web service that occasionally goes down. It basically moves JMS Messages to and from a temporary queue with the use of a timer. The MessageDrivenBean that actually performs the communication and business logic just has to rollback the transaction that includes accepting receipt of the message when it can&amp;#8217;t communicate with the external service. The MBean system facility takes care of calling it again later.
&lt;p /&gt;
In writing this MBean, the static typing of Java helped make it robust. The checked exceptions forced me to seriously consider different failure modes and how to handle them without losing any messages from the queue. This is a system facility whose requirements were ultimately driven by developers. Once the requirements were understood they never changed. I propose this is the common behavior for this sort of system facility, and that it is precisely because there is not the typical impedance mismatch of communication between technical and non-technical folks. But for business logic, this mismatch exists, and dynamic typing makes the changes much less painful
&lt;p /&gt;
I&amp;#8217;m on a roll here, so I&amp;#8217;ll bring up one more related topic that has come up in recent conversations with coworkers. We&amp;#8217;ve been discussing exception handling. Most the developers have been doing Java lately, but there&amp;#8217;s a new project being written in .NET, which only has unchecked exceptions. Java gives you the choice of either checked or unchecked exceptions. My position is that checked exceptions go hand in hand with strong typing, and unchecked exceptions go with dynamic typing. Unchecked exceptions help make the code more fungible around business logic, which checked exceptions help make the code more robust around system facilities. Java gives us that choice in the exception arena, but not more broadly for type safety. (Oh, and .NET is really mismatched by having static typing, but unchecked exceptions.)
&lt;p /&gt;
I forget where I read it lately, but someone proposed a language that would allow you that choice in how types were enforced. If this could be done on a class by class, or component by component level, it would let us avoid the complexity of using two implementation languages for an application, which would happen if we go with a static typed language for system facilities and a dynamically typed language for business logic. Perhaps there already is a non-mainstream language that allows that. Let me know if you&amp;#8217;re aware of any.</description>
  </item>
  <item>
    <title>Educational Tests</title>
    <link>http://gigavolt.net/blog/2003/05/10#edutests</link>
    <description>&lt;p /&gt;
Brian Marrick &lt;a href=&quot;http://www.testing.com/cgi-bin/blog/2003/05/08#learning-tests&quot;&gt;comments&lt;/a&gt; on Mike Clark&amp;#8217;s blog entry &lt;a href=&quot;http://www.clarkware.com/cgi/blosxom/2003/05/06#Software/Development/StayingFitWithLearningTests&quot;&gt;Staying Fit With Learning Tests &lt;/a&gt;. I&amp;#8217;m quite interested since I noticed some of my own backsliding behavior recently when I was writing code against a new API. I was writing my first JMX MBean, and had no one experienced with JMX around for guidance. I didn&amp;#8217;t write it test first :-O
&lt;p /&gt;
I did, however, go back and give it a full unit test suite after-the-fact, and it has been rock solid in production. It did take some refactoring to get it in shape to be easy to unit test, so the late testing step did improve the design. Anyway, back on topic: I attributed my backsliding to the fact that I was exploring/learning a new API.
&lt;p /&gt;
I think there&amp;#8217;s a well-known compromise between Brian and Mike&amp;#8217;s approaches, and I&amp;#8217;m waiting for a Smalltalker to go into more details &amp;#8212; the Inspector. My first development job was for the Apple Newton PDA, which used a custom language called NewtonScript that had features from a number of languages (I&amp;#8217;ll try really hard not to bore everyone with all the details, but suffice it to say that it was really a &lt;em&gt;great&lt;/em&gt; language to program in, but I was too inexperienced to really realize it at the time). 
&lt;p /&gt;
One of the features the NewtonScript IDE copied from Smalltalk was the Inspector. I&amp;#8217;m sure I never used it to its full potential due to being young and dumb at the time, but it allowed the sort of interactive exploration Brian is mentioning, and stored these &amp;#8220;lessons learned&amp;#8221; in a file that could easily be reopened and re-executed at any time. Mike&amp;#8217;s learning tests don&amp;#8217;t sound like they&amp;#8217;re going to be included in the regular source tree and build process. The only reason they would be saved is to review the lesson and copy/paste some of it into the real system.
&lt;p /&gt;
Eclipse has the concept of scrapbook pages, which are essentially renamed Inspector pages. It&amp;#8217;s not too surprising considering Eclipse&amp;#8217;s Visual Age roots, however, I was coding in IntelliJ IDEA so I didn&amp;#8217;t think of a scrapbook until I read Brian&amp;#8217;s blog. The advantage of an inspector/scrapbook page over Mike&amp;#8217;s practice is that you don&amp;#8217;t need the overhead of a full compilation unit. You don&amp;#8217;t have to have a class and method in which to place executable lines of code. The &amp;#8216;run&amp;#8217; function of the scrapbook handles that for you.
&lt;p /&gt;
I suppose I need to explore some more nooks and crannies of IntelliJ to see if scrapbooks are available, but I had looked briefly when I first switched from Eclipse and did not find them. Perhaps it is time to file a feature request.</description>
  </item>
  <item>
    <title>iLoo</title>
    <link>http://gigavolt.net/blog/2003/05/10#iloo</link>
    <description>&lt;p /&gt;
I first saw an AP story on this, but I thought it had to be a hoax until I found &lt;a href=&quot;http://www.microsoft.com/uk/press/content/presscentre/releases/2003/05/PR03049.asp&quot;&gt;this&lt;/a&gt; on Microsoft&amp;#8217;s own website. They&amp;#8217;re creating an Internet connected port-a-potty! 
&lt;p /&gt;
Must&amp;#8230;&amp;#8230;.resist&amp;#8230;&amp;#8230;..toilet&amp;#8230;&amp;#8230;.humor&amp;#8230;&amp;#8230;. but it&amp;#8217;s such &lt;em&gt;fertile&lt;/em&gt; ground.</description>
  </item>
  <item>
    <title>Hackers and Painters</title>
    <link>http://gigavolt.net/blog/2003/05/10#hackersandpainters</link>
    <description>&lt;p /&gt;
I know I gave Paul Graham a bit of a hard time &lt;a href=&quot;http://gigavolt.net/blog/2003/04/11#future&quot;&gt;earlier&lt;/a&gt;, but I have nothing negative to say about his latest essay, &lt;a href=&quot;http://www.paulgraham.com/paulgraham/hp.html&quot;&gt;Hackers and Painters&lt;/a&gt;. He weighs into the dynamic vs. static languages with this great characterization:
&lt;blockquote&gt;
&amp;#8230; a programming language should, above all, be malleable.  A programming language is for thinking of programs, not for expressing programs you&amp;#8217;ve already thought of.  It should be a pencil, not a pen.  Static typing would be a fine idea if people actually did write programs the way they taught me to in college.  But that&amp;#8217;s not how any of the   hackers I know write programs.  We need a language that lets us scribble and smudge and smear, not a language where you have to sit with a teacup of types balanced on your knee and make polite conversation with a strict old aunt of a compiler. 
&lt;/blockquote&gt;
&lt;p /&gt;
I&amp;#8217;m seeing writings all about dynamic vs. static languages all over blogspace. In the meta-sense, it&amp;#8217;s really interesting to see a common topic over such a wide variety of individual writers. Good writers, must first be good readers.
&lt;p /&gt;
I also was quite struck by this insightful, but disheartening observation:
&lt;blockquote&gt;
Big companies want to decrease the standard deviation of design outcomes because they want to avoid disasters. But when you damp oscillations, you lose the high points as well as the low. This is not a problem for big companies, because they don&amp;#8217;t win by making great products. Big companies win by sucking less than other big companies. 
&lt;/blockquote&gt;
&lt;p /&gt;
The only slightly contrary point I&amp;#8217;d make about the whole essay is that experimental scientific research is a lot more like debugging than he realizes.</description>
  </item>
  <item>
    <title>Rsync Your Referrer log</title>
    <link>http://gigavolt.net/blog/2003/05/06#rsyncreferer</link>
    <description>&lt;p /&gt;
I had thought about this the other day, but it didn&amp;#8217;t immediately work as easily as I expected. On my webhost, I&amp;#8217;ve added a symlink to my referrer log file in my blosxom directory. I also made a custom shell script that Blapp executes to synchronize my blog entries. That script does a two way rsync so not only does it publish my latest entries from the laptop to the webhost, but it also copies the referrer log from my webhost to my laptop. The script looks like this (with some mods to protect the innocent and a line continuation backslash for presentation):
&lt;pre&gt;&lt;code&gt;
#! /bin/sh
rsync -Cavz -e ssh --delete /Users/gvaughn/Sites/gigavolt.net/blosxom/ \
userid@webhost.com:/WebSite/gigavolt/blosxom/

rsync -urptgovLz -e ssh --copy-unsafe-links \
userid@webhost.com:/WebSite/gigavolt/blosxom/ \
/Users/gvaughn/Sites/gigavolt.net/blosxom/ &lt;/code&gt;&lt;/pre&gt;

As a bonus tip, that &amp;#8216;C&amp;#8217; in the first rsync call respects entries in $HOME/.cvsignore. I added &amp;#8216;.DS_Store&amp;#8217; in there to keep some of that extra junk from going across.</description>
  </item>
  <item>
    <title>Dynamic vs. Static Languages</title>
    <link>http://gigavolt.net/blog/2003/05/05#staticvsdynamiclanguages</link>
    <description>&lt;p /&gt;
Bob Martin asks &lt;a href=&quot;http://www.artima.com/weblogs/viewpost.jsp?thread=4639&quot;&gt;Are Dynamic Languages Going to Replace Static Languages&lt;/a&gt;. I replied:
&lt;blockquote&gt;
A couple of months ago my mind went down this same path. I do believe that TDD compensates for many of the things static typing helps with. Over an IM conversation with &lt;a href=&quot;http://www.vanderburg.org/cgi-bin/glv/blosxom&quot;&gt;Glenn Vanderburg&lt;/a&gt;, he came up with a good counter-point. The pointcut concept introduced by AOP is very powerful, and relies on static typing. I haven&amp;#8217;t gotten my hands into AOP enough to be sure, but my impression is that it could be viewed as a compensation for the lack of meta-programming. Since weakly typed languages are more likely to offer meta facilities, this may be a moot point. 
&lt;p /&gt;
I&amp;#8217;m glad to read the article to refresh this idea in my mind, because I think it may tie into the other direction my mind has been going lately (and I love those connections between ideas). I&amp;#8217;ve recently began emphasizing the difference between the business logic classes, and the system infrastructure classes and how the different goals imply the different approaches we should use. 

Now I&amp;#8217;m confronted with the question: Is system infrastructure best with static typing, and business logic with weak typing? 

I think I&amp;#8217;ll start up a new background thread.. 
&lt;/blockquote&gt;

So, I&amp;#8217;m not so sure dynamic languages will replace static ones, but I do think they&amp;#8217;ll take some of the market where they are typically used. This also ties into my early &lt;a href=&quot;http://gigavolt.net/blog/2003/04/11#future&quot;&gt;entry&lt;/a&gt; about looking for languages that truly move the state of the art ahead. I will have the time to get more acquainted with Ruby by using it in a project in the next month or two. I&amp;#8217;m excited.</description>
  </item>
  <item>
    <title>Finding Bugs is Easy</title>
    <link>http://gigavolt.net/blog/2003/05/05#findBugs</link>
    <description>&lt;p /&gt;
I&amp;#8217;m referring to a paper describing the utility &lt;a href=&quot;http://www.cs.umd.edu/~pugh/java/bugs/&quot;&gt;FindBugs&lt;/a&gt;. It appears to be developed by a student of Bill Pugh, who is best known for discovering why double-checked locking is not completely safe in Java. I haven&amp;#8217;t had the time to play with it yet, but judging from the paper, it looks very promising. It uses heuristics to find typical bug &amp;#8220;patterns&amp;#8221;. Yes, it&amp;#8217;ll have false positives, but it could also prove invaluable in tracking down real bugs before they bite.</description>
  </item>
  </channel>
</rss>