<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-5369352</atom:id><lastBuildDate>Fri, 08 Aug 2008 18:02:30 +0000</lastBuildDate><title>JD Tangney &amp; Associates</title><description/><link>http://jdtangney.com/resources/blog/</link><managingEditor>noreply@blogger.com (jdtangney)</managingEditor><generator>Blogger</generator><openSearch:totalResults>276</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-3662872130648519889</guid><pubDate>Fri, 08 Aug 2008 05:12:00 +0000</pubDate><atom:updated>2008-08-08T06:56:24.894-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>xp</category><title>Wired</title><description>&lt;p&gt;All of my on-stage experience to date has been unplugged. That is, I have never dealt with amplification of any sort. I have sung the lead in operettas and musicals of all sorts as well as numerous musical roles, of course. All of it unamplified. But I have never – until tonight – had to sing onstage with a full band, had to deal with mic technique, had to try to follow exactly where the hell we are in the song with a monitor blaring the bass line alone...&lt;/p&gt;
&lt;p&gt;The "Music Masti" at Agile2008 was my wired debut. Damn, it's hard to figure out where you are, to keep track, to be able to hear un-monitored instruments when you are singing in a band.&lt;/p&gt;
&lt;p&gt;Now I have designed sound for stage productions, even mic'ing actors where needed. But now I know what it's like to be on the performing end. Who'd a' thunk it was so hard? This is what happens when you let popular culture pass you by.&lt;/p&gt;
&lt;p&gt;Sigh. There's a lesson in this. There is no substitute for doing, even when it seems that "it" is a natural extension of what one already knows. Maybe it's the geek mystique: "How hard could it be?" But when you pick up that mic and you realize that it's actually &lt;em&gt;not&lt;/em&gt; that self-evident,.. it's no longer an extrapolation from the known the assumed, but genuinely into the unknown, it's a bit of shock.&lt;/p&gt;
&lt;p&gt;Regardless, it was unbelievable fun.&lt;/p&gt;
&lt;p&gt;Rock on!&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/08/wired.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-4035514348146020582</guid><pubDate>Fri, 08 Aug 2008 05:10:00 +0000</pubDate><atom:updated>2008-08-08T06:56:30.542-07:00</atom:updated><title>tSQLt</title><description>&lt;p&gt;I attended a demo today in which tSQLT was put through its paces. It's a microtesting framework for databases. So what makes this one different? For one, the two dudes who presented totally &lt;em&gt;get&lt;/em&gt; TDD. The framework eats its own dogfood (it was TDD'ed with itself.)&lt;/p&gt;
&lt;p&gt;Downside? So far, it appears to be MS SQL Server-only. It's "pre-alpha" in the words of the authors, so it may not be as mature as one might like.&lt;/p&gt;
&lt;p&gt;Still, the promise of real, grown-up TDD in a database is mighty appealing.&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/08/tsqlt.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-6733835716289823768</guid><pubDate>Wed, 30 Jul 2008 18:12:00 +0000</pubDate><atom:updated>2008-07-30T11:53:01.436-07:00</atom:updated><title>FileMaker – the war continues</title><description>&lt;p&gt;Now that I am starting to add some web-visible components to the SIS I am building with FMP, I finally have the opportunity to test-drive what I'm doing. What a pleasure it is to make a Selenium script that logs in, clicks around, types a bit and validates the contents of the web pages!

&lt;p&gt;Of course, the best part of test-driving (albeit in this rather coarse, macro way sans microtests) is that it is so much faster! I spent a few minutes putting the script together. I didn't even bother using Selenium-RC but instead just run the thing straight from the IDE. Then, logging in with the right credentials and doing all the preliminary navigation is done precisely &lt;span class="Apple-style-span" style="font-style: italic;"&gt;once&lt;/span&gt; in my script. I don't have to do that mind-numbing, repetitive work that machines enjoy but I don't.

&lt;p&gt;The test, simple as it is, is a one-click, red/green litmus test. If it's red, I hack around in the gibblies of my app, and click again. Rinse and repeat. When it's green, I refactor a little then check in.

&lt;p&gt;Of course, checking in a giant FileMaker file as an opaque, binary monolith really only has value as a backup. There ain't no way anyone's ever going to do a diff on those puppies. Maybe I should take the extra 5 minutes to generate a new DDR in XML and check &lt;span class="Apple-style-span" style="font-style: italic;"&gt;that&lt;/span&gt; in.

&lt;p&gt;And since you brought it up, refactoring's a larf in FMP. Maybe I'll write a book called "Refactoring to FMP Patterns." In reality, all I actually do is to get rid of any debug fields or relationships I created. 

&lt;p&gt;While the scripts seem like an obvious target, the real, hard-core refactoring of scripts is something I have skirted. As I mentioned in a previous post, the overhead of passing parameters into a "sub-script" feels like it outweighs the putative benefits. Maybe there are some tricks that I can come up with... I'll have to think about this more seriously. 

&lt;p&gt;Meanwhile, even if we can't do much beyond the basics regarding the size of scripts, we can start with intention-revealing names for scripts and variables. Deep nesting of if's might be reduced by using guard clauses.

&lt;p&gt;Other refactorings might come from the database world. At least that's well-understood! Most of the time it's not much of an issue for the schema itself; it's a question of factoring correctly in the first place, thereby obviating the necessity to &lt;span class="Apple-style-span" style="font-style: italic;"&gt;re&lt;/span&gt;-factor. It's not rocket surgery: normalize the schema. Don't duplicate. Consider whether a 1-1 relationship is worth the overhead of maintaining it. The usual bitrot kinds of things like lousy names of fields and tables are quite trivial to deal with in the FMP world – references are transparently updated.

&lt;p&gt;Layouts, being primarily collections of visual elements, yield to modest refactoring goals like maintainability through revelation of intention. Reduction of duplication by parameterizing the layout is not something I have pursued very rigorously. There is probably room for exploration there. One concern is that supporting such techniques might require introducing temporary tables. I suppose I shouldn't be afraid of that, but the though of copying data back and forth just seems like a lot of heavy lifting, again outweighing the minor inconvenience of duplication. Sigh. Another area I guess I need to delve into a bit more deeply.

&lt;p&gt;Although FMP retains references to internal objects by some means other than their names (so you can, e.g. rename a table and all references to it show the new name), it's possible to delete some objects and leave unused objects in the file. This is where an analysis tool is yer only man. It often takes several passes to get a file "clean", but it's worth it as a regular part of pre-checkin refactoring hygiene.

&lt;p&gt;While writing this, I have noticed areas that might be fertile ground for further XP-oriented study. You'll be the first to know.</description><link>http://jdtangney.com/resources/blog/2008/07/filemaker-war-continues.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-5723483550272491675</guid><pubDate>Mon, 28 Jul 2008 03:20:00 +0000</pubDate><atom:updated>2008-07-27T20:20:56.061-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>user interface</category><title>Readings on User Interface for Children's Interactive Media</title><description>&lt;p&gt;There is a quiet, but knowledgeable community on the ACM's CHI-Kids mailing list. A reader had requested references to "user interface standards and guidelines for children ages 3 to 6 years old. " Another reader collected them, and they are now posted &lt;a href="http://dustormagic.wikispaces.com/Readings"&gt;on this wiki.&lt;/a&gt;&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/07/readings-on-user-interface-for-children.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-2792540801134347287</guid><pubDate>Fri, 25 Jul 2008 23:51:00 +0000</pubDate><atom:updated>2008-08-08T06:56:19.504-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>xp</category><title>Disgruntled employees</title><description>&lt;p&gt;I caught a bit of this morning's Forum on KQED (&lt;a href="http://www.kqed.org/.stream/anon/radio/forum/2008/07/2008-07-25a-forum.mp3"&gt;Download (MP3)&lt;/a&gt;) which was mostly about some civil servant in SF who sabotaged the City's computer systems, and what that means for employers and "health and security of the workplace."&lt;/p&gt;
&lt;p&gt;The interesting bit for me was a Towers Perrin survey of 90,000 employees across 18 countries indicating "widespread disengagement".&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;21% "engaged with their work"&lt;/li&gt;

  &lt;li&gt;38% "partly or fully disengaged"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also cited was a Gallup survey saying that&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;19% of employees are "actively disengaged" i.e. trying to sabotage the workforce&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I bring this up because as XP evangelists we run into people who &lt;i&gt;we want&lt;/i&gt; to see succeed and excel, but who might be dealing with the own demons. And a much-cited antidote mentioned on the show was "job rotation" and "employees training each other". So pair programming is not just good for the code, good for the dev, good for the team, good for the enterprise, &lt;strong&gt;but&lt;/strong&gt; it might just stop you from going postal. ;-)&lt;/p&gt;
&lt;p&gt;Those numbers also tell us that there is a vast amount of waste. Large numbers of people punch clocks and little else. Again, as XPers, we talk about productivity, but what does that really mean for someone who is &lt;a href="http://en.wikipedia.org/wiki/Comfortably_Numb"&gt;comfortably numb&lt;/a&gt;?&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/07/disgruntled-employees.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-5534978446144516130</guid><pubDate>Thu, 24 Jul 2008 03:22:00 +0000</pubDate><atom:updated>2008-07-23T21:04:36.898-07:00</atom:updated><title>Facebook Rediscovered</title><description>&lt;p&gt;Seriously.&lt;/p&gt;
&lt;p&gt;I joined pretty soon after FB started up. I wanted to jump on the social networking bandwagon as a marketing tool. I gave up almost immediately, since I was not interested in dating... That seemed to be the exclusive intent of FB at the time.&lt;/p&gt;
&lt;p&gt;A couple days ago, I logged in on a whim. I found old school friends from 30 years ago, my teenaged niece, and various former colleagues. The maturity of the site was impressive, both UI and content. Now my purpose is different. It's social! It's a way to reconnect and keep in touch - and be silly about it!&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/07/facebook-rediscovered.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-8339914062120477157</guid><pubDate>Sun, 20 Jul 2008 17:49:00 +0000</pubDate><atom:updated>2008-07-20T10:57:26.729-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>xp</category><category domain='http://www.blogger.com/atom/ns#'>filemaker</category><title>Why FileMaker ultimately sucks</title><description>&lt;p&gt;When you have a FileMaker "solution" in place, you have a large investment in UI design and usability. You might, depending on the quality of the original design, also have an investment in the database schema. Porting to another environment - say Java + Spring + Hibernate - is daunting, mostly because re-implementing the UI is such a vast undertaking.&lt;/p&gt;
&lt;p&gt;As an XPer, I need to be able to test-drive development. The only reasonable way to do that is by using external AppleScript (or Python + appscript and maybe PyUnit too) tests. I don't know about you, but that sounds like far more trouble than it's worth. Just navigating the maze of what works as expected and what requires arcane tricks in the AppleScript world gives me a headache just thinking about it.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;XPers also refactor. Not surprisingly, there are no tools at all for refactoring. Worse, the structure and syntax of FileMaker's scripting language actively discourages refactoring. For example, while it's &lt;em&gt;possible&lt;/em&gt; to pass multiple arguments into a sub-script, they have to be packed on the caller side and unpacked by the callee - multiple lines of script. And having to drag commands into place rather than just type like a normal human...&lt;/p&gt;
&lt;p&gt;Then there is basic source control. A FileMaker file consists of several elements, the most important being&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Tables and relationships&lt;/li&gt;

  &lt;li&gt;Scripts&lt;/li&gt;

  &lt;li&gt;Layouts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I need to be able to see what's changed from one version of my FMP file to another. Since all the above elements are stored in a single binary file with a proprietary format, it's impossible to do a diff. Sure, one could export a DDR XML file and diff that, but diffing XML?!&lt;/p&gt;
&lt;p&gt;And there are indeed tools that purport to do this. Unfortunately, they are universally hard to use and slow, if you cam get them to work at all. (Of the 3 main contenders, I have only managed to get the demo version of one of them to work consistently. The others are so obsessed with license keys that they fail to work at all.)&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/07/why-filemaker-ultimately-sucks.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-7416801148231972937</guid><pubDate>Sun, 20 Jul 2008 17:39:00 +0000</pubDate><atom:updated>2008-07-20T12:03:07.977-07:00</atom:updated><title>Wanted: Part-Time IT Support</title><description>&lt;p&gt;&lt;a href="http://www.montessorifamily.com/"&gt;Montessori Family School&lt;/a&gt; is looking for someone to help with IT support. This is a part-time position. In addition to maintaining hardware and software for a dozen Macs of various vintages, this person will need to help users - and help them learn to help themselves. The IT support person will need to be available during business hours.&lt;/p&gt;
&lt;p&gt;This is an entry- to intermediate-level position. We have a corps of volunteers so this person will not be alone and can learn on the job. Attitude and aptitude are more important than experience.&lt;/p&gt;
&lt;p&gt;Because this is an elementary school, a background check will be conducted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Essential Qualifications:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Good working knowledge of Mac OS X configuration and setup ("power user")&lt;/li&gt;

  &lt;li&gt;Strong verbal communication skills and the ability to listen and understand&lt;/li&gt;

  &lt;li&gt;Strong service ethic and enthusiasm for getting things done - without being reckless.&lt;/li&gt;

  &lt;li&gt;The desire to make users' lives easier&lt;/li&gt;

  &lt;li&gt;Ability to perform minor surgery on Macs (install memory, replace disk drives, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ideal Qualifications:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;An ability to organize and simplify - a digital neatnik&lt;/li&gt;

  &lt;li&gt;The wisdom to balance infrastructure improvements against budget realities&lt;/li&gt;

  &lt;li&gt;Curiosity and a commitment to learning, both personally and as a contributor to the MFS mission.&lt;/li&gt;

  &lt;li&gt;Willingness to ask questions (especially "Why?") and to press for answers without being obnoxious&lt;/li&gt;

  &lt;li&gt;Knowledge of network infrastructure (routers, switches, 802.11x)&lt;/li&gt;

  &lt;li&gt;Understanding of the role of ISPs and corresponding system configuration&lt;/li&gt;

  &lt;li&gt;Basic understanding of system security - why it's needed and some sense of what to do about it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Interested, or know someone who might be? &lt;a href="http://jdtangney.com/contact/index.html"&gt;Contact John&lt;/a&gt;&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/07/wanted-part-time-it-support.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-8928942076478719643</guid><pubDate>Wed, 16 Jul 2008 02:53:00 +0000</pubDate><atom:updated>2008-07-15T19:53:56.806-07:00</atom:updated><title>Montessori Middle School</title><description>&lt;p&gt;If you know anyone who'd make a good Middle School Teacher...&lt;/p&gt;
&lt;blockquote cite="http://www.montessorifamily.com/jobs.html"&gt;
  [From &lt;a href="http://www.montessorifamily.com/jobs.html"&gt;&lt;cite&gt;Montessori Family School - Education for Peace - Job Openings&lt;/cite&gt;&lt;/a&gt;]
&lt;/blockquote&gt;
&lt;p&gt;And yes, it's real Montessori.&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/07/montessori-middle-school.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-8607792978066932352</guid><pubDate>Tue, 20 May 2008 00:15:00 +0000</pubDate><atom:updated>2008-07-20T12:17:45.446-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>java</category><category domain='http://www.blogger.com/atom/ns#'>xp</category><title>Selenium-RC</title><description>&lt;p&gt;My "&lt;a href="http://submissions.agile2008.org/node/5043"&gt;Mastering Selenium&lt;/a&gt;" tutorial has been approved at Agile2008. I am very excited about that.&lt;/p&gt;
&lt;p&gt;Meanwhile, in preparation, I have been putting &lt;a href="http://selenium-grid.openqa.org/"&gt;Selenium-Grid&lt;/a&gt; through its paces at &lt;a href="http://industriallogic.com/"&gt;Industrial Logic&lt;/a&gt;. We are formulating a high level lingua franca to use in describing executable Storytests. This is a big deal. It was the promise of &lt;a href="http://fit.c2.com/"&gt;FIT&lt;/a&gt;, but for one reason or another (and theories abound!) Customers stayed away from FIT in droves.&lt;/p&gt;
&lt;p&gt;Our old Selenium tests had been constructed using a wiki language and template processor. This provided a powerful toolset with which to construct Stroytests, but we ran into 3 major issues:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Selenium Core is slow&lt;/li&gt;

  &lt;li&gt;With the HTML Selenium tests, there is no guaranteed tear-down as there is in xUnit&lt;/li&gt;

  &lt;li&gt;Our toolset, while providing a fair bit of power and reasonable readability, did not come close to the expressiveness of a language like Python, Java, or Ruby in Selenium-RC.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So we went full out for Selenium-RC, using JUnit to drive the tests against a local Selenium-server.&lt;/p&gt;
&lt;p&gt;To get the ball rolling, we grabbed the HTML from an old Selenium test by simply firing it up in Selenium Core and grabbing the code from the browser. It's a trivial matter to translate it into one of the Selenium-RC languages - we're using Java - with the Selenium IDE. Some deft text editing massages the Java file into shape so that it fits into it's place in the class hierarchy. More about the hierarchy later. We found reworking these legacy Stroytests to be an illuminating process. It meant bottom-up - starting with a very long list of Selenese commands, and doing &lt;code&gt;extract method&lt;/code&gt; on clumps of code. The original source file with its template language was found to be lacking in many cases. The tests had grown over time and had not been refactored. We found some very interesting issues:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Code that verified conditions that had absolutely nothing to do with the story at hand. These were presumably checks that had been copied/pasted from some other test where those checks were relevant.&lt;/li&gt;

  &lt;li&gt;Some tests attempted to do too much and veered off on a tangent.&lt;/li&gt;

  &lt;li&gt;Once we put in place some decent setup and (dependable!) tear-down, the test body was short and to the point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what does the class hierarchy look like?&lt;/p&gt;
&lt;p&gt;The immediate superclass of each Selenium test class contains domain-specific helper methods. Its superclass is essentially a proxy for the Selenium server (or a hub, which is in turn a proxy for the runners.) For that class, we started with the SeleneseTestCase that is provided in the download, but decided that we didn't like it for a variety of reasons. In particular, we needed to do some magic so that a new Selenium session (and hence a new browser) is only launched if none already exists for the current thread. That's because we exploit the good ol' JUnit 3.x suite and test decorators to run allow for parallelization of tests. Sure, we could have used testng but its seemed a little haphazard to us and that business of generating an intermediate xml file just doesn't seem right.&lt;/p&gt;
&lt;p&gt;The next chunk of learning relates to just what is needed to get tests to run in parallel so that they don't stomp all over each other.&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/05/selenium-rc.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-6763553333514448562</guid><pubDate>Mon, 12 May 2008 02:01:00 +0000</pubDate><atom:updated>2008-05-11T19:01:24.295-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>macos</category><category domain='http://www.blogger.com/atom/ns#'>synology</category><title>AFP and Bonjour on DS-107+</title><description>&lt;p&gt;Here are some notes I took when getting a Synology DS-107+ to play nicely on an all-Mac network. I installed an AFP server and mDNS daemon, also known as Bonjour or Zeroconf.&lt;/p&gt;
&lt;p&gt;The first pitfall: Use firefox - bugs prevent proper privileges and path installation if you use Safari.&lt;/p&gt;
&lt;p&gt;Instal EnableSSH. See &lt;a href="http://www.synology.com/enu/support/releaseNote/SSH.php"&gt;Synology's instructions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Check "Hide this share in My Network Places". This prevents them from being published as samba shares. They're still accessible via samba, and AFS only publishes to people who have access anyway.&lt;/p&gt;
&lt;p&gt;Install ipkg by following the instructions on &lt;a href="http://www.maartendamen.com/node/6"&gt;Maarten Damen's site&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you're a Unix geek, you'll recognize ipkg as being a package manager something along the lines of Debian's apt or the Mac port, fink.&lt;/p&gt;
&lt;p&gt;We'll install &lt;a href="http://avahi.org/"&gt;avahi&lt;/a&gt; next. It's the Bonjour bit. The ipkg install is in the "unstable" tree so we need to tell ipkg about it by adding&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;to /opt/etc/ipkg.conf&lt;/p&gt;
&lt;p&gt;Then avahi will install by simply running&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ipkg install avahi&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;We need to give avahi the wherewithal to boot and be useful. I found that the slackware distro has the closest to what I wanted.&lt;/p&gt;
&lt;p&gt;Copy the init script from&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/avahi-0.6.22/initscript/slackware/avahi-daemon.in &lt;span style="font-family: Helvetica;"&gt;to &lt;span style="font-family: -webkit-monospace;"&gt;/opt/etc/init.d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Also change the @sbindir@ to /opt/sbin&lt;/p&gt;
&lt;p&gt;This is easiest if you mount /opt via smb (the share is published by ipkg bootstrap)&lt;/p&gt;
&lt;p&gt;Start all the daemons by running&lt;/p&gt;
&lt;p&gt;/opt/etc/rc.optware&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;In /opt/etc/avahi/services&lt;/p&gt;
&lt;p&gt;delete sftp-ssh.service and replace with afpd.service:&lt;/p&gt;
&lt;p&gt;(see http://gentoo-wiki.com/HOWTO_Share_Directories_via_AFP)&lt;/p&gt;
&lt;p&gt;Hacked the S20dbus script in /opt/etc/init.d to NOT check for pid file. I think the pid is not properly cleaned up on shutdown so dbus fails to boot. This causes it to run, which allows avahi to run too.&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/05/afp-and-bonjour-on-ds-107.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-417788481069023301</guid><pubDate>Fri, 18 Apr 2008 04:13:00 +0000</pubDate><atom:updated>2008-04-18T20:50:08.221-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>macos</category><category domain='http://www.blogger.com/atom/ns#'>xp</category><title>Macworld | Mac OS X Hints | Add more power to 10.5's screen sharing</title><description>&lt;blockquote cite="http://www.macworld.com/article/131094/2007/12/screensharepower.html"&gt;
  &lt;br /&gt;
  [From &lt;a href="http://www.macworld.com/article/131094/2007/12/screensharepower.html"&gt;&lt;cite&gt;Macworld | Mac OS X Hints | Add more power to 10.5's screen sharing&lt;/cite&gt;&lt;/a&gt;]&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;I live by VNC, since we are a distributed XP team. So I was thrilled when I found this MacWorld article on tweaking the build-in VNC client on Leopard.&lt;/p&gt;
&lt;p&gt;Now if only it would get over some of its temperamentality so I can use it reliably over an SSH tunnel or to a non-Mac machine.&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/04/macworld-mac-os-x-hints-add-more-power.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-4550453343710709508</guid><pubDate>Sat, 15 Mar 2008 04:13:00 +0000</pubDate><atom:updated>2008-03-14T21:13:21.910-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>macos</category><title>Leopard: Connect As... does nothing</title><description>&lt;p&gt;In Finder, Connect As says "Connecting" but does nothing. That's because NetAuthAgent is dead or wedged. See this thread: &lt;a href="http://discussions.apple.com/message.jspa?messageID=5785124#5785124"&gt;http://discussions.apple.com/message.jspa?messageID=5785124#5785124&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The only cure I can find is to log out/in again.&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/03/leopard-connect-as-does-nothing.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-8659856365609062903</guid><pubDate>Sat, 15 Mar 2008 04:12:00 +0000</pubDate><atom:updated>2008-03-14T21:12:21.568-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>macos</category><title>Getting Postfix running on Leopard</title><description>&lt;p&gt;1) Enable the service by changing the "disabled" flag in /System/Library/LaunchDaemons/org.postfix.master.plist I just use Lingon for this.&lt;/p&gt;
&lt;p&gt;2) Edit /etc/postfix/main.cf and uncomment and edit this line:&lt;/p&gt;
&lt;p&gt;myhostname = host.domain.tld&lt;br /&gt;
Also uncomment this line:&lt;br /&gt;
myorigin = $mydomain&lt;br /&gt;
That's it!&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2008/03/getting-postfix-running-on-leopard.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-8068579848542802989</guid><pubDate>Sat, 15 Mar 2008 04:10:00 +0000</pubDate><atom:updated>2008-03-14T21:10:22.651-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>java</category><category domain='http://www.blogger.com/atom/ns#'>xp</category><title>TDE - test-driven exploration</title><description>&lt;p&gt;So I was geeking out last night, as Mike would say. I was writing some code to fix some corruption in my calendar. It's in iCalendar format, so I found an ical4j framework on SourceForge and fired up Eclipse.&lt;/p&gt;&lt;br /&gt;
The first thing I did was to copy some snippets of sample code from the ical4j docs into a JUnit test and see what happens. I did this for 2 reasons: (a) the docs for FOSS are often wrong, and (ii) I needed to get all the config set up (e.g. to make a test calendar with events in it containing the properties I was interested in.)&lt;br /&gt;
&lt;br /&gt;
As I worked, my "production code" kept evolving inside my test class. When I had successfully TDD'ed a step, I extracted the code into a real production class. I could move code around with Eclipse's refactoring tools and I had solid tests to save my butt.&lt;br /&gt;
&lt;br /&gt;
Nothing startling in any of this. The interesting thing for me was that I was &lt;i&gt;exploring&lt;/i&gt; ical4j. It was something of a spike - I didn't know ahead of time if the framework would be up to the job - yet each success immediately resulted in moving the code to the production classes.&lt;br /&gt;
&lt;br /&gt;
So what do you think of this approach of evolving the code in the test and moving it as soon as it's green?&lt;br /&gt;
&lt;br /&gt;
Redux: Keith Ray says: It's good. I think Kent Beck or someone called these "Learning Tests"when learning an API via TDD.

</description><link>http://jdtangney.com/resources/blog/2008/03/tde-test-driven-exploration.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-720402765705175525</guid><pubDate>Wed, 20 Feb 2008 19:33:00 +0000</pubDate><atom:updated>2008-02-20T18:10:06.162-08:00</atom:updated><title>Installing Tomcat, MySQL, ... Yawn.</title><description>&lt;p&gt;There must be a gazillion blogs and other posts about how to do this "right." This post is for my benefit, so ignore it if you like.

&lt;p&gt;I'm installing on Tiger, so some weirdness with MySQL on Leopard and the deprecated /Library/StartupItems is blithely ignored. All is not glorious, however. Beware of the broken StartupItems installer: It puts the folder into /usr/local instead of /Library/StartupItems so just move it and you're done.

&lt;p&gt;Installing MySQL itself is trivial. Download, install both packages and the pref panel. Add /usr/local/mysql/bin to your PATH. Done. (Well, set the root password too.)

&lt;p&gt;Tomcat 6 seems to want to be in /usr/java. I tried putting it into /usr/local but it cried. I copied the distro (apache-tomcat-6*) straight into /usr/java and made a symlink called /usr/java/tomcat to point to it.

&lt;p&gt;Edit the tomcat-users.xml. It now ships empty. Just add the tomcat role and a user.

&lt;p&gt;I created a StartupItem for Tomcat too. I just started with the Apache one and changed it. The plist looks like this:

&lt;pre&gt;&lt;code&gt;{
Description   = "Tomcat";
Provides      = ("Tomcat");
Requires      = ("Resolver");
Preference    = "None";
Messages =
{
start = "Starting Tomcat";
stop  = "Stopping Tomcat";
};
}&lt;/code&gt;&lt;/pre&gt;

Sigh. For completeness, here's the script:

&lt;pre&gt;&lt;code&gt;#!/bin/sh
. /etc/rc.common

CATALINA_HOME=/usr/java/tomcat

StartService ()
{
   if [ "${TOMCAT:=-NO-}" = "-YES-" ]; then
       echo "Starting Tomcat"
       su - logic -c ${CATALINA_HOME}/bin/startup.sh
   fi
}

StopService ()
{
echo "Stopping Tomcat"
su - logic -c ${CATALINA_HOME}/bin/shutdown.sh
}

RestartService ()
{
echo "Restarting Tomcat"
su - logic -c ${CATALINA_HOME}/bin/shutdown.sh
su - logic -c ${CATALINA_HOME}/bin/startup.sh
}

RunService "$1"
&lt;/code&gt;&lt;/pre&gt;</description><link>http://jdtangney.com/resources/blog/2008/02/installing-tomcat-mysql-yawn.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-3795256639075897602</guid><pubDate>Tue, 20 Nov 2007 04:20:00 +0000</pubDate><atom:updated>2007-11-19T20:20:06.618-08:00</atom:updated><title>The Launch Continues</title><description>&lt;p&gt;&lt;a style="float: right; border: none" href="http://industriallogic.com/gh/submit?Action=ShoppingAction"&gt;&lt;img src="http://industriallogic.com/images/elearning/agile_try_free.gif" width="250" height="293" /&gt;&lt;/a&gt;One normally thinks of a "launch" as a discrete event, an atomic occurrence, something which starts and ends almost instantaneously. A product launch takes days to get out the door. It's more like childbirth. Today, Josh sent out the press releases to Dr Dobb's and other publications, email to numerous mailing lists, and the mass mailings. The launch continues.&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2007/11/launch-continues.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-723565700264310474</guid><pubDate>Sat, 17 Nov 2007 08:29:00 +0000</pubDate><atom:updated>2007-11-17T00:29:56.306-08:00</atom:updated><title>Greatest Hits</title><description>&lt;p&gt;I've been busy. Very. I've been doing some hard-core XP with one of the Masters, Josh Kerievsky.&lt;/p&gt;
&lt;p&gt;And we have something to show for it. We at Industrial Logic are launching a series of eLearning titles that help you master XP practices. It's called Greatest Hits because it's years of training and coaching experience rolled into a web-based delivery. Find out more at the &lt;a href="http://industriallogic.com/"&gt;IL web site.&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

</description><link>http://jdtangney.com/resources/blog/2007/11/greatest-hits.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-7441481488410459631</guid><pubDate>Fri, 10 Aug 2007 07:10:00 +0000</pubDate><atom:updated>2007-08-10T00:11:02.513-07:00</atom:updated><title>Agile 2007</title><description>&lt;p&gt;
Off to the conference on Sunday morning. See you there.
&lt;/p&gt;</description><link>http://jdtangney.com/resources/blog/2007/08/agile-2007.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-6508559524228675985</guid><pubDate>Thu, 21 Jun 2007 07:49:00 +0000</pubDate><atom:updated>2007-06-21T00:49:34.954-07:00</atom:updated><title>Managing the Risks When Outsourcing Offshore</title><description>&lt;p&gt;
&lt;a href="http://www.15seconds.com/issue/070410.htm"&gt;Anil Singh's article&lt;/a&gt; is pretty well written, and augers well for us budding nearshorers. The principal reason given for outsourcing is lack of in-house resources, with cost only number three on the list. (Singh dutifully cites &lt;a href="http://diamondconsultants.com/PublicSite/ideas/perspectives/downloads/Diamond2005OutsourcingStudy.pdf"&gt;a reference for the study&lt;/a&gt;.)
&lt;/p&gt;&lt;p&gt;
Singh goes on to recommend more and more stringent waterfallisms in order to keep tight control over requirements. Hmmm. I think I'll do a treatment on his paper, injecting XPisms instead. Stand by.
&lt;/p&gt;
&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tag/outsourcing" rel="tag"&gt;outsourcing&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/xp" rel="tag"&gt;xp&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;</description><link>http://jdtangney.com/resources/blog/2007/06/managing-risks-when-outsourcing.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-3843134995700016223</guid><pubDate>Sat, 26 May 2007 22:31:00 +0000</pubDate><atom:updated>2007-05-26T18:36:20.340-07:00</atom:updated><title>Beyond Compare</title><description>&lt;p&gt;
I really, really want &lt;a href="http://www.scootersoftware.com/"&gt;Beyond Compare&lt;/a&gt; for Mac OS X!
&lt;/p&gt;&lt;p&gt;
I was turned on to this gem when I was doing security work for &lt;a href="http://www.astechconsulting.com/"&gt;AsTech Consulting&lt;/a&gt; and bought a copy for myself, even though I develop on Mac OS X. So who's going to make a comparable (sorry) app for the Mac? The closest I've found is &lt;a href="http://www.zizasoft.com/products/zsCompare/index.shtml"&gt;zsCompare&lt;/a&gt; but it seems to be a Swing app and has a comparitively klunky UI. Maybe I can get used to it, but can it even be as &lt;em&gt;fast&lt;/em&gt; as BC? When you've tasted the best, it's hard to settle for another...
&lt;/p&gt;&lt;p&gt;
&lt;strong&gt;Update&lt;/strong&gt;
&lt;/p&gt;&lt;p&gt;
I guess I may as well list the other contenders:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;xxdiff (install with fink) - requires X11&lt;/li&gt;
&lt;li&gt;meld (ditto) - requires Gnome&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tag/macos" rel="tag"&gt;macos&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;</description><link>http://jdtangney.com/resources/blog/2007/05/beyond-compare.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-1431921508714482379</guid><pubDate>Mon, 14 May 2007 00:23:00 +0000</pubDate><atom:updated>2007-05-13T17:23:57.326-07:00</atom:updated><title>Google Reader vs rawdog</title><description>&lt;p&gt;
&lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt; does not (yet) replace the venerable &lt;a href="http://offog.org/code/rawdog.html"&gt;rawdog&lt;/a&gt;. Google Reader allows you to "share" a single article, whereas rawdog will get the latetst articles from any number of feeds. So I still have to maintain a template. Maybe I'll shove rawdog back into an iframe to simplify the template... 
&lt;/p&gt;</description><link>http://jdtangney.com/resources/blog/2007/05/google-reader-vs-rawdog.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-3497275811908535032</guid><pubDate>Fri, 11 May 2007 19:05:00 +0000</pubDate><atom:updated>2007-05-11T12:26:48.426-07:00</atom:updated><title>Conversations at the abstract level</title><description>&lt;p&gt;Now this is clearly "just me". I have always had this problem. I have trouble getting people to think in abstract terms.

&lt;p&gt;It depends on who I am talking to, of course. It's easier with people I've known for a while. Maybe they just know me, know my style, and can tell when I'm going abstract. But other people - smart people - seem to get hooked on the concrete and I struggle to shift them into more abstract territory.

&lt;p&gt;Is it a cultural thing? Maybe I should say "sub-cultural" because I am a geek, after all. Geeks have no trouble with abstraction. I pepper my abstract conversation with examples, and that's what people latch onto.

&lt;p&gt;Sure, I could omit the examples. I have tried that, and the response I get is "Can you give me an example?" People are clearly stuck. They can't leave the concrete and be vague.

&lt;p&gt;Why is this important? Well, if you are trying to invent something, or if you are trying to understand what improvements can be made, you have to think big before you narrow down to specifics. If you don't, you run the risk of implementing a local optimum, improving some small part while missing a larger, grander solution - a global optimum.

&lt;p&gt;OK, so what does XP tell us? Do the simplest thing that could possibly work. Aha! A local optimum, no? No! The simplest thing that &lt;span style="font-style: italic;"&gt;could possibly work&lt;/span&gt; is the simplest thing to implement a Customer story. The Customer, meanwhile, has a grand, unified vision, of which the individual story is but a small part.

&lt;p&gt;But what about architecture? Is just-in-time design not a local optimum? Yes! XP relies on &lt;span style="font-style: italic;"&gt;re-&lt;/span&gt;designing as needed, but at no time is the architecture to be grander than the set of stories: YAGNI. Does that mean that XP can lead you down a path of local optima to the extent that you might miss the opportunity to use a grander, more elegant, simpler architecture that solves the problem with less code, better performance, higher maintainability, ...? Hmmm. I s'pose so!

&lt;p&gt;So if you have any thoughts on how to push people towards abstract thinking in conversation, please let me know.</description><link>http://jdtangney.com/resources/blog/2007/05/conversations-at-abstract-level.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-708347643976652221</guid><pubDate>Mon, 07 May 2007 20:04:00 +0000</pubDate><atom:updated>2007-05-08T15:06:08.001-07:00</atom:updated><title>Dreaming in Code 2</title><description>&lt;p&gt;
I have almost finished Rosenberg's book, and am pleased to report that he does indeed mention XP and waterfall, and Big Upfront Design (though he conflates software design, aka architecture, with UX design, UI design and graphic design.) 
&lt;/p&gt;&lt;p&gt;
Rosenberg, in the second half of the book, captures the feelings of directionlessness and uncertainty that permeate projects like the one he describes. And it was only after a few days' of feeling miserable that I realized something. All those awful feelings that had become such a large part of my daily life in my various Jobs from Hell were still buried deeply in my memory and reliving the Chandler experience brought them back. The recollection was on two levels, of course: The conscious recognition of the failings and symptoms (I mentioned that in my previous post) are simple enough, but the deeper stuff, manifesting itself as a kind of despair that colors one's outlook... That's more serious and profound and ultimately, more disturbing. It is (in this culture of victimism and labeling) a bit like post traumatic stress disorder!
&lt;/p&gt;&lt;p&gt;
Of course, the upside is that very smugness I blogged about: I now know better. I am unlikely to fall into a project like that again. I feel that, in a sense, I have transcended that kind of project... And furthermore, I know how to &lt;em&gt;fix&lt;/em&gt; a project like that!
&lt;/p&gt;&lt;p&gt;
Rosenberg, with a slightly wistful tone, talks about how to make software projects better. He mentions XP, as I said, but he lumps it in with some of the less credible - or at least unrealized - approaches to software development. His description of XP seems rather good, but on a human level, the level of what it means to &lt;em&gt;do&lt;/em&gt; XP in a project, he doesn't get it. Of course not. How could he? The book is a chronicle and a reflection, and XP was not part of the chronicle. He does not postulate how XP might have helped Chandler.
&lt;/p&gt;&lt;p&gt;
Thinking about programming as art, while bandied about in our community, is not something I had reflected on in any great depth. Rosenberg touches on this aspect of programming and contrasts it with the (mostly discredited, imo) software as engineering approach. Comparing a computer program to a work of art is edifying for programmers. Some art is better than other, but the same is true of software. Counting lines of code is like counting brushstrokes. Time to reread Brenda Laurel.
&lt;/p&gt;&lt;p&gt;
Then there's the point Rosenberg steers towards about just how hard it is to understand what you've got when you have a piece of software. Actually, he doesn't say that; I'm extrapolating again. Rosenberg actually makes the point that software cannot be proven correct in general. And, since the Customer cannot know the entire problem space (which is why the corner cases have to be articulated by a software professional), we cannot even guarantee that the system delivered comes close to what the Customer &lt;em&gt;wants&lt;/em&gt;.  Again, this is an area where the wisdom of XP is plain. If the Customer drives what goes into the product, then presumably the Customer gets what she wants. Assuming she knows what she wants. And again, it's up to use programmers to say "ah, but what about X?"
&lt;/p&gt;&lt;p&gt;
And that's the hardest part to sell to potential clients. No, despite appearances, software is seldom a done deal, an off-the-shelf solution to a well-understood problem. No, you can't just say "This is what I want; how much will it cost?"
&lt;/p&gt;</description><link>http://jdtangney.com/resources/blog/2007/05/dreaming-in-code-2.html</link><author>noreply@blogger.com (jdtangney)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-5369352.post-2112802798143881185</guid><pubDate>Fri, 04 May 2007 20:16:00 +0000</pubDate><atom:updated>2007-05-04T13:18:40.444-07:00</atom:updated><title>Dreaming in Code</title><description>&lt;p&gt;
The CTO of a small start-up I worked for once told me I was "smug." I was hurt. I consider myself rather diffident and, though I can be a smart-ass in the interests of humor, and I can be a little rebellious... But I don't see myself as smug at all.
&lt;/p&gt;&lt;p&gt;
Until now.
&lt;/p&gt;&lt;p&gt;
I've been reading Scott Rosenberg's &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;#38;location=http%3A%2F%2Fwww.amazon.com%2FDreaming-Code-Programmers-Transcendent-Software%2Fdp%2F1400082463%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1178309593%26sr%3D1-1&amp;#38;tag=criticalmassd-20&amp;#38;linkCode=ur2&amp;#38;camp=1789&amp;#38;creative=9325"&gt;Dreaming in Code&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=criticalmassd-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;. I'm almost half-way through it and, boy am I smug. Almost every pitfall, obstacle and roadblock encountered, every travail, trial and burden endured - all of them make me smirk in recognition and at the certainty that most of their problems stemmed from the inability to plan and the blind belief in a waterfall model - especially unsuited to highly innovative and adaptive development. Rosenberg describes the analysis paralysis that gripped the project. It's familiar to anyone who's been in the industry for more than a fortnight. These are not the causes of project failure, but symptoms of deeper, higher-level and &lt;em&gt;simpler,&lt;/em&gt; more fundamental issues.
&lt;/p&gt;&lt;p&gt;
Rosenberg's done a great job. The "recognition" factor I mentioned is that this is all so, so, so very familiar. I have been on more projects just like this than I can count. It says something about me that I have habitually associated myself with software projects that are headed into unknown territory - from a technical as well as functional point of view. I'm that kind of bear. But until the last few years, it's precisely those projects that have had the highest risk.
&lt;/p&gt;&lt;p&gt;
So what's changed? Well, Rosenberg had probably not heard of XP - or if he mentions it, it's in the latter, as-yet unread, half of the book.  In the half of the book I have read, every problem encountered by this ill-fated team could have been solved by adopting a more sensible development methodology. Now I'm being smug.
&lt;/p&gt;&lt;p&gt;
Let's add some of our practices to the Chandler Project that Rosenberg chronicles, and see what happens in a little thought experiment. Now before you start flaming, know that I am not critiquing the &lt;em&gt;current&lt;/em&gt; &lt;a href="http://chandler.osafoundation.org/"&gt;Chandler&lt;/a&gt; project. I'm talking about the one Rosenberg describes.
&lt;/p&gt;&lt;p&gt;
So here goes. Planning. "Planning is everything, but plans are nothing." With a release plan and week-long iteration plans, the question of project direction goes away - with one huge caveat: You need a Customer who has a strong sense of direction, a damned good idea of what the product is supposed to do. Technical decisions happen much more easily in the spirit of YAGNI.
&lt;/p&gt;&lt;p&gt;
We can add other practices like TDD (or even &lt;a href="http://blog.daveastels.com/articles/2005/07/05/a-new-look-at-test-driven-development"&gt;BDD&lt;/a&gt;!) but those are nothing without the leadership of the Customer.
&lt;/p&gt;&lt;p&gt;
And this leads me to another phenomenon. My clients don't care &lt;em&gt;how&lt;/em&gt; I develop software. They don't care about anything other than getting the product they &lt;em&gt;want&lt;/em&gt; for a reasonable sum of money. They don't always know what they want, and the smart ones know that. And when I start talking XP to them, and telling them what their duties and responsibilities are as Customer, they get all excited! The ones who've spoken to other developers wonder why they've wasted their time. The ones who have not, don't understand why this is an issue - after all, isn't what I am telling them normal, to be expected?
&lt;/p&gt;&lt;p&gt;
Yes, I'm smug. Of course XP is not a panacea (Ron once quoted Ward as saying he wouldn't like to fly in a plane whose avionics system was built using XP.) But for something like (Rosenberg's) Chandler? C'mon! It's a gimme!
&lt;/p&gt;
&lt;!-- technorati tags start --&gt;&lt;p style="text-align:right;font-size:10px;"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tag/xp" rel="tag"&gt;xp&lt;/a&gt;&lt;/p&gt;&lt;!-- technorati tags end --&gt;</description><link>http://jdtangney.com/resources/blog/2007/05/dreaming-in-code.html</link><author>noreply@blogger.com (jdtangney)</author></item></channel></rss>