<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-33777038</id><updated>2011-12-24T22:24:00.934Z</updated><category term='linux'/><category term='firefox'/><category term='estimating'/><category term='legacycode'/><category term='sqlserver'/><category term='ddd'/><category term='javascript'/><category term='agile'/><category term='oo'/><category term='books'/><category term='gadgets'/><category term='di'/><category term='programming'/><category term='peopleware'/><category term='professionalism'/><category term='windows'/><category term='tdd'/><category term='quality'/><category term='events'/><category term='softwarecraftsmanship'/><category term='testing'/><category term='aboutme'/><title type='text'>programmer.grrl</title><subtitle type='html'>(copy + paste) code = bad</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33777038.post-681486234124159631</id><published>2011-03-05T15:00:00.001Z</published><updated>2011-03-05T15:56:07.211Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='di'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Book Review: Dependency Injection in .NET</title><content type='html'>&lt;p&gt;This isn't so much a review as just a note that I read &lt;a href="http://www.manning.com/seemann/"&gt;Dependency Injection in .NET&lt;/a&gt; by Mark Seemann and found it pretty helpful in clearing up some of my confusions about dependency injection frameworks.&lt;/p&gt;&lt;p&gt;I already was aware of the basics of constructor injection, but was experiencing some pain around problems like constructor over-injection and lots of 1-1 mapping between interfaces and implementations. This book explores ways to fix these issues and many others.&lt;/p&gt;&lt;p&gt;Here are some topics the book covered that I really appreciated:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;DI patterns, including the different types of injection, and Ambient Context
&lt;/li&gt;&lt;li&gt;DI antipatterns, including Service Locator
&lt;/li&gt;&lt;li&gt;DI refactorings, including Abstract Factory and dealing with cyclic dependencies
&lt;/li&gt;&lt;li&gt;Object composition, including implementing the composition root for common types of .NET applications&lt;/li&gt;&lt;li&gt;Interception&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I particularly liked the way the Interception chapter went over Decorators and how to configure them, and then moved into how to implement and configure interception.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-681486234124159631?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/681486234124159631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2011/03/book-review-dependency-injection-in-net.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/681486234124159631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/681486234124159631'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2011/03/book-review-dependency-injection-in-net.html' title='Book Review: Dependency Injection in .NET'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-7384757104862052150</id><published>2010-09-05T21:28:00.001+01:00</published><updated>2010-09-05T21:28:53.633+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='softwarecraftsmanship'/><title type='text'>A Real-Life Short-Short Story About Software Craftsmanship</title><content type='html'>&lt;p&gt;One day, at the end of my team's daily stand-up meeting, one person said he was cleaning out his garage. He'd found a couple of books that his previous employer gave to all new hires. And that now he would like to get rid of those books to anyone interested.&lt;/p&gt;  &lt;p&gt;One of the books was &lt;a href="http://my.safaribooksonline.com/0-201-73386-2"&gt;Software Craftsmanship&lt;/a&gt; by &lt;a href="http://www.improvingwetware.com/"&gt;Pete McBreen&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;One of our managers laughed, saying, &amp;quot;Oh, so now you're all going to be &lt;em&gt;craftsmen&lt;/em&gt;.&amp;quot;&lt;/p&gt;  &lt;p&gt;Several other people laughed, too.&lt;/p&gt;  &lt;p&gt;After they were done laughing, I said that I thought it was a good book and I recommended reading it.&lt;/p&gt;  &lt;p&gt;There was silence.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-7384757104862052150?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/7384757104862052150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/09/real-life-short-short-story-about.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7384757104862052150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7384757104862052150'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/09/real-life-short-short-story-about.html' title='A Real-Life Short-Short Story About Software Craftsmanship'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-6639386711275322646</id><published>2010-07-26T20:39:00.001+01:00</published><updated>2010-07-26T20:39:34.748+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='professionalism'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Does "Software Engineering" Need to be a Profession?</title><content type='html'>&lt;p&gt;[This is Part 2 of a review of Steve McConnell's book &lt;a href="http://www.stevemcconnell.com/psd.htm"&gt;Professional Software Development&lt;/a&gt;. Read Part 1 &lt;a href="/2010/07/book-review-professional-software.html"&gt;here&lt;/a&gt;.]&lt;/p&gt;  &lt;p&gt;In proposing that software development should become a true profession, McConnell points out that for a something to be considered a profession, it must have&lt;/p&gt;  &lt;blockquote&gt;   &lt;ul&gt;     &lt;li&gt;A requirement for extensive learning and training. &lt;/li&gt;      &lt;li&gt;A code of ethics imposing standards higher than those normally tolerated in the marketplace. &lt;/li&gt;      &lt;li&gt;A disciplinary system for professionals who breach the code. &lt;/li&gt;      &lt;li&gt;A primary emphasis on social responsibility over strictly individual gain, and a corresponding duty of its members to behave as members of a disciplined and honorable profession. &lt;/li&gt;      &lt;li&gt;A prerequisite of a license prior to admission to practice. &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;In discussing licensing, McConnell notes&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Licensing is a &lt;em&gt;mandatory&lt;/em&gt;, legal process that is intended to protect the public, and is typically administered by jurisdictions (states, provinces, and territories).&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;One of the consequences of being a professional engineer is that you can be held personally liable for the work your company performs under your signature. Courts in the United States have held that only members of a profession can be found guilty of malpractice. Doctors, lawyers, and architects can be guilty of malpractice. Garbage truck drivers, short order cooks, and computer programmers cannot be guilty of malpractice because, legally, they aren't considered to be professionals.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;No individual engineer will be required to be licensed, but some companies eventually will be required to employ licensed engineers.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Professional engineers in these companies will review software engineering work and sign off on the software their companies deliver. To those companies, employing professional engineers will be a legal necessity. If software companies follow other engineering disciplines, the company that hires a professional engineer will pay for liability insurance as part of the professional engineer's employment package, which will minimize that disadvantage of getting your professional engineering license.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Professional engineers will gain other benefits. The professional engineers who put their signature and reputation on the line for their companies will have final say over methodology choices, design approaches, and other decisions that affect the quality of the software for which they might be held liable. Without professional standing, your boss can come to you and demand that you commit to an unrealistic schedule, make shortsighted design compromises, or sacrifice quality in order to get the software out the door. With a well-defined profession—consisting of education, a code of ethics, and licensing—you will be able to say, &amp;quot;The standards of my profession don't allow me to shortchange quality in this situation. I could lose my license or get sued.&amp;quot; You will have a professional and legal basis for standing up to unenlightened managers, marketers, and customers—a basis that is sorely lacking today.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Wow. In some ways, it sounds great to have a legal basis for saying no to bad development practices. In other ways, it sounds very scary to be subject to that liability.&lt;/p&gt;  &lt;p&gt;Mostly, though it makes me wonder if software development truly needs to have &amp;quot;standards higher than those normally tolerated in the marketplace&amp;quot; and &amp;quot;a primary emphasis on social responsibility over strictly individual gain.&amp;quot; It makes me want to know more about what happened to make it generally agreed that in engineering, medicine, and law, public good can't be ensured by the marketplace alone.&lt;/p&gt;  &lt;p&gt;Because right now, one of the arguments for high standards in software development is that it's a good business decision. &amp;quot;&lt;a href="http://programmer.97things.oreilly.com/wiki/index.php/Speed_Kills"&gt;The only way to go fast is to go well&lt;/a&gt;,&amp;quot; as &lt;a href="http://blog.objectmentor.com/articles/category/uncle-bobs-blatherings"&gt;Uncle Bob Martin&lt;/a&gt; says. Or, we want to make sure we don't take on the &lt;a href="http://forums.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx"&gt;wrong kind of technical debt&lt;/a&gt;, because that will be bad for the company in the long run.&lt;/p&gt;  &lt;p&gt;But for a profession, these high standards don't have to be justified solely in marketplace terms. Instead, they have been accepted by society as being important for its own public interest.&lt;/p&gt;  &lt;p&gt;In discussing how engineering came to be a profession, McConnell says:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Historically, professional engineering has been established in response to threats to public safety. Although we take the safety of modern bridges for granted, in the 1860s American bridges were failing at the rate of 25 or more per year. Bridge failures and the loss of life they caused precipitated creation of a stricter engineering approach to bridge design and construction.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I wonder what sort of disaster would need to happen for society to demand higher standards in software development. Or would a slow build-up of buggier and buggier software be enough? How many times do you need to lose your data, have your computer crash, or just plain not be able to figure out how to do what you want in a user interface before you've had enough? And if you've had enough, can you buy a competitor's software instead, or is it just as buggy?&lt;/p&gt;  &lt;p&gt;Can the problems of today's software development be fixed by the marketplace, or do they require regulation? Does software development need to be a profession?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-6639386711275322646?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/6639386711275322646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/07/does-engineering-need-to-be-profession.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6639386711275322646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6639386711275322646'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/07/does-engineering-need-to-be-profession.html' title='Does &amp;quot;Software Engineering&amp;quot; Need to be a Profession?'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-6766581353078301867</id><published>2010-07-25T22:16:00.001+01:00</published><updated>2010-07-26T20:42:47.799+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='professionalism'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Book Review: Professional Software Development</title><content type='html'>&lt;p&gt;I can understand how many people sound as though they were disappointed in Steve McConnell's &lt;a href="http://www.stevemcconnell.com/psd.htm"&gt;Professional Software Development: Shorter Schedules, Better Projects, Superior Products, Enhanced Careers&lt;/a&gt;. It's not a &amp;quot;practical&amp;quot; book—like &lt;a href="http://www.stevemcconnell.com/cc.htm"&gt;Code Complete&lt;/a&gt;, &lt;a href="http://www.stevemcconnell.com/rdcntnt.htm"&gt;Rapid Development&lt;/a&gt;, or &lt;a href="http://www.stevemcconnell.com/est-toc.htm"&gt;Software Estimation&lt;/a&gt;—that you can immediately put into practice and improve your software's code or schedules.&lt;/p&gt;  &lt;p&gt;But whether or not you agree with McConnell's conclusions about how to &amp;quot;fix&amp;quot; software development by turning it into a profession—like engineering, medicine, or law—it does a good job highlighting some of the ongoing struggles in developing software.&lt;/p&gt;  &lt;p&gt;Many other reviews point out that the stratification and specialisation advocated by McConnell seem out of touch with agile development, and I agree. On the other hand, agile development encourages &amp;quot;&lt;a href="http://www.agilemodeling.com/essays/generalizingSpecialists.htm"&gt;generalising specialists&lt;/a&gt;,&amp;quot; not straight-up generalists.&lt;/p&gt;  &lt;p&gt;Other reviewers have also pointed out that the ladder-like professional development program promoted by McConnell also seems overly-regimented, and I agree with that, too. On the other hand, if career progression depends on taking specific classes, publishing articles, or participating in conferences, that might be better than not being allowed time for any learning or professional development at all, which happens at some companies.&lt;/p&gt;  &lt;p&gt;[To be continued in &amp;quot;&lt;a href="/2010/07/does-engineering-need-to-be-profession.html"&gt;Does 'Software Engineering' Need to be a Profession?&lt;/a&gt;&amp;quot;]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-6766581353078301867?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/6766581353078301867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/07/book-review-professional-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6766581353078301867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6766581353078301867'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/07/book-review-professional-software.html' title='Book Review: Professional Software Development'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-7618825390837860124</id><published>2010-07-10T09:58:00.001+01:00</published><updated>2010-07-10T09:58:50.483+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='oo'/><title type='text'>Book Review: Growing Object-Oriented Software, Guided by Tests</title><content type='html'>&lt;p&gt;Recently, I read &lt;a href="http://www.growing-object-oriented-software.com/"&gt;Growing Object-Oriented Software, Guided by Tests&lt;/a&gt; by Steve Freeman and Nat Pryce. Amongst excellent discussions of other TDD topics, it sheds a lot of light on good ways to use mock objects. &lt;/p&gt;  &lt;p&gt;Personally, I can remember reading Martin Fowler's &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren't Stubs&lt;/a&gt; quite a while ago and concluding that I'd be a &amp;quot;classicist.&amp;quot; &lt;/p&gt;  &lt;p&gt;Some time later, I started working with mocks as a way to isolate unit tests from &amp;quot;slow&amp;quot; dependencies, such as databases, trying to make them run more quickly. I didn't have much success, though, because I was still writing my tests in a classicist style. &lt;/p&gt;  &lt;p&gt;This book helped open my eyes to how the &amp;quot;mockist&amp;quot; style really works, and why it can be a good thing. I absolutely recommend it to any programmer who is doing TDD (or writing unit tests), but who still feels like when it comes to being a mockist, they just don't get it. &lt;/p&gt;  &lt;p&gt;I also think a great complement to the book is the video of J. B. Rainsberger's presentation &lt;a href="http://www.infoq.com/presentations/integration-tests-scam"&gt;Integration Tests Are A Scam&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;As a note on how to read the book, I got a bit bogged down in the middle section, with the worked example. I ended up skipping to the final section and came back to the middle after. Reading it like that worked just fine. I also think it could be interesting to alternate chapters of the middle section with those of the final section.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-7618825390837860124?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/7618825390837860124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/07/book-review-growing-object-oriented.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7618825390837860124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7618825390837860124'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/07/book-review-growing-object-oriented.html' title='Book Review: Growing Object-Oriented Software, Guided by Tests'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-5991445710021356013</id><published>2010-04-24T17:13:00.001+01:00</published><updated>2010-04-29T21:33:55.900+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><title type='text'>Do Unit Tests and Quality Code Result in Fewer Bugs?</title><content type='html'>&lt;p&gt;At the end of my team's last release, I set out to prove that unit tests and quality code lead to fewer bugs.&lt;/p&gt;  &lt;p&gt;Here are the tools I used.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Jira&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first thing to know is that the team I'm on keeps its features in &lt;a href="http://www.atlassian.com/software/jira/"&gt;Jira&lt;/a&gt;, and when we commit code to &lt;a href="http://subversion.apache.org/"&gt;Subversion&lt;/a&gt;, we include the Jira ID in the comments.&lt;/p&gt;  &lt;p&gt;Below, you'll see how this helped me relate code to features.&lt;/p&gt;  &lt;p&gt;The second thing to know is when we find bugs in a feature during its development, in Jira we link those bugs back to the parent feature.&lt;/p&gt;  &lt;p&gt;This allowed me to measure how many bugs had been reported for each feature at release.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SvnPlot&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There's an open source project called &lt;a href="http://code.google.com/p/svnplot/"&gt;svnplot&lt;/a&gt; that allows you to export the information stored in svn to a &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt; database. To do this, follow the instructions in Step 1 of the &lt;a href="http://code.google.com/p/svnplot/wiki/Introduction"&gt;Quick Start&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;You end up with a couple tables that include rows for each revision, including the comment and the files that were added, removed, and changed.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ANTLR&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I used &lt;a href="http://antlrcsharp.codeplex.com/"&gt;ANTLR C# grammar&lt;/a&gt; to help map the files changed to classes.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NCover&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I used &lt;a href="http://www.ncover.com/"&gt;NCover&lt;/a&gt; to measure unit test coverage of the added and changed classes.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NDepend&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;And finally, I used &lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt; to measure code quality of those classes, as well as to query the coverage metrics.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is the part where I'd love to show some fancy graphs proving my point. Unfortunately, the results weren't exactly conclusive.&lt;/p&gt;  &lt;p&gt;I ended up dropping the idea of trying to correlate code quality to number of bugs altogether, because I just ended up with a mess.&lt;/p&gt;  &lt;p&gt;The results for how unit test coverage related to bugs is sort-of presentable, at least, but they don't show a nice correlation:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;th&gt;Feature&lt;/th&gt;        &lt;th&gt;LOC Changed / Bug&lt;/th&gt;        &lt;th&gt;Average Coverage (%)&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;1&lt;/td&gt;        &lt;td&gt;521&lt;/td&gt;        &lt;td&gt;65&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;2&lt;/td&gt;        &lt;td&gt;290&lt;/td&gt;        &lt;td&gt;38&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;3&lt;/td&gt;        &lt;td&gt;165&lt;/td&gt;        &lt;td&gt;0&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;4&lt;/td&gt;        &lt;td&gt;140&lt;/td&gt;        &lt;td&gt;54&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;5&lt;/td&gt;        &lt;td&gt;125&lt;/td&gt;        &lt;td&gt;21&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;6&lt;/td&gt;        &lt;td&gt;76&lt;/td&gt;        &lt;td&gt;25&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;7&lt;/td&gt;        &lt;td&gt;74&lt;/td&gt;        &lt;td&gt;77&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;8&lt;/td&gt;        &lt;td&gt;59&lt;/td&gt;        &lt;td&gt;30&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;9&lt;/td&gt;        &lt;td&gt;2&lt;/td&gt;        &lt;td&gt;80&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;I'd like to think I'll try again another day, but given those results, I just don't know. I can come up with many reasons why things didn’t come out the way I'd hoped:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The amount of change for each feature was very diverse. Some features involved lots of code changes and others involved very few, so that the features may not really be comparable in this way. &lt;/li&gt;    &lt;li&gt;Some features involved mostly changing UI code, where the coverage can't be high, because we don't currently have a good way to unit test our UI code. &lt;/li&gt;    &lt;li&gt;Some features, especially Feature 9, had high test coverage, but the unit tests were very low on actual assertions. &lt;/li&gt;    &lt;li&gt;There's just not enough data. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In the end, if my argument to the business is that unit tests and code quality are important because they reduce the number of bugs, results like these won't help me make my case.&lt;/p&gt;  &lt;p&gt;So, if you know of more persuasive results—either your own or stuff out there in the literature—I'd love to hear about it :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-5991445710021356013?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/5991445710021356013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/04/do-unit-tests-and-quality-code-result.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5991445710021356013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5991445710021356013'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/04/do-unit-tests-and-quality-code-result.html' title='Do Unit Tests and Quality Code Result in Fewer Bugs?'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-7792161430982253205</id><published>2010-03-08T15:10:00.001Z</published><updated>2010-03-08T15:10:39.693Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Using the Windows Findstr Command to Find Text, Files and Folders</title><content type='html'>&lt;p&gt;Currently, I like the &lt;a href="http://technet.microsoft.com/en-us/library/bb490907.aspx"&gt;&lt;code&gt;findstr&lt;/code&gt;&lt;/a&gt; command better than other ways to search files in Windows.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Prerequisite: Open Command Window Here&lt;/strong&gt;    &lt;br /&gt;For XP, it's part of &lt;a href="http://www.microsoft.com/windowsxp/Downloads/powertoys/Xppowertoys.mspx"&gt;Microsoft PowerToys for Windows XP&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For Vista and Windows 7, apparently you &lt;a href="http://blogs.msdn.com/tims/archive/2006/09/18/windows-vista-secret-1-open-command-prompt-here.aspx"&gt;hold down the hold down the shift key and right click&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Finding File Contents&lt;/strong&gt;    &lt;br /&gt;Once you have a command window open at the directory you want to search within, you&amp;#160; can do something like this, which will return all lines containing &amp;quot;MyText&amp;quot; in all subdirectories of the current one, case-insensitive, and only searching files that contain printable characters:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;findstr /s /i /p &amp;quot;MyText&amp;quot; *.*&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;It turns out that &amp;quot;MyText&amp;quot; is treated as a regular expression, which is great. But if you don't want it treated as a regular expression, you can use the &lt;code&gt;/l&lt;/code&gt; or &lt;code&gt;/c:&lt;/code&gt; options. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Finding File &amp;amp; Folder Names&lt;/strong&gt;    &lt;br /&gt;Instead of giving &lt;code&gt;findstr&lt;/code&gt; files to search, you can pipe text to it from another command, so to search for file or folder names, you can give it the results of the &lt;code&gt;dir&lt;/code&gt; command to search:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;dir /s /b | findstr /i &amp;quot;MyFileName.txt&amp;quot;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Combining the Two&lt;/strong&gt;    &lt;br /&gt;Say you want to find all the lines containing &amp;quot;MyText&amp;quot;, except you don't want those that are part of a subversion directory. You can do this, where the &lt;code&gt;/v&lt;/code&gt; option means only return lines that &lt;em&gt;don't&lt;/em&gt; match:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;findstr /s /i /p &amp;quot;MyText&amp;quot; *.* | findstr /v /l &amp;quot;.svn&amp;quot;&lt;/code&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-7792161430982253205?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/7792161430982253205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/03/using-windows-findstr-command-to-find.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7792161430982253205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7792161430982253205'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/03/using-windows-findstr-command-to-find.html' title='Using the Windows Findstr Command to Find Text, Files and Folders'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-3277040883161413501</id><published>2010-02-18T23:30:00.002Z</published><updated>2010-02-18T23:33:18.894Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='peopleware'/><title type='text'>Software Development Career Paths: Up or Out?</title><content type='html'>&lt;p&gt;Continued from &lt;a href="/2010/02/software-development-career-paths.html"&gt;Software-Development Career Paths: Organizational Quality&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Moving Up     &lt;br /&gt;&lt;/strong&gt;For this option, mostly I can only repeat the traditional oft-heard worries: your tech skills will get rusty and you'll be stuck in middle-management forever.&lt;/p&gt;  &lt;p&gt;On the other hand, I don't think developers who like to code should dismiss moving up out of hand. If you get a chance, try it. Who knows, you might like it.&lt;/p&gt;  &lt;p&gt;There's a nice discussion about staying technical as a manager over on Rands In Repose: &lt;a href="http://www.randsinrepose.com/archives/2007/02/07/technicality.html"&gt;Technicality&lt;/a&gt;. If you keep your technical skills sharp, then hopefully if it turns out that you hate being a manager, you can still go back to being a developer.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Moving Out     &lt;br /&gt;&lt;/strong&gt;Lately I have a new perspective on moving out, thanks to the software craftsmanship movement. How many books and articles have you read lately that use the word &amp;quot;journeyman?&amp;quot; There's a reason the word &amp;quot;jouney&amp;quot; is in there.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;In parts of Europe… spending time as a journeyman, moving from one town to another to gain experience of different workshops, was an important part of the training of an aspirant master. [Wikipedia, &lt;a href="http://en.wikipedia.org/wiki/Journeyman"&gt;Journeyman&lt;/a&gt;]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Although I don't think it's a perfect book, &lt;a href="http://my.safaribooksonline.com/9780596806842"&gt;Apprenticeship Patterns&lt;/a&gt; by Dave Hoover and Adewale Oshineye is currently the best reference I know for thinking about different ways to approach a career as a software craftsman from the perspective of an individual developer rather than that of a manager.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Another Option: Stay Small, Maybe Even Really Small     &lt;br /&gt;&lt;/strong&gt;Keep in mind that not all organizations force you to choose between coding and managing. Smaller companies often don't have &amp;quot;&lt;a href="http://www.togsblom.com/2010/02/i-just-want-to-be-programmer-but-can-i.html"&gt;Eiffel Tower corporate hierarchies&lt;/a&gt;.&amp;quot; If you're moving around, you might find more satisfaction sticking with smaller companies, especially since that way you're more likely to personally provide value to customers, as described by Cameron Purdy in his great article &lt;a href="http://www.jroller.com/cpurdy/entry/eight_theses"&gt;Eight Theses&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Don't forget that you can go it on your own. Recently at DDD8, &lt;a href="http://geekswithblogs.net/twickers/Default.aspx"&gt;Liam Westley&lt;/a&gt; gave &lt;a href="http://vimeo.com/9216563"&gt;a talk&lt;/a&gt; about owning your own software development company. Of course, the talk assumed that you already &amp;quot;have commercial ideas, clients, or sales leads.&amp;quot; I have no idea how to get to that point, but the fact that Liam was there giving the talk is a reminder that people actually do manage it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Staying Motivated     &lt;br /&gt;&lt;/strong&gt;Whether you literally become a journeyman by moving among companies or you stay for a long time at a single company, if you don't want to move up, you may need to look for non-traditional ways to keep yourself up-to-date technically and otherwise generally motivated, especially if you find yourself occasionally working at places that treat you as an interchangeable coding machine.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://my.safaribooksonline.com/9780596806842"&gt;Apprenticeship Patterns&lt;/a&gt; gives some ideas about how to do this. Obviously, there are always things like learning new languages, participating in either local or virtual developer communities, and in open source projects.&lt;/p&gt;  &lt;p&gt;Interestingly, all of those things follow a general leadership-followership pattern that's pointed out in &lt;a href="http://my.safaribooksonline.com/9780787996659"&gt;The Art of Followership&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[An] example, which is becoming increasingly common in developed countries, occurs with employees who have extensive professional education. These employees can often perform their work assignments without relying on technical guidance from their hierarchical superiors. Their education often includes a strong socialization component, instilling in them a desire for autonomous, self-controlling behavior and the tendency to look to their professional colleagues for support and recognition. This often occurs with university professors who are highly educated and tenured. These individuals often view their university as a place to practice their teaching and research skills with little interference by administrators. They work with and obtain feedback from colleagues, they read academic journals for up-to-date information on their field, and they derive intrinsic satisfaction from their publications and recognition at academic conferences. Similar tendencies exist in firms that provide consulting and accounting services. In these instances, professional education and socialization can replace or substitute for a leader's direction and supportive behavior. [Chapter 3, Three Perspectives on Followership by Howell and Mendez]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I don't think the software development profession has necessarily quite reached this point yet, but it's an interesting perspective to keep in mind. Ideally, you can get &amp;quot;support and recognition&amp;quot; from your &amp;quot;hierarchical superiors&amp;quot; as well as your peers. Anything else is draining. However, in a pinch, don't forget to look out as well as up to get the sustenance you need to nurture your craft.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-3277040883161413501?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/3277040883161413501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/02/software-development-career-paths-up-or.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/3277040883161413501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/3277040883161413501'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/02/software-development-career-paths-up-or.html' title='Software Development Career Paths: Up or Out?'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-9096578820783224100</id><published>2010-02-16T23:09:00.002Z</published><updated>2010-02-18T23:32:28.197Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='peopleware'/><title type='text'>Software-Development Career Paths: Organizational Quality</title><content type='html'>&lt;p&gt;A developer-friend of mine, &lt;a href="http://www.togsblom.com/"&gt;Tom Wessels&lt;/a&gt;, recently asked the computer-age-old question:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.togsblom.com/2010/02/i-just-want-to-be-programmer-but-can-i.html"&gt;I just want to be a programmer. But can I?&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;He follows up the question with a great quote from the great and still-relevant book &lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439/"&gt;Peopleware&lt;/a&gt; by DeMarco and Lister, which points the career path encouraged, or at least tolerated, by many organizations: If you're not on your way up, you'd best be on your way out.&lt;/p&gt;  &lt;p&gt;To be fair, DeMarco and Lister follow up this description with a contrasting one, &amp;quot;The Mentality of Permanence:&amp;quot;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Over the years, we have been privileged to work and consult for a few companies with extraordinarily low turnover. You won't be surprised to learn that low turnover is not the only good thing about these companies. Indeed, they seem to excel at many or most of the people-conscious qualities discussed in these pages. They are the best…. In the best organizations, the short term is not the only thing that matters. What matters more is being the best. And that's a long-term concept.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;DeMarco and Lister go on to describe ways in which these companies invest in their employees, fostering a culture of learning, professional improvement, permanence, and organizational excellence.&lt;/p&gt;  &lt;p&gt;To answer the question, I think you need to look at your career along a few different dimensions. One of which is the quality of the organizations at which you will work.&lt;/p&gt;  &lt;p&gt;It might be possible, to get a job at one of these &amp;quot;best organizations&amp;quot; and be comfortable for some time with one of the options Tom presents:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;You reach a point where you just accept that you're at a good company, you get to write code in a somewhat enjoyable fashion, and you leave it at that.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hooray! Yes, I think it would be good for everyone to at least have that option for a few years at some point in their careers.&lt;/p&gt;  &lt;p&gt;But a couple things stand in the way. &lt;/p&gt;  &lt;p&gt;First, it can be hard to get a job at an organization like that, not only because its bar to entry might be pretty high, but also because from the outside, it can be hard even to identify which companies are truly the best. Or maybe you just don't happen to live near the offices of any of those best organizations and aren't able to move.&lt;/p&gt;  &lt;p&gt;Second, nothing lasts forever, including &amp;quot;being the best.&amp;quot; I'm not sure the great organizations DeMarco and Lister use to demonstrate their &amp;quot;mentality of permanence&amp;quot; are still considered to be the best now that it's 10-20 years later: Reader's Digest, Hewlett-Packard, Pacific Bell? Even the lean software development movement's favourite company, Toyota, has recently shown signs of falling off the &amp;quot;being the best&amp;quot; pedestal.&lt;/p&gt;  &lt;p&gt;In short, the mentality of permanence may not be permanent. If you're lucky enough to find yourself working for one of these best organizations, that's super. Enjoy it while it lasts, or for as long as you're comfortable staying. But don't be shocked if it doesn't last forever.&lt;/p&gt;  &lt;p&gt;Which brings us to the next dimension. Given that you might find yourself working at lower-quality, &amp;quot;up or out&amp;quot; organizations during your career, should you move up or should you move out?&lt;/p&gt;  &lt;p&gt;Continued in &lt;a href="/2010/02/software-development-career-paths-up-or.html"&gt;Software Development Career Paths: Up or Out?&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-9096578820783224100?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/9096578820783224100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2010/02/software-development-career-paths.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/9096578820783224100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/9096578820783224100'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2010/02/software-development-career-paths.html' title='Software-Development Career Paths: Organizational Quality'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-1343571934307425831</id><published>2009-12-06T16:43:00.004Z</published><updated>2010-03-07T17:43:11.226Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>A Year Of London Developer Events</title><content type='html'>&lt;p&gt;Today marks a year since I moved to London from Chicago. So far, my favourite thing about being here is &lt;strike&gt;the trains run like clockwork&lt;/strike&gt; the vibrant software developer community.&lt;/p&gt;&lt;p&gt;Here is a list of events I've attended, all of which I highly recommend:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://altnetgroup.com/"&gt;AltNetBeers and AltNetWorkshops&lt;/a&gt; organised by &lt;a href="http://serialseb.blogspot.com/"&gt;Sebastien Lambla&lt;/a&gt; &lt;a href="http://twitter.com/serialseb"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dnug.org.uk/"&gt;London .NET User Group&lt;/a&gt; organised by &lt;a href="http://codebetter.com/blogs/ian_cooper/default.aspx"&gt;Ian Cooper&lt;/a&gt; &lt;a href="http://twitter.com/icooper"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt; and &lt;a href="http://www.zimakki.com/blog/"&gt;Zi Makki&lt;/a&gt; &lt;a href="http://twitter.com/zimakki"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Open Source .NET, Architecture &amp; DDD, Agile PM &amp; Scrum, and Agile Testing &amp; BDD events at &lt;a href="http://skillsmatter.com/go/home"&gt;Skills Matter&lt;/a&gt; &lt;a href="http://twitter.com/skillsmatter"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;. Several of the ones I've been to were organised by &lt;a href="http://gojko.net/"&gt;Gojko Adzic&lt;/a&gt; &lt;a href="http://twitter.com/gojkoadzic"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://openspacecode.com/"&gt;Open Space Coding Days&lt;/a&gt; organised by &lt;a href="http://alandean.blogspot.com/"&gt;Alan Dean&lt;/a&gt; &lt;a href="http://twitter.com/adean"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.altnetuk.com/"&gt;The Alt.Net UK Conference&lt;/a&gt; organised by Alan Dean, Ian Cooper, &lt;a href="http://blog.benhall.me.uk/"&gt;Ben Hall&lt;/a&gt; &lt;a href="http://twitter.com/ben_hall"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;, and Sebastien Lambla&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.meetup.com/DDD-London/"&gt;DDD Meetups&lt;/a&gt; organised by Adam Shimali&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.thoughtworks.co.uk/"&gt;ThoughtWorks&lt;/a&gt; &lt;a href="http://londongeeknights.wetpaint.com/"&gt;London Geek Nights&lt;/a&gt; organised by &lt;a href="http://rrees.wordpress.com/"&gt;Robert Rees&lt;/a&gt; &lt;a href="http://twitter.com/rrees"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://xpday-london.editme.com/eXtremeTuesdayClub"&gt;eXtreme Tuesday Club&lt;/a&gt; &lt;a href="http://twitter.com/extremetuesday"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://wave.google.com/wave/#restored:wave:googlewave.com!w%252Bfn0VOKp-D"&gt;#DevBookClub&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=devbookclub"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt; organised by &lt;a href="http://holytshirt.blogspot.com/"&gt;Toby Henderson&lt;/a&gt; &lt;a href="http://twitter.com/holytshirt"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt; and &lt;a href="http://www.shift-in.com"&gt;Chris Browne&lt;/a&gt; &lt;a href="http://twitter.com/shiftin"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-1343571934307425831?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/1343571934307425831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/12/today-marks-year-since-i-moved-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1343571934307425831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1343571934307425831'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/12/today-marks-year-since-i-moved-to.html' title='A Year Of London Developer Events'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s72-c/twitter_square_blue.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-7856658072085922919</id><published>2009-10-27T23:19:00.012Z</published><updated>2009-10-28T00:19:53.140Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><title type='text'>Misadventures in DDD With Not-So-Ubiquitous Language</title><content type='html'>&lt;p&gt;Lots of people have been talking about DDD (&lt;a href="http://my.safaribooksonline.com/0-321-12521-5/ch01lev1sec2"&gt;Domain-Driven Design&lt;/a&gt;) lately, and my friend Tom just discussed it over on &lt;a href="http://www.togsblom.com"&gt;his blog&lt;/a&gt; in the article &lt;a href="http://www.togsblom.com/2009/10/refactoring-toward-deeper-insight.html"&gt;Refactoring Toward Deeper Insight&lt;/a&gt;. So, I thought I'd share one way &lt;b&gt;not&lt;/b&gt; to do DDD.&lt;/p&gt;&lt;p&gt;Once upon a time, shortly after the big blue book was published, I saw it in the store and thought it looked interesting. I bought it and read through the first section about knowledge crunching and ubiquitous language. And it all made so much sense&amp;mdash;where I worked, the business analysts and software developers already worked together to crunch knowledge into a domain model they both understood (or so I thought). The trouble was, even though when they talked together, they used that language, when the developers actually wrote the code, they used their own. Why? Well, I didn't know&amp;mdash;mostly just because we usually thought our names for things were better, I supposed. Trying to keep the language the same just wasn't something we'd thought about much.&lt;/p&gt;&lt;p&gt;So, I decided that on the project I was working on, we'd start doing DDD by using the names from the business language for the classes in our code. I didn't discuss it with the business people, since I didn't think it involved them much&amp;mdash;they didn't need to change their language, we developers just needed to use it.&lt;/p&gt;&lt;p&gt;Everything went fine for most of the project. Then, a couple days before release, the business decided that they wanted to rename one of our core domain concepts&amp;mdash;and that was okay, right, because it was just changing a few labels on a few screens?&lt;/p&gt;&lt;p&gt;And that's when I learned that if you want to do DDD, it helps to get buy-in from the business.&lt;/p&gt;&lt;p&gt;So, happy DDD-ing everybody&amp;mdash;because I do think lots of the ideas are great and worth exploring&amp;mdash;just make sure you let the business know what you're up to and you'll avoid my rookie mistake.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-7856658072085922919?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/7856658072085922919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/10/misadventures-in-ddd-with-not-so.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7856658072085922919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7856658072085922919'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/10/misadventures-in-ddd-with-not-so.html' title='Misadventures in DDD With Not-So-Ubiquitous Language'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-7687235313718313393</id><published>2009-10-26T15:13:00.001Z</published><updated>2010-09-05T21:45:09.703+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='estimating'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Estimating is Like Measuring the Coast of Great Britain</title><content type='html'>&lt;p&gt;Earlier today, &lt;a href="http://lizkeogh.com/"&gt;Liz Keogh&lt;/a&gt; &lt;a href="http://twitter.com/lunivore/status/5168577622"&gt;tweeted this&lt;/a&gt;, which I couldn't agree with more, as long as she's saying what I think she's saying: &lt;/p&gt;  &lt;blockquote&gt;Thinking about fractal estimation—estimates grow as scale shrinks—and wondering what dimension current projects have.&lt;/blockquote&gt; A while back, every time I started doing technical estimates for a release, I began to think more and more of the illustrations along the side of this Wikipedia article: &lt;a href="http://en.wikipedia.org/wiki/How_Long_Is_the_Coast_of_Britain%3F_Statistical_Self-Similarity_and_Fractional_Dimension"&gt;How Long Is the Coast of Britain? Statistical Self-Similarity and Fractional Dimension&lt;/a&gt;.   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The situation was, that as a developer in a waterfall process, when I was trying to estimate how long it would take to code something, even with the requirements supposedly &amp;quot;fixed,&amp;quot; unless I examined the code I was proposing to change in so much detail that I was basically writing it—and that's &lt;b&gt;not&lt;/b&gt; estimating anymore—I'd always miss things that would make coding take longer than I'd estimated. In essence, there were always craggy little details that upon actually writing the code, became significant or added up with others to become significant. &lt;/p&gt;  &lt;p&gt;Now, I know that if your architecture and code are clean, this should happen less. But I still think it's generally true that until you actually write the code, you really don't know how long it will take, and the amount of time will usually be longer than you think when analyzing it at higher levels. &lt;/p&gt;  &lt;p&gt;Then, I thought of this problem again when I attended a talk on &lt;a href="http://programmergrrl.blogspot.com/2009/07/scope-budgeting.html"&gt;Scope Budgeting&lt;/a&gt;. There, the general issue is that in Agile, if you write a user story, estimate it, put it in your backlog, and only elaborate it when you pull it back out to implement it, you may find that the size of the story grows at elaboration-time. &lt;/p&gt;  &lt;p&gt;According to Liz's fractal estimation rule, that makes complete sense and should be expected. I agree. Whenever I have worked with user proxies to move from general functional requirements to specifics, the estimate has always increased. The amount of work needed to address all the details we discover always grows beyond the original estimate. If we made commitments based on that estimate, the only way to keep them is to prioritize and remove some of the details. &lt;/p&gt;  &lt;p&gt;I can think of a few ways to address this problem, if we want to consider it to be a problem:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Just be aware of it and deal with it as needed, which is a lot better than not being aware of it at all. &lt;/li&gt;    &lt;li&gt;Start measuring it, so you can factor it into your future estimates. This might be taken care of by comparing estimates to actuals and factoring that into future estimates. You'll need to decide whether the time it takes to do this is worth the return, though. &lt;/li&gt;    &lt;li&gt;Move toward techniques like &lt;a href="http://www.agilemanagement.net/Articles/Weblog/KanbanPlanningandEstimati.html"&gt;Kanban that de-emphasize estimation&lt;/a&gt;. Whether or not this works for you will depend on your current situation, but it's always worth questioning whether you're estimating because you truly need to or just because that's what you're used to. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;   &lt;hr /&gt;&lt;/p&gt;  &lt;p&gt;Update Sept, 2010:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Liz also wrote about the fractal nature of estimation as part of &lt;a href="http://lizkeogh.com/2009/11/30/estimation-anti-patterns/"&gt;Estimation anti-patterns&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.dannorth.net/"&gt;Dan North&lt;/a&gt; mentioned it in &lt;a href="http://blog.dannorth.net/2009/07/01/the-perils-of-estimation/"&gt;The perils of estimation&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;Dan also has referenced it more recently in &lt;a href="http://blog.dannorth.net/2010/08/30/introducing-deliberate-discovery/"&gt;Introducing Deliberate Discovery&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-7687235313718313393?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/7687235313718313393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/04/estimating-is-like-measuring-coast-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7687235313718313393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7687235313718313393'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/04/estimating-is-like-measuring-coast-of.html' title='Estimating is Like Measuring the Coast of Great Britain'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-1766713781401261292</id><published>2009-09-06T14:50:00.018+01:00</published><updated>2009-12-16T18:41:29.560Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Pair Programming for Flow</title><content type='html'>&lt;p&gt;
A while ago, I attended the workshop &lt;a href="http://skillsmatter.com/event/agile-testing/debugging-pair-programming"&gt;Debugging Pair Programming&lt;/a&gt; by &lt;a href="http://blog.mattwynne.net/"&gt;Matt Wynne&lt;/a&gt; &lt;a href="http://twitter.com/mattwynne"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter" /&gt;&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Matt gave the same workshop at &lt;a href="http://agile2009.agilealliance.org/"&gt;Agile 2009&lt;/a&gt;. That website has &lt;a href="http://agile2009.agilealliance.org/node/1206"&gt;a good write-up&lt;/a&gt; of how it worked.
&lt;/p&gt;&lt;p&gt;
After the first part, where we discussed how to convince &lt;a href="http://blog.mattwynne.net/2009/08/09/personas-for-debugging-pair-programming-session/"&gt;different developer personas&lt;/a&gt; why they should cooperate with pair programming, we moved on to the second part, where we paired up and interviewed each other about good experiences pair programming or collaborating in other ways.
&lt;/p&gt;&lt;p&gt;
I was paired with &lt;a href="http://tomtenthij.co.uk/"&gt;Tom ten Thij&lt;/a&gt; &lt;a href="http://twitter.com/tomtt"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter"&gt;&lt;/a&gt;, who said something really interesting about pair programming.
&lt;/p&gt;&lt;p&gt;
He said that pairing can make it easier to get into flow.
&lt;/p&gt;&lt;p&gt;
This was completely the opposite of what I'd heard before about pair programming. Before, I'd heard it can be difficult to achieve flow while pairing—that you might even have to give up on flow, but that the increased code quality is probably worth the trade-off.
&lt;/p&gt;&lt;p&gt;
But Tom's point was that while pairing, you're less likely to procrastinate getting into your coding task. In other words, having a partner helps force the "&lt;a href="http://programmergrrl.blogspot.com/2009/04/writing-unit-tests-should-be-fun.html"&gt;activation energy&lt;/a&gt;" that flow activities can require.
&lt;/p&gt;&lt;p&gt;
So, as long as your pair works well together, and you keep everyone engaged by doing something like &lt;a href="http://www.stickyminds.com/sitewide.asp?ObjectId=9101&amp;amp;Function=edetail&amp;amp;ObjectType=COL"&gt;ping-pong programming&lt;/a&gt;, you might be able to achieve flow after all.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-1766713781401261292?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/1766713781401261292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/09/pair-programming-for-flow.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1766713781401261292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1766713781401261292'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/09/pair-programming-for-flow.html' title='Pair Programming for Flow'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s72-c/twitter_square_blue.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-1719812420095379827</id><published>2009-08-08T19:22:00.020+01:00</published><updated>2009-12-16T19:18:29.561Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Misadventures In BDD With NBehave</title><content type='html'>&lt;p&gt;
From my previous post, you might have picked up that I like the idea of BDD's given-when-then construct for describing scenarios. 
&lt;/p&gt;&lt;p&gt;
For a while, I've been wanting to use this syntax in unit/integration tests to make them clearer. But I've been hoping to do that without switching languages or unit-testing frameworks. Toward that end, I tried out &lt;a href="http://nbehave.org/"&gt;NBehave&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Here's some test code that demonstrates my worst fears about why NBehave might not be right for me:
&lt;/p&gt;
&lt;pre class="brush:csharp;"&gt;public void Execute()
{
    var story = new Story("Search Contacts by Relationship Strength")
        .AsA("User")
        .IWant("To search on the Strength field")
        .SoThat("I can find Contacts who have a given Strength");

    Scenario scenario = story
        .WithScenario("Find Contacts with Strength of 50");

    scenario.Given("The database contains a Contact with a Strength of 50")
        .And("a search results view", GivenResultsInfo)
        .And("a query for Contacts with Strength of 50",
            GivenQueryForContactsWithStrengthOf50)
        .When("The search is run", WhenRunSearch)
        .Then("The results contain Contacts with Strength of 50",
            ThenShouldContainResultsWithStrengthOf50);
}

private void GivenResultsInfo()
{
    var resultsView = new ReadOnlyResultsView(
        ExtendableEntity.Person, SortType.Ascending, 
        new[] { Column }, Column);
    ResultsInfo = new ResultsInfo(resultsView);
}
private void GivenQueryForContactsWithStrengthOf50()
{
    var condition = 
        new DecimalCondition(Column, ComparisonOperation.EqualTo);
    condition.DataField.Value = 5;

    _query = TypeHelper.GetAdvancedQuery(_entityType);
    _listManager.AddListToAdvancedQuery(_query);
    _query.MainConditionGroup.AddCondition(condition);
}
private void WhenRunSearch()
{
    ISearchService service = TypeHelper.GetSearchService(_entityType);
    ISearchResults results = service.GetResults(_query, ResultsInfo);
    _resultsData = results.Results;
}
private void ThenShouldContainResultsWithStrengthOf50()
{
    Assert.Greater(_resultsData.Rows.Count, 0);

    foreach (DataRow row in _resultsData.Rows)
        Assert.AreEqual(5, (decimal)row[Column.Name]);
}&lt;/pre&gt;
&lt;p&gt;But for me, creating reports of the text descriptions wasn't the main point. The main point was just to better organize the test. When I started writing the code, I thought maybe I'd just skip the text, but then I thought, "Oh well, I might as well do it."
&lt;/p&gt;&lt;p&gt;
And that was fine, but when the requirements changed, I had trouble keeping the text synchronized with the code.
&lt;/p&gt;&lt;p&gt;
After I wrote the initial code, the team decided that instead of having strength on a scale from 0-60, we'd have it on a scale from 0.0-6.0. And when I changed the code, I was in a hurry, since that change hadn't been part of the original estimate, and consequently threatened our timeline.
&lt;/p&gt;&lt;p&gt;
So I ended up with text that said 50 and code that said 5.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-1719812420095379827?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/1719812420095379827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/08/misadventures-in-bdd-nbehave.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1719812420095379827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1719812420095379827'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/08/misadventures-in-bdd-nbehave.html' title='Misadventures In BDD With NBehave'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-2105460235531238146</id><published>2009-08-03T21:44:00.028+01:00</published><updated>2009-12-16T19:48:39.196Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>Open Space Coding Day: TDD As If You Meant It and Cucumber With IronRuby</title><content type='html'>&lt;p&gt;
Saturday I was at the &lt;a href="http://www.altnetuk.com/2009-08-01.en.html"&gt;Open Space Coding Day&lt;/a&gt; that was part of the &lt;a href="http://www.altnetuk.com/2009.en.html"&gt;Alt.Net UK Conference 2009&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
In the morning, I was in the session on &lt;a href="http://www.parlezuml.com/softwarecraftsmanship/sessions/tdd_as_if_you_meant_it.htm"&gt;TDD As If You Meant It&lt;/a&gt;. &lt;a href="http://gojko.net/"&gt;Gojko Adzic&lt;/a&gt; already did a pretty good write up, so I'll point you there to learn more about it: &lt;a href="http://gojko.net/2009/08/02/tdd-as-if-you-meant-it-revisited/"&gt;TDD as if you meant it – revisited&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
In the afternoon, I was in the session about using &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; and &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; with &lt;a href="http://www.ironruby.net/"&gt;IronRuby&lt;/a&gt;. Mostly, I was interested in this because I keep hearing really good things about Cucumber, but as a non-ruby person, I have never quite discovered what those good things actually look like.
&lt;/p&gt;&lt;p&gt;
I was also a bit psyched, because I was pretty sure I'd heard that &lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/7965"&gt;IronRuby was going 1.0 on my birthday&lt;/a&gt;. But alas, it seems that article subtly changed since I last looked at it, from saying "IronRuby is 1.0!" to now saying "IronRuby is &lt;i&gt;almost&lt;/i&gt; at 1.0!" A slight let-down, but that's okay. We still had a good session, and I'm the first person to understand that software doesn't always magically appear on a certain date just because we want it to.
&lt;/p&gt;&lt;p&gt;
To install IronRuby, Cucumber, and RSpec, I mostly used these instructions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/astopford/archive/2009/04/14/bdd-with-rspec-cucumber-ironruby.aspx"&gt;BDD with RSpec\Cucumber\IronRuby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net"&gt;IronRuby and .NET&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The process for me went something like this:&lt;ol&gt;&lt;li&gt;&lt;a href="http://rubyforge.org/projects/rubyinstaller/"&gt;Install Ruby&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ironruby.net/Download"&gt;Install IronRuby&lt;/a&gt;. (The day I was doing this, 0.6 was being billed as the current release. It looks like things have moved on.)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;From &lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/ironruby-and-net"&gt;IronRuby and .NET&lt;/a&gt;, do:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Installing required gems&lt;/li&gt;&lt;li&gt;Creating a Cucumber wrapper script for IronRuby&lt;/li&gt;&lt;li&gt;Running the examples&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Now the examples ran, but there was some weird escape-character output. I didn't find the answer to how to fix this, but another person in the session, &lt;a href="http://www.codegrunt.co.uk/"&gt;Lorenzo Stoakes&lt;/a&gt; &lt;a href="http://twitter.com/lstoakes"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter"&gt;&lt;/a&gt;, did. &lt;a href="http://search.twitter.com/search?q=%23ironruby+%23altnetuk"&gt;Here's how that looked on Twitter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For convenience, though, I guess I'll compile that into the single sentence: In your file that corresponds to &lt;code&gt;C:/Ruby/lib/ruby/gems/1.8/gems/cucumber-0.3.92/lib/cucumber/formatter/ansicolor.rb&lt;/code&gt;, replace &lt;code&gt;Term::AnsiColor.coloring = false if...&lt;/code&gt; with &lt;code&gt;Term::AnsiColor.coloring = false&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;At that point, the examples seemed to sort-of run okay for me. I think Lorenzo and &lt;a href="http://blog.robustsoftware.co.uk/"&gt;Garry Shutler&lt;/a&gt; &lt;a href="http://twitter.com/gshutler"&gt;&lt;img src="http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s800/twitter_square_blue.gif" class="twitter" alt="Twitter"&gt;&lt;/a&gt; got past some warnings that were getting output, but I didn't. I'm also pretty sure Garry also got RSpec to work.
&lt;/p&gt;&lt;p&gt;
What was the whole point? Well, since I didn't get past the examples, I'll sum it up with one of them.
&lt;/p&gt;&lt;p&gt;
Say you're developing a calculator. Your business person can specify the addition behaviour in text, like this:&lt;/p&gt;&lt;pre class="brush:text"&gt;Feature: Addition
  In order to avoid silly mistakes
  As a math idiot 
  I want to be told the sum of two numbers

  Scenario Outline: Add two numbers
    Given I have entered &lt;input_1&gt; into the calculator
    And I have entered &lt;input_2&gt; into the calculator
    When I press add
    Then the result should be &lt;output&gt; on the screen

  Examples:
    | input_1 | input_2 | output |
    | 20      | 30      | 50     |
    | 2       | 5       | 7      |
    | 0       | 40      | 40     |&lt;/pre&gt;&lt;p&gt;And you can make that executable by adding some code in a related code file like this, where you're testing a .NET assembly Calculator.dll that contains a Calculator class in the namespace Demo, and the Calculator class has &lt;var&gt;push&lt;/var&gt; and &lt;var&gt;Add&lt;/var&gt; methods:&lt;/p&gt;&lt;pre class="brush:ruby"&gt;require 'spec/expectations'
$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
require 'Calculator' # Calculator.dll

Before do
  @calc = Demo::Calculator.new # A .NET class in Calculator.dll
end

Given "I have entered $n into the calculator" do |n|
  @calc.push n.to_i
end

When /I press add/ do
  @result = @calc.Add
end

Then /the result should be (.*) on the screen/ do |result|
  @result.should == result.to_i
end&lt;/pre&gt;&lt;p&gt;That does look pretty sweet.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-2105460235531238146?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/2105460235531238146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/08/open-space-coding-day-notes-tdd-as-if.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/2105460235531238146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/2105460235531238146'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/08/open-space-coding-day-notes-tdd-as-if.html' title='Open Space Coding Day: TDD As If You Meant It and Cucumber With IronRuby'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_yLiQDoD41F4/SqPFdpaTkGI/AAAAAAAAADY/tMWOTJTNDgQ/s72-c/twitter_square_blue.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-4385820499650870154</id><published>2009-07-28T21:10:00.023+01:00</published><updated>2009-12-16T18:46:03.317Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Scope Budgeting</title><content type='html'>&lt;p&gt;
A while back, I attended the talk &lt;a href="http://www.thoughtworks.co.uk/what-we-say/events/tech-briefing_uk.html"&gt;Scope Is Not A Dirty Word&lt;/a&gt; given by business analyst Angela Ashworth and delivery manager Mark Coster from &lt;a href="http://www.thoughtworks.co.uk/"&gt;ThoughtWorks&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
The centre of the discussion was "scope budgeting," which basically boils down to having the developer work with the user to manage scope within an iteration.
&lt;/p&gt;&lt;p&gt;
In many flavours of agile, the user writes a story, the developer estimates it, and then it goes into the backlog. It's only when the story gets pulled from the backlog and put into an iteration that the user and developer fully flesh out the implementation details. But at that point, they may find they have scope creep&amp;mdash;that the implementation will take longer than the original estimate.
&lt;/p&gt;&lt;p&gt;
At this point, the developer has two options:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Implement the story, even though it will take longer than originally estimated, pushing out the other stories, potentially dropping some off the end of the release.&lt;/li&gt;&lt;li&gt;Talk to the user more. Let him know that the estimate has changed and why. See if together they can come up with a way to reduce the scope of the story to get it back down to the estimate.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;Option 2 is scope budgeting.
&lt;/p&gt;&lt;p&gt;
I have to admit that I was actually very disappointed to hear this from ThoughtWorks.
&lt;/p&gt;&lt;p&gt;
I have never been part of an agile project, I've only read about it. My agile daydreams included how nice it would be to have the user prioritise stories from the beginning, understanding that not everything would necessarily make it into a release, thus avoiding one of the activities I've come to think of as churn&amp;mdash;the developer and user constantly having to re-prioritise and re-think functionality as scope creep happens in order to try to fit everything in or to figure out what is best to leave out.
&lt;/p&gt;&lt;p&gt;
I suppose I can understand why scope budgeting is a good idea. And I can understand that having all the stories in an unchanging ordered list from the beginning of the project isn't really very agile at all.
&lt;/p&gt;&lt;p&gt;
But it's still tough to see my daydreams shattered.
&lt;/p&gt;&lt;p&gt;
The up side is that it highlights that both the developer and the user are in the same boat, working together toward the same goal. In waterfall, each is under pressure to "be perfect." The user should write down every single implementation detail at the beginning of the project and the developer should estimate every one of them down to the minute. Later, when they discover that a requirement was missed, the developer blames the user for blowing the project. When they discover that an estimate wasn't quite right, the user blames the developer for blowing the project.
&lt;/p&gt;&lt;p&gt;
At least with agile and scope budgeting, the focus changes from blaming to recognising that neither the user nor the developer can make a perfect plan at the beginning of the project&amp;mdash;that they need to work together throughout to figure out how to create the most value.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-4385820499650870154?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/4385820499650870154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/07/scope-budgeting.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4385820499650870154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4385820499650870154'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/07/scope-budgeting.html' title='Scope Budgeting'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-9105886247746961408</id><published>2009-07-27T15:45:00.004+01:00</published><updated>2009-12-16T18:47:28.800Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>My Favorite Technical Books</title><content type='html'>&lt;p&gt;
It's been half a year since I moved from Chicago to London, and there is still an awful lot of stuff that isn't unpacked and is sitting in boxes, including many, many books.
&lt;/p&gt;&lt;p&gt;
But last weekend, the DH and I added yet another bookcase to the flat, and it's time to take care of the box sitting at my feet, labeled "Amy's favorite computer books."
&lt;/p&gt;&lt;p&gt;
But wait, I hear you say, if those are your favorite computer books, how can they possibly still be packed away in a box? Don't you need them at your desk every day?
&lt;/p&gt;&lt;p&gt;
Not so much anymore. A few years ago, I bought a subscription to &lt;a href="http://my.safaribooksonline.com"&gt;Safari Books Online&lt;/a&gt;, which I can't say enough good things about. Yes, it can be expensive, but if you can scrape together the cash and you love technical books, it's great. Almost all of the books in my box are on there, so I don't need them at my desk.
&lt;/p&gt;&lt;p&gt;
The other aspect of having these books at my desk was that they were available for my teammates to easily grab and use. But now that I'm in London and those teammates are in Chicago, that doesn't happen anymore.
&lt;/p&gt;&lt;p&gt;
So, my favorite books have been sitting in their box until now. Now, I have a bookcase with glass doors available, so they won't get dusty. Here they come out of the box:
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124/"&gt;Head First Design Patterns&lt;/a&gt;
by Freeman &amp; Freeman
I can't say enough good things about this book. It was the book that made the light go on for me for understanding what design patterns are and why they are useful. I own two copies&amp;mdash;one was for work and one for home&amp;mdash;plus the poster.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052/"&gt;Working Effectively with Legacy Code&lt;/a&gt;
by Michael Feathers
For when you have to deal with ugly code, old code, code written by someone else long gone from your company, scary code, code without unit tests, or code you wrote last year and now hate.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Refactoring-Patterns-Addison-Wesley-Signature-Kerievsky/dp/0321213351/"&gt;Refactoring to Patterns&lt;/a&gt;
by Joshua Kerievsky
A bridge between patterns and refactoring.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Software-Estimation-Demystifying-Demystified-Practices/dp/0735605351/"&gt;Software Estimation: Demystifying the Black Art&lt;/a&gt;
by Steve McConnell
Sometimes I curse that I read this, because it made my BDUF estimates more accurate. Don't worry, there's lots of other good stuff in there, though.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Enterprise-Application-Architecture-Addison-Wesley-signature/dp/0321127420/"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt;
by Martin Fowler
This was the most-borrowed book in my library before I moved.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Pro-2008-NET-Platform-Fourth/dp/1590598849/"&gt;Pro C# 2008 and the .NET 3.5 Platform&lt;/a&gt;
by Andrew Troelsen
When I can't remember how something .NET 3.5 works, and I have trouble finding it online, this is where I end up.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/VB-VBA-Nutshell-Language-Languages/dp/1565923588/"&gt;VB &amp; VBA In a Nutshell&lt;/a&gt;
by Paul Lomax
Because unfortunately, sometimes VBA still happens.
&lt;/p&gt;&lt;p&gt;
There are two more that I need to mention, even though they aren't in the box. The first, I have on CD, and the second I used to borrow from a work-mate until I got Safari books:
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Design-patterns-elements-reusable-object-oriented/dp/0201633612/"&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;
by Gamma, Helm, Johnson and Vlissides
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://www.amazon.co.uk/Refactoring-Improving-Design-Existing-Technology/dp/0201485672/"&gt;Refactoring: Improving the Design of Existing Code&lt;/a&gt;
by Martin Fowler
&lt;/p&gt;&lt;p&gt;
But wait? Where is &lt;a href="http://www.amazon.co.uk/Mythical-Month-Essays-Software-Engineering/dp/0201835959/"&gt;The Mythical Man-Month&lt;/a&gt; by Fred Brooks? Good question. Darn thing is too skinny. It's always getting itself lost.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-9105886247746961408?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/9105886247746961408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/07/my-favorite-technical-books.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/9105886247746961408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/9105886247746961408'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/07/my-favorite-technical-books.html' title='My Favorite Technical Books'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-6934848115828293101</id><published>2009-07-26T14:13:00.010+01:00</published><updated>2009-12-16T18:48:02.617Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='aboutme'/><title type='text'>Programmer.Grrl: The Prequel</title><content type='html'>&lt;p&gt;
As I &lt;a href="http://programmergrrl.blogspot.com/2009/06/happy-anniversary-to-me.html"&gt;mentioned before&lt;/a&gt;, back in high school, I was pre-med. The interesting thing is, when I was about 15, I actually did take a programming class and really enjoyed it. It was BASIC on Apple IIe computers. I remember one of the projects being to code a dice game. What could be more fun that that? Not just playing a computer game&amp;mdash;but creating one? 
&lt;/p&gt;&lt;p&gt;
It didn't feel like school, it felt like play. And because it felt like play, and because I didn't know that programming was a real profession, when it came time to sign up for the next semester of classes, I decided I didn't have space in my schedule for Programming II. I needed to take more biology or chemistry or some such thing.
&lt;/p&gt;&lt;p&gt;
The problem was, where and when I grew up, in a small town out in the country and before the Internet, I didn't have any concept that what I'd done in the programming class was at all useful. I didn't make any connection between it and the software my family bought for our own PC clone&amp;mdash;things like WordPerfect and Lotus 1-2-3.
&lt;/p&gt;&lt;p&gt;
I don't know that it's true, but I hope so, that the Internet has opened childrens' horizons, so that when they think about what they want to be when they grow up, they understand there is more available than the professions they see in their everyday lives. Because when I think about that programming class I took when I was 15, I always wonder what a better programmer I might be if I'd kept with it from way back then.
&lt;/p&gt;&lt;p&gt;
It also makes me think more about how people end up as programmers in general. One of the original joys of programming when I was 15 was that I was making something. Most of my life, especially my school life, didn't produce anything remotely tangible or useful. It was about completing assignments or studying for tests, where once the assignment was done or the test taken, it was over, and the graded paper or test wasn't useful in any way.
&lt;/p&gt;&lt;p&gt;
But programming was different. You could tinker around and write some code and have something useful when you were done. Making something&amp;mdash;something that other people might even really like&amp;mdash;it's a rush. I'm sure there are other programmers out there who got interested in programming because of that. And for us, that's one of the frustrations with Big Design Up Front or with other processes where it's difficult to link end-user value back to our own work. Even if the process works for the organization, it can be tough for the individual.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-6934848115828293101?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/6934848115828293101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/07/programmergrrl-prequel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6934848115828293101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6934848115828293101'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/07/programmergrrl-prequel.html' title='Programmer.Grrl: The Prequel'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-142487614467397725</id><published>2009-07-20T20:59:00.016+01:00</published><updated>2009-12-16T18:48:47.597Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Companies are Addicted to Profit Like Smokers are Addicted to Nicotine?</title><content type='html'>&lt;p&gt;
What I believe and what I'm discussing are two very different things. I absolutely can't agree more with pretty much everything Jim says in &lt;a href="http://www.writebetterbits.com/2009/07/define-success.html"&gt;Define success...&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
My worry is that if an organization views its projects as successful, the argument that the success isn't sustainable may not be compelling. If so far, using its current methods, the organization has been making money, and as far as its managers can see, will continue to do so in the near future, how do you convince those managers that it needs to change?
&lt;/p&gt;&lt;p&gt;
It's even more difficult than convincing a smoker that smoking will kill him eventually, and that he should stop&amp;mdash;at least in a logical sense. An organization isn't an individual, whose best interests are intrinsically aligned with the longevity of his body. An organization is a collection of individuals, who can leave at nearly any time. If the organization's methods aren't sustainable&amp;#151;if it won't make it through the next 50 years&amp;mdash;how many employees really care, as long as they are currently able to cash their paychecks?
&lt;/p&gt;&lt;p&gt;
It reminds me of Alan Greenspan's &lt;a href="http://en.wikipedia.org/wiki/Alan_greenspan#Late_2000s_recession"&gt;testimony about the economic meltdown&lt;/a&gt;: "Those of us who have looked to the self-interest of lending institutions to protect shareholder's equity&amp;mdash;myself especially&amp;mdash;are in a state of shocked disbelief."
&lt;/p&gt;&lt;p&gt;
Yes, it's a shocker. It turns out that not everyone in an organization cares about its longevity, as long as they get their cash and escape before it implodes.
&lt;/p&gt;&lt;p&gt;
But let's assume better of employees of software companies, especially since most I've encountered really do seem to care a lot more than that.
&lt;/p&gt;&lt;p&gt;
It's still hard to convince people to change when the current model is "succeeding."
&lt;/p&gt;&lt;p&gt;
In organizations where meeting yearly financial targets takes higher priority than continuous improvement, the continuous-improvement conversation can end up working like this variation of being too busy sawing to sharpen the blade:&lt;blockquote&gt;Lumberjack: Say boss, this blade is getting dull. It's getting slower for me to cut down the trees. I don't think we're going to make our quota.
&lt;/p&gt;&lt;p&gt;
Supervisor: You have a point. How long do you think it will take for you to sharpen the blade?
&lt;/p&gt;&lt;p&gt;
Lumberjack: I'm not sure. Since I've been working here, we've never sharpened the blades, so it's difficult to estimate how long it would take, because I'm out of practice. Plus, the blades are pretty dull, so it probably would take longer than usual anyway.
&lt;/p&gt;&lt;p&gt;
Supervisor: Hmmm. I'm not sure we'll be able to make our quota if we don't know how long it will take. We can't risk that. At our current rate of cutting, we can still make the quota if we hire in a few contractor lumberjacks. We'll do that.&lt;/blockquote&gt;It's not necessarily that the members of the organization don't want to improve&amp;mdash;they may just think they don't have time given their current constraints.
&lt;/p&gt;&lt;p&gt;
And as far as the greater organization is concerned, they still made their quota. As far as it's concerned, everything is hunky-dory.
&lt;/p&gt;&lt;p&gt;
So, I'm back to the question. If the organization thinks the project was a success, but some people do not&amp;mdash;some people think that success will be unsustainable in the long run&amp;mdash;how do those people convince the rest of the organization that change is needed now?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-142487614467397725?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/142487614467397725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/07/companies-are-addicted-to-profit-like.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/142487614467397725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/142487614467397725'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/07/companies-are-addicted-to-profit-like.html' title='Companies are Addicted to Profit Like Smokers are Addicted to Nicotine?'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-6159875866322544721</id><published>2009-07-19T13:54:00.008+01:00</published><updated>2009-12-16T18:49:54.528Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>What If Your Unsuccessful Project Wasn't?</title><content type='html'>&lt;p&gt;
In &lt;a href="http://www.writebetterbits.com/2009/07/large-scale-project-doesn-equal-large.html"&gt;Large-Scale Project Doesn&amp;#39;t Equal Large-Scale Development&lt;/a&gt;, &lt;a href="http://www.writebetterbits.com/"&gt;Jim Fiorato&lt;/a&gt; concludes that "The concept of parallelizing development with a large team to deliver a large amount of code for a large project all at once, is in my opinion, well... broke."&lt;/p&gt;&lt;blockquote&gt;The only successful large projects I've been a part of have consisted of small development releases.&lt;/blockquote&gt;&lt;p&gt;and&lt;/p&gt;&lt;blockquote&gt;With the "large scale development" mind set, the odds are stacked against you. You'll find that you've fallen short on what you've envisioned, fallen short on your timeline, and probably done some irreparable damage to your talented team.
&lt;/blockquote&gt;&lt;p&gt;My concern is, so what? Just because a project fell short of what was envisioned, blew the timeline, or damaged the team, does that mean it wasn't successful?
&lt;/p&gt;&lt;p&gt;
Did the software release? Did customers pay for it? Is the organization still in business?
&lt;/p&gt;&lt;p&gt;
And if so, do you think the organization viewed the project as a success or a failure?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-6159875866322544721?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/6159875866322544721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/07/what-if-your-unsuccessful-project-wasnt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6159875866322544721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6159875866322544721'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/07/what-if-your-unsuccessful-project-wasnt.html' title='What If Your Unsuccessful Project Wasn&apos;t?'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-6368649842253750934</id><published>2009-07-04T12:10:00.006+01:00</published><updated>2010-01-05T21:43:55.020Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>FireFox 3.5: How To Bring Back "Close Last Tab"</title><content type='html'>&lt;p&gt;
First, in about:config, set &lt;code&gt;browser.tabs.closeWindowWithLastTab&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt;.
&lt;/p&gt;&lt;p&gt;
Then, add the following to &lt;code&gt;userChrome.css&lt;/code&gt; (via &lt;a href="http://veerasundar.com/blog/2009/07/closing-the-last-tab-in-firefox-35/comment-page-1/#comment-1086"&gt;comment on Veera Sundar's blog&lt;/a&gt;):&lt;/p&gt;

&lt;pre class="brush:css"&gt;
.tabbrowser-tabs[closebuttons="alltabs"] 
    &gt; .tabbrowser-tab &gt; .tab-close-button 
{
    display: -moz-box !important;
}
.tabbrowser-tabs:not([closebuttons="noclose"]):not([closebuttons="closeatend"]) 
    &gt; .tabbrowser-tab[selected="true"] &gt; .tab-close-button 
{
    display: -moz-box !important;
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-6368649842253750934?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/6368649842253750934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/07/firefox-35-how-to-bring-back-close-last.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6368649842253750934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6368649842253750934'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/07/firefox-35-how-to-bring-back-close-last.html' title='FireFox 3.5: How To Bring Back &quot;Close Last Tab&quot;'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-5689417481749145495</id><published>2009-06-16T23:02:00.007+01:00</published><updated>2009-12-16T18:51:04.895Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>IronRuby &amp; rake-dotnet</title><content type='html'>&lt;p&gt;
I'm back from attending &lt;a href="http://skillsmatter.com/event/open-source-dot-net/in-the-brain-of-michael-delaney"&gt;a talk&lt;/a&gt; on &lt;a href="http://www.ironruby.net/"&gt;IronRuby&lt;/a&gt; and &lt;a href="http://github.com/petemounce/rake-dotnet/tree/master"&gt;rake-dotnet&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
I haven't had &lt;span style="text-decoration: line-through;"&gt;much&lt;/span&gt; any time to play with Ruby, so a lot of what I took away is pretty basic: &lt;/p&gt;&lt;ul&gt;&lt;li style="margin-bottom:1em;"&gt;You don't need to use parentheses when calling methods. That contributes to the magic you see when it's used for writing business-facing tests and DSLs.&lt;/li&gt;&lt;li style="margin-bottom:1em;"&gt;IronRuby is much closer to 1.0 than I thought, &lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/7965"&gt;only about a month away&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Theoretically, you can use it to do &lt;a href="http://cukes.info"&gt;Cucumber&lt;/a&gt; and &lt;a href="http://rspec.info"&gt;RSpec&lt;/a&gt;, though that wasn't quite working in this particular demo at the moment.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Anyway, it was interesting. Thanks to &lt;a href="http://gojko.net"&gt;Gojko Adzic&lt;/a&gt; for organizing it, and Michael Delaney and &lt;a href="http://blog.neverrunwithscissors.com"&gt;Peter Mounce&lt;/a&gt; for presenting.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-5689417481749145495?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/5689417481749145495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/06/ironruby-rake-dotnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5689417481749145495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5689417481749145495'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/06/ironruby-rake-dotnet.html' title='IronRuby &amp; rake-dotnet'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-1140515880344348226</id><published>2009-06-14T19:53:00.010+01:00</published><updated>2009-12-16T18:51:57.081Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='aboutme'/><title type='text'>Happy Anniversary to Me</title><content type='html'>&lt;p&gt;
Today marks 10 years since I got my first real job in technology, so I thought I'd share how I ended up where I did.
&lt;/p&gt;&lt;p&gt;
Once upon a time, I was a high school student and I wanted to grow up to have a well-respected, dependable, well-paying job. So, I started at university on the pre-med track. 
&lt;/p&gt;&lt;p&gt;
I pretty much hated it. But I'm not a quitter, so I only admitted that I wanted a change once I was 3 years into my degree, when I'd completed all of my pre-med requirements.
&lt;/p&gt;&lt;p&gt;
So, I was ready to switch to something else. But I had no idea what. What was I good at? I wasn't really sure. Maybe I'd try writing.
&lt;/p&gt;&lt;p&gt;
As luck would have it, a nearby medical technology company was looking for a technical writing intern.
&lt;/p&gt;&lt;p&gt;
Being a technical writing intern meant helping write user manuals. I didn't like that much. Among other things, it wasn't much fun because you spent a long time laying things out in a desktop publishing program, not really quite exactly sure how they would look in the finished product. You had to wait for every single page of the manual to be done, send things to the print shop, wait a while, and only then finally get to see the real deal.
&lt;/p&gt;&lt;p&gt;
But the other thing going on at that medical technology company, back in 1997, was that they were starting to provide online access to those user manuals on their website. And that duty fell to the tech writers.
&lt;/p&gt;&lt;p&gt;
So my boss sat me down with a Laura Lemay book and told me to learn HTML.
&lt;/p&gt;&lt;p&gt;
And I was amazed. I'd seen all sorts of totally awesome stuff on the World Wide Web. I had no idea it was this incredibly easy to make that stuff.
&lt;/p&gt;&lt;p&gt;
And quick, too. You could write your HTML and put it up where the whole world could see it immediately&amp;#151;none of that waiting for your manuscript to get printed and distributed.
&lt;/p&gt;&lt;p&gt;
...
&lt;/p&gt;&lt;p&gt;
Well, it's getting late, and I realize I don't have time right now to bore everyone with my life's story over the 2 years between when I first discovered HTML and when I graduated from university and got my first job as a Production Assistant, a.k.a. HTML-writer.
&lt;/p&gt;&lt;p&gt;
Or about how I went from writing HTML to coding in ASP 2.0, to coding in VB6, to coding in .NET C#.
&lt;/p&gt;&lt;p&gt;
But one of the ironies I reflect on occasionally, is how one of my initial attractions to the web was instant publishing.
&lt;/p&gt;&lt;p&gt;
And how these days, the projects I work on often take months to go from idea to being live.
&lt;/p&gt;&lt;p&gt;
Just like those user manuals I wanted to escape back in 1997.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-1140515880344348226?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/1140515880344348226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/06/happy-anniversary-to-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1140515880344348226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1140515880344348226'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/06/happy-anniversary-to-me.html' title='Happy Anniversary to Me'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-6516459152128468011</id><published>2009-05-04T21:21:00.012+01:00</published><updated>2009-12-16T18:52:38.128Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>Notes from Gojko Adzic's "What is FitNesse and Should I Use It?"</title><content type='html'>&lt;p&gt;
Last week, I went to &lt;a href="http://gojko.net/2009/04/28/slides-from-what-is-fitnesse-and-should-i-use-it/"&gt;What is FitNesse and Should I Use It?&lt;/a&gt; by &lt;a href="http://gojko.net/"&gt;Gojko Adzic&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
I was struck by the difference between two of his slides:
&lt;/p&gt;&lt;p&gt;
&lt;img src="http://lh5.ggpht.com/_7lRWqY-sCiw/Sf9MT9vWaVI/AAAAAAAABeE/6mo6l6Fs-iY/s400/WhatIsFitness.jpg" style="border:1px solid black;" /&gt;
&lt;/p&gt;&lt;p&gt;
&lt;img src="http://lh3.ggpht.com/_7lRWqY-sCiw/Sf9MT-A8MPI/AAAAAAAABd8/9jL6Jz6-c_I/s400/WhatIsFitness2.jpg" style="border:1px solid black;" /&gt;
&lt;/p&gt;&lt;p&gt;
And a slide from a different talk about FitNesse that I'd attended a week earlier:
&lt;/p&gt;&lt;p&gt;
&lt;img src="http://lh4.ggpht.com/_7lRWqY-sCiw/Sf9NWgzCvzI/AAAAAAAABeQ/03t2zUwSmFA/s400/HowWeIncorporatedFitIntoOurProcess.jpg" style="border:1px solid black;" /&gt;
&lt;/p&gt;&lt;p&gt;
To be fair, Gojko said that it's very easy to hook lots of different kinds of testing into FitNesse, and he had been as guilty of it as anyone else.
&lt;/p&gt;&lt;p&gt;
Here are a couple other good things I picked up from Gojko's presentation that I hope to put to use: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Focus on "what" and not "how". Don't try to translate test scripts into FitNesse&amp;#151;that's "how" and can lead to having a lot of similar or duplicated setup code. In fact, if you find yourself writing many similar tests, you're probably focusing too much on "how".&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;To keep your tests as living documentation, separate them into to main categories: tests for the current release and tests for previous releases organized by feature. At the end of each release, move the tests from that release into the other category.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-6516459152128468011?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/6516459152128468011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/05/notes-from-gojko-adzics-what-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6516459152128468011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6516459152128468011'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/05/notes-from-gojko-adzics-what-is.html' title='Notes from Gojko Adzic&apos;s &quot;What is FitNesse and Should I Use It?&quot;'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_7lRWqY-sCiw/Sf9MT9vWaVI/AAAAAAAABeE/6mo6l6Fs-iY/s72-c/WhatIsFitness.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-4131448805598855301</id><published>2009-04-26T19:37:00.007+01:00</published><updated>2009-12-16T18:53:45.235Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Writing Unit Tests Should Be Fun</title><content type='html'>&lt;p&gt;
I picked up on "&lt;a href="http://www.markhneedham.com/blog/2009/04/25/writing-unit-tests-can-be-fun/"&gt;writing unit tests can be fun&lt;/a&gt;" vs "&lt;a href="http://blog.brodzinski.com/2009/04/when-unit-testing-doesnt-work.html"&gt;writing unit tests is boring&lt;/a&gt;" over at &lt;a href="http://www.markhneedham.com/blog/"&gt;Mark Needham's blog&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Besides excellent points that Mark makes about the &lt;a href="http://www.peterprovost.org/blog/post/The-Pair-Programming-TDD-Game.aspx"&gt;pair-programming game&lt;/a&gt; and that &lt;a href="http://urilavi.blogspot.com/"&gt;Uri Lavi&lt;/a&gt; makes about &lt;a href="http://blog.typemock.com/2009/04/unit-testing-is-boring.html#c6428049279930495681"&gt;unit-testing code posing many of the same challenges as production code&lt;/a&gt;, there's another reason unit testing should be fun: flow.
&lt;/p&gt;&lt;p&gt;
I think a lot of developers know what it's like to experience flow while coding and know that it's a good thing.
&lt;/p&gt;&lt;p&gt;
It turns out that two &lt;a href="http://en.wikipedia.org/wiki/Flow_(psychology)#Components_of_flow"&gt;factors that help produce flow&lt;/a&gt; are clear goals and direct and immediate feedback.
&lt;/p&gt;&lt;p&gt;
Writing tests first absolutely helps you clarify goals and receive quick feedback when you're coding.
&lt;/p&gt;&lt;p&gt;
Interestingly, flow activities can also require "activation energy" to get into them. (See Chapter 5 in &lt;a href="http://www.amazon.co.uk/Finding-Flow-Psychology-Engagement-MasterMinds/dp/0465024114/"&gt;Finding Flow&lt;/a&gt; by &lt;a href="http://en.wikipedia.org/wiki/Mihaly_Csikszentmihalyi"&gt;Mihaly Csikszentmihalyi&lt;/a&gt;.)
&lt;/p&gt;&lt;p&gt;
This is one reason why you might find yourself being a couch potato in your free time instead of working on your favorite hobby, even though you know if you got your butt off the couch and did that hobby, you'd actually enjoy yourself more.
&lt;/p&gt;&lt;p&gt;
Similarly, sometimes when I'm at work and I need to code something, I find it hard to pull together that activation energy needed to write both the tests and the code.
&lt;/p&gt;&lt;p&gt;
But I can say that when I do, it's almost always totally worth it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-4131448805598855301?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/4131448805598855301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/04/writing-unit-tests-should-be-fun.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4131448805598855301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4131448805598855301'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/04/writing-unit-tests-should-be-fun.html' title='Writing Unit Tests Should Be Fun'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-4665191290473375062</id><published>2009-04-24T13:35:00.014+01:00</published><updated>2009-12-16T18:55:04.020Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>Notes from ThoughtWorks London Geek Night: Startups That Innovate</title><content type='html'>&lt;p&gt;
Last night I went to the &lt;a href="http://londongeeknights.wetpaint.com/"&gt;ThoughtWorks London Geek Night&lt;/a&gt; "&lt;a href="http://londongeeknights.wetpaint.com/page/Startups+that+innovate"&gt;Startups That Innovate&lt;/a&gt;". I know there are some people who wanted to go who couldn't because there wasn't enough space, so I'm going to share what I remember. And I aplogise for everything I remember wrong.
&lt;/p&gt;&lt;p&gt;
The first two speakers were &lt;a href="http://twitter.com/gpjt"&gt;Giles Thomas&lt;/a&gt; and &lt;a href="http://twitter.com/tartley"&gt;Jonathan Hartley&lt;/a&gt; from &lt;a href="http://www.resolversystems.com/"&gt;Resolver Systems&lt;/a&gt;, who talked about founding Resolver and the technologies they use. Here's what I remember:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;To get your startup going, you need people who can fill three essential roles: (1) Technologist/Developer (2) Rainmaker (3) User Advocate.&lt;/li&gt;
&lt;li&gt;They use &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython"&gt;IronPython&lt;/a&gt; and it works well for them. At first, they picked it because it looked like a good language for rapid prototyping. When it came time to switch over to a "real" programming language, they decided that they liked IronPython so much that they wanted to keep using it.&lt;/li&gt;
&lt;li&gt;They use PyUnit for unit testing. Some people in the audience thought PyUnit might not be mature enough, but Giles and Jonathan said they were able to make it work.&lt;/li&gt;
&lt;li&gt;They use an internal Python-based DSL to automate acceptance tests.&lt;/li&gt;
&lt;li&gt;They are an &lt;a href="http://www.extremeprogramming.org/"&gt;XP&lt;/a&gt; shop.&lt;/li&gt;
&lt;li&gt;Developers really do pair program pretty much all the time, except for spikes.&lt;/li&gt;
&lt;li&gt;With pair programming, it's true that you don't get as much of a flow experience as you would programming alone, but it still seems to work pretty well.&lt;/li&gt;
&lt;li&gt;As an XP shop, they try to keep their working hours sustainable. That might be different from what you see in other startups.&lt;/li&gt;
&lt;li&gt;One lesson they learned was: Don't go into stealth mode&amp;#151;it would have been useful to get user and community feedback earlier.&lt;/li&gt;
&lt;li&gt;Another lesson they learned: Release earlier. It took them around 2 years to release v1.0, and again, it would have been useful to get user and community feedback earlier&lt;/li&gt;
&lt;li&gt;Interns are a great resource for startups.&lt;/li&gt;
&lt;li&gt;(Jonathan used vi instead of PowerPoint to present his talk, which was cool.)&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;
The last speaker was Martin Dittus from &lt;a href="http://last.fm"&gt;Last.fm&lt;/a&gt;. Here's what I remember:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Last.fm started to having trouble scaling all of the updating of data that results from scrobbling. They realized that they didn't need to do it in real time and switched to batch mode.&lt;/li&gt;
&lt;li&gt;They are using &lt;a href="http://hadoop.apache.org/core/"&gt;Hadoop&lt;/a&gt; to do this.&lt;/li&gt;
&lt;li&gt;One of their interns, &lt;a href="http://users.ugent.be/~klbostee/"&gt;Klaas Bosteels&lt;/a&gt;, wrote &lt;a href="http://wiki.github.com/klbostee/dumbo"&gt;Dumbo&lt;/a&gt; to help make working with Hadoop easier.&lt;/li&gt;
&lt;li&gt;As a startup, they had trouble affording Business Intelligence tools, so they built them themselves.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;
I'm not very good at tweeting events, but some other people did better: &lt;a href="http://search.twitter.com/search?q=%22london+geek+night%22"&gt;London Geek Night tweets&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Also, I saw a list of upcoming ThoughtWorks Geek Nights while I was there. I think there were three in May and one in June. Here are links to the ones I could find links to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://londongeeknights.wetpaint.com/page/Java+in+the+Google+Cloud"&gt;Java in the Google Cloud&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://londongeeknights.wetpaint.com/page/Erlang+in+your+Infrastructure"&gt;Erlang in Your Infrastructure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://londongeeknights.wetpaint.com/page/Web+Unconventions"&gt;Web Unconventions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-4665191290473375062?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/4665191290473375062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/04/notes-from-thoughtworks-london-geek.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4665191290473375062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4665191290473375062'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/04/notes-from-thoughtworks-london-geek.html' title='Notes from ThoughtWorks London Geek Night: Startups That Innovate'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-3853243154384703666</id><published>2009-04-18T18:32:00.006+01:00</published><updated>2009-12-16T18:56:54.014Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='legacycode'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Links: Agile Practices and Rebuilding Legacy Codebases</title><content type='html'>&lt;p&gt;
Over on &lt;a href="http://mikehadlow.blogspot.com/"&gt;Code rant&lt;/a&gt;, Mike Hadlow recently put out an article I liked: &lt;a href="http://mikehadlow.blogspot.com/2009/04/agile-practices-are-not-just-about.html"&gt;Agile practices are not just about management&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Besides being good reading, it also reunited me with an article that I've been wanting to re-find for a while now, but couldn't quite remember the source: Uncle Bob's &lt;a href="http://blog.objectmentor.com/articles/2009/01/09/the-big-redesign-in-the-sky"&gt;The Big Redesign In The Sky&lt;/a&gt;. There are so many good points there about rebuilding&amp;#151;or rather &lt;i&gt;not&lt;/i&gt; rebuilding&amp;#151;legacy codebases that you should go read it right now if you haven't. And if you have, you should go read it again, just because it's that good (even though it gratuitously uses the number 42).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-3853243154384703666?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/3853243154384703666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/04/links-agile-practices-and-rebuilding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/3853243154384703666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/3853243154384703666'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/04/links-agile-practices-and-rebuilding.html' title='Links: Agile Practices and Rebuilding Legacy Codebases'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-4796050012564150168</id><published>2009-04-15T22:18:00.014+01:00</published><updated>2009-12-16T18:57:36.027Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='peopleware'/><title type='text'>Quitting Isn't a Way to Effect Organizational Change</title><content type='html'>&lt;p&gt;
Today I heard someone discussing why they were leaving a company, and that discussion involved them saying something like, "This job has been a bit crazy, and hopefully this will be a bit of a wake-up call for the company that something needs to change."
&lt;/p&gt;&lt;p&gt;
Baloney.
&lt;/p&gt;&lt;p&gt;
If you're unhappy with your job and you have a better position available somewhere else, then by all means, you owe it to yourself to switch.
&lt;/p&gt;&lt;p&gt;
But don't kid yourself that your leaving will make the organization realize they need to fix what was wrong with your position, department, or team.
&lt;/p&gt;&lt;p&gt;
As someone who has been working long enough to watch more than one person quit under circumstances like these, I can say that I have &lt;b&gt;never&lt;/b&gt; seen the organization "fix what's broken" due to a single person leaving.
&lt;/p&gt;&lt;p&gt;
Maybe&amp;#151;just maybe&amp;#151;if an entire department or team left, the organization would experience enough pain to realize that something must have been very, very wrong and try to fix it. I think I may have seen this happen once.
&lt;/p&gt;&lt;p&gt;
But when a single person on a team quits, it just leaves a hole that the rest of the team scrambles to cover. They are so busy doing so, that the last thing they have time for is organizational change. And after a while, the organization sees that the person who quit really could be done without, and that no change is needed after all.
&lt;/p&gt;&lt;p&gt;
Recently, over on &lt;a href="http://www.codesqueeze.com/"&gt;codesqueeze&lt;/a&gt;, I read &lt;a href="http://www.codesqueeze.com/companies-arent-progressive-but-people-are/"&gt;Companies Aren’t Progressive (But People Are…)&lt;/a&gt;. I don't agree with everything in the article, but at least it has a point&amp;#151;if you want change to happen, it's up to you to try to bring it about.
&lt;/p&gt;&lt;p&gt;
Once you're blue in the face from trying, and sick to death of it, feel free to quit with a clear conscience and go work someplace where people (might) better appreciate your efforts. As I said, if you have the opportunity to do so, you owe it to yourself to take it.
&lt;/p&gt;&lt;p&gt;
But don't delude yourself that your departure will be the tipping point that makes your organization wake up to how badly it needs change.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-4796050012564150168?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/4796050012564150168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/04/quitting-isnt-way-to-effect.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4796050012564150168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4796050012564150168'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/04/quitting-isnt-way-to-effect.html' title='Quitting Isn&apos;t a Way to Effect Organizational Change'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-7501875403158366764</id><published>2009-04-15T18:02:00.001+01:00</published><updated>2009-12-16T18:58:17.990Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Sometimes It's Easier to Stick With What You Already Use</title><content type='html'>&lt;p&gt;
For the upcoming &lt;a href="http://openspacecode.com/uk/london.en.xhtml"&gt;London Open Space Coding Day&lt;/a&gt;, we're thinking about &lt;a href="http://groups.google.co.uk/group/openspacecode/msg/d25c6f06c4db5dee?hl=en"&gt;working with messaging in enterprise applications&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
That reminds me of the lesson I learned the last time I tried using MSMQ: Sometimes, it's easier to stick with what you already use.
&lt;/p&gt;&lt;p&gt;
The scenario was that we were going to import some record updates from an external system. Once we grabbed them from the external web service, we wanted to queue them up and bring them into our system.
&lt;/p&gt;&lt;p&gt;
"Aha!" I thought. "We need a queue. This is what MSMQ is for. We'll use that."
&lt;/p&gt;&lt;p&gt;
Unfortunately, this import is a very, very small piece of an application that otherwise is very, very largely database-driven. Ever since implementing the import, every time someone needs to test it, there's baloney about the MSMQ queues not getting set up right or not having permissions or some other junk. And that's ignoring that when we first coded it, we found out that lots of our developers didn't even have MSMQ installed, and they all had to install it.
&lt;/p&gt;&lt;p&gt;
On the other hand, if we'd set up the queues to be stored in the database, there would have been no problem. In our application, if you can't access the database, you're not going anywhere. In fact, in the next release, another developer needed a queue. He stored it in the database and never had any of the problems I did.
&lt;/p&gt;&lt;p&gt;
Now, this isn't a story about how you shouldn't use MSMQ. Instead, it's a story about how if your application is largely based on one technology, and to implement a single feature, you have a choice between using that technology and another one&amp;#151;where both will work pretty much equally well&amp;#151;you might want to seriously think about sticking with the one the rest of the application is based on.
&lt;/p&gt;&lt;p&gt;
On a related note, a few months ago, when I was at the February meeting of the &lt;a href="http://www.dnug.org.uk"&gt;London .NET User Group&lt;/a&gt;, &lt;a href="http://gojko.net"&gt;Gojko Adzic&lt;/a&gt; and David de Floriner gave &lt;a href="http://gojko.net/2008/12/02/asynchronous-net-applications-with-nservicebus"&gt;a talk&lt;/a&gt; on &lt;a href="http://www.nservicebus.com"&gt;NServiceBus&lt;/a&gt;. It looked like an interesting way I might have been able to interface the message queuing so that I could have swapped out MSMQ with our SQL Server database without needing to change code.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-7501875403158366764?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/7501875403158366764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/04/sometimes-its-easier-to-stick-with-what.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7501875403158366764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/7501875403158366764'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/04/sometimes-its-easier-to-stick-with-what.html' title='Sometimes It&apos;s Easier to Stick With What You Already Use'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-905582025823247674</id><published>2009-04-12T14:21:00.016+01:00</published><updated>2009-12-16T18:58:45.680Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Egoless Programming: Admitting When You Should Be Shot</title><content type='html'>&lt;p&gt;
&lt;a href="http://www.markhneedham.com"&gt;Mark Needham&lt;/a&gt; brought up &lt;a href="http://c2.com/cgi/wiki?EgolessProgramming"&gt;Egoless Programming&lt;/a&gt; &lt;a href="http://twitter.com/markhneedham/status/1495300147"&gt;on Twitter&lt;/a&gt; the other day, reminding me of one of my favorite times I got to admit "I did this, including the mistakes."
&lt;/p&gt;&lt;p&gt;
It looks much funnier as an &lt;a href="http://xkcd.com"&gt;xkcd&lt;/a&gt;-style cartoon than it did in real life:
&lt;/p&gt;&lt;p&gt;
&lt;img src="http://lh6.ggpht.com/_7lRWqY-sCiw/SeILyN1X7II/AAAAAAAABT4/YzOLD2mYJ_w/should_be_shot2.png" /&gt;
&lt;/p&gt;&lt;p&gt;
(Disclaimer: All of the drawing above was copied directly from &lt;a href="http://xkcd.com"&gt;xkcd&lt;/a&gt;, because I can't draw at all. But the words are mine&amp;#151;well, mine and those of the co-worker who wanted to shoot me.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-905582025823247674?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/905582025823247674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/04/egoless-programming-admitting-when-you.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/905582025823247674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/905582025823247674'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/04/egoless-programming-admitting-when-you.html' title='Egoless Programming: Admitting When You Should Be Shot'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_7lRWqY-sCiw/SeILyN1X7II/AAAAAAAABT4/YzOLD2mYJ_w/s72-c/should_be_shot2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-677490045683431041</id><published>2009-03-31T11:14:00.006+01:00</published><updated>2009-12-16T18:59:15.343Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>Looking Forward to Alt.Net London Beers Tonight</title><content type='html'>&lt;p&gt;
I'm looking forward to attending &lt;a href="http://serialseb.blogspot.com/2009/03/altnet-london-beers-7.html"&gt;Alt.Net London Beers&lt;/a&gt; tonight to see what social gaffe I can commit next. My favorite from last time was when someone asked me if I "was you-switch" and I looked at them blankly, wondering what they could possibly mean. In retrospect, I knew that there were several developers there from &lt;a href="http://www.uswitch.com/"&gt;uSwitch&lt;/a&gt;, and I was just being asked if I was one of them. But at the time, I completely forgot, and the best my mind could turn the question into was something like... "Do you use switch statements? Because you know, in the OO-world, that's not cool." My secret is that I probably have used switch statements in the past year. But I didn't like it. Really.
&lt;/p&gt;&lt;p&gt;
Seriously, though. It's a good event. I made it to the last two, where we discussed Robert C. "&lt;a href="http://blog.objectmentor.com/articles/category/uncle-bobs-blatherings"&gt;Uncle Bob&lt;/a&gt;" Martin's &lt;a href="http://blog.objectmentor.com/articles/2009/02/12/getting-a-solid-start"&gt;SOLID Principles&lt;/a&gt; and "avoiding the big rewrite," including ideas from Michael Feathers' book &lt;a href="http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052/"&gt;Working Effectively With Legacy Code&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-677490045683431041?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/677490045683431041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/03/looking-forward-to-altnet-london-beers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/677490045683431041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/677490045683431041'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/03/looking-forward-to-altnet-london-beers.html' title='Looking Forward to Alt.Net London Beers Tonight'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-6522413006072918605</id><published>2009-02-02T10:24:00.005Z</published><updated>2009-12-16T19:01:43.181Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><title type='text'>Jeff and Joel Say Quality Really Doesn't Matter That Much. Uncle Bob Disagrees</title><content type='html'>&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt; has a &lt;a href="http://www.joelonsoftware.com/items/2009/01/31.html"&gt;transcript of part of a podcast&lt;/a&gt; with &lt;a href="http://www.codinghorror.com/blog/"&gt;Jeff Atwood&lt;/a&gt; where they say various odd things about software development, including:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;"And I find, sadly, to be completely honest with everybody listening, quality really doesn't matter that much, in the big scheme of things."&lt;/li&gt;
&lt;li&gt;Robert C. Martin's SOLID principles sound like "extremely bureaucratic programming that came from the mind of somebody that has not written a lot of code, frankly."&lt;/li&gt;
&lt;li&gt;And, "The longer I think about this, the less I care about code hygiene issues."&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Robert C. "Uncle Bob" Martin gives them a much-deserved ass-reaming in &lt;a href="http://blog.objectmentor.com/articles/2009/01/31/quality-doesnt-matter-that-much-jeff-and-joel"&gt;his response&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-6522413006072918605?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/6522413006072918605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/02/jeff-and-joel-say-quality-really-doesnt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6522413006072918605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/6522413006072918605'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/02/jeff-and-joel-say-quality-really-doesnt.html' title='Jeff and Joel Say Quality Really Doesn&apos;t Matter That Much. Uncle Bob Disagrees'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-3794049974532781063</id><published>2009-01-09T10:47:00.004Z</published><updated>2009-12-16T19:02:47.146Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver'/><title type='text'>Debugging Deadlocks in SQL Server Sucks Less These Days</title><content type='html'>&lt;p&gt;
I'm debugging deadlocks in SQL Server 2005. I hate debugging deadlocks.
&lt;/p&gt;&lt;p&gt;
The good news is that debugging deadlocks in SQL Server 2005 sucks a lot less than it did in SQL Server 2000.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://blogs.msdn.com/bartd/default.aspx"&gt;Bart Duncan&lt;/a&gt; expresses the difference well:&lt;/p&gt;
&lt;blockquote&gt;Turn on trace flag 1222 with "DBCC TRACEON (1222, -1)" or by adding "-T1222" as a SQL startup parameter.  This trace flag is a new trace flag in SQL 2005, a much improved version of the tried-and-true -T1204.  If you’re running SQL 2005, you should be using 1222 instead of 1204 unless you have deep-seated masochistic tendencies. Alternatives to 1222:&lt;ul&gt;&lt;li&gt;If you are using SQL 2000 or SQL 7.0, you’ll have no choice but to fall back on the older -T1204. &lt;/li&gt;&lt;li&gt;There’s a "Deadlock graph" Profiler trace event that provides the same info as -T1222.  Feel free to use this instead of -T1222 if you’re on SQL 2005.  But don’t waste your time with the "Lock:Deadlock" and "Lock:Deadlock Chain" trace events that are in SQL 2000, as they provide an unacceptably incomplete picture of the deadlock.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;
&lt;p&gt;Hooray!
&lt;/p&gt;&lt;p&gt;
That quote is taken from the first part in an excellent three-part series on debugging deadlocks in SQL Server 2005:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/bartd/archive/2006/09/09/747119.aspx"&gt;Deadlock Troubleshooting, Part 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/bartd/archive/2006/09/13/751343.aspx"&gt;Deadlock Troubleshooting, Part 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/bartd/archive/2006/09/25/770928.aspx"&gt;Deadlock Troubleshooting, Part 3&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
Also, there's &lt;a href="http://www.togsblom.com/2008/12/basic-sql-server-deadlock-debugging.html"&gt;Basic SQL Server Deadlock Debugging&lt;/a&gt; over on &lt;a href="http://www.togsblom.com/"&gt;Tog's Blom&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
I also like the Troubleshooting Deadlocking section in &lt;a href="http://www.amazon.com/dp/0735621969/"&gt;Inside Microsoft SQL Server 2005: Query Tuning and Optimization&lt;/a&gt; by Kalen Delaney.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-3794049974532781063?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/3794049974532781063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2009/01/debugging-deadlocks-in-sql-server-sucks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/3794049974532781063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/3794049974532781063'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2009/01/debugging-deadlocks-in-sql-server-sucks.html' title='Debugging Deadlocks in SQL Server Sucks Less These Days'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-638354865748771290</id><published>2008-05-14T16:23:00.013+01:00</published><updated>2009-12-16T19:35:39.342Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>JavaScript: The Return [no LineTerminator here] Statement</title><content type='html'>&lt;p&gt;
I was just reading &lt;a href="http://www.amazon.com/dp/0596517742/"&gt;JavaScript: The Good Parts&lt;/a&gt; by Douglas Crockford, and came across this statement:&lt;/p&gt;&lt;blockquote&gt;I always use the K&amp;R style, putting the { at the end of a line instead of the front, because it avoids a horrible design blunder in JavaScript's return statement.&lt;/blockquote&gt;&lt;p&gt;A while back, I was introduced to using closure to help get rid of unnecessary global variables in JavaScript by a friend at work, along with the book &lt;a href="http://www.amazon.com/dp/159059908X/"&gt;Pro JavaScript Design Patterns&lt;/a&gt;. Instead of something like this:&lt;/p&gt;&lt;pre class="brush:javascript"&gt;var myString = 'hi';

function doStuff() {
    alert(myString);
}&lt;/pre&gt;&lt;p&gt;You write something like this:&lt;/p&gt;&lt;pre class="brush:javascript"&gt;var myNamespace = function() {
    var myString = 'hi';

    return {
        doStuff: function() {
            alert(myString);
        }
    }
}();&lt;/pre&gt;&lt;p&gt;But, because I like BSD style, I did this, with line breaks before the opening braces:&lt;/p&gt;&lt;pre class="brush:javascript"&gt;var myNamespace = function() 
{
    var myString = 'hi';

    return 
    {
        doStuff: function() 
        {
            alert(myString);
        }
    }
}();&lt;/pre&gt;&lt;p&gt;
When I tried to call doStuff, I promptly got the JavaScript error "myNamespace is null or not an object."&lt;/p&gt;&lt;p&gt;After much head-scratching and debugging, I learned the hard way that &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"&gt;ECMAScript&lt;/a&gt; defines the return statement like this:&lt;/p&gt;&lt;blockquote&gt;return [no &lt;i&gt;LineTerminator&lt;/i&gt; here] &lt;i&gt;Expression&lt;sub&gt;opt&lt;/sub&gt;&lt;/i&gt; ;&lt;/blockquote&gt;&lt;p&gt;Let me put that a slightly different way:&lt;/p&gt;&lt;blockquote&gt;return [&lt;span style="font-weight: bold; color: red;"&gt;!!!NO &lt;i&gt;LINE_TERMINATOR&lt;/i&gt; HERE!!!&lt;/span&gt;] &lt;i&gt;Expression&lt;sub&gt;opt&lt;/sub&gt;&lt;/i&gt; ;&lt;/blockquote&gt;&lt;p&gt;And that's the story of how I became a convert to using K&amp;R style when coding JavaScript.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-638354865748771290?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/638354865748771290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2008/05/javascript-return-no-lineterminator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/638354865748771290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/638354865748771290'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2008/05/javascript-return-no-lineterminator.html' title='JavaScript: The Return [no LineTerminator here] Statement'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-5024407301810602783</id><published>2008-04-23T20:41:00.002+01:00</published><updated>2009-12-16T19:03:32.364Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Avoid Resharper 4.0 Nightly Build 775</title><content type='html'>&lt;p&gt;
If you're trying the Resharper 4 beta nightly builds, I just thought I'd warn that I had trouble with build 775 from 11 Apr 2008, which is currently the newest build marked "Works here". When I installed it, the Resharper items, such as "Find Usages", were disabled in the context menu. I found the issue discussed in the Jetbrains forums, and they said they fixed it in a later build.
&lt;/p&gt;&lt;p&gt;
Now, I'm using build 780 from 18 Apr 2008, and it's working well for me so far.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-5024407301810602783?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/5024407301810602783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2008/04/avoid-resharper-40-nightly-build-775.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5024407301810602783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5024407301810602783'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2008/04/avoid-resharper-40-nightly-build-775.html' title='Avoid Resharper 4.0 Nightly Build 775'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-1061262413042834631</id><published>2008-01-22T01:27:00.000Z</published><updated>2008-01-22T01:41:33.007Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gadgets'/><title type='text'>Amazon Kindle Email Support Does Not Suck</title><content type='html'>&lt;p&gt;In all fairness to Amazon, I need to explain what happened after my last post.&lt;/p&gt;&lt;p&gt;The bf contacted customer service by e-mail again, and explained his long wait on the phone.&lt;/p&gt;&lt;p&gt;Amazon apologised, and sent a new battery to try.&lt;/p&gt;&lt;p&gt;That didn't fix things, and we let Amazon know by e-mail.&lt;/p&gt;&lt;p&gt;They sent us a new Kindle, and explained we had 30 days from receiving it to return the malfunctioning one.&lt;/p&gt;&lt;p&gt;We received the new one. It works great. We'll be sending the old one back.&lt;/p&gt;&lt;p&gt;And everyone lived happily ever after.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-1061262413042834631?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/1061262413042834631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2008/01/amazon-kindle-email-support-does-not.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1061262413042834631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/1061262413042834631'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2008/01/amazon-kindle-email-support-does-not.html' title='Amazon Kindle Email Support Does Not Suck'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-4969911645493748627</id><published>2007-12-30T20:56:00.001Z</published><updated>2009-12-16T19:04:49.370Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gadgets'/><title type='text'>Amazon Kindle Phone Customer Support Sucks</title><content type='html'>&lt;p&gt;
My bf bought a Kindle. My opinion is that it's a very nice e-book reader. There are a lot of reviews out there that think it should be prettier or flashier or do more.
&lt;/p&gt;&lt;p&gt;
But they are wrong. It's an e-book reader. And it does that job very nicely.
&lt;/p&gt;&lt;p&gt;
As long as it's working.
&lt;/p&gt;&lt;p&gt;
Our Kindle seems to be having some issues with the battery&amp;#151;just flat-out really bad battery life, even with the wireless off. Some people have speculated this is because the device is draining too much power when the screensaver is on, and that things work better if you turn it off between reading sessions.
&lt;/p&gt;&lt;p&gt;
Okay, fine. But rather disappointing from a device you just paid $400 for.
&lt;/p&gt;&lt;p&gt;
Our Kindle has another issue, though, where if you leave it in the screensaver and not plugged into an outlet, it often won't wake up from the screensaver. Getting it back to life involves various resets, battery-poppings, and &lt;b&gt;always&lt;/b&gt; needing to get it plugged back into an outlet.
&lt;/p&gt;&lt;p&gt;
And it's not that the battery is dead. When it wakes back up, it shows the battery as having plenty power left.
&lt;/p&gt;&lt;p&gt;
This rendered it unusable for the bf to take on his trans-Atlantic flight to see his family for Christmas.
&lt;/p&gt;&lt;p&gt;
That's not acceptable from a device you just paid $400 for.
&lt;/p&gt;&lt;p&gt;
The bf contacted customer service by e-mail. They said that from his description, they couldn't tell if the problem was in the Kindle itself, or just in the battery, and he needed to contact them by phone. Fair enough.
&lt;/p&gt;&lt;p&gt;
When he got back to the States, we did that.
&lt;/p&gt;&lt;p&gt;
For Kindle customer support, Amazon has a system where you enter your details into their online support site, and then support calls you at the phone number you provide&amp;#151;you can choose immediately, or in a few minutes. We chose immediately, and indeed were immediately called.
&lt;/p&gt;&lt;p&gt;
Only to be put on hold until a support representative was available to take our call.
&lt;/p&gt;&lt;p&gt;
I expected this. I understand this is how customer phone support works. You usually have to wait a while. But you know, if your business has a system sophisticated enough to have support call the customer back like that, they could actually make it so that support only calls when they have someone free to handle the call.
&lt;/p&gt;&lt;p&gt;
It's just a thought.
&lt;/p&gt;&lt;p&gt;
The bf and I passed the phone back and forth, waiting for a human. (Our speaker-phone died a terrible death a while back.)
&lt;/p&gt;&lt;p&gt;
Every few minutes, a pre-recorded voice broke through the music, saying the things those pre-recorded voices usually do, including that someone would take our call within a few minutes.
&lt;/p&gt;&lt;p&gt;
We passed the phone back-and-forth like this, waiting and waiting.
&lt;/p&gt;&lt;p&gt;
FOR THREE HOURS.
&lt;/p&gt;&lt;p&gt;
THEN THE SUPPORT SYSTEM HUNG UP ON US.
&lt;/p&gt;&lt;p&gt;
Furthermore, we are not the only people this has happened to. In the Kindle discussion forums on Amazon, at least one other customer said something similar had happened to them.
&lt;/p&gt;&lt;p&gt;
Amazon, I know you're a big enough company that you don't care how one customer feels, or even a few.
&lt;/p&gt;&lt;p&gt;
BUT RIGHT NOW, I'M REALLY PISSED OFF AT YOU.
&lt;/p&gt;&lt;p&gt;
The bf and I are still deciding if we will try getting through to the Kindle phone customer support again, or just send the thing back. (We're still within our 30-day return window.)
&lt;/p&gt;&lt;p&gt;
Right now, we're favoring the latter.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-4969911645493748627?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/4969911645493748627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2007/12/amazon-kindle-phone-customer-support.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4969911645493748627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4969911645493748627'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2007/12/amazon-kindle-phone-customer-support.html' title='Amazon Kindle Phone Customer Support Sucks'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-5671515860876402761</id><published>2007-12-21T19:26:00.001Z</published><updated>2009-12-16T19:05:32.393Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Customers Do So Care What Your Code Looks Like, They Just Don't Know It</title><content type='html'>&lt;p&gt;
Over at &lt;a href="http://www.codinghorror.com/"&gt;Coding Horror&lt;/a&gt;, Jeff Atwood claims "&lt;a href="http://www.codinghorror.com/blog/archives/001022.html"&gt;Users couldn't care less whether the underlying code is pretty&lt;/a&gt;."
&lt;/p&gt;&lt;p&gt;
Baloney.
&lt;/p&gt;&lt;p&gt;
The article sparked lots of responses noting that customers do care, because ugly code is often hard to maintain, and code that is hard to maintain often leads to more bugs, as well as to longer implementation times both for bug fixes and for the new features that keep you ahead of your competition.
&lt;/p&gt;&lt;p&gt;
But yes, in a short-sighted way, Jeff is right. Customers often don't &lt;b&gt;appear&lt;/b&gt; to care about quality until something bad happens.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;They don't care about the bad quality of cheap toys from China, until they find out they are hazardous to their children's health because the toys contain too much lead.&lt;/li&gt;
&lt;li&gt;They are so enamored with the bling of their SUVs that they don't think about quality until news headlines start shouting about rollovers.&lt;/li&gt;
&lt;li&gt;And, they don't care about ugly, unmaintainable code until your product has a showstopper bug and it takes you forever to fix it, because you can't figure out how to. Or, until a competitor has a feature that your customers are dying for, but that it takes you forever to match, because you can't figure out how to integrate it into your ugly codebase.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Whoops! It turns out that customers care about quality after all.
&lt;/p&gt;&lt;p&gt;
So yes, customers do care, it's just that they are so dazzled by promises of features and the potential for bargains that sometimes they forget&amp;#151;until something bad happens.
&lt;/p&gt;&lt;p&gt;
As always&amp;#151;and I think this may really be part of Jeff's point anyway&amp;#151;there has to be balance. Take the time to write maintainable, quality code so you don't end up in the "whoops!" situation. But on the other hand, don't stare at your code editor, re-refactoring for hours on end just to write a masterpiece.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-5671515860876402761?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/5671515860876402761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2007/12/customers-do-so-care-what-your-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5671515860876402761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/5671515860876402761'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2007/12/customers-do-so-care-what-your-code.html' title='Customers Do So Care What Your Code Looks Like, They Just Don&apos;t Know It'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-9219896571361605564</id><published>2007-12-15T02:28:00.000Z</published><updated>2007-12-30T21:43:01.571Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Gutsy Gibbon on My ThinkPad T61</title><content type='html'>&lt;p&gt;Recently, I bought a new ThinkPad. Much to the chagrin of the bf, I didn't start using it right away. It sat on a pile of boxes while I planned my attack.&lt;/p&gt;&lt;p&gt;See, I wanted to reinstall Windows&amp;#151;to get rid of crapplets&amp;#151;before I filled the disk full of stuff.&lt;/p&gt;&lt;p&gt;And, I wanted to set up the machine to dual-boot Ubuntu.&lt;/p&gt;&lt;p&gt;I wasn't entirely successful with the clean XP install. I mostly followed the guides listed below. But I must have done something wrong, because after my install, Windows would only start in safe mode. And when I looked at the install log, it was complaining about several crucial DLLs not being right. (I no longer have the error messages, because I cleared them out, or I'd list them here for posterity.)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.howtohaven.com/system/createwindowssetupdisk.shtml"&gt;How to Create a Bootable Windows XP Setup CD/DVD on a System with Windows Pre-loaded&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dance.richii.com/article221.html"&gt;Thinkpad T60P (200793U) Windows XP Install&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wintellect.com/cs/blogs/jrobbins/archive/2007/03/24/a-squeaky-clean-thinkpad-x60-tablet-with-no-craplets.aspx"&gt;A Squeaky Clean ThinkPad X60 Tablet with No Craplets&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
But then I remembered that the bf and I had actually bought an OEM XP CD to install under Parallels on his MacBook. Oh yes, I could use that!&lt;/p&gt;&lt;p&gt;So I did, and everything was happy.&lt;/p&gt;&lt;p&gt;Once past that hurdle, I followed the article &lt;a href="http://physicsmajor.wordpress.com/2007/03/03/my-ubuntu-installation-on-thinkpad-r60-dual-boot-with-winxp/"&gt;My Ubuntu Installation on Thinkpad R60: Dual boot with WinXP&lt;/a&gt; to set up the dual-boot. &lt;/p&gt;&lt;p&gt;It only took me 3 tries.&lt;/p&gt;&lt;p&gt;The first time, I managed to download a bad Ubuntu installer image. The lesson learned there was that before burning a CD and trying to use it to install an operating system, you should check the MD5.&lt;/p&gt;&lt;p&gt;The second time, I missed that it didn't keep all the attributes about what I wanted to do with my partitions from the first time. The partitions (obviously) were still there, but I missed that I needed to re-fill-out some of the details about how Linux should use them.&lt;/p&gt;&lt;p&gt;The third time, it worked like a charm!&lt;/p&gt;&lt;p&gt;Now, let me tell you, Linux has come a !!!LONG!!! way since the last time I looked at it&amp;#151;which was something like SUSE 7.1.
&lt;/p&gt;&lt;p&gt;Quite a lot of things really did work, right out of the box.&lt;/p&gt;&lt;p&gt;I followed the guide &lt;a href="http://www.thinkwiki.org/wiki/Installing_Ubuntu_7.10_(Gutsy_Gibbon)_on_a_ThinkPad_T61"&gt;Installing Ubuntu 7.10 (Gutsy Gibbon) on a ThinkPad T61&lt;/a&gt; at &lt;a href="http://www.thinkwiki.org/wiki/ThinkWiki"&gt;ThinkWiki&lt;/a&gt;&amp;#151;very helpful.&lt;/p&gt;&lt;p&gt;I had a few travails&amp;#151;which if I'm feeling motivated, I'll post about later&amp;#151;but I'm amazed at how many things are working:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Wireless networking&lt;/li&gt;&lt;li&gt;Printing to an IPP HP LaserJet printer on the network&lt;/li&gt;&lt;li&gt;VPNing into work and remote desktopping into my work computer&lt;/li&gt;&lt;li&gt;Suspending (well sometimes anyway)&lt;/li&gt;&lt;li&gt;Automounting network shares&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I want to give a big shout-out and "Thank You!" to everyone in the Linux, Ubuntu, and ThinkPad community who helped make this possible. It's beautiful.&lt;/p&gt;&lt;p&gt;And I even let myself order the &lt;a href="http://www.thinkgeek.com/tshirts/ladies/3754/"&gt;Tux Babydoll T-Shirt&lt;/a&gt; from &lt;a href="http://www.thinkgeek.com/"&gt;ThinkGeek&lt;/a&gt; in celebration.
&lt;/p&gt;&lt;p&gt;Cheers!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-9219896571361605564?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/9219896571361605564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2007/12/gutsy-gibbon-on-my-thinkpad-t61.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/9219896571361605564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/9219896571361605564'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2007/12/gutsy-gibbon-on-my-thinkpad-t61.html' title='Gutsy Gibbon on My ThinkPad T61'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-4850168040710438150</id><published>2007-04-01T23:54:00.001+01:00</published><updated>2009-12-16T19:06:10.452Z</updated><title type='text'>Physical World Hyperlinks</title><content type='html'>&lt;p&gt;
You know the feeling when you read about something, and think, "That's cool. I want to be a part of that."?
&lt;/p&gt;&lt;p&gt;
I just read the &lt;a href="http://www.nytimes.com/2007/04/01/business/01code.html"&gt;New York Times article&lt;/a&gt; about &lt;a href="http://en.wikipedia.org/wiki/Physical_world_hyperlinks"&gt;physical world hyperlinks&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
I want it, now. I want to build it, now.
&lt;/p&gt;&lt;p&gt;
Ooh, and I just found &lt;a href="http://www.semacode.org"&gt;semacode.org&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-4850168040710438150?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/4850168040710438150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2007/04/physical-world-hyperlinks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4850168040710438150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/4850168040710438150'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2007/04/physical-world-hyperlinks.html' title='Physical World Hyperlinks'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-8418862923037521379</id><published>2006-12-05T01:24:00.000Z</published><updated>2006-12-05T01:49:59.220Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Please UnSuggest Some Of My Favorite Books To Me</title><content type='html'>&lt;p&gt;I saw the story about &lt;a href="http://www.librarything.com/unsuggester/"&gt;UnSuggester&lt;/a&gt; on &lt;a href="http://slashdot.org"&gt;Slashdot&lt;/a&gt;. Obviously, since I love books and &lt;a href="http://www.librarything.com/"&gt;LibraryThing&lt;/a&gt;, I couldn't wait to give it a try.&lt;/p&gt;&lt;p&gt;When I typed in my favorite novel, &lt;a href="http://www.librarything.com/work/2204"&gt;Jane Eyre&lt;/a&gt;, the first two items UnSuggester unsuggested were Fowler's &lt;a href="http://www.librarything.com/work/10604"&gt;Patters Of Enterprise Architecture&lt;/a&gt; and Freeman &amp; Freeman's &lt;a href="http://www.librarything.com/work/16763"&gt;Head First Design Patterns&lt;/a&gt;&amp;mdash;two of my &lt;a href="http://www.librarything.com/catalog.php?tag=tech&amp;view=programmergrrl&amp;shelf=list&amp;sort=ratingREV"&gt;best-rated tech books&lt;/a&gt; that I have on my bookshelf.&lt;/p&gt;&lt;p&gt;lol.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-8418862923037521379?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/8418862923037521379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2006/12/please-unsuggest-some-of-my-favorite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/8418862923037521379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/8418862923037521379'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2006/12/please-unsuggest-some-of-my-favorite.html' title='Please UnSuggest Some Of My Favorite Books To Me'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33777038.post-115893669590498349</id><published>2006-09-22T15:49:00.001+01:00</published><updated>2009-12-16T19:08:57.112Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>What Is The Best Way To Use Immutable Atomic Value Types With XML Serialization?</title><content type='html'>&lt;p&gt;
Here are two items from &lt;a href="http://www.amazon.com/gp/product/0321245660/"&gt;Effective C#: 50 Specific Ways to Improve Your C#&lt;/a&gt; by &lt;a href="http://www.srtsolutions.com/public/blog/20574"&gt;Bill Wagner&lt;/a&gt;:
&lt;/p&gt;&lt;p&gt;
Item 7: Prefer Immutable Atomic Value Types&lt;/p&gt;
&lt;blockquote&gt;Immutable types are simple: After they are created, they are constant. If you validate the parameters used to construct the object, you know that it is in a valid state from that point forward. You cannot change the object's internal state to make it invalid. You save yourself a lot of otherwise necessary error checking by disallowing any state changes after an object has been constructed. Immutable types are inherently thread safe: Multiple readers can access the same contents. If the internal state cannot change, there is no chance for different threads to see inconsistent views of the data. Immutable types can be exported from your objects safely. The caller cannot modify the internal state of your objects. Immutable types work better in hash-based collections. The value returned by Object.GetHashCode() must be an instance invariant (see Item 10); that's always true for immutable types.
&lt;/p&gt;&lt;p&gt;
Not every type can be immutable. If it were, you would need to clone objects to modify any program state. That's why this recommendation is for both atomic and immutable value types. Decompose your types to the structures that naturally form a single entity. An Address type does. An address is a single thing, composed of multiple related fields. A change in one field likely means changes to other fields. A customer type is not an atomic type. A customer type will likely contain many pieces of information: an address, a name, and one or more phone numbers. Any of these independent pieces of information might change. A customer might change phone numbers without moving. A customer might move, yet still keep the same phone number. A customer might change his or her name without moving or changing phone numbers. A customer object is not atomic; it is built from many different immutable types using composition: an address, a name, or a collection of phone number/type pairs. Atomic types are single entities: You would naturally replace the entire contents of an atomic type. The exception would be to change one of its component fields.&lt;/blockquote&gt;
&lt;p&gt;Item 25: Prefer Serializable Types&lt;/p&gt;
&lt;blockquote&gt;Prefer adding serialization to your types when practical. It should be practical for all types that do not represent UI widgets, windows, or forms. The extra perceived work is no excuse. .NET Serialization support is so simple that you don't have any reasonable excuse not to support it. In many cases, adding the Serializable attribute is enough&lt;/blockquote&gt;
&lt;p&gt;But, are immutable atomic value types serializable to XML?
&lt;/p&gt;&lt;p&gt;
Here is the immutable atomic address structure, pretty much taken straight from Wagner's book:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[&lt;span style="color: teal;"&gt;Serializable&lt;/span&gt;]
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;struct&lt;/span&gt; &lt;span style="color: teal;"&gt;Address&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _street;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _city;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _state;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _zip;
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Address (&lt;span style="color: blue;"&gt;string&lt;/span&gt; street, &lt;span style="color: blue;"&gt;string&lt;/span&gt; city, &lt;span style="color: blue;"&gt;string&lt;/span&gt; state, &lt;span style="color: blue;"&gt;string&lt;/span&gt; zip)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _street = street;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _city = city;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _state = state;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _zip = zip;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Street { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; _street; } }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; City { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; _city; } }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; State { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; _state; } }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Zip { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; _zip; } }
}&lt;/code&gt;&lt;/pre&gt;
And here is a class that uses it:
&lt;pre&gt;&lt;code&gt;[&lt;span style="color: teal;"&gt;Serializable&lt;/span&gt;]
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Office&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _name;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;Address&lt;/span&gt; _address;
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Office() { }
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Name
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; _name; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { _name = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;Address&lt;/span&gt; Address
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; _address; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { _address = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/code&gt;&lt;/pre&gt;
Now, here is some code that creates an Office and serializes it to XML:
&lt;pre&gt;&lt;code&gt;&lt;span style="color: teal;"&gt;Office&lt;/span&gt; office = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Office&lt;/span&gt;();
office.Name = &lt;span style="color: maroon;"&gt;"Chicago"&lt;/span&gt;;
office.Address = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Address&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"1060 W Addison St"&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"Chicago"&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"IL"&lt;/span&gt;, &lt;span style="color: maroon;"&gt;"60613"&lt;/span&gt;);
&amp;nbsp;
&lt;span style="color: teal;"&gt;XmlSerializer&lt;/span&gt; s = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt; (&lt;span style="color: teal;"&gt;Office&lt;/span&gt;), &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Type&lt;/span&gt;[] {&lt;span style="color: blue;"&gt;typeof&lt;/span&gt; (&lt;span style="color: teal;"&gt;Address&lt;/span&gt;)});
s.Serialize(&lt;span style="color: teal;"&gt;Console&lt;/span&gt;.Out, office);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here's the output:&lt;/p&gt;
&lt;pre&gt;&amp;lt;Office&amp;gt;
  &amp;lt;Name&amp;gt;Chicago&amp;lt;/Name&amp;gt;
  &amp;lt;Address /&amp;gt;
&amp;lt;/Office&amp;gt;
&lt;/pre&gt;&lt;/p&gt;
Where's the address information?
&lt;/p&gt;&lt;p&gt;
MSDN explains in &lt;a href="http://msdn2.microsoft.com/en-us/library/182eeyhh%28VS.80%29.aspx"&gt;XML Serialization Considerations&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;Only public properties and fields can be serialized. Properties must have public accessors (get and set methods). If you need to serialize non-public data, use the BinaryFormatter class rather than XML serialization.&lt;/blockquote&gt;
&lt;p&gt;My Address properties don't have public set methods, and so aren't in the XML.
&lt;/p&gt;&lt;p&gt;
Now, I &lt;i&gt;like&lt;/i&gt; the immutable type idea. It feels good and clean and right to me for things like Address. And &lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; and Eric Evans agree&amp;#151;they both have descriptions of immutable value objects in their books &lt;a href="http://www.amazon.com/dp/0321127420/"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt; and &lt;a href="http://www.amazon.com/dp/0321125215/"&gt;Domain-Driven Design&lt;/a&gt;, respectively. So, I really want to use the immutable value type idea. However, I'm going to start using these types over a web service. That means I want a good way to serialize them, where "good" is defined by James Shore in &lt;a href="http://www.jamesshore.com/Articles/Quality-With-a-Name.html"&gt;Quality With a Name&lt;/a&gt; as&lt;/p&gt;
&lt;blockquote&gt;A good software design minimizes the time required to create, modify, and maintain the software while achieving acceptable run-time performance.&lt;/blockquote&gt; 
&lt;p&gt;And so, the question is: What is the best way to use immutable atomic value types with XML serialization?&lt;/p&gt;
&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33777038-115893669590498349?l=www.programmergrrl.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.programmergrrl.com/feeds/115893669590498349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.programmergrrl.com/2006/09/what-is-best-way-to-use-immutable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/115893669590498349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33777038/posts/default/115893669590498349'/><link rel='alternate' type='text/html' href='http://www.programmergrrl.com/2006/09/what-is-best-way-to-use-immutable.html' title='What Is The Best Way To Use Immutable Atomic Value Types With XML Serialization?'/><author><name>programmergrrl</name><uri>http://www.blogger.com/profile/08045944515241515020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_yLiQDoD41F4/S1xTWXfrlEI/AAAAAAAAADo/wYU36i7yJH8/S220/Rosie.jpg'/></author><thr:total>0</thr:total></entry></feed>
