<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-20165167</id><updated>2009-12-01T14:25:35.620-07:00</updated><title type='text'>Chris McMahon's Blog</title><subtitle type='html'>Software testing, scripting, agile development, things in general...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default?start-index=26&amp;max-results=25'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>112</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20165167.post-8723301082559272198</id><published>2009-12-01T10:29:00.002-07:00</published><updated>2009-12-01T10:37:05.688-07:00</updated><title type='text'>telecommuting policy</title><content type='html'>&lt;span style="font-style: italic;"&gt;Many of the members of the writing-about-testing group are also experienced telecommuters.  It turns out that a number of us have had bad experiences when telecommuting for organizations that lack a sane and rational telecommuting policy.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;So we wrote one.  The following document has been through more than 80 revisions and contains text contributed by 5 separate authors, and also reflects the comments of even more participants.  We hope you find a generic telecommuting policy useful.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 id="telecommuting_policy"&gt;Telecommuting Policy&lt;/h3&gt; &lt;p&gt; Some organizations want to offer telecommuting as an amenity for work/life balance. Other organizations do not want to have to rely on local talent to build exceptional teams. Other organizations want to use telecommuting to reduce the cost of infrastructure such as office space.&lt;/p&gt; &lt;p&gt; Regardless of the reason, any organization wishing to succeed with telecommuting must have a policy for handling remote working. An institutional standard must be in place such that everyone telecommuting or interacting with remote workers has had a similar experience using similar tools to accomplish similar work. This is such a policy.&lt;/p&gt; &lt;blockquote&gt; &lt;em&gt;Any team member who wishes will be allowed to telecommute if: the&lt;/em&gt; &lt;em&gt;&lt;strong&gt;whole team&lt;/strong&gt;&lt;/em&gt; agrees &lt;em&gt;to monitor and be responsive on all of the communication channels required by the organization for telecommuting teams. Team members doing solo or pairing work must keep the rest of the team apprised of their status, and should not be incommunicado for long periods of time.&lt;/em&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt; &lt;span style="font-style: italic;"&gt;Telecommuters who are not responsive on all of the required communication channels will be questioned and may be subject to having their telecommute privileges revoked or other disciplinary action.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt; Here we describe how to implement this simple policy.&lt;/p&gt; &lt;h2 id="for_telecommuting_beginners"&gt;For Telecommuting Beginners&lt;/h2&gt; &lt;p&gt; As stated above, an effective telecommuting culture makes constant use of a set of communication channels. As a first step to implement this mode of working, an organization with little experience with telecommuting can have an expert supply compelling, collaborative training sessions, presented using teleworking technologies. These high-value training sessions provide a focus as the organization implements these policies and procedures for the first time, or consolidates such procedures already in place, and supplies incentive for everyone attending to participate and contribute. Although everyone will attend the training via the communication channels, interacting with the trainer, the material, and one another electronically as though they were telecommuting, training may take place locally and some or all attendees may be co-located. This enables smooth technical support and a controlled experience, affording natural opportunities for feedback on the policy.&lt;/p&gt; &lt;h4 id="prepare_the_team_and_prepare_the_environment"&gt;Prepare the Team and Prepare the Environment&lt;/h4&gt; &lt;p&gt; We strongly recommend that the organization put an IRC (Internet Relay Chat) server in place and have everyone in the organization know how to use it. The authors do not know of another messaging service that provides even a fraction of the features available in IRC. We recommend an institutional channel like "#social" for casual messages like "how was your weekend", as well as institutional channels for groups that collaborate closely, for instance "#dev" or "#my_team".&lt;/p&gt; &lt;p&gt; Before the remote training session begins, the following equipment must be in place for every member of the team:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;A working headset&lt;/li&gt;&lt;li&gt;A VNC server and client for desktop sharing (1)&lt;/li&gt;&lt;li&gt;A working instance of Skype, or other VOIP service that provides conference-calling ability (2)&lt;/li&gt;&lt;/ul&gt; &lt;h4 id="agree_to_participate"&gt;Agree to Participate&lt;/h4&gt; &lt;p&gt; Every member of the team must agree to participate in all of the communication channels required by remote workers. During business hours, every member of the team must be monitoring &lt;strong&gt;at least&lt;/strong&gt; the following channels and be prepared to answer on them quickly when appropriate:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;email&lt;/li&gt;&lt;li&gt;instant messaging such as Yahoo IM, AIM, or similar service&lt;/li&gt;&lt;li&gt;VOIP/Skype&lt;/li&gt;&lt;li&gt;yahoo IM video (3)&lt;/li&gt;&lt;li&gt;wiki (4)&lt;/li&gt;&lt;li&gt;IRC in both #social and #&lt;team&gt;&lt;/team&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; We consider these channels to be a minimum standard for telecommuting. Telecommuters require high bandwidth communication channels to be effective. If they are disconnected from the ongoing work of others on the team, the lack of critical information will make them unable to contribute; the risk of wasted work is far higher than for those on co-located teams. Having a required set of standard institutional communication channels mitigates the risk of wasting the work of telecommuters.&lt;/p&gt; &lt;p&gt; Other communication channels like a microblogging service, IRC interfaces to Twitter or Facebook, or other such communication channels may also be appropriate. The authors are aware of at least one organization experimenting with virtual worlds like Second Life for distributed teams.&lt;/p&gt; &lt;h2 id="ongoing_remote_working"&gt;Ongoing Remote Working&lt;/h2&gt; &lt;h3 id="telecommuting_policy"&gt;Telecommuting Policy&lt;/h3&gt; &lt;p&gt; The organization must have a telecommuting policy to refer to once the training sessions are finished. Since we have built an institutional standard, where all of the telecommuters who participated in the training have had a similar experience, using similar tools to accomplish similar work, we can now put such a policy in place.&lt;/p&gt; &lt;blockquote&gt; &lt;em&gt;Upon finishing any required training, any team member who wishes will be allowed to telecommute at will under the same requirements that were agreed to when working in the training session: the&lt;/em&gt; &lt;em&gt;&lt;strong&gt;whole team&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;must agree to monitor and be responsive on all of the communication channels required by the organization. Team members doing solo or pairing work must keep the rest of the team apprised of their status, and should not be incommunicado for long periods of time.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;It should be understood that telecommuters who are not responsive on all of the channels mentioned above will be questioned and may be subject to having their telecommute privileges revoked or other disciplinary action.&lt;/em&gt;&lt;/blockquote&gt; &lt;p&gt; During the training experience, we assume that some workers were on-site, interacting with the trainer (and with each other) using the channels described above. When such workers are remote themselves, there may be a need to have on-site workers available on their office phone extensions. The open source PBX project "asterisk" supplies VOIP connections to office phone extensions, as do a number of commercial phone applications such as Avaya.&lt;/p&gt; &lt;h3 id="meetings"&gt;Meetings&lt;/h3&gt; &lt;p&gt; Meetings should be structured such that remote employees can participate on an equal basis with those on-site. On-site meeting rooms must be equipped with adequate speakerphones. A multi-user IRC or IM 'back channel' where both on-site and remote participants may comment on the ongoing discussion in the meeting increases meeting bandwidth and makes it much easier for telecommuters to raise interruptions.&lt;/p&gt; &lt;h3 id="travel"&gt;Travel&lt;/h3&gt; &lt;p&gt; Travel requires a careful balancing act. Face-to-face time allows coworkers to connect on a human level and can be incredibly productive and beneficial. However, full-time telecommuters are telecommuting for a reason, and mandatory travel that inflicts hardship upon them harms the company in equal measure. Have a clear travel policy for telecommuting workers.&lt;/p&gt; &lt;h2 id="appendix_tools"&gt;Appendix: Tools&lt;/h2&gt; &lt;p&gt; (1) Desktop sharing is required, both for pair-programming and for demonstration of issues with software. Employees should be able to screen-share spontaneously, without the need to schedule a slot in advance. Tools such as Microsoft LiveMeeting or Webex or YuuGuu may substitute for the open source VNC. When working in a *nix environment, &lt;tt&gt;screen(1)&lt;/tt&gt; is more productive than VNC for collaborating in a text-only environment. Examples of when to use &lt;tt&gt;screen(1)&lt;/tt&gt; are, for instance, when using Vim or when doing system administration from the command line.&lt;/p&gt; &lt;p&gt; (2) The open source 'asterisk' project provides a professional-level PBX with multiple conference-call and office numbers available. Proprietary tools such as Avaya or other systems may provide the same sorts of features. What is required is the ability to have a group of people speaking together without echo, distortion, or other interference. Employees should be able to hold impromptu conference calls without the need to book a conference extension in advance.&lt;/p&gt; &lt;p&gt; (3) Some people find video screens of individuals unnecessary if those individuals are available on other channels. For remote workers interacting with an on-site team, having a camera in the team room is valuable so the remote workers can see who are at their desk, or engaged in conversation, or otherwise disposed.&lt;/p&gt; &lt;p&gt; (4) Teams need to manage significant amounts of project documentation and other text. Storing documents on network drives and sharing documents by email is far too low-bandwidth for remote workers to negotiate effectively. As well, these media do not allow for effective multi-user collaboration, nor do they provide an easily accessible revision history for documents, nor do they provide a single authoritative place to access a given document. A full-featured wiki like Confluence, Socialtext, Mediawiki, or Twiki is required for the access to constantly changing information that remote workers need. In our experience, Microsoft SharePoint has shown to be subpar for this purpose.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-8723301082559272198?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/8723301082559272198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=8723301082559272198' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8723301082559272198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8723301082559272198'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/12/telecommuting-policy.html' title='telecommuting policy'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-1521598670905646476</id><published>2009-11-18T18:50:00.002-07:00</published><updated>2009-11-18T19:37:36.540-07:00</updated><title type='text'>ui test tool search</title><content type='html'>I now work for &lt;a href="http://42lines.net/"&gt;42lines&lt;/a&gt;. I was hired along with &lt;a href="http://thetestingblog.com/"&gt;Marisa Seal&lt;/a&gt; to start the QA/testing practice for a very small totally distributed/remote software shop implementing agile processes as they make sense.  I like this place.&lt;br /&gt;&lt;br /&gt;One of the things that 42lines wants to do is to begin UI-level test automation.  I have a lot of experience doing this, but I've never done it from a standing start, so this was a great opportunity to get a good look at the state of the practice for UI-level test automation. &lt;br /&gt;&lt;br /&gt;For the last 3 years or so I've been using &lt;a href="http://search.cpan.org/%7Elukec/Socialtext-WikiTest-0.06/"&gt;keyword-driven test frameworks that use a wiki&lt;/a&gt; to &lt;a href="http://www.fitnesse.org/"&gt;manage test data&lt;/a&gt;.  I like these wiki-based table-based keyword-driven frameworks a lot.  I'm a little suspicious of the BDD-style frameworks like Cucumber and others based on rspec-like text interpretation.  Anecdotal evidence suggests that analyzing the causes of failing tests within BDD-style frameworks is an onerous task; also, I suspect that since BDD-style frameworks map closely to story coverage, there ends up being a lot of duplication of test steps.  With wiki/table/keyword frameworks, I know from experience that it is possible to design tests with great domain coverage, little duplication, and scale to numbers of test steps in the suite in the five figures.&lt;br /&gt;&lt;br /&gt;I was really hoping to find something great in Ruby.  I did find that Fit has been ported to a number of languages, &lt;a href="http://blog.cornetdesign.com/2005/12/fitnesse-and-ruby-a-basic-tutorial/"&gt;including Ruby&lt;/a&gt;, but it's still a pretty primitive ecosystem out there.  I didn't find any significant bridges between Fit and &lt;a href="http://watir.com/"&gt;Watir &lt;/a&gt;or Fit and Selenium-RC in Ruby.&lt;br /&gt;&lt;br /&gt;(For the record, it would have been great to be a contributing member of the Watir community again.  As far as anyone on the Watir team can tell, I was the very first Watir user, and I still think it is a brilliant project.)&lt;br /&gt;&lt;br /&gt;So the best-of-breed wiki-based test management system seems without  a doubt to be FitNesse.  I've used it and I like it, and Marisa is something of an expert in FitNesse and its accoutrement.  FitNesse comes in two flavors: Java and C#.  42lines is a Java shop.  Selenium Core is in Java.  I got no time to fuss with JRuby or whatever the latest coolest implementation of Ruby in the JVM is.  It makes every kind of sense to use Java/Fitnesse and Java/Selenium for this project.&lt;br /&gt;&lt;br /&gt;So FitNesse and Selenium in Java are beyond dispute the best-of-breed in their respective fields.  I thought they went together like peanut butter and jelly, pizza and beer, and SURELY there would be a canonical reference implementation of an integration between these two awesome tools. &lt;br /&gt;&lt;br /&gt;Sadly, I was mistaken. &lt;br /&gt;&lt;br /&gt;There are to my knowledge three reasonable FitNesse+Selenium integration projects.  The first one, &lt;a href="http://www.magneticreason.com/tools/fitnium/fitnium.html"&gt;fitnium&lt;/a&gt;,  I dismissed mostly on the basis of rumors of bugs and rumors of lack of support.  And in the official documentation, I found that the project was taking on features (Flex and Flash support) for which I had no need.  Also, I object to abstracting/renaming Selenium methods for purely arbitrary reasons, as it makes the (very nice) Selenium documentation unusable in the tool. &lt;br /&gt;&lt;br /&gt;That left us with a choice of &lt;a href="http://storytestiq.solutionsiq.com/wiki/Main_Page"&gt;StoryTestIQ&lt;/a&gt; and &lt;a href="http://www.fitnesse.info/webtest"&gt;WebTest&lt;/a&gt;.  We spiked them both.&lt;br /&gt;&lt;br /&gt;StoryTestIQ has a beautiful UI, but it has too much magic.  The killer flaw for us was that STIQ must run on the same host as the SUT.  Even though it is possible to invoke *chrome/FF and *iehta/IE modes from the framework, the framework itself will not support cross-site operations.  That's a non-starter for us.&lt;br /&gt;&lt;br /&gt;And that left us with WebTest.  The brilliant Gojko Adzic began the project but abandoned it about a year and a half ago.  It has the feel of something partially-done.  And yet in our spike with WebTest we found that we could not only invoke *chrome and *iehta modes, but we could also swap out the very latest FitNesse version and the very latest Selenium version for the antique versions shipped with WebTest, and the WebTest integration code still worked.  To my mind, this speaks of good design.&lt;br /&gt;&lt;br /&gt;Marisa and Gojko &lt;a href="http://submissions.agile2008.org/node/400"&gt;gave a joint presentation on DbFit&lt;/a&gt; at Agile2008.  Gojko has been known to answer my emails.  WebTest is a really obvious choice under the circumstances. &lt;br /&gt;&lt;br /&gt;So as of today Marisa and I are administrators for the WebTest project on Sourceforge.  I hesitate to say "owners", because neither of us knows much about Java (although Marisa certainly knows more than me) but the code for WebTest is so simple and readable that I am completely comfortable describing what it does and does not do. &lt;br /&gt;&lt;br /&gt;Today I made some really nice demonstration tests in FitNesse driving Selenium via WebTest.  We're going to make this work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-1521598670905646476?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/1521598670905646476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=1521598670905646476' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1521598670905646476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1521598670905646476'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/11/ui-test-tool-search.html' title='ui test tool search'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-759606796092362769</id><published>2009-11-05T10:52:00.002-07:00</published><updated>2009-11-05T11:24:00.574-07:00</updated><title type='text'>backchannel</title><content type='html'>Kent Beck mentioned recently that he can't think of a situation for which Google Wave is indispensable.  Jason Huggins left &lt;a href="http://www.threeriversinstitute.org/blog/?p=395#comment-1515"&gt;this amazing comment&lt;/a&gt; on Beck's blog post.  Wave could very well be indispensable for implementing a "backchannel". &lt;br /&gt;&lt;br /&gt;A backchannel is a multi-user space for commenting on some action being shared by everyone on the channel, whether it be listening to a speaker at a conference or attending a meeting during which people take turns speaking.  A backchannel is perhaps most commonly implemented on IRC, but any reasonably robust multi-user messaging tool will serve.&lt;br /&gt;&lt;br /&gt;But it's not only conference attendees that need a backchannel.  Coming up I have a couple of articles recommending required communications channels for distributed teams and very large teams, wherein I strongly recommend having a backchannel during team meetings.   It really is a critical core practice for distributed teams.  &lt;br /&gt;&lt;br /&gt;But even given an IRC backchannel, a lot of information gets lost during the interaction.  The chat goes by very quickly, and it is impossible to type all the ideas one has into the backchannel (along with everyone else) fast enough or efficiently enough to capture everything that everyone thinks.  Running a backchannel on a wiki is far too inefficient to be effective. &lt;br /&gt;&lt;br /&gt;But Wave changes that.  Not only can multiple users all contribute to the backchannel at once in real time; but after the meeting or the presentation, Wave provides a persistent, shareable, editable artifact that captured at least the basic premises of everyone's thoughts at the time.  Any valuable aspects of this artifact may be edited and enhanced and otherwise manipulated after the fact. &lt;br /&gt;&lt;br /&gt;I really want to try this out soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-759606796092362769?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/759606796092362769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=759606796092362769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/759606796092362769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/759606796092362769'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/11/backchannel.html' title='backchannel'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-7082603518755181519</id><published>2009-10-15T15:10:00.002-06:00</published><updated>2009-10-15T15:21:33.807-06:00</updated><title type='text'>when to use analogy</title><content type='html'>Analogy is a useful device when used to describe the things that we work on; but it is actively dangerous when used to describe our work itself.  &lt;br /&gt;&lt;br /&gt;When we're building software, it is useful to be able to say for example "it's like a library, where someone can make use of a feature and then stop using it so that someone else can use that feature" or "it's like a train, where there are just a few places where anyone can get on or where anyone can get off" &lt;br /&gt;&lt;br /&gt;But when we use analogy to talk about our work, we invite misconception and misinterpretation.  To say "writing software is like making a cake" invites misperception.  Does writing software involve flour and sugar?  Is there frosting involved?  &lt;br /&gt;&lt;br /&gt;Of course someone who says such a thing *probably* means that to write software one must do certain steps in a certain order-- but it is far better to describe the actual steps ("red, green, refactor" is not an analogy) than to invoke analogy, because analogy always misleads to some extent, and we have known for many years that the cost of failed communication on software projects is extremely high.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-7082603518755181519?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/7082603518755181519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=7082603518755181519' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/7082603518755181519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/7082603518755181519'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/10/when-to-use-analogy.html' title='when to use analogy'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-8660599827610738504</id><published>2009-10-01T15:15:00.002-06:00</published><updated>2009-10-01T18:07:35.704-06:00</updated><title type='text'>CFP: Peer conference "Writing About Testing" May 21/22 Durango CO</title><content type='html'>CFP: Peer conference "Writing About Testing" May 21/22 Durango CO&lt;br /&gt;&lt;br /&gt;I am organizing a a peer conference for people working in software testing and software development who write about their work in public.  The conference will be organized LAWST-style, much like the recurring Austin Workshop on Test Automation or the Tester-Developer/Developer-Tester conference I helped organize in 2007.&lt;br /&gt;&lt;br /&gt;The original proposal is on my blog here:  http://chrismcmahonsblog.blogspot.com/2009/08/proposed-peer-conference-writing-about.html&lt;br /&gt;&lt;br /&gt;There is significant demand for public information about software testing and software development and software process.  This conference is for people who want to influence the public discourse on these subjects through public writing.  &lt;br /&gt;&lt;br /&gt;If you are interested in the subject, but not necessarily interested in the peer conference, there is a private mail list for writing about testing whose members include both writers and publishers.  I (or any other member of the list) will add you to the mail list if you send us your email address.  I am at christopher.mcmahon on gmail.  Your email will be used for no other purpose than to join the list.&lt;br /&gt;&lt;br /&gt;New voices are particularly encouraged to apply for the conference and to join the mail list.  If we don't know you or your writing, please point out links to some public examples like blog posts, public documentation, conference papers, or similar work when you do so. &lt;br /&gt;&lt;br /&gt;A number of prominent writers and also new voices in the software testing community have have expressed interest in attending the conference.  In an effort to break down some of the wall between writers and publishers, at least two publishers of software testing material also have expressed interest in attending.  The conference will have a definite agile slant, but I don't want to exclude great writers working in other situations.&lt;br /&gt;&lt;br /&gt;This peer conference is run like many others:  send a position statement saying why you want to attend, and what relevant material you would be prepared to contribute to the conference.  Examples of relevant material might be a presentation, interesting experience, or even a really good set of questions.  People will be invited based on those position statements.  As of now, I will be the one evaluating these, but I will be sharing them freely with others on the mail list whose judgment I trust.  Even better, join the mail list and publish your position statement there.  &lt;br /&gt;&lt;br /&gt;I may or may not cap attendance at 15.  If we get a significant amount of great position statements, I might increase that number.  &lt;br /&gt;&lt;br /&gt;There will be no fee to attend, but you will be responsible for your own transportation and lodging.  A discounted rate at a convenient bed and breakfast hotel within walking distance of the conference will be available for a limited number of rooms.&lt;br /&gt;&lt;br /&gt;Here are the relevant dates: &lt;br /&gt;&lt;br /&gt;Dec 1 2009&lt;br /&gt;Deadline for position statements to be emailed to me or to be posted on the writing-about-testing mail list.&lt;br /&gt;&lt;br /&gt;Feb 1 2010&lt;br /&gt;Invitations to the conference sent.  Waiting list established if necessary. &lt;br /&gt;&lt;br /&gt;May 21 and 22 2010&lt;br /&gt;Conference.&lt;br /&gt;&lt;br /&gt;Durango has a lot to offer visitors.  Attendees may want to arrive early and stay late.  The Taste of Durango street festival is Sunday May 23, and we also plan to have an outdoor excursion that day.  There will likely be a number of attendees driving from the Denver area Thursday May 20, so carpooling from Denver or Colorado Springs could be possible for the 6-8 hour drive. Direct flights to Durango are available from Denver, Phoenix, and Salt Lake City, or the Albuquerque airport is a 4 hour drive in a rental car.  Let me know if you need more detailed information about getting to Durango or about the conference itself.&lt;br /&gt;&lt;br /&gt;UPDATE: I have just been informed that there is no longer a direct flight to Durango from Salt Lake City.  United, Frontier, and USAirways fly to Durango from Denver and Phoenix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-8660599827610738504?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/8660599827610738504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=8660599827610738504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8660599827610738504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8660599827610738504'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/10/cfp-peer-conference-writing-about.html' title='CFP: Peer conference &quot;Writing About Testing&quot; May 21/22 Durango CO'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-804787282218387304</id><published>2009-09-22T15:09:00.002-06:00</published><updated>2009-09-22T15:13:20.472-06:00</updated><title type='text'>against kanban part 3</title><content type='html'>At the agile2009 conference, David Carlton and Brian Marick presented something they called "Idea Factory", an overview of three sociological systems by which the scientific community comes to regard a certain thing as fact. &lt;br /&gt;&lt;br /&gt;Carlton's presentation was particularly intriguing.  He cited work pointing out that disparate communities come together in what are called "trading spaces" in order to pool aspects of their expertise to create new work.&lt;br /&gt;&lt;br /&gt;One of the signs of a "trading space" is a creole or pidgin language created by the participants in the trading space and used by participants in the trading space to negotiate among themselves.  Such language may seem weird or impenetrable by outsiders, but participants wield it in order to accomplish things among themselves.&lt;br /&gt;&lt;br /&gt;In contrast, Six Sigma, ISO9000, and now Lean/kanban, are imposed upon the agile development trading space.  They are concepts and processes and ideas forged from managing factories, fitted (roughly and badly) into a culture that, when healthy, has no need of them.  Just a quick glance at the hundred or so two-column translation tables in the book "Lean-Agile Pocket Guide for Scrum Teams" gives a clear indication that it takes serious effort to map Lean processes onto an indigenous Agile framework. &lt;br /&gt;&lt;br /&gt;To my mind, the agile/XP/Scrum community conceived three brilliant "trading space" type of ideas around which our work revolves:&lt;br /&gt;&lt;br /&gt;First, the idea that at a certain time, we will release a predictable and well-known set of running, tested features to production, over and over again, reliably, puts the emphasis on actually shipping things for people&lt;br /&gt;to use. This emphasis on succeeding within a time box consistently (and the subsequent celebration by both the agile team and by the customers!) is utterly critical to the success of agile teams, and Lean/kanban throws it out the window.&lt;br /&gt;&lt;br /&gt;I had a number of Lean advocates tell me that "you can still have iterations with kanban", but the radical de-emphasis of the time box and of the ceremony of releasing features to the customer at the end of every scheduled development cycle is a huge step backward.  In other writing I have suggested that software development without a regular, public, scheduled, celebrated release of features to production cannot be agile, regardless of what other processes are involved in such software development. &lt;br /&gt;&lt;br /&gt;Second, the fact that the language to describe this work (iterations; big visible charts; information radiators; test-driven development; continuous integration; pair programming; automated testing; etc. etc. etc.) comes&lt;br /&gt;directly from those who practice the work and is indigenous to that work.  These terms have no meaning outside the realm of agile software development.  This insistence on our own creole or pidgin language gives the agile software development community a high degree of self-reliance, and a degree of resistance to corruption.&lt;br /&gt;&lt;br /&gt;The language used by Lean/kanban software folk is strewn with corrupted Japanese words and phrases ripped from a generation of Japanese manufacturing.  In my experience such words (kaizen; pokyoke) are used more to intimidate and confuse the uninitiated rather than to actually further the work at hand.  There are perfectly good words in the agile "trading space" to describe such concepts without resorting to arbitrarily adding terms from an entirely different culture, the culture of Japanese automobile manufacturing. &lt;br /&gt;&lt;br /&gt;Third is that every Scrum process for every individual team contains the seeds of its own destruction. Every agile retrospective contains an opportunity to break the rules for a good cause.  Want to scale your team up to three times the recommended size?  &lt;a href="http://www.socialtext.com/"&gt;Go&lt;/a&gt; for &lt;a href="http://www.ultimatesoftware.com/"&gt;it&lt;/a&gt;.  Want to replace pair programming with institutional code review, replace CI and TDD with a hair-trigger build system plus dedicated testers expert in the debugger?  &lt;a href="http://chrismcmahonsblog.blogspot.com/2009/04/agile-cobol-is-no-oxymoron.html"&gt;Go for it.&lt;/a&gt;&lt;br /&gt;There is no room for creativity on the factory floor.  Any significant change to a manufacturing process involves significant retooling expense.  In software we have no such expense.  We can change our development processes right now, and then change them again an hour from now, and again an hour after that.  The agile frameworks and tools we use give us fast feedback that tells us what works and what does not.&lt;br /&gt;&lt;br /&gt;The Lean/kanban term that probably concerns me the most is "waste".  On a factory floor, this term has a reasonably clear meaning.  In a software development team this word has dangerous implications.&lt;br /&gt;&lt;br /&gt;I am a dedicated telecommuter, and the best telecommuter situations I have worked in have provided proxies for the "water cooler": wikis where we can post photos of our gardens and of our vacations, messaging systems where we can talk about our music or even our religion.  On the face of it, this is waste; in practice, it binds a team tightly together and increases productivity. &lt;br /&gt;&lt;br /&gt;This healthy social interaction in the course of the work is a symptom of a healthy "trading space".  Besides the pidgin/creole language created universally by devs + BAs + testers, there is a creole created within individual teams to describe their work and how it affects their lives. &lt;br /&gt;&lt;br /&gt;The foreign concepts Lean/kanban offer present a clear risk of corruption of the natural discourse of agile software development, and its other concepts like "waste" and "value stream mapping" pose a threat to the social interactions that make working in healthy agile teams such a productive, easy, and even joyous experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-804787282218387304?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/804787282218387304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=804787282218387304' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/804787282218387304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/804787282218387304'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/09/against-kanban-part-3.html' title='against kanban part 3'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-6250025188760103522</id><published>2009-09-14T15:44:00.001-06:00</published><updated>2009-09-14T15:48:47.310-06:00</updated><title type='text'>against kanban part 2</title><content type='html'>After conversations with various well-meaning folk at the Agile 2009&lt;br /&gt;conference about some details of Lean and kanban, I remain more&lt;br /&gt;opposed to a general implementation of them than ever.&lt;br /&gt;&lt;br /&gt;But I'm willing to grant that a single kanban call might have value.&lt;br /&gt;Liz Keogh had a good example:  a group of agile coaching consultants, each with multiple clients, each client moving at different rates, with more clients&lt;br /&gt;waiting for attention.  The consultants track their work with cards on a board. (Note: tracking work with cards on a board is NOT kanban...)&lt;br /&gt;&lt;br /&gt;When one consultant finishes with a client, that consultant adds a&lt;br /&gt;card to the board saying GIVE ME WORK.&lt;br /&gt;&lt;br /&gt;As I understand it, this is the essence of kanban:  as Eric Willike told me, the essential image of kanban is a colored card in an empty basket, sent up the line to have the basket filled again.&lt;br /&gt;&lt;br /&gt;But what a frighteningly low-bandwidth transaction!  This means of communication is for infants: GIMME followed by either YES or NO.  Put a bunch of infants in a room and you will certainly observe social behavior and even happy cooperation; but those social transactions cannot be very complex.  A social system based only on GIMME: OK/NO is a poor substitute for real adult communication.&lt;br /&gt;&lt;br /&gt;But it is a perfectly adequate system for interacting with inanimate objects, such as on a factory floor.&lt;br /&gt;&lt;br /&gt;I was asked to supply my favorite metaphor so we could apply lean/kanban to it, and of course I chose a musical performance:  a group of experts negotiate a set of things to perform at a certain time at a certain place for a paying audience who will be delighted by the performance.  At the arranged time and place, the group of performers demonstrate their expertise for the delighted audience. Then they do it again two weeks later.&lt;br /&gt;&lt;br /&gt;My interlocutor then asked me to imagine how to deal with the transportation and the instruments and the catering and the sound and lights and the hotel, etc. etc. etc., implying that lean/kanban is an appropriate system with which to negotiate the larger ecosystem in which a software development team works.&lt;br /&gt;&lt;br /&gt;Thinking it over later, though, I still think that not only is kanban a poor fit, it's a dangerous approach when applied to any transaction more complex than filling a basket with parts.&lt;br /&gt;&lt;br /&gt;The essential problem is that arranging a performing arts tour or releasing successful iterations to production requires complex negotiations among people at every stage. Kanban defines only a single, infantile transaction: GIMME: OK/NO.  If this single&lt;br /&gt;transaction is the only model you have for dealing with people, your project, whatever its nature, is doomed to fail.&lt;br /&gt;&lt;br /&gt;On the other hand, if your communication model is complex, for example as they say in the Scrum world, if your story is a placeholder for a conversation rather than an empty basket to be filled, you are doing something-- but whatever it is, it is not kanban.  If your cards on a board represent more than just Work In Progress but instead represent complex agreements among groups of people, you have stepped outside&lt;br /&gt;the lines of Lean and kanban and you are doing something altogether different.&lt;br /&gt;&lt;br /&gt;The risk I perceive here is that organizations will not only attempt to reduce all of their software development practices to infantile GIMME:OK/NO transactions, but that they will pursue such oversimplifications to great expense in the name of "value stream&lt;br /&gt;mapping".  This is an approach that blends the brain-dead process descriptions of ISO9000 with the outrageous process design expense of Six Sigma.&lt;br /&gt;&lt;br /&gt;As I've noted many times, processes designed to manipulate physical objects map very poorly to software development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-6250025188760103522?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/6250025188760103522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=6250025188760103522' title='38 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/6250025188760103522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/6250025188760103522'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/09/against-kanban-part-2.html' title='against kanban part 2'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-5443471821380821693</id><published>2009-08-16T12:38:00.006-06:00</published><updated>2009-08-16T14:05:39.909-06:00</updated><title type='text'>proposed: peer conference "Writing About Testing"</title><content type='html'>It seems like there is more demand than ever among the technical publications for information about software testing.  Experience reports, theoretical pieces, tool documentation, all seem to be in great demand right now.&lt;br /&gt;&lt;br /&gt;At the same time, I think the overall quality of what I've been reading about testing is declining, as people rush to meet that demand without adequate preparation or knowledge.&lt;br /&gt;&lt;br /&gt;I'm interested enough to do the legwork to host such a peer conference, assuming the potential participants were willing to come to Durango.  If not, I'd be willing to travel to attend such a conference, and to help facilitate, promote, or whatever is needed to bring it off.&lt;br /&gt;&lt;br /&gt;I envision soliciting participation from two groups: established writers with a history of publication with outlets like SQE, STP, InformIT, O'Reilly, etc. etc.; and also new voices looking to start writing for these sorts of publishers (I very much hope that there really are new voices writing about testing very soon).  New voices should have some sort of verifiable writing ability, like a public weblog or conference papers, or some other reasonable means to evaluate their work.&lt;br /&gt;&lt;br /&gt;As for content, I'd like an Open Space style event, but I envision themes like:&lt;br /&gt;&lt;br /&gt;Ethics of public discourse: the difference between reporting and opinion; proper citation; avoiding false pretences and misunderstandings; criticising ethical lapses on the part of others.&lt;br /&gt;&lt;br /&gt;Voice and style; tone and timbre.  Academic/scientific writing versus colloquial and general writing.  Grammar, structure, how to engage the reader.&lt;br /&gt;&lt;br /&gt;Working the business: queries and pitching, invoicing, negotiating with publishers, working with editors and art departments.&lt;br /&gt;&lt;br /&gt;Professional development: improving technical skills, and being able to write about it.&lt;br /&gt;&lt;br /&gt;Impact of blogging, Twitter, social media that shows extensive writing,  like Facebook and LinkedIn and such.&lt;br /&gt;&lt;br /&gt;As for a date, I envision some time within the next year, but not before January 2010.  Assuming it's in Durango, there would be a lot of amenities available.  In winter, there is good skiing available at a couple of places nearby.  Spring is a shoulder season, but it's a great time to go to the canyon country.  Summer has river sports, biking, and mountain trips, all in town.&lt;br /&gt;&lt;br /&gt;Durango has a new library with meeting facilities that should be adequate for a fairly small group.  For a larger group, the local college makes its facilities available for minimal cost.  This conference, like most such, would be a break-even proposition.&lt;br /&gt;&lt;br /&gt;There are a number of alternative locations to Durango.  SQE is based in FL, as is the company I work for.  STP is mostly in Nashville, not far away.  The Bay Area or Chicago or Portland or Austin all might be possible locations, as I believe there are facilities for such gatherings easily available.  I'd be particularly interested in Denver, Phoenix,  SLC or Albuquerque also, as they are only a short plane ride or a day's drive away.&lt;br /&gt;&lt;br /&gt;If this idea interests you, please leave a comment here, send me email, or drop me a line on Twitter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-5443471821380821693?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/5443471821380821693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=5443471821380821693' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/5443471821380821693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/5443471821380821693'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/08/proposed-peer-conference-writing-about.html' title='proposed: peer conference &quot;Writing About Testing&quot;'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-8923651247603630425</id><published>2009-07-18T17:22:00.003-06:00</published><updated>2009-07-18T23:24:28.123-06:00</updated><title type='text'>a year of STPedia</title><content type='html'>This month marks one year of the column &lt;a href="http://xndev.blogspot.com/"&gt;Matt Heusser&lt;/a&gt; and I co-write every month for Software Test and Performance magazine, "STPedia".   It was great to mark our anniversary in a double-length column on "Agile Testing in Practice" in July's newly redesigned print version of ST&amp;amp;P and to help out with the launch of ST&amp;amp;P's redesigned portal, &lt;a href="http://www.stpcollaborative.com/"&gt;stpcollaborative&lt;/a&gt;.  ST&amp;amp;P are changing things around for the better.&lt;br /&gt;&lt;br /&gt;The format of the column is that we have a paragraph or two introducing the topic for the month, then we define dictionary-style a set of terms related to the topic, then usually we draw some sort of conclusion from how the terms are related.  ST&amp;amp;P has a 6-month editorial calendar, so at this point we've treated many subjects twice.  And really, how much is there to say about source control?  From here on out we're going to range a little more widely in our choice of topic.&lt;br /&gt;&lt;br /&gt;A little Inside Baseball, for those who are interested in how the writing gets done:  we have no set process.   Some of the time one of us will write the whole draft for the other to edit.  For instance, September's column is mostly Matt, and October (at this point at least) is mostly me.  Other times one of us will start the column, run out of steam, and the other will finish it.  I remember one column in particular where I just could not come up with a conclusion that made sense.  Matt rewrote the last half so that it all made sense.   Sometimes one of us will write some of the definitions, and the other will handle what's left over.  Matt has a wider range of expertise than me, so he likely wrote the really technical stuff.   If you read the column month to month, you probably get about 50% of each of us over time.&lt;br /&gt;&lt;br /&gt;The fact that we've been at this a year with no end in sight speaks to our mutual respect.  Matt is a bright, honest, motivated, dedicated guy.  And fun to work with.  I think we still have a lot to say, I hope you'll consider reading our stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-8923651247603630425?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/8923651247603630425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=8923651247603630425' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8923651247603630425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8923651247603630425'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/07/year-of-stpedia.html' title='a year of STPedia'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-5069899016050245528</id><published>2009-07-11T12:54:00.002-06:00</published><updated>2009-07-11T13:47:51.418-06:00</updated><title type='text'>against kanban</title><content type='html'>I've been somewhat alarmed by the enthusiasm with which the agile community has embraced Lean manufacturing principles, especially kanban.  While I'm sure that kanban is effective in some circumstances, I am also convinced that it exposes software teams to real risk of impaired function.&lt;br /&gt;&lt;br /&gt;Like many of my qa/tester colleagues who were working in the field in the 90s, I used to be a real process-head.  I was part of projects that enthusiastically implemented Six Sigma, CMM, ISO9000, as well as other approaches like RUP, spiral development, etc. etc.  We thought then that if only we could get the process right, we could crank out great software just like factories crank out cars and engineers crank out bridges.&lt;br /&gt;&lt;br /&gt;Six Sigma and ISO9000 were lifted straight from manufacturing.  CMM was the product of a lot of analysts who looked at some properties of a selected set of software projects. &lt;br /&gt;&lt;br /&gt;Then the Agile movement came along, and with it new processes, the most significant of which turned out to be XP and Scrum together.  These were revolutionary, because they were software development processes actually created from scratch by people who were very very good at creating software.  Obviously, because these processes were created by smart people creating software, these processes map very well to how we do excellent software development.&lt;br /&gt;&lt;br /&gt;We can argue about the details:  is it better to have stable velocity or increasing velocity?  should we estimate using points or using ideal hours?  Regardless of these details, if your team measures velocity and uses velocity to plan iterations, and if your team always does pair programming, test-driven development, and continuous integration, then you will either release excellent software every iteration; or you will quickly expose and face the reasons why not.&lt;br /&gt;&lt;br /&gt;Kanban doesn't make it necessary to face your inadequacies.  I have two examples:&lt;br /&gt;&lt;br /&gt;At one point my dev team had a chance to interview a self-appointed "kanban expert" on the subject of kanban and Lean.  At this point the team had successfully shipped something like 25 of the last 27 iterations, so releasing iterations to production was routine, we had the whole process pretty well dialed in.  And we had some killer questions for the kanban expert.&lt;br /&gt;&lt;br /&gt;Under this questioning, it turned out that the kanban expert's team had been using a Scrum/XP process, but they blew iteration after iteration after iteration.  From his answers to our questions, it seemed that his team lacked the skill and discipline to be consistently successful iteration after iteration.  So one iteration, when they knew they'd blown it one more time, they simply stopped doing iterations or planning to release features.  This is apparently when this person attached "kanban expert" to his resume. &lt;br /&gt;&lt;br /&gt;Before we started releasing every iteration, my team had been using a kanban-like process.  We would identify a set of features, then branch our trunk code for each feature under development.  When a feature was finished, we would merge the feature branch back into the trunk code.  This way we always had features being developed, and we could release trunk safely at any time. &lt;br /&gt;&lt;br /&gt;We had a lot of very bright developers on the team.  Some of them were maybe a little too bright.  With no timebox pressure, we had people doing a lot of gold-plating, making architecture changes that had no relation to the feature being developed, making (cool!) experiments in the underlying code, and generally making merging not very fun.&lt;br /&gt;&lt;br /&gt;Furthermore, it was an enormous headache for the marketing people.  Without timeboxes or estimates, it was difficult to know when a particular feature would be available, which made it almost impossible to do effective marketing for the product.  When we switched to planning iterations based on our velocity and our backlog, we made the marketing people very, very happy.&lt;br /&gt;&lt;br /&gt;The fundamental difference between software development and manufacturing or engineering is that in software development we do not manipulate physical objects.  We manipulate concepts, and algorithms, and process.  Processes designed to optimize the handling of physical objects simply do not map to the work we do when we create software.   I'm sympathetic to those who see estimation and iteration planning as waste, but I think the risk inherent in not having a mechanism to expose our inadequacies is too much risk to take, even for the best of teams.  We have no warehouses to fill up or assembly lines to halt, we have only the contents of our heads and of our code repository.  For software development, the only truly useful metric is: can you deliver running tested features on a consistent schedule?  Iteration timeboxing exposes that metric in the most obvious way possible.&lt;br /&gt;&lt;br /&gt;What we find in both literature and anecdote about the application of processes taken from manufacturing and engineering, puzzlingly, is that for every team for which the process is successful and helpful, there are other teams who implement the same process only to meet with failure. &lt;br /&gt;&lt;br /&gt;What I suspect is that ANY process or methodology (that is not actively destructive), applied to a skilled, disciplined, high-functioning, motivated team, will succeed, regardless of the process.  Likewise, any process applied to a low-functioning team will likely fail.&lt;br /&gt;&lt;br /&gt;With an XP/Scrum sort of iterative process, we will know very soon exactly how and why we are failing.  This seems to be not true of kanban or of any other software development process taken from the manufacturing arena.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-5069899016050245528?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/5069899016050245528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=5069899016050245528' title='42 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/5069899016050245528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/5069899016050245528'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/07/against-kanban.html' title='against kanban'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>42</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-1022119507228181249</id><published>2009-07-07T14:42:00.003-06:00</published><updated>2009-07-07T15:27:36.994-06:00</updated><title type='text'>validate order with regular expressions</title><content type='html'>Today I wrote some UI tests to validate that certain text appears on pages in a particular order.  Since I've done this now in two different jobs using two different tools, I thought it might be of interest to others.&lt;br /&gt;&lt;br /&gt;There are a couple of reasons you might want to do this.  For example, a page might have a list of records sorted by certain aspects of the record.  Here's a crude example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;|name |date|description|&lt;br /&gt;|chris|july|tester     |&lt;br /&gt;|tracy|june|gardener   |&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One set of critical tests validates that name/date/description appear in the right order; that chris/july/tester appears in the right order; and that tracy/june/gardener appears in the right order.&lt;br /&gt;&lt;br /&gt;Another critical test is that chris appears above tracy in the display.&lt;br /&gt;&lt;br /&gt;The first challenge for the tester is to identify and be able to address the smallest part of the page that contains the text under consideration.  Every tool does this in a slightly different way, but &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; is your friend here.&lt;br /&gt;&lt;br /&gt;The next challenge is to make sure that your particular framework knows how to interpret regular expressions.  I have seen this in place in &lt;a href="http://seleniumhq.org/projects/remote-control/"&gt;Selenium-RC&lt;/a&gt; and &lt;a href="http://ulti-swat.wiki.sourceforge.net/"&gt;SWAT&lt;/a&gt;, and I have rolled my own in &lt;a href="http://wtr.rubyforge.org/"&gt;Watir&lt;/a&gt;.  (But for all I know Watir might have this kind of thing automatically by now.  It's been some time since I've used Watir on a real project.)&lt;br /&gt;&lt;br /&gt;Now, to check the horizontal order, you construct a test that looks something like&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;|assert_text|id=text_container|name.+date.+description|&lt;br /&gt;|assert_text|id=text_container|chris.+july.+tester    |&lt;br /&gt;|assert_text|id=text_container|tracy.+june.+gardener  |&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To test that chris appears before tracy on the page:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;|assert_text|id=text_container|chris[\W\w]+tracy|&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;Regular expressions are for matching text&lt;/a&gt;.  The first set of tests is fairly straightforward.  The "." operator says "match any character".  The "+" operator says "match 1 or more instances of whatever".  This means that text like "namedate" would cause the test to fail (which is exactly what we want) but text like "name foo date" would pass (which might not be what we want but it's still a decent test, we could write a fancier regex if that happened to be critical).&lt;br /&gt;&lt;br /&gt;The second test is a little trickier.  The trouble is that by default "." does not match any newline characters. And since chris has to appear above tracy in the page, there will always be a newline involved.  Most if not all languages have a way to tell the "." operator to match a newline, but some of them are really awkward.  (I'm looking at you, .NET.)&lt;br /&gt;&lt;br /&gt;So instead we make a little workaround: the \W means "match anything that's not a word" and "\w" means "match anything that is a word".  "Word" is defined as any letters plus any numbers plus "_", but it doesn't matter.  [\d\D] (for digits) would have worked as well, since the point is that one of those expressions will always match anything we encounter between one interesting string ("chris") and the other interesting string ("tracy").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-1022119507228181249?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/1022119507228181249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=1022119507228181249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1022119507228181249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1022119507228181249'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/07/validate-order-with-regular-expressions.html' title='validate order with regular expressions'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-2097252141466546383</id><published>2009-04-24T13:45:00.009-06:00</published><updated>2009-05-04T11:49:20.858-06:00</updated><title type='text'>UI test framework design using Watir</title><content type='html'>I wrote a little toy test automation framework recently.&lt;br /&gt;&lt;br /&gt;It's a keyword-driven framework, and the test data is kept in a CSV file.  The test data look like this:&lt;br /&gt;&lt;br /&gt;goto,http://www.google.com,,&lt;br /&gt;text_field,name,q,pickaxe&lt;br /&gt;button,name,btnG,click&lt;br /&gt;match,Programming Ruby,text&lt;br /&gt;&lt;br /&gt;This is the classic Google Search example from the Watir documentation.&lt;br /&gt;&lt;br /&gt;I used CSV because it's the simplest implementation.  This is, after all, a toy.  In the real world this might be HTML tables or wiki tables or a spreadsheet.  What we want is for anyone to be able to write a test quickly and easily after a little bit of training on FireBug or the IE Developer Toolbar.  (Test design is a different issue.  Let's not talk about that now.)&lt;br /&gt;&lt;br /&gt;The framework grabs the test data and interprets each row in order.  A simple dispatcher invokes the correct execution method depending on what the first element in the row of test data is.  This has two advantages. &lt;br /&gt;&lt;br /&gt;For one thing, there are a finite number of types of page elements to deal with, so our methods to manipulate them will be limited in number.&lt;br /&gt;&lt;br /&gt;For another thing, we can write custom test fixtures using our own special keywords, and make our own little DSL, like I did with the final row above that starts with "match". &lt;br /&gt;&lt;br /&gt;Reporting pass/fail status is left as an exercise for the reader. &lt;br /&gt;&lt;br /&gt;This simple framework could easily be the start of a real test automation project.  It's robust, it scales well, and it can easily be customized, improved, and refactored over time.&lt;br /&gt;&lt;br /&gt;[UPDATE: the comment below about leaking memory is interesting.  I didn't say it explicitly in the original post, but I think test data (CSV files) should represent fewer than about 200 individual steps.  My vision is that this script is invoked for a series of CSV files all testing different paths through the application, and each CSV file is handled by a new process.  Paths through the application with more than about 200 steps make it much harder to analyze failures.  The fewer the number of test steps, the better.]&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;require 'test/unit'&lt;br /&gt;require 'watir'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class ExampleTest &lt; Test::Unit::TestCase&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def goto(args)&lt;br /&gt;      @ie.goto("#{args[1]}")&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def text_field(args)&lt;br /&gt;      @ie.text_field(:"#{args[1]}",'q').set("#{args[3]}")&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def button(args)&lt;br /&gt;      @ie.button(:"#{args[1]}","#{args[2]}").click&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def match(args)&lt;br /&gt;      assert_match("#{args[1]}",@ie.text,message="FAIL!")&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def test_google&lt;br /&gt;&lt;br /&gt;      @ie = Watir::IE.new&lt;br /&gt;&lt;br /&gt;      @command_array = []&lt;br /&gt;&lt;br /&gt;      File.open('watir_keywords.csv') do |file|&lt;br /&gt;         while line = file.gets&lt;br /&gt;            @command_array &lt;&lt; line&lt;br /&gt;         end #while&lt;br /&gt;      end #do&lt;br /&gt;&lt;br /&gt;      @command_array.each do |comm|&lt;br /&gt;         args = comm.split(',')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#arguably 'case' would be nicer here than 'if', but this gets the job done.&lt;br /&gt;         if args[0] == "goto"&lt;br /&gt;            goto(args)&lt;br /&gt;         elsif args[0] == "text_field"&lt;br /&gt;            text_field(args)&lt;br /&gt;         elsif args[0] == "button"&lt;br /&gt;            button(args)&lt;br /&gt;         else args[0] == "match"&lt;br /&gt;            match(args)&lt;br /&gt;         end #if&lt;br /&gt;      end #do&lt;br /&gt;&lt;br /&gt;   end #def&lt;br /&gt;&lt;br /&gt;end #class&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-2097252141466546383?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/2097252141466546383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=2097252141466546383' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/2097252141466546383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/2097252141466546383'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/04/ui-test-framework-design-using-watir.html' title='UI test framework design using Watir'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-185220267084944110</id><published>2009-04-19T20:39:00.002-06:00</published><updated>2009-04-19T20:51:08.398-06:00</updated><title type='text'>a really good bug report</title><content type='html'>I had occasion to use FireWatir recently and found a strange bit of behavior trying to manipulate a select_list element.  I posted an &lt;a href="http://groups.google.com/group/watir-general/browse_thread/thread/276d98c7598daa6c/5e503c2239677997?lnk=gst&amp;amp;q=anomaly#5e503c2239677997"&gt;executable bug report&lt;/a&gt; to the Watir-general mail list. (Please read the whole (short) discussion.)&lt;br /&gt;&lt;br /&gt;I have not been working closely with Watir for some time, so I missed some obvious diagnostic paths.  Even so,  though I got a reasonable explanation for the observed behavior, I pushed it farther, wondering why I did not receive a NoMethodError trying to do what I did. &lt;br /&gt;&lt;br /&gt;Please note:  at no time did I ever editorialize; nor criticize; nor invent solutions.  I merely discussed observed behavior with interested parties in disinterested tones.  And upon examination, I had turned up not one, but two different bugs.&lt;br /&gt;&lt;br /&gt;I am pleased once again to have contributed to the Watir project.  Furthermore, I think the discussion linked above is pretty close to a Platonic ideal of bug reports.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-185220267084944110?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/185220267084944110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=185220267084944110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/185220267084944110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/185220267084944110'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/04/really-good-bug-report.html' title='a really good bug report'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-1487593873001971819</id><published>2009-04-05T21:23:00.002-06:00</published><updated>2009-04-05T21:31:30.997-06:00</updated><title type='text'>at liberty</title><content type='html'>blogging &lt;a href="http://testingjeff.wordpress.com/2009/04/03/some-benefits-of-being-part-of-real-professional-communities/"&gt;is so old-school&lt;/a&gt;.  Thanks again Jeff!&lt;br /&gt;&lt;br /&gt;I have been amazed by and touched by and thankful for and proud of all the people who have sent nice messages, said nice things, and sent me leads since I was laid off from the best job I've had in a decade. &lt;br /&gt;&lt;br /&gt;I am seeking a telecommuting software testing/QA job or related work.  I have expert-level skills and experience, a shockingly good resume, and awesome references from some of the best software people in the world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-1487593873001971819?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/1487593873001971819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=1487593873001971819' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1487593873001971819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1487593873001971819'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/04/at-liberty.html' title='at liberty'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-4757689714661451415</id><published>2009-04-05T09:36:00.007-06:00</published><updated>2009-04-05T11:58:48.384-06:00</updated><title type='text'>agile COBOL is no oxymoron</title><content type='html'>&lt;a href="http://faculty.fortlewis.edu/hanks_b/"&gt;Dr. Brian Hanks&lt;/a&gt; of Fort Lewis College said on Twitter just now:&lt;br /&gt;&lt;br /&gt;"Agile Cobol - the new oxymoron"&lt;br /&gt;&lt;br /&gt;I have to disagree.  In the late 90s I worked testing a life-critical 911 data-validation system written in COBOL and C.  I was the tester when we migrated from key-sequenced data files (basically VSAM, or very close) to an SQL database (albeit one with no relational integrity-- we had to write that into the code).&lt;br /&gt;&lt;br /&gt;When I joined the company, system releases were chaos.  By the time I left, system releases were orderly, done on a regular basis, with great confidence.  We evolved what was essentially an agile process to regularly ship running, tested features that our customers wanted.&lt;br /&gt;&lt;br /&gt;But we broke every rule in the book (of the time) to do it.  We had customers talking to developers all the time, we had sysadmins reviewing features before release, we had testers reading code and running debuggers, we (quietly)  ignored test plans in 5-inch binders.&lt;br /&gt;&lt;br /&gt;The Agile Manifesto validated this way of working.  It was the first public acknowledgment that we were not alone in thinking that it took people working together all the time to release good software.  Suddenly I had somewhere to point to say "See? Someone else thinks that working this way is a good idea!"  As the Agile Manifesto became more widely known, any number of old-school mainframe people came out of the woodwork to talk about how they had been doing similar work for a long time.  The Manifesto did not come into being from nowhere.&lt;br /&gt;&lt;br /&gt;I want to talk about a few test techniques I used in a couple of COBOL code bases that are creative analogs of modern techniques, but using old tools.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Human Unit Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My mainframe career was spent all on Tandem systems.  Tandem had a GREAT debugger, and a GREAT proprietary scripting language.  As a tester, the first thing I did whenever new code got checked in was to crank up the debugger, set a breakpoint at the new code, step back and forth modifying the values of variables trying to cause a failure.  When I did cause a failure, I would step back to a system level and use the UI or the batch processes to attempt to generate the data to cause the failure.  Most of the time this was possible.  Then I filed a bug report.&lt;br /&gt;&lt;br /&gt;It is worth noting, now that the statute of limitations has probably run out:  I was completely confident that our system would survive Y2K.  Not because of the system test plan in the 5-inch binder  (a worthless and stupid exercise required by someone in another part of the building whom we never talked to and that I ignored outright) but because I had personally examined the use of every instance of every date in every place in the entire code base by hand, in the debugger.   That took significant time, but it was worth it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Debugger + macros + scripting = automated unit testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In hindsight I should have done a lot more of this.&lt;br /&gt;&lt;br /&gt;Tandem's scripting language allowed you to start a program, call the debugger, and load something called a 'macro'.  The macro would drive the debugger, allowing you to set breakpoints, modify and capture values during the course of the run.&lt;br /&gt;&lt;br /&gt;I used to use this technique a lot to accomplish what &lt;a href="http://www.kohl.ca/"&gt;Jonathan Kohl&lt;/a&gt; calls "Computer Assisted Testing".  Use automation to accomplish the tedious steps of bringing the system to a state where something interesting is just about to happen, then let human beings take over.&lt;br /&gt;&lt;br /&gt;If I knew then what I know now, I could have built some awesome standalone regression test suites using this technique.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Golden Snapshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I worked in another COBOL code base that was a disaster.  Actually, the whole company was a mess.  To give a sense of how bad it was:  the ball of mud was far too big for the compiler.  Whenever the size of the main procedure had to be cut, the devs didn't peel off a module or a functional area; they just cut lines 5000-6000 or whatever and called it a day.  Utter chaos.&lt;br /&gt;&lt;br /&gt;And improving the code base would have threatened the jobs of the most senior devs.  The best developers in the company were given impossible assignments, sabotaged along the way, blamed for the failure, and then demoted.  Not nice.&lt;br /&gt;&lt;br /&gt;The code was so bad it literally could not be automated at a unit or integration level.  So I did two things.&lt;br /&gt;&lt;br /&gt;First, we designed a "smoke test" set of manual test cases.  We had the best tester in the shop run each test very carefully by hand. At the end of each reference test run we took a snapshot of all the system files and stored them in directories named for each test case.&lt;br /&gt;&lt;br /&gt;For subsequent manual runs, the tester would execute the steps, then (figuratively) press a button that caused a diff of the saved files vs. the current system files.  Any discrepancies between the state of the files was cause to suspect a bug.&lt;br /&gt;&lt;br /&gt;In step 2 of this system, I used a tool called VersaTest from a company called Ascert to begin automating the stuff that the manual testers did.  This tool was basically a proxy for the UI and allowed me to drive the system guts by bypassing the UI.  To this day, I have never had a better customer support experience than I did with Ascert.  I was calling them constantly, and one of their customer support people became a real friend I still speak with now and then.&lt;br /&gt;&lt;br /&gt;This is pretty much a last-resort automation option.  For one thing, it is extremely expensive up front.  For another thing, debugging failures is depressingly hard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stubs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was teaching myself Perl at this time also, which came in really handy on several occasions.&lt;br /&gt;&lt;br /&gt;At one point I was assigned to a small side project.  One of the better devs had run afoul of his peers again and been sentenced to work on this not-sexy side project.  This dev is responsible for one of my favorite quotes of all time.  After we'd been working together for a while and the project was starting to flesh out a bit, I noticed that his COBOL was quite a lot better than the code in the main code base and the code I'd seen from other devs.  He said "Just because it's COBOL doesn't mean it HAS to be ugly".&lt;br /&gt;&lt;br /&gt;This project was a transaction system.  Our code would send an transaction, and an outside party would send back one of 4 messages:  Success; Failure; Queued for Later Processing; or Later Processing Complete.  But their test interface was really flaky and was down most of the time.  I wrote a little Perl script that would reply to our system with one of the 4 messages depending on whether the last digit in the transaction number in the record was 1, 2, 3, or 4.  It was rather clever and simple, and that little script saw use for the whole life of the project.  This little side project was also neat because the team was me, the dev, and a business guy, and we were iterating fast, all together, all using the code, all analyzing the work at the same time.&lt;br /&gt;&lt;br /&gt;Meanwhile, in the big sexy part of the company, there was a highly visible project to do transactions with a very important partner, but our dev schedule was ahead of theirs, so interaction testing was some way out.  When I was informed that the code was "done", I read the spec and implemented a little Perl network server that could read and write messages over TCP/IP.  I pointed our code at it, which immediately fell over dead.   I started reporting bugs on the code.  The dev actually complained to my boss about this.  He could not understand how someone could report bugs when the other side of the transaction was not complete.  One day though, he turned all the way around and started being nice to me.  I suspect someone had reviewed his "done" code and chewed him out. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No Oxymoron&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So it is possible to have automated unit testing, integration testing, and system testing in a COBOL/mainframe environment.  Furthermore, it is not only possible to develop COBOL according to the Agile Manifesto; I think the points made by the Manifesto came from the cultures of successful mainframe projects.&lt;br /&gt;&lt;br /&gt;Agile software development has been around for a long, long time.  It just didn't have a name until those guys got together at Snowbird and cranked up the Agile movement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-4757689714661451415?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/4757689714661451415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=4757689714661451415' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/4757689714661451415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/4757689714661451415'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/04/agile-cobol-is-no-oxymoron.html' title='agile COBOL is no oxymoron'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-6074252472532219172</id><published>2009-01-03T13:28:00.003-07:00</published><updated>2009-01-03T13:42:53.919-07:00</updated><title type='text'>Ruby net/http+SSL+Basic Auth</title><content type='html'>Since one post from this blog is (or at least used to be) a &lt;a href="http://chrismcmahonsblog.blogspot.com/2006/11/linked-from-soap4r-wiki.html"&gt;little chunk of official documentation&lt;/a&gt; for Basic Auth in Ruby, I decided I should write this down also.&lt;br /&gt;&lt;br /&gt;Socialtext is switching some of the SaaS servers to be https all the time.  So I had to rejigger my selenium test-runner script, because it reads (test data) from and writes (test results) to the wiki.&lt;br /&gt;&lt;br /&gt;I found this &lt;a href="http://pixels-and-politics.blogspot.com/2007/02/ruby-https-with-http-basic-auth.html"&gt;very elegant example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My take on it looks like&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;def put_test_results_to_wiki&lt;br /&gt;         http = Net::HTTP.new(@test_host,443)&lt;br /&gt;         req = Net::HTTP::Put.new(@put_loc, initheader = {'Content-Type' =&gt;'text/x.socialtext-wiki'})&lt;br /&gt;         http.use_ssl = true&lt;br /&gt;         req.basic_auth @test_user, @test_pass         &lt;br /&gt;         req.body = ".pre\n" + @content + "\n.pre"         &lt;br /&gt;         response = http.request(req)&lt;br /&gt;         puts response&lt;br /&gt;     end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What is a little peculiar about this is that Basic Auth is very much optional for SSL connections.  Normally the client would do a GET, the server would return a cookie, and the client would use that cookie in subsequent transactions.  I found a nice example of that &lt;a href="http://snippets.dzone.com/posts/show/788"&gt;here&lt;/a&gt;, but as of today the server seems to be down.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-6074252472532219172?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/6074252472532219172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=6074252472532219172' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/6074252472532219172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/6074252472532219172'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2009/01/ruby-nethttpsslbasic-auth.html' title='Ruby net/http+SSL+Basic Auth'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-3452196425960243994</id><published>2008-11-24T21:40:00.002-07:00</published><updated>2008-11-24T21:55:02.946-07:00</updated><title type='text'>artistic testing</title><content type='html'>I like to point out that historical, well-vetted aesthetic frameworks are &lt;a href="http://chrismcmahonsblog.blogspot.com/2008/05/software-artists-value-of-software.html"&gt;useful for evaluating software&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt; But what if similar aesthetic frameworks could not only validate software itself but also *predict* software test techniques? &lt;br /&gt;&lt;br /&gt;For example, let's examine overarching schools of painting:  first came realism, where painters attempted to represent as much as possible what appears to the human eye.  We can test realistic scenarios, we do this all the time.  I would suggest that most bugs are not discovered under what we understand to be realistic circumstances.&lt;br /&gt;&lt;br /&gt;Then came expressionism, where painters attempted to express things not seen.  Likewise, test techniques moved on to persona testing (imagining the use of software by peculiar users) and soap-opera testing.   Such techniques expose significant bugs. &lt;br /&gt;&lt;br /&gt;Then came abstract expressionism.  Think of Jackson Pollack.  Are there abstract expressionist test techniques?  &lt;a href="http://chrismcmahonsblog.blogspot.com/2008/09/test-technique.html"&gt;Of course there are&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I would really like to hear of any other explorations along these lines...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-3452196425960243994?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/3452196425960243994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=3452196425960243994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/3452196425960243994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/3452196425960243994'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/11/artistic-testing.html' title='artistic testing'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-3509884114313233906</id><published>2008-11-22T16:01:00.002-07:00</published><updated>2008-11-22T16:11:54.986-07:00</updated><title type='text'>two agile antipatterns</title><content type='html'>Both of these have been crossing my path with increasing frequency in recent months (not at work, but in conversations with others whom one would think would know better):&lt;br /&gt;&lt;br /&gt;1) Stories are scheduled work for features.  Stories should not include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;testing&lt;/li&gt;&lt;li&gt;refactoring&lt;/li&gt;&lt;li&gt;documentation&lt;/li&gt;&lt;li&gt;undefined customer support&lt;/li&gt;&lt;li&gt;calling your mom&lt;/li&gt;&lt;/ul&gt;The problem with writing stories for stuff other than scheduled work on features is that you completely undermine the concept of velocity. &lt;br /&gt;&lt;br /&gt;Velocity is the number of story points accomplished per iteration.  If you assign story points to activities other than scheduled work on features, you cheat the business of accurate information about release schedules.  (Although it might make you feel better to be accomplishing so many points each iteration, if you are not delivering features, you fail.) &lt;br /&gt;&lt;br /&gt;2) Doing it "by the book".&lt;br /&gt;&lt;br /&gt;Part of the agile culture is to have retrospectives at the end of each iteration.  Each retrospective is an opportunity to change your process. &lt;br /&gt;&lt;br /&gt;So if you're doing 2-week iterations, at the end of a year, you've had 25 or so opportunities to change your process.  At the end of two years, 50 process changes. &lt;br /&gt;&lt;br /&gt;If after all of these retrospectives, you are doing your work the same way you were at the beginning, you fail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-3509884114313233906?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/3509884114313233906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=3509884114313233906' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/3509884114313233906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/3509884114313233906'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/11/two-agile-antipatterns.html' title='two agile antipatterns'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-7545370639318845781</id><published>2008-11-12T17:25:00.001-07:00</published><updated>2008-11-12T17:26:47.005-07:00</updated><title type='text'>Finally joined Twitter</title><content type='html'>I'm chris_mcmahon there if you want to follow me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-7545370639318845781?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/7545370639318845781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=7545370639318845781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/7545370639318845781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/7545370639318845781'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/11/finally-joined-twitter.html' title='Finally joined Twitter'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-2978193140267898074</id><published>2008-10-08T09:47:00.002-06:00</published><updated>2008-10-08T09:56:55.278-06:00</updated><title type='text'>testers as navigators</title><content type='html'>Not long ago &lt;a href="http://en.wikipedia.org/wiki/Audrey_Tang"&gt;Audrey Tang&lt;/a&gt; started working for Socialtext.  It has been a remarkable experience, as Audrey is mostly fixing bugs based on bug reports submitted by our testers. &lt;br /&gt;&lt;br /&gt;Audrey is in Taiwan and another of our testers is working from Bangladesh (although he is usually in Vancouver BC).  Today they needed to hash out some details of a bug report so they shared a VNC session on a machine hosted in Palo Alto CA.  It took only a couple of minutes to arrive at an agreement that the bug was fixed. &lt;br /&gt;&lt;br /&gt;Audrey's comment in IRC really struck us all:  "&lt;audreyt&gt; having an excellent qa team is like driving with a first-grade GPS navigation system :)"&lt;br /&gt;&lt;br /&gt;We have worked very hard to create consistent, readable, executable bug reports for real, visible bugs.  Having a developer as good as Audrey validate that work means a lot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-2978193140267898074?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/2978193140267898074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=2978193140267898074' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/2978193140267898074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/2978193140267898074'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/10/testers-as-navigators.html' title='testers as navigators'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-8359324253931562296</id><published>2008-09-06T22:09:00.002-06:00</published><updated>2008-09-06T22:27:06.953-06:00</updated><title type='text'>a test technique</title><content type='html'>Very recently I was part of a bug hunt:  an effort to find as many defects as possible in a UI in a short period of time.  &lt;br /&gt;&lt;br /&gt;I am not an outstanding UI tester.  I have worked with testers whose eye for detail, line, color, consistency, work flow, etc. etc. make them really outstanding testers to have examining the front end.  But I've spent most of my career on green-screen apps, test automation, environment maintenance, stuff like that.  I lack the really expert artist's eye that great UI testers have.  &lt;br /&gt;&lt;br /&gt;That said, I was on a roll on this particular bug hunt, finding a lot of nice, sophisticated bugs.  It was classic ET: decide a test approach, determine your next test based on the results of your last test;  and when you stop finding bugs, change your test approach.&lt;br /&gt;&lt;br /&gt;I'd followed all the logical paths I could think of; I'd tried really big inputs and really small inputs; I'd tried permissions errors, navigation errors, and checking error messages themselves.  I tried some crazy stuff.  I started to run out of reasonable test approaches.  Toward the end, when I was getting tired and finding fewer and fewer bugs, I hit on a neat test technique that found a really cool bug:&lt;br /&gt;&lt;br /&gt;Here's what I did:  I sort of unfocused my eyes, and addressed the UI spacially instead of logically.  Moving from top left to bottom right, I manipulated everything I could find to manipulate.  Then I went across the bottom; across the top; up and down in lanes; just clicking and typing and choosing whatever was located next to the last thing I manipulated. &lt;br /&gt;&lt;br /&gt;I found this great bug this way:  there was a very small link in the footer of a particular area on a page that had exactly the same label as a much larger link elsewhere on the page.  Even though we had four expert testers closely examining the application, no one had discovered that the little link in the footer was wired up completely differently (and totally wrong) than the big link with exactly the same label.   Until I unfocused my eyes and considered everything on the page as equal and logically unrelated, except by space.  Because I approached the UI spacially instead of logically, I found the little piece that was wired up completely wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-8359324253931562296?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/8359324253931562296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=8359324253931562296' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8359324253931562296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8359324253931562296'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/09/test-technique.html' title='a test technique'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-2720612244911436622</id><published>2008-06-23T22:34:00.003-06:00</published><updated>2008-06-23T23:35:58.951-06:00</updated><title type='text'>technical investment</title><content type='html'>My colleague Matt Heusser is doing this &lt;a href="http://www.cs.calvin.edu/activities/technical-debt/"&gt;workshop on technical debt&lt;/a&gt; soon. &lt;br /&gt;&lt;br /&gt;I posted a little meditation on &lt;a href="http://chrismcmahonsblog.blogspot.com/2008/04/technical-debt-as-impedance-mismatch.html"&gt;techdebt as impedance mismatch&lt;/a&gt;, but that seems to me to be trivially true, facile. &lt;br /&gt;&lt;br /&gt;Since I made The Software Artists public, though, I've been fielding a lot of questions on the software-test mail list that has me rethinking my position on technical debt.   So here is what I *really* think:&lt;br /&gt;&lt;br /&gt;Technical debt doesn't really exist.  At least, it doesn't exist for high-performing software teams.  It's a useful concept for those encumbered by poor programming and poor testing, but the idea ceases to be useful about the time the code base becomes manageable.&lt;br /&gt;&lt;br /&gt;I have a graph and and I have a metaphor that both explain my position.  &lt;br /&gt;&lt;br /&gt;I'll just describe the graph because I'm too lazy to hunt down some free software to draw it.  This graph describes a couple of different projects I've been involved in, for a couple of different employers. &lt;br /&gt;&lt;br /&gt;The critical line on the graph is "regression bugs released to production".  Or you could title it "predictable bugs released to production" if you wanted to be more inclusive, but I like the regression idea best. &lt;br /&gt;&lt;br /&gt;Another line on the graph is "features released to production".  This is where we make the product better.&lt;br /&gt;&lt;br /&gt;A third line on the graph is "test coverage".  I don't really care about the distinction between unit tests, integration tests, acceptance tests, or whatever.  Just stipulate that it is possible to achieve some significant automated test coverage of the product. &lt;br /&gt;&lt;br /&gt;Over time, the graph of a productive, high-performance team creating software will likely show:&lt;br /&gt;&lt;br /&gt;Early on, the number of regression bugs released to production will be a small number, then will go to zero.   At Socialtext, we have a suite of Selenium-based regression tests.  About a year ago, we rapidly increased the number of test steps from around 1000 to around 4000.  The number of regression bugs released to production went from 'a few' at 1000 test steps to zero at 4000 test steps.    That line on the graph has remained at zero, and the test suite now has about 7000 test steps. &lt;br /&gt;&lt;br /&gt;The number of features added to the software will rise significantly.   Good developers working well, releasing to production every two weeks:  you get a lot of features.  &lt;br /&gt;&lt;br /&gt;Test coverage (and by implication, refactoring):  this is the interesting part.  Test coverage rises at a much smaller rate than the rate at which features are added.   Picture the difference:  as the number of features rises dramatically, and the amount of test coverage rises less dramatically, the amount of technical debt increases. &lt;br /&gt;&lt;br /&gt;Yet the number of regression bugs released to production remains zero. &lt;br /&gt;&lt;br /&gt;This works because that area of the graph between test coverage and features released doesn't really represent debt.   We know of course that the number of *possible* tests for any reasonable feature far exceed the number of *necessary* tests for that feature.  The only line that matters to us the 'defects released' line.  We choose our tests to minimize defects, not to maximize coverage.   Rather than go for feature-for-feature coverage, we weave a web of tests that is likely to catch any regression errors.&lt;br /&gt;&lt;br /&gt;We INVEST in automated tests (and refactoring, etc.) to MINIMIZE RISK.   I have to emphasize again that this can really only be done with a skilled and disciplined team in a reasonably well-designed code base.   In a less-expert environment, the idea of technical debt might be more useful.  &lt;br /&gt;&lt;br /&gt;So now to the metaphor:&lt;br /&gt;&lt;br /&gt;I have a &lt;a href="http://www.karyngabaldon.com/"&gt;friend&lt;/a&gt; who is a successful artist and gallery owner here in  our small town in the West.  She started in sculpture more than 25 years ago, moved to oils, and recently has fallen for acrylics and is doing some of the best work of her career.  She tends toward landscapes both real and imagined, although she sometimes takes for a subject flowers or saxophones. &lt;br /&gt;&lt;br /&gt;She's a Western female painter of landscapes and flowers:  why is she not as successful as Georgia O'Keefe? &lt;br /&gt;&lt;br /&gt;If we had been talking about software, the answer would probably involve 'technical debt'.   But we can see on the face of it that such an answer is silly.  There is no such thing as technical debt in a practice or in a performance.   &lt;br /&gt;&lt;br /&gt;However, the concept of technical *investment* does clearly apply in both cases.   Georgia O'Keefe was an expert and shaped her career in a certain way.  And she had a lot of luck.  My friend Karyn is also an expert and shaped her career in a certain way.  And she had her own share of luck, also.  &lt;br /&gt;&lt;br /&gt;The careers of both of these successful women show a lot of investment, but different kinds of investment in different areas, different people, different times, with different results. &lt;br /&gt;&lt;br /&gt;The important thing is not that Ms. Gabaldon is less famous than Ms. O'Keefe:  the important thing is that both succeeded in their work.  &lt;br /&gt;&lt;br /&gt;So where would the idea of technical debt actually be useful?  Consider the team encumbered by poor programming and poor testing.  If the number of predictable defects released to production on your project is high, consider studying the literature of software development and of software testing in order to bring the skills of the team up to a level where technical investment makes more sense than technical debt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-2720612244911436622?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/2720612244911436622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=2720612244911436622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/2720612244911436622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/2720612244911436622'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/06/technical-investment.html' title='technical investment'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-1961506905165549158</id><published>2008-05-31T13:57:00.002-06:00</published><updated>2008-05-31T14:00:51.227-06:00</updated><title type='text'>The Software Artists: Citations for Part Three</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Citations For the section “Practicing, Rehearsing, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;and Performing Software” &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Programmer, poet and guitarist Richard Gabriel's quote is from&lt;br /&gt;his proposal  for  a Master  of  Fine Arts in Software:&lt;br /&gt;http://www.dreamsongs.com/MFASoftware.html&lt;br /&gt;&lt;br /&gt;Apple CEO Steve Jobs' quote is widely noted, but is documented&lt;br /&gt;in  context  by  Andy  Hertzfeld  here:&lt;br /&gt;http://www.folklore.org/StoryView.py?story=Pirate_Flag.txt&lt;br /&gt;&lt;br /&gt;The practice/rehearse/perform rubric was first presented on the&lt;br /&gt;author's  blog  in  September  2007:&lt;br /&gt;http://chrismcmahonsblog.blogspot.com/2007/09/become-better-software-artist.html&lt;br /&gt;&lt;br /&gt;The title of this paper comes from the author's blog post of May&lt;br /&gt;2007 in response to Jonathan Kohl's recommendation of theater&lt;br /&gt;and  musical  experience  for  software  testing:&lt;br /&gt;http://chrismcmahonsblog.blogspot.com/2007/05/here-come-software-artists.html &lt;br /&gt;&lt;br /&gt;A performance by Ella Fitzgerald and Count Basie available on&lt;br /&gt;YouTube was a strong influence on this paper, cited in response&lt;br /&gt;to another  of  Brian Marick's  thoughtful  blog posts:&lt;br /&gt;http://chrismcmahonsblog.blogspot.com/2007/05/example-of-analogy-monks-vs-music.html  &lt;br /&gt;&lt;br /&gt;Luke Closs of Socialtext is a performing juggler and an excellent&lt;br /&gt;agile developer.  His talk  “Juggling for Geeks” is a fine&lt;br /&gt;performance: http://revver.com/video/317034/juggling-for-geeks-alpha/&lt;br /&gt;&lt;br /&gt;The author performed the jazz standard “These Foolish Things”&lt;br /&gt;on a $25.00 green ukulele at the Developer-Tester/Tester-&lt;br /&gt;Developer Summit at Google in Mountain View in February&lt;br /&gt;2007, to demonstrate (as good software testers know) that is is&lt;br /&gt;possible to produce excellent results even with inferior tools.&lt;br /&gt;http://googletesting.blogspot.com/2007/03/developer-testertester-developer-summit.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-1961506905165549158?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/1961506905165549158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=1961506905165549158' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1961506905165549158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/1961506905165549158'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/05/software-artists-citations-for-part.html' title='The Software Artists: Citations for Part Three'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-798816864121596859</id><published>2008-05-31T13:49:00.002-06:00</published><updated>2008-05-31T13:56:55.860-06:00</updated><title type='text'>The Software Artists: Practicing, Rehearsing, and Performing Software</title><content type='html'>&lt;blockquote style="font-style: italic;"&gt;Software development is a performance exhibiting&lt;br /&gt;skills developed by an individual—often in groups of teams...&lt;br /&gt;-Richard P. Gabriel&lt;br /&gt;&lt;br /&gt; Real artists ship.&lt;br /&gt;-Steve Jobs &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Since the language of art criticism provides useful tools for&lt;br /&gt;evaluating software, and the practice of teaching music provides&lt;br /&gt;useful approaches to teaching software, it is reasonable to think&lt;br /&gt;that the practice of artistic performance should provide useful&lt;br /&gt;ways to approach creating software. &lt;br /&gt;&lt;br /&gt;Only one way to build software has ever been acknowledged:&lt;br /&gt;software is designed,  coded,  and tested.   Sometimes the&lt;br /&gt;design/code/test  cycle is done a single time,  sometimes&lt;br /&gt;design/code/test is done iteratively or incrementally, sometimes,&lt;br /&gt;as in Test Driven Development, the steps are moved around, so&lt;br /&gt;that the cycle goes test/design/code.   &lt;br /&gt;&lt;br /&gt;But this is not how human beings create a performance.  Instead&lt;br /&gt;of  design/code/test,  artists  have  a  cycle  of&lt;br /&gt;practice/rehearse/perform.&lt;br /&gt;&lt;br /&gt;Since human beings have been creating performances since&lt;br /&gt;prehistoric times, it is worthwhile to see if creating software might&lt;br /&gt;benefit from the practices of artists.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Practice &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before an artist is prepared to perform, the artist must have a&lt;br /&gt;certain set of skills.  Even the most naive or improvisational artist&lt;br /&gt;will have practiced some aspects of their craft before performing.&lt;br /&gt;Practice is where the artist acquires and improves the basic skills&lt;br /&gt;of the craft.  A musician will use practice to learn scales and&lt;br /&gt;chords and rhythms, an actor will practice lines and passages, a&lt;br /&gt;painter will practice brush strokes and coloring. &lt;br /&gt;&lt;br /&gt;By practice the artist acquires not only the fundamental&lt;br /&gt;knowledge of the craft, but also masters the necessary tools for&lt;br /&gt;that craft.  A musician will learn an instrument, a painter will&lt;br /&gt;learn brushes and pigments and canvases, an actor will learn&lt;br /&gt;speech and movement.  &lt;br /&gt;&lt;br /&gt;When practicing for software, the software creator will learn&lt;br /&gt;applications and programming languages, design patterns and&lt;br /&gt;editors.   The software creator will also learn operating systems&lt;br /&gt;and network protocols, the basic frameworks on which software&lt;br /&gt;is created.&lt;br /&gt;&lt;br /&gt;When practicing for a particular software performance, a software&lt;br /&gt;creator might use a “spike” in the agile sense, or a simple&lt;br /&gt;prototype of  some feature or features to be developed.&lt;br /&gt;Regression tests could be considered as a tool for practice,&lt;br /&gt;because such tests reinforce good software behavior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rehearse &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As Dr. Gabriel says, software is created by groups.  But whether&lt;br /&gt;solo or in a group, artists rehearse before they perform.  Rehearsal&lt;br /&gt;is where artists behave as if they were performing.   In rehearsal,&lt;br /&gt;the various aspects of the performance are worked out, and the&lt;br /&gt;performers examine the boundaries of the performance to make&lt;br /&gt;certain that what is expected of them is in fact not only possible,&lt;br /&gt;but will also be attractive to an audience.  &lt;br /&gt;&lt;br /&gt;Integration testing and functional testing might be tools of&lt;br /&gt;software rehearsal, also beta versions and “dogfooding”, using the&lt;br /&gt;software internally or among a small group before releasing the&lt;br /&gt;software.  User experience testing might be part of rehearsal.&lt;br /&gt;Pair-programming could be a tool of software rehearsal, as could&lt;br /&gt;code inspection.  &lt;br /&gt;&lt;br /&gt;Investigation is a key part of rehearsal.  After practicing, artists&lt;br /&gt;still need to know where misunderstandings exist, where aspects&lt;br /&gt;of the performance may break down, where skills may not be&lt;br /&gt;adequate to the demands of the performance. &lt;br /&gt;&lt;br /&gt;Iteration is a key part of rehearsal.  Rehearsal often involves a&lt;br /&gt;close examination of the performance looking for ambiguity and&lt;br /&gt;wrong expression.  Upon discovering such issues, the small part&lt;br /&gt;of the work exhibiting the problem is reworked until the&lt;br /&gt;performers agree on the proper way to conduct the performance.&lt;br /&gt;&lt;br /&gt;Listening to a symphony orchestra rehearse is enlightening.  A&lt;br /&gt;major  symphony orchestra is  comprised of  the most&lt;br /&gt;accomplished musicians on Earth.   These musicians have&lt;br /&gt;dedicated their lives to practice and performance.   A symphony&lt;br /&gt;orchestra is also an extremely expensive operation.  &lt;br /&gt;&lt;br /&gt;In a symphony rehearsal, the conductor or music director will&lt;br /&gt;have the orchestra play only a few bars from passages that the&lt;br /&gt;conductor believes to be problematic in some way.  Based on&lt;br /&gt;only a few seconds or minutes of playing, the conductor will&lt;br /&gt;adjust the performance of various players and sections of the&lt;br /&gt;orchestra in a very short period of time.  These adjustments are&lt;br /&gt;understood to also apply to the rest of the performance.  &lt;br /&gt;Some things about artistic performance could greatly improve&lt;br /&gt;software performance:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For an artistic performance, everyone on the project has a role on the stage.  The best agile development projects emulate this behavior, since everyone on the team is always actively involved in creating the software. &lt;/li&gt;&lt;li&gt;If rehearsals for an artistic performance are poor, the performers may retire to practice more before continuing with rehearsal.  The notion of a software “spike” is very much like this, when the software creators put their regular work aside in order to learn something new about a relevant aspect of creating the software.  &lt;/li&gt;&lt;li&gt;Performers are rarely micro-managed.  Successful artistic projects and successful software projects assume that the performers have a certain level of competence, and remove people who do not have that level of competence.  &lt;/li&gt;&lt;li&gt;The value of practice and rehearsal is measured qualitatively not quantitatively.  For both software and art, the creators worry first about the excellence of the performance, and only later about the number of tickets or copies of the performance to be sold.  &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Perform &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Serious artists perform their art for an audience.  Serious software&lt;br /&gt;creators release software for their users.  &lt;br /&gt;&lt;br /&gt;Performance is where value is realized, where expertise is on&lt;br /&gt;display, where practice and rehearsal pay off:  for the performers,&lt;br /&gt;the creators, the investors, and for the audience.  &lt;br /&gt;&lt;br /&gt;Maybe it is time for the software development practice to begin&lt;br /&gt;referring not to “the users” but to “the audience”.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;To the Studio&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Artists' studios, rehearsal studios, movie studios, and recording&lt;br /&gt;studios are busy places.  They are full of the artists' tools, toys,&lt;br /&gt;and works in progress, and they are arranged for the convenience&lt;br /&gt;and inspiration of the artists. &lt;br /&gt;&lt;br /&gt;A factory floor is arranged for the convenience of managing the&lt;br /&gt;product. &lt;br /&gt;&lt;br /&gt;This tension between the artist and the manufacturer is not new.&lt;br /&gt;For instance, Andy Warhol's studio was called The Factory.&lt;br /&gt;Many movies and photographs of The Factory exist.  The irony is&lt;br /&gt;clear. &lt;br /&gt;&lt;br /&gt;It is notable that cubicle farms, departments, and isolated offices&lt;br /&gt;are giving way to bullpens, open spaces, war rooms, co-working&lt;br /&gt;space, home offices, even coffeehouses and brewpubs.  The&lt;br /&gt;correlation to artists' studios is clear.  &lt;br /&gt;&lt;br /&gt;It is notable that a small number of software creators are already&lt;br /&gt;being treated like artists.  Linus Torvalds, David Heinemeier&lt;br /&gt;Hansson, and Richard Stallman all come to mind.  &lt;br /&gt;&lt;br /&gt;Perhaps in the future the software artists will practice and&lt;br /&gt;rehearse in their software studios so that they can release software&lt;br /&gt;performances to their audiences.  The artists and the audiences&lt;br /&gt;and everyone else involved in these software performances will&lt;br /&gt;understand the value of these performances, and the feedback&lt;br /&gt;between artist and audience will increase the value of these&lt;br /&gt;performances.  People have been doing exactly this in art for&lt;br /&gt;thousands of years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-798816864121596859?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/798816864121596859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=798816864121596859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/798816864121596859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/798816864121596859'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/05/software-artists-practicing-rehearsing.html' title='The Software Artists: Practicing, Rehearsing, and Performing Software'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20165167.post-8447274549423646460</id><published>2008-05-31T13:45:00.001-06:00</published><updated>2008-05-31T13:48:58.742-06:00</updated><title type='text'>The Software Artists: Citations for Part Two</title><content type='html'>Citations for the section “Pedagogy and Practice in&lt;br /&gt;Software and in Guitar”&lt;br /&gt;&lt;br /&gt;Some of Joel Spolsky's writing about working with young&lt;br /&gt;software creators is at these links:&lt;br /&gt;http://www.joelonsoftware.com/articles/CollegeAdvice.html&lt;br /&gt;http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html&lt;br /&gt;http://www.joelonsoftware.com/items/2008/01/08.html&lt;br /&gt;&lt;br /&gt;Thoughtworks University had been called “Thoughtworks Boot&lt;br /&gt;Camp” until the author had to explain the term upon crossing an&lt;br /&gt;international border in 2005.  A description of Thoughtworks&lt;br /&gt;University is here:&lt;br /&gt;http://www.thoughtworks.com/work-for-us/TWU.html&lt;br /&gt;&lt;br /&gt;Some representative citations from IEEE publications about poor&lt;br /&gt;software education are:&lt;br /&gt;http://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel5/8994/28540/01276501.pdf&lt;br /&gt;http://stevemcconnell.com/ieeesoftware/eic12.htm&lt;br /&gt;http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/mags/so/&amp;amp;toc=comp/mags/so/2002/05/s5toc.xml&amp;amp;DOI=10.1109/MS.2002.1032848&lt;br /&gt;&lt;br /&gt;The citation from CrossTalk is here:&lt;br /&gt;http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonb erg.html&lt;br /&gt;&lt;br /&gt;Samples of the discussion of the apprentice/journeyman/master&lt;br /&gt;model in software are at these links: &lt;br /&gt;http://butunclebob.com/ArticleS.UncleBob.TheProgrammingDoj o&lt;br /&gt;http://www.mcbreen.ab.ca/SoftwareCraftsmanship/&lt;br /&gt;&lt;br /&gt;Of particular interest is Dave Hoover's account of hearing Bob&lt;br /&gt;Martin's presentation at Agile2007:&lt;br /&gt;http://redsquirrel.com/cgi-bin/dave&lt;br /&gt;&lt;br /&gt;The developers at Atomic Object also believe that software is a&lt;br /&gt;craft:&lt;br /&gt;http://www.atomicobject.com/pages/Software+as+a+Craft&lt;br /&gt;&lt;br /&gt;Brian Marick's blog post about skill, discipline, ease, and joy is&lt;br /&gt;here:&lt;br /&gt;http://www.exampler.com/blog/2007/05/16/six-years-later-what-the-agile-manifesto-left-out/&lt;br /&gt;&lt;br /&gt;This interview with Robert Fripp was very helpful:&lt;br /&gt;http://emusician.com/em_spotlight/fripp_philosophy_guitar_craft/&lt;br /&gt;&lt;br /&gt;Eric Tamm's biography of Robert Fripp has a wealth of&lt;br /&gt;information.  Chapters 10 an 11 concern Guitar Craft, and were&lt;br /&gt;very helpful: &lt;br /&gt;http://www.progressiveears.com/frippbook/contents.htm&lt;br /&gt;&lt;br /&gt;The Guitar Craft website is&lt;br /&gt;http://www.guitarcraft.com/&lt;br /&gt;The site behaves oddly sometimes though, so a direct link to “A&lt;br /&gt;Preface to Guitar Craft is here:&lt;br /&gt;http://www.guitarcraft.com/?np=5&amp;amp;&amp;amp;id=4&lt;br /&gt;&lt;br /&gt;A number of Robert Fripp quotes are here:&lt;br /&gt;http://www.brainyquote.com/quotes/authors/r/robert_fripp.html&lt;br /&gt;&lt;br /&gt;The description of Bob Martin's ideas of “professionalism” come&lt;br /&gt;from the abstract of his presentation at Agile2007:&lt;br /&gt;http://www.agile2007.com/agile2007/index.php?page=sub/&amp;amp;id=649&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20165167-8447274549423646460?l=chrismcmahonsblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrismcmahonsblog.blogspot.com/feeds/8447274549423646460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=20165167&amp;postID=8447274549423646460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8447274549423646460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20165167/posts/default/8447274549423646460'/><link rel='alternate' type='text/html' href='http://chrismcmahonsblog.blogspot.com/2008/05/software-artists-citations-for-part-two.html' title='The Software Artists: Citations for Part Two'/><author><name>Chris McMahon</name><uri>http://www.blogger.com/profile/16339861008904941703</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12084375236585512454'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>