<?xml version='1.0' encoding='windows-1252'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-69451</id><updated>2008-07-01T22:16:13.837-05:00</updated><title type='text'>Girl Writes Code</title><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default?start-index=26&amp;max-results=25'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1564</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-69451.post-4803326982875597921</id><published>2008-07-01T22:11:00.002-05:00</published><updated>2008-07-01T22:16:13.884-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Market Research</title><content type='html'>Your opinion, please: What are the qualities of a conference that attracts a sparkling diversity of attendees?&lt;br /&gt;&lt;br /&gt;I'd like to gather our collective observations and apply them to increasing the variety of ideas that are brought to our conferences and the variety of people we reach with our ideas. My first practical applications will be software-oriented conferences, but I think the best suggestions may come from non-software events. Think broadly; where have you been amongst a bunch of people who differ from you, where you benefited, learned, and taught?&lt;br /&gt;&lt;br /&gt;The question usually comes to &lt;i&gt;me&lt;/i&gt; regarding women, but I'm interested in other kinds of diversity, too:&lt;ul&gt;&lt;li&gt;interaction style&lt;/li&gt;&lt;li&gt;culture&lt;/li&gt;&lt;li&gt;experience level&lt;/li&gt;&lt;li&gt;type of experience&lt;/li&gt;&lt;li&gt;project methodology preference&lt;/li&gt;&lt;li&gt;age&lt;/li&gt;&lt;li&gt;outlook&lt;/li&gt;&lt;li&gt;interests&lt;/li&gt;&lt;li&gt;worries&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;So please, think about gatherings you've attended where a lot of different people harmoniously shared and challenged ideas. What gave those gatherings the opportunity to bring those people together? Once they were there, what made the space safe for them to contribute, to speak up, to risk being different?&lt;br /&gt;&lt;br /&gt;If you don't mind, ask this question around. I'm looking for a bunch of contributions that are, well, diverse.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/07/market-research.html' title='Market Research'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=4803326982875597921' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4803326982875597921'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4803326982875597921'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6390626926601016961</id><published>2008-06-26T16:28:00.004-05:00</published><updated>2008-06-26T16:44:06.701-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Workstation Hack: Visual Studio on 2 monitors</title><content type='html'>Having two monitors is an obvious improvement to any development workstation, but are there tricks for really &lt;em&gt;effectively&lt;/em&gt; using all that extra acreage? I learned a great strategy from a co-worker for a two-monitor setup for Microsoft Visual Studio.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Hack Summary&lt;/strong&gt;&lt;br /&gt;Maximize the editor on one screen, and pull out all the floating windows (Solution Explorer, Error List, etc.) onto the second screen&amp;mdash;which is great until you want to look at your database or your wiki or your work-in-progress app while also typing code. (If you're typing in the editor, Visual Studio is in front, which means all those little windows are in front of any other app you want to look at while coding.) The solution is to set up some shortcut keys that switch you from "Sprawl across two screens" mode to "Pull everything into one screen, dock the little windows, and make the second monitor available for other stuff" mode, and back.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Export Two Sets of Window Settings&lt;/strong&gt;&lt;br /&gt;You can save Visual Studio settings (such as window layout) to a file, and later import that settings file. For this hack, we'll export two settings files (one for two-screen, sprawl mode; one for one-screen, compact mode). Then, we can switch from one mode to the other by importing the appropriate settings file.&lt;br /&gt;&lt;br /&gt;Get your windows how you like them in one-screen mode. For example, my Solution Explorer is a docked pane on the right, unpinned so that it auto-hides; and so on, for the handy windows I want at my fingertips. So, set those up.&lt;br /&gt;&lt;br /&gt;Go to Tools &amp;gt; Import and Export Settings... &amp;gt; select the radio button for Export &amp;gt; click Next &amp;gt; uncheck All Settings &amp;gt; expand General Settings &amp;gt; check Window Layouts &amp;gt; click Next. Name the file (e.g., OneScreen.vssettings) and give it a location. Click Finish.&lt;br /&gt;&lt;br /&gt;Now set up your windows in two-screen mode. Unhide a window by hovering over it, pin it, right-click on its title bar, and pick Floating. Drag it where you want. This is the artistic phase.&lt;br /&gt;&lt;br /&gt;As above, export those settings, with a different name (e.g., TwoScreens.vssettings).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Create Two Switcher Macros&lt;/strong&gt;&lt;br /&gt;Add a macro module in the Macros IDE (Tools &amp;gt; Macros &amp;gt; Macros IDE), and create two macros, one to import each settings file. Here's my module, called WindowsSettingsSwitcher, which gets my settings files from C:\VSSettings\.&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;Imports System.IO&lt;br /&gt;Imports EnvDTE&lt;br /&gt;Imports EnvDTE80&lt;br /&gt;Imports System.Diagnostics&lt;br /&gt;&lt;br /&gt;Public Module WindowsSettingsSwitcher&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Public Sub SwitchToWinLayoutTwoScreens()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DTE.ExecuteCommand("Tools.ImportandExportSettings", "-import:C:\VSSettings\TwoScreens.vssettings")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Public Sub SwitchToWinLayoutOneScreen()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DTE.ExecuteCommand("Tools.ImportandExportSettings", "-import:C:\VSSettings\OneScreen.vssettings")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub&lt;br /&gt;End Module&lt;/div&gt;&lt;br /&gt;You can test the macros from the Macro Explorer by double-clicking their names.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Assign Shortcut Keys to the Macros&lt;/strong&gt;&lt;br /&gt;Create some shortcuts that execute those macros. Tools &amp;gt; Options &amp;gt; expand Environment &amp;gt; click Keyboard. In the "Show commands containing" box, enter some text that will find your macros, e.g., "switchtowin" if you used my names above. Highlight a macro, put your cursor in the "Press shortcut keys" box, and type your shortcut. (Mine are Ctrl+Alt+1 for one-screen, and Ctrl+Alt+2 for two-screen, since those weren't in use by anything else.) I left the "Use new shortcut in" set to "Global." Click OK. &lt;br /&gt;&lt;br /&gt;At this point, you can use your shortcut keys to switch modes. I added them to my View menu, too, mostly to give me a visual reminder of the shortcuts.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Add Switcher Commands to the View Menu&lt;/strong&gt;&lt;br /&gt;Tools &amp;gt; Customize &amp;gt; Commands tab &amp;gt; select the "Macros" category. Click and drag your macro from the Commands list in the dialog up to your toolbar. When you hover over View, the View menu will appear, showing the insertion point for your new command. Drop it in place. Right-click on the command in its new location, click on the Name box, and edit that down to something helpful (e.g., "OneScreen"). Repeat to add the other macro. Close the Customize dialog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With this hack, you can keep lots of useful Visual Studio bits visible (liberating you from relying on the mouse to hover over auto-hiding windows, and maximizing your editor window), but stow them away quickly when you need the second screen for something else.&lt;br /&gt;&lt;br /&gt;So how 'bout you? What are your workstation hacks?</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/06/workstation-hack-visual-studio-on-2.html' title='Workstation Hack: Visual Studio on 2 monitors'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6390626926601016961' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6390626926601016961'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6390626926601016961'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6894118727182410320</id><published>2008-06-12T07:40:00.002-05:00</published><updated>2008-06-12T07:46:31.795-05:00</updated><title type='text'>Change your organization, or...</title><content type='html'>So here's the thing about being in a place that makes you depressed: You're too depressed to make the changes necessary to get out of the place. It can seem insurmountable. In eerily coincidental-sounding but utterly unrelated news (*cough*), I have a new job! You will certainly already know this if you've had occasion to see me bouncing off the walls lately. While some of my friends are content in their jobs, many are not, so I'll share my self-help program, in the hopes that it might console and inspire those who are wishing for a change.  &lt;br /&gt;&lt;br /&gt;I had been in the old job for 8 years, so even thinking about a change was scary. Here's what I did.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Believe.&lt;/strong&gt;&lt;br /&gt;You deserve a job that makes you happy.&lt;br /&gt;&lt;br /&gt;Really, you do. You probably have a list of reasons why you need to stay at the place you're at, but look critically at those reasons. Put yourself into a five-year-old's mindset and ask "Why? …Why? …Why?" about each one. The reasons on my list, when I started doing some fact-checking out in the real world, turned out to be myths. &lt;br /&gt;&lt;br /&gt;Throw rocks at that old adage, "…that's why they call it 'work.'" Pfft, whatever. If you're reading my blog, I'll assume you're a knowledge worker, and probably a programmer, and someone who likes to think about new ways of doing things. Lucky us, there are many lucrative careers for people who &lt;i&gt;like&lt;/i&gt; to think. For me, writing software is like play&amp;mdash;heck, it &lt;i&gt;is&lt;/i&gt; something I do for play&amp;mdash;so I didn't need to find a different line of work, just a different job that let me write software. You don't need to suffer to put bread on your table.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Network.&lt;/strong&gt;&lt;br /&gt;Get out there, walk amongst the people. If you're really sunk in the doldrums, this is probably the most tempting one to blow off, but here are some benefits: meet people with similar interests and challenges;  dispel myths about the job market; find inspiration, in people who like their jobs, in people with passion; meet job prospects; become known for your ideas and contributions.&lt;br /&gt;&lt;br /&gt;Networking and professional venues I find helpful: &lt;a href="http://door64.com/"&gt;door64&lt;/a&gt;, &lt;a href="http://www.agileaustin.org/"&gt;AgileAustin&lt;/a&gt;, &lt;a href="http://www.agileatx.org/"&gt;AgileATX&lt;/a&gt;, &lt;a href="http://geekaustin.org/"&gt;GeekAustin&lt;/a&gt;, &lt;a href="http://adnug.org/"&gt;Austin .NET User Group&lt;/a&gt;, classes, and my blog. Yeah, yeah, and &lt;a href="http://www.linkedin.com/"&gt;LinkedIn&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Define the goal.&lt;/strong&gt;&lt;br /&gt;I developed a really clear list about what I wanted in an employer. Honed it, you might say. Took it out during meetings and quietly polished it. But this was helpful, because it gave me a concise list of interview questions to ask of my potential employers. The ultimate filter question, the one at the top of the list that immediately let me know whether it was even worth continuing, goes like this: "Do you like your job?"&lt;br /&gt;&lt;br /&gt;Look for a yes. There are a ton of answers that are not yeses. I know, because I had years of delivering them myself. "It presents me with a lot of challenges. I get to work with people from all over the world, and I'm part of a great team." Yeah, but that wasn't a yes. I want to work in a place where it's possible to like your job.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Keep it positive.&lt;/strong&gt;&lt;br /&gt;No matter how bad it is, if you come off as a complainer, you will sour job prospects. Be diplomatic, and steer the conversation to what you're working towards, what you look for in the future.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Seek support.&lt;/strong&gt;&lt;br /&gt;To keep the gushing to a minimum, I'll simply say: My husband rocks. You've probably got someone, too, whether a sweetie or a best friend, a pen pal or your mom or your dog, someone who knows that you're awesome. This is a good time to trust that person (or dog), to let him or her know that you're embarking on something intimidating and you'd like encouragement through the journey. It helps to have a &lt;a href="http://en.wikipedia.org/wiki/Belay"&gt;belayer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Believe in yourself.&lt;/strong&gt;&lt;br /&gt;At my lowest, I believed that I had no useful, marketable skills; all I was good at was politicking my way through my employer's byzantine bureaucracy. I had to break out of that if I was going to even begin the process of moving elsewhere. (Or of getting a promotion, for that matter.) I got a big sheet of newsprint and a box of goofy-big crayons, I went into a room by myself and closed the door, and I brainstormed. Crazy, wild, unrelated ideas about what I do, what I'm capable of, and what I am that is awesome. I wrote a lot of things on that paper, and many of them showed up on the next draft of my r&amp;eacute;sum&amp;eacute;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Improve.&lt;/strong&gt;&lt;br /&gt;And then I thought about what I &lt;i&gt;wanted&lt;/i&gt; my r&amp;eacute;sum&amp;eacute; to look like. Or, more specifically, what skills I would need in order to get the kind of job I would enjoy. I made a curriculum:  books to read, topics to research, and projects to implement. Tuesday is homework night, for writing code. Here's the trick to making this palatable: Every time I worked on a curriculum item, I complimented myself on taking another step towards that new job. When you're in a hole, the very act of climbing up makes you see the sky. &lt;i&gt;That's&lt;/i&gt; where I'm going, and I'm making progress towards it. Yay, me.&lt;br /&gt;&lt;br /&gt;So there's an overview of how I improved my lot in life. The hardest part was overcoming inertia and getting started. Well, that, and persevering through to the goal. ;-)  If you're happy where you are, don't forget to look around and appreciate that from time to time. Every job has its annoyances and challenges I imagine, but it is possible to find one where you feel fulfilled and appreciated, where your skills are useful, and where the challenges are fun. You deserve a job you enjoy.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/06/change-your-organization-or.html' title='Change your organization, or...'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6894118727182410320' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6894118727182410320'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6894118727182410320'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6226588754142635025</id><published>2008-06-01T16:05:00.001-05:00</published><updated>2008-06-01T16:06:33.619-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='agileaustinopenspace'/><title type='text'>Lurking Under that Resistance</title><content type='html'>Some of the topics at the AgileAustin Open Space revolved around a theme. Is Agile appropriate for critical systems (medical, life-supporting software)? Can we use Agile when we have a fixed timeline and a finite budget? Will Agile work when our software supports an always-on manufacturing floor? What about when developing strategic software, breaking new business ground? Are there times when Agile is not appropriate?&lt;br /&gt;&lt;br /&gt;I believe the conveners are primarily asking these questions as proxies. They're at the conference because they believe in Agile, but they've been asked these questions by stakeholders they need to convince. So they're looking for help in crafting their arguments.&lt;br /&gt;&lt;br /&gt;In my experience, resistance to Agile derives from an underlying fear. That fear tends to take some mix of two forms: "I've invested my career in getting good at one way of doing things, and you want to make me obsolete," and "My rear is on the line for a lot of money. I'm not interested in risking my rear while you experiment with your touchy-feely methodology. Just deliver."&lt;br /&gt;&lt;br /&gt;When trying to convince someone, first sussing out his concerns and then pitching your argument to address them will make you most effective.&lt;br /&gt;&lt;br /&gt;For the fear of obsolescence, convey that, while some ways of doing things may no longer be needed, the &lt;em&gt;person&lt;/em&gt; is still valued, and he has skills and experiences that will help the team make the transition. Give that person a clear role, an obvious place of value, and his fears and therefore resistance should relax. &lt;br /&gt;&lt;br /&gt;To those who are inherently change-averse, you can still work to improve the feeling of safety, to make the change more palatable. There are some folks, however, whom Agile doesn't suit. Let them find jobs as SOX auditors or something.&lt;br /&gt;&lt;br /&gt;For those who seek assurances that this crazy experiment will deliver, on time and on budget, I take two tacks. I show them burndown charts, and explain how you can clearly see, "Does this trend line look like it's going to hit the finish line when you want it to?" Burndowns are very communicative graphics; they're a great tool. Second, I ask permission to try it for a month. Just, give me two sprints. Worst case, you've lost a month, which you would have spent writing half of a Business Requirements Document. Best case, you might have a few high-value, ready-to-ship features. That's a pretty good risk-to-return ratio.&lt;br /&gt;&lt;br /&gt;Understand what fears are hiding behind their resistance. Address those fears (usually without making direct mention of them; fear tends to turn defensive if you point out a perceived weakness). Talk in their language, using their own levers, to present your case (e.g., talk numbers to a finance person). Finally, ask for something reasonable: "You don't have to do this forever, just let us try it for a bit, and then you can decide whether to continue or adjust."</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/06/lurking-under-that-resistance.html' title='Lurking Under that Resistance'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6226588754142635025' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6226588754142635025'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6226588754142635025'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6883141654301481330</id><published>2008-05-30T22:18:00.004-05:00</published><updated>2008-05-30T22:28:10.194-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='agileaustinopenspace'/><title type='text'>Agile Open Space: On Certifications</title><content type='html'>The &lt;a href="http://openspace.agileaustin.org/"&gt;AgileAustin Open Space&lt;/a&gt; has kicked off. I found the opening session positive, engaging, really fun to be there. I'm chuffed because I felt confident enough to suggest (convene) a few sessions. One responsibility of a convener is to capture notes from the session. This blog post is meeting that responsibility.&lt;br /&gt;&lt;br /&gt;Y'see, one of the sessions I proposed was entitled, "&lt;em&gt;Certified&lt;/em&gt; ScrumMaster??" I wanted to gauge people's opinions of the CSM certification: Is it valuable, is it real, or is it just r&amp;eacute;sum&amp;eacute;-padding fluff?&lt;br /&gt;&lt;br /&gt;I got my answer. The groans, grumbles, and rolled eyes around the room confirmed my suspicions. In &lt;em&gt;this&lt;/em&gt; crowd at least, it is worse than irrelevant. It is counter to and detrimental to the philosophy of the Agile community.&lt;br /&gt;&lt;br /&gt;After the proceedings broke into less formal conversations, I caught up with some community members whom I respect and enjoy. They elaborated on their earlier non-verbal remarks. It is not difficult to get a CSM; you attend a two-day class. That's it. That sounds like just enough knowledge to be &lt;em&gt;really&lt;/em&gt; dangerous. &lt;br /&gt;&lt;br /&gt;Why do we even need certifications? What does a certificate indicate about my real skills, abilities, and past experience? No, I inherently reject any model that sets up a gate-keeper-style hierarchy to knowledge&amp;mdash;a system that says, "We know things; you don't. Your ideas and perspectives are not as good as ours until we bless you and permit you to be one of us (and your check clears)." I don't accept religions that do this, nor governments, nor software project methodologies, for Pete's sake. &lt;br /&gt;&lt;br /&gt;The true flaw in the CSM is the name: Certified ScrumMaster. Go to a hiring manager and ask which she'd rather have, someone with 3 years' experience as a Scrum team member, or a Certified Scrum Master [trumpet fanfare]. Those in the know, know that ScrumMaster is the role; you hear it without the space. But to those who are not yet well versed in Scrum, it sounds like Mastery of the Scrum process; they inject a space between the words. &lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.scrumalliance.org/training/"&gt;Training&lt;/a&gt; page on the Scrum Alliance website says it plain: "The journey to mastery &lt;em&gt;begins&lt;/em&gt; with..." and "These courses [CSM and CSPO] provide a solid &lt;em&gt;foundation&lt;/em&gt; to &lt;em&gt;help&lt;/em&gt; you make the &lt;em&gt;paradigm shift&lt;/em&gt; to managing a project using Scrum." [emphasis added] They state straight up that this is the starting point. But the name of the certification doesn't say that. The opportunity for misinterpretation will get people into trouble.&lt;br /&gt;&lt;br /&gt;Why does it get my dander up? Personally, because it threatens to be Another Damn Thing I gotta do to stay in the game. Professionally, because agile projects can be magnificent, and certifications smack of the process-for-process'-sake mindset that turns software development into a tedium. Philosophically, because neophytes will incorrectly elevate the merit of opinions from a Certified ScrumMaster, no matter how little experience he may have, and dilute and muddle the tenets of Agile.&lt;br /&gt;&lt;br /&gt;Mike Cohn the other night joked about the CSM culminating in a tattoo. I don't know, man, I might put more stock in &lt;em&gt;that&lt;/em&gt;, if the tattoo embodied the &lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;. (Em&lt;em&gt;bodied&lt;/em&gt;&amp;mdash;ha!) It would at least convey the right level of commitment.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/05/agile-open-space-on-certifications.html' title='Agile Open Space: On Certifications'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6883141654301481330' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6883141654301481330'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6883141654301481330'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-3002757184126263252</id><published>2008-05-17T20:00:00.005-05:00</published><updated>2008-05-19T23:37:51.286-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Simplest Responsible Thing</title><content type='html'>Someone on Saturday asked rhetorically, how do you reconcile the agile philosophy of "do the simplest thing possible" with good OO design principles. That apparent conflict stems from misquoting the first part. The more useful version is:&lt;br /&gt;&lt;blockquote&gt;Do the simplest responsible thing that works.&lt;/blockquote&gt;&lt;br /&gt;That is, responsible to highly probable future features; responsible to your known performance demands; responsible to your business's security and reliability requirements. &lt;br /&gt;&lt;br /&gt;Above all, responsible to your future teammates (and your Future Self) who will have to support and maintain that code. Happily, this last responsibility is nicely supported by the emphasis on "simplest."&lt;br /&gt;&lt;br /&gt;Note also that it is "simplest," not "easiest." Your old familiar habits will be easiest, but if those habits were formed in a different paradigm&amp;mdash;say... old ASP that you learned by osmosis (Hey, we all had to start &lt;i&gt;somewhere&lt;/i&gt;.)&amp;mdash;then it will take some dedicated study to turn the responsible thing, the simplest thing, into something you can do easily. Meanwhile, the state of the art in Simple will keep moving, but that just gives us something to keep striving towards. That's what keeps it interesting, right?</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/05/simplest-responsible-thing.html' title='Simplest Responsible Thing'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=3002757184126263252' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3002757184126263252'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3002757184126263252'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6034041533209808615</id><published>2008-05-10T10:51:00.003-05:00</published><updated>2008-05-10T10:58:29.791-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Wrangling Rhinoceri</title><content type='html'>I've been asked to help some teammates become more comfortable with &lt;a href="http://www.ayende.com/projects/rhino-mocks.aspx"&gt;Rhino.Mocks&lt;/a&gt;. I'll practice my explanations here, and y'all can offer guidance and ask clarifying questions if you're so inspired. I'll be glad for the help.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rhino-what? What-mocks? What-what?&lt;/b&gt;&lt;br /&gt;The domain we're discussing is &lt;a href="http://en.wikipedia.org/wiki/Unit_testing"&gt;unit testing&lt;/a&gt;, the code that developers write to verify the logic in their code. Rhino.Mocks is not a testing framework, but a mocking framework, which means it allows you to mock (simulate) parts of your application. You use it along with a testing framework like &lt;a href="http://www.nunit.org/index.php"&gt;NUnit&lt;/a&gt; or &lt;a href="http://www.mbunit.com/"&gt;MbUnit&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;If you have written code without keeping an eye on testability, it is likely to be witheringly difficult to apply Rhino.Mocks after the fact. Life is simpler if you write the tests first, therefore Rhino.Mocks plays well with &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test-Driven Development&lt;/a&gt;, which drives you to design your code in a testable way.&lt;br /&gt;&lt;br /&gt;As far as &lt;em&gt;what&lt;/em&gt; it is, Rhino.Mocks is a dll you include with your test project files. You create a reference to it from your test project, and it gives you some additional classes and methods you can use within your unit tests.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;State-based and interaction-based tests&lt;/b&gt;&lt;br /&gt;There are two main styles of unit tests, state-based and interaction-based, and each is useful for different things. With state-based, you set up some variables, run them through the methods you want to test, and then verify that their &lt;em&gt;state&lt;/em&gt; has become what you expect. You use Assert statements to assert, "The state should be [this]. If not, fail the test." If you're testing an addition method, you can verify the state of the answer, as in, "I assert that 2 plus 2 &lt;em&gt;should be 4&lt;/em&gt;."&lt;br /&gt;&lt;br /&gt;Rhino.Mocks is used in interaction-based tests. Here you are verifying the interaction between your classes. For example, in a Model-View-Controller architecture, you could test your Controller's interactions with the Model and the View, as in, "I want to verify that, when the Controller is asked to display customers, it gets customers out of the data repository, runs the results through my CustomerFormatter class (I don't know, it's just an example), and sends them to be displayed on the user interface." &lt;br /&gt;&lt;br /&gt;You have three interactions there, so you'll probably write three tests. You are not testing what comes out of the data repository, just that the Controller talked to it. In fact, you don't even need a real data repository for this test. If you could just simulate that repository in a way that let you verify it was called... This is what Rhino.Mocks gives you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What next?&lt;/b&gt;&lt;br /&gt;Martin Fowler has written a great article, &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren't Stubs&lt;/a&gt;. If this is your first introduction to Rhino.Mocks and mocking frameworks, perhaps not everything in that article will click with you. It is still worth reading now, and I'll link to it again in my next post. It wouldn't hurt to read Martin's article twice.&lt;br /&gt;&lt;br /&gt;My next post will include why you would want to simulate classes instead of using the real thing. I also want to explain why you even want interaction-based tests. I have an intuitive sense of the value, but I am not yet good at articulating it. Feel free to chime in.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/05/wrangling-rhinoceri.html' title='Wrangling Rhinoceri'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6034041533209808615' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6034041533209808615'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6034041533209808615'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-1589345679323790930</id><published>2008-05-09T08:16:00.002-05:00</published><updated>2008-05-13T19:05:09.343-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Globally distributed scrum</title><content type='html'>I'm on record as saying that globally distributed scrum teams &lt;i&gt;can&lt;/i&gt; work, but sub-optimally. I'd like to retract and revise that position, so that something I'd said doesn't inadvertently lead a team down a poor path.&lt;br /&gt;&lt;br /&gt;My team's scrum adventure lasted from March 2007 to April 2008. (Why does it have an end date? Buy me a beer, and we'll talk. But none of the people who were a part of or were affected by our efforts wanted it to end. The project was a success.) We started out with four developers in Austin, six developers in Bangalore, a Test Lead in Austin, and five testers in Hyderabad. I'll call this the Two Parallel Teams period. Team members were moved over time, so that we became two developers in Austin, eight developers in Bangalore, a Test Lead in Austin, and three testers in Hyderabad. This is the One Distributed Team period. &lt;br /&gt;&lt;br /&gt;We had a good collection of team members, and I think we could have worked together very effectively, had the distance between our desks not been so great. I am not criticizing off-shoring; I am criticizing scattering your product owners, developers, and testers across different continents. Note who I included in that list there; if your dev team is co-located, but your product owner is far away, you have a distributed team.&lt;br /&gt;&lt;br /&gt;We did not have a choice about where our teammates should be located, but we had influence over which project methodology we would use. So the choice was not "distributed scrum versus co-located scrum," but instead "distributed scrum versus distributed waterfall."&lt;br /&gt;&lt;br /&gt;Do I still think distributed scrum is better than distributed waterfall? Yes, although with less unbridled enthusiasm. It required more meetings from all team members (including product owners) at crazy hours, but it still made it easier for the product owners to get the system they need; it still had us writing more code, more often, which is way more fun than fighting over contracts; and it still enabled productive, visible progress toward our goals.&lt;br /&gt;&lt;br /&gt;We were happiest in our Two Parallel Teams mode. The developers in one city worked on one feature, and likewise for the other city. The only people who really suffered here were the product owners and the scrum master, who had to accommodate a ten-and-a-half-hour time difference to have their sprint planning meetings. &lt;br /&gt;&lt;br /&gt;We offset our two-week sprints by one week, so that the testers could be shared between the two sets of developers. It worked okay because it did not require the "save state and hand off" process inherent in distributed teams. That process is, at the end of the day, you write an email explaining what you did, where your thoughts are about the work-in-progress, what you want your teammates to pick up, and what you want them to leave alone because it's currently too fragile to explain or share. It's like "hibernating" in Windows--save a snapshot of where you're at--and it takes time. &lt;br /&gt;&lt;br /&gt;The more distributed the team, and the more they need to collaborate, then the more time will be spent handing off, and the team will be less efficient. In our One Distributed Team mode, the hand-off process overwhelmed the development process, so that more time was spent &lt;i&gt;saying&lt;/i&gt; what you're doing than &lt;i&gt;doing&lt;/i&gt;. This is the dangerous mode I want to warn people away from. If multiple people are collaborating on a feature, they have to be able to talk to each other, in person, real time.&lt;br /&gt;&lt;br /&gt;There are still dangers lurking in the Two Parallel Teams mode. The most insidious is the way it undermines egalitarian, democratic, &lt;i&gt;self-organizing&lt;/i&gt; decision making. For a team to decide things like designs, system architecture, even working practices, they have to be able to discuss and debate as a team. This requires trust, camaraderie, and personal safety. Those things are built in informal, day-to-day interactions--y'know, the way friendships are built. Over email and conference calls, they happen incredibly slowly, if at all. &lt;br /&gt;&lt;br /&gt;You have to be comfortable with someone to be able to argue with him. The threads stitching together a global team are tenuous, and we operate with great delicacy to avoid snapping them. The communication channel is so anemic, you have to choose every word carefully, to ensure it does not accidentally offend. This is the opposite of having the confidence to know that, after we argue about this topic, we'll still be a team. Which means a lot of decisions go un-debated; they get made by default instead of by consensus.&lt;br /&gt;&lt;br /&gt;Do I recommend globally distributed teams? No. Regardless of the project methodology, and no matter how talented the team members are, you will be dramatically less efficient if the members of your team are scattered over the planet. If you're off-shoring, then off-shore--put developers, testers, product owners, project managers, &lt;i&gt;the whole team&lt;/i&gt; in one place. Software development is intrinsically collaborative. Structure your teams so that they may collaborate.&lt;br /&gt;&lt;br /&gt;This experience gave me a taste, however, of how fun scrum can be. With a co-located team, you could seriously rock and roll.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/05/globally-distributed-scrum.html' title='Globally distributed scrum'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=1589345679323790930' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1589345679323790930'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1589345679323790930'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-5716644898798121846</id><published>2008-05-02T07:54:00.002-05:00</published><updated>2008-05-02T08:01:58.891-05:00</updated><title type='text'>Software Development as Manufacturing Metaphor</title><content type='html'>Alistair Cockburn's talk the other night was inspiring, thought-provoking, and entertaining. If you have the opportunity to hear him speak, I highly recommend it.&lt;br /&gt;&lt;br /&gt;I have been wary of the agile community's current enthusiasm for the Lean literature, as applied to software development. I'm hesitant to trust "manufacturing" as a metaphor for "software development," because I work for a large manufacturing firm. My executive management believe they are experts in efficient manufacturing, and therefore apply those lessons to managing software teams. The agile-to-lean trend gives them permission to make this leap.&lt;br /&gt;&lt;br /&gt;The problem comes in attending to the wrong part of the metaphor. Incorrectly applied, it overlooks that developers are knowledge workers, and you are led to believe that they are interchangeable laborers who should specialize on a small task. Easily outsourced, among other things.&lt;br /&gt;&lt;br /&gt;But Mr. Cockburn made me realize the right part of the metaphor to apply, the useful part. He said, substitute "unverified decisions" for "inventory," and now you can map your team's process, look for bottlenecks, and improve throughput. When unverified decisions pile up, work is not getting done.&lt;br /&gt;&lt;br /&gt;Mr. Cockburn said that different types of bottlenecks mean you need different solutions. He also flouts the strictest adherence to Lean, which would have you remove all waste, and instead suggests &lt;b&gt;spending efficiency to increase throughput&lt;/b&gt;. You have too many developers and too few db designers? Let the devs iterate through a bunch of designs and code until they have it really baked, before handing it over to the db designer. Too many analysts and not enough devs? Get the requirements solid, signed off, and thoroughly detailed before giving them to the devs. Too few product owners to tell you which route to build? Build both and let them choose. &lt;br /&gt;&lt;br /&gt;Spend your excess efficiency in order to increase the speed of the overall team.&lt;br /&gt;&lt;br /&gt;Back to my beef with the manufacturing metaphor. Incorrectly applied, it lets you think waterfall software development makes sense: They give us the specs for a computer, we build it, it gets tested. But the scale is wrong. What a waterfall project actually does is give you the entire order for the DoD's workstation upgrade initiative, and you build 1000 computers before any of them get tested. (A huge backlog of unverified decisions.) Rapid iterations bring you back to building one computer at a time. And Scrum makes the deciding and the verifying nigh simultaneous...&lt;br /&gt;Developer: Purple or green?&lt;br /&gt;Product Owner: Purple.&lt;br /&gt;Developer: 2gigs or 4?&lt;br /&gt;Product Owner: Ooh, 4!&lt;br /&gt;Tester: Oops, hold it, you actually grabbed the 2.&lt;br /&gt;Developer: Whew, good catch.&lt;br /&gt;&lt;br /&gt;What I learned from Mr. Cockburn is that the Lean philosophy holds useful lessons for the agile practitioner. Drawing an analogy between writing software and installing chips on a motherboard does not help you, but thinking of your software team as a process comprising different roles, each with their own decisions to verify, can help you increase your team's productivity.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/05/software-development-as-manufacturing.html' title='Software Development as Manufacturing Metaphor'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=5716644898798121846' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5716644898798121846'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/5716644898798121846'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6608802783027095630</id><published>2008-04-28T21:40:00.003-05:00</published><updated>2008-04-28T21:49:07.988-05:00</updated><title type='text'>Computer as Brain Metaphor</title><content type='html'>I have been splitting my reading lately between &lt;a href="http://www.librarything.com/work/43791/book/29260101"&gt;finite automata&lt;/a&gt; and &lt;a href="http://www.librarything.com/work/63333/book/29448237"&gt;metaphors that shape thought and action&lt;/a&gt;. My husband Jonathan and I have an on-going debate about the appropriateness of using the computer as a metaphor for the human brain. I find it useful for describing all sorts of events; he feels it undervalues the capabilities and elegance of the brain.&lt;br /&gt;&lt;br /&gt;I probably don't need to pitch my side of the argument to y'all. You've likely said things like...&lt;ul&gt;&lt;li&gt;I wish I could install more RAM.&lt;/li&gt;&lt;li&gt;Dude, that guy totally overclocked his processor.&lt;/li&gt;&lt;li&gt;I can only hold x things in memory.&lt;/li&gt;&lt;li&gt;Core dump!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;But it bothers Jon, and he takes me to task whenever I say something that betrays my underlying metaphor. I've been trying to understand why we have different emotional stances on this, and I've hit on the following. As a programmer, I think of my computer as the outlet of my creativity, the tool by which I express my craft. A user tends to think of his computer as an annoying appliance that would give him access to all this great stuff (entertainment, social contact, information, pr0n), if it would just freakin' &lt;i&gt;work&lt;/i&gt;. You've seen how users treat their laptops: bang, pound, whack! Given how Jon and I view our brains (as valuable, precision tools), I can see why he does not want to think of his brain the way a user thinks of his computer.&lt;br /&gt;&lt;br /&gt;Beyond that, I see Jon's side: This metaphor leads you to think of intelligence in terms of processor speed or amount of RAM, which leads you to believe you can quantitatively compare the intelligence of one human to another, and that leads to a very narrow definition of human intelligence. There is more to intelligence than number of instructions per second. To satisfy me, a metaphor for intelligence has to accommodate empathy and personality and intuition. From these spring creativity, and society, and humanity.&lt;br /&gt;&lt;br /&gt;At least, that's what the wetware wants me to believe.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/04/computer-as-brain-metaphor.html' title='Computer as Brain Metaphor'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6608802783027095630' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6608802783027095630'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6608802783027095630'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-1006334461770465458</id><published>2008-04-18T13:23:00.004-05:00</published><updated>2008-04-18T13:54:54.692-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Runs in the Family</title><content type='html'>I'm a language geek, but I try not to be a nit about it. I like the subtle nuances in choosing the "right" word for a situation, but not at the expense of connecting and communicating with real human beings. However, sometimes a small change in word choice can have a large impact on clarity.&lt;br /&gt;&lt;br /&gt;In JP's &lt;a href="http://codebetter.com/blogs/jean-paul_boodhoo/archive/2008/01/29/nothin-but-net-austin-tx-april-7th-11th.aspx"&gt;Nothin' But .NET&lt;/a&gt; class last week, we had an object called "criteria." (He was creating a DSL for generating SQL statements. Neat stuff.) My brain kept tripping over the example, until I realized, "Oh! Your criteria is a single thing, and I'm expecting it to be a collection. Ah ha!" So I suggested a name-change to "criterion," not to be pedantic (I swear), but just to improve clarity.&lt;br /&gt;&lt;br /&gt;A little time passed, and then a student raised the objection I was expecting. "Well, actually, Merriam-Webster's says..." I know this objection well; I've explored it, and I've read Merriam-Webster's editorial philosophy (Did you know your dictionary has an Introduction?). M-W has a &lt;i&gt;descriptive&lt;/i&gt; focus, not prescriptive; their intent is to capture and document language usage in the wild. It's a good resource, but not when you want to know the "proper" use of a word.&lt;br /&gt;&lt;br /&gt;Knowing this did not improve my image in the class.&lt;br /&gt;&lt;br /&gt;Ah, well, I gotta be me. Teasing me, one student said, "Hey, you know so much about dictionaries. Do you have strong opinions on hash tables?" No... &lt;a href="http://www.google.com/search?hl=en&amp;q=Cichelli+%22minimal+perfect+hash+functions%22"&gt;that's my dad&lt;/a&gt;!</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/04/runs-in-family.html' title='Runs in the Family'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1006334461770465458'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1006334461770465458'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-2588574530924441551</id><published>2008-04-05T13:20:00.004-05:00</published><updated>2008-04-05T13:32:05.852-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>NAnt  and LINQ - namespace error</title><content type='html'>"The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)" &lt;br /&gt;&lt;br /&gt;I was getting this error when using a &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; script to  build a project I created in Visual Studio 2008. Turns out to be related to which .NET Framework is targeted, in this case.&lt;br /&gt;&lt;br /&gt;Aside: If you are &lt;em&gt;not&lt;/em&gt; using NAnt, and you're getting this error when you try to build, then make sure your project has a reference to the System.Core assembly. But if you use the defaults in Visual Studio 2008, then you already have this reference. My project would build through Visual Studio, but not through my NAnt script.&lt;br /&gt;&lt;br /&gt;Here's the cause. I thought I should use the latest stable release, instead of the latest beta, so I downloaded NAnt 0.85. It supports multiple frameworks, and by default it &lt;a href="http://nant.sourceforge.net/faq.html#default-framework"&gt;targets the framework in use&lt;/a&gt;. You can point it to another using the -t command-line argument.&lt;br /&gt;&lt;br /&gt;But NAnt 0.85 is aware of frameworks only up to 2.0. For LINQ, you need 3.5, and therefore &lt;strong&gt;you need NAnt 0.86&lt;/strong&gt; (in beta at the time of this writing).  I kept 0.85 just in case, so my NAnt folder contains a folder for each version; they co-exist.  I just changed the path in my &lt;a href="http://nant.sourceforge.net/release/latest/help/introduction/installation.html"&gt;nant.bat file&lt;/a&gt; to point it to 0.86-beta. And voil&amp;agrave;.&lt;br /&gt;&lt;br /&gt;Hope this helps. Yay, automated builds!</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/04/nant-and-linq-namespace-error.html' title='NAnt  and LINQ - namespace error'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=2588574530924441551' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/2588574530924441551'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/2588574530924441551'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-96872495056160295</id><published>2008-04-02T06:57:00.003-05:00</published><updated>2008-04-02T07:26:21.295-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Pretty code: Skeptical of elses</title><content type='html'>Pretty code is readable code. One strategy for code beautification is to look critically at every if/else statement. Is there a more streamlined way to write that statement? Cultivate a general mistrust of elses.&lt;br /&gt;&lt;br /&gt;Some examples...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Testing a boolean to return a boolean&lt;/strong&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;if (x == true)&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;return true;&lt;br /&gt;}&lt;br /&gt;else &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;becomes&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;return x;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you need to swap those,&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;return !x;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's a pattern. Recall that comparison operators (less than, greater than, equal to) return a boolean. So this also applies here:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;if (myPropertyToCheck == someValue) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return true;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;becomes&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;return myPropertyToCheck == someValue;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Guard clauses&lt;/strong&gt;&lt;br /&gt;You can use a guard clause when you are testing if it is safe to do something, and if not, you want to exit.&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;if (safeToDoThis)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;DoThis();&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;becomes&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;if (!safeToDoThis) return;&lt;br /&gt;DoThis();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When the DoThis() is rather involved, guard clauses greatly help the readability for your future teammates (even when that's you). Step 1, check if we're in an okay state, and if not, just get out of there. This saves you from the Hunt The Else game (although, if that matching else is that hard to find, you could break up your method into smaller pieces with more specific responsibilities).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Comparisons&lt;/strong&gt;&lt;br /&gt;Compare() and CompareTo() methods need to return -1, 1, or 0. It's handy that these are integers, because now you can harness the Power of Arithmetic to do your bidding. Also when you are comparing your own classes, you often want to compare a property that is a value type or a string. Those already have their own CompareTo() methods, which you can borrow.&lt;br /&gt;&lt;br /&gt;Say you want to sort your children by their ages. You don't need&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;if (child1.age &lt; child2.age)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return -1;&lt;br /&gt;}&lt;br /&gt;else if... &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Not just an if/else, but an if/elseif/else. Aaah!) Use instead:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;return child1.Age.CompareTo(child2.Age);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you want to sort them from oldest to youngest, this is where the arithmetic comes in. To flip a negative 1 into a 1, multiply it by negative 1. Same for flipping positive 1 into a negative 1. And zero, conveniently, doesn't mind being multiplied by anything. So you could say:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;return -1 * child1.Age.CompareTo(child2.Age);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can get it even simpler. Because -(-1) = 1, and -(1) = -1, your Compare() method becomes:&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;return -child1.Age.CompareTo(child2.Age);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Not only no elses, but also no ifs! Very pretty.&lt;br /&gt;&lt;br /&gt;Reducing the number of paths through your code (i.e., reducing cyclomatic complexity) gets it closer to being read like prose. Simpler code has fewer bugs, and your successors who have to read your code will think you are smart and good looking. Keep a healthy mistrust of else statements, and write pretty code.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/04/pretty-code-skeptical-of-elses.html' title='Pretty code: Skeptical of elses'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=96872495056160295' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/96872495056160295'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/96872495056160295'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7413188009815936746</id><published>2008-03-02T09:00:00.004-06:00</published><updated>2008-03-02T09:16:26.210-06:00</updated><title type='text'>5 Qualities that Make Social Software Social</title><content type='html'>I have single friends who try to meet people by going to bars. But the only thing you have in common with people you meet this way is that they are trying to meet people. Contrast this with taking a class, joining a club, of volunteering for a charity, where you meet people with a common interest and compatible outlook. Much more likely to hit it off.&lt;br /&gt;&lt;br /&gt;Social software intrigues me, as it ushers us further down our path to becoming integrated cyborgs. What creates self-sustaining communities? What causes some corners of digital life to reach critical mass and become essential social outlets, while others wither and wander off? What makes these sites successful?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt; and their knockoffs strike me as attempts to meet people in a bar (complete with the assault of unwelcome music when you walk in the door). &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt; (photos) and &lt;a href="http://www.myfolia.com/"&gt;Folia&lt;/a&gt; (gardening) are clubs for people with similar interests. I have fun hanging out in these clubs and enjoy the people I meet there. The first community-builder is: Pull together people with a common interest.&lt;br /&gt;&lt;br /&gt;Closely related but slightly different is that hobby-oriented sites give people something to talk about besides themselves. For a while I used &lt;a href="http://www.livejournal.com/"&gt;LiveJournal&lt;/a&gt; to keep in touch with my friends, until I got completely fed up with it. I like people better when I am not privy to their every insecure and narcissistic thought (and they shouldn't be subjected to mine, either). But when I keep up with my friends via Flickr, I see their projects, their trips, their outings and their adventures. Those are excellent conversation-starters. The second community-builder is: Plant conversation seeds, something to talk about or argue about that is outside the realm of psychotherapy.&lt;br /&gt;&lt;br /&gt;Something that delighted me about Flickr from the first time I used it is the human-oriented, whimsical language displayed by the software. The site greeted me in a different language each time I logged in—how silly! When they brought their new messaging system online and I received my first message, I said, "Hey! A message!" I clicked on it, and Flickr displayed on the screen, "Hey! A message!" That this "photo management system" would talk to me like a goofy, light-hearted friend charmed me utterly. The third community-builder is: Set the tone; make it a fun place to hang out.&lt;br /&gt;&lt;br /&gt;If you've played with Flickr or &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; or &lt;a href="http://www.librarything.com/"&gt;LibraryThing&lt;/a&gt;, you've had occasions where you go to look up one little thing, which causes you to stumble onto another thing, which leads you to another thing, and then you look at the clock and find that hours have elapsed, making you wonder if you were abducted by aliens who then wiped your memory. By allowing you to stumble upon content, following tangentially related linkages, these sites invite you to explore. The exploration engages your curiosity and keeps you there for hours. Unexpected discoveries create a feeling of delight. The fourth community-builder is: Enable serendipity.&lt;br /&gt;&lt;br /&gt;I have been puzzling over my own site, &lt;a href="http://www.invisible-city.com/"&gt;Invisible City&lt;/a&gt;, for years. My husband has posted a free print-and-play board game every month since 2000. We get an encouragingly consistent number of hits. The site has areas for visitors to comment, and yet... hardly anyone does. It's like performing a show every night to a sold-out crowd who never claps. The site is definitely missing something.&lt;br /&gt;&lt;br /&gt;Looking again for lessons from Flickr, Folia, and YouTube, I have a theory: Community members need to establish their own identities and create their own contributions. In other words, they need a profile page and a place to post their stuff. Invisible City is more like a gallery than a community, because people can come comment on &lt;span style="font-style: italic;"&gt;our&lt;/span&gt; content, but they can't display their own. Galleries provide a useful service, so there isn't necessarily anything wrong with Invisible City's format, but it will never become a hip hang-out unless it changes. The fifth community-builder is: Give members the means to showcase their distinct identities.&lt;br /&gt;&lt;br /&gt;Meat-market social networking sites aimed at helping singles hook up will always be transitory, passing in and out of popularity like fads. A community-oriented site can grow and blossom into a self-sustaining organism with staying power. Looking at my own habits and preferences as a user, I observe that the following five facets facilitate the formation of communities:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Provide services and features that pull together people with a common interest.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Give them something non-narcissistic to talk about.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Set the tone to create a fun place to hang out.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Enable exploration and serendipity.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Give members the means to showcase their distinct identities.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Do you have a fun site that you love to hang out in? What makes it fun and what keeps you coming back?</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/03/5-qualities-that-make-social-software.html' title='5 Qualities that Make Social Software Social'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7413188009815936746' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7413188009815936746'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7413188009815936746'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-2867023908050392958</id><published>2008-01-25T10:54:00.000-06:00</published><updated>2008-01-25T11:21:19.763-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Past the Summit</title><content type='html'>&lt;p&gt;Earning the "instigator" lable in my blog masthead, I collaborated with some fellow employees to present the "Agile Summit." Yesterday was the day. It was an internal event, a day of training to give a taste of the concepts—whetting the organization's appetite.&lt;/p&gt;&lt;p&gt;The day was definitely a success, but I am also relieved to be past it. (You need a good waterfall project, with lots of slack, to have the time to plan such a thing.) My product owner and I were also part of the agenda, as a case study of one of the few teams at our company using an agile method. Given only a few minutes to get my message out to 300 people, I chose to focus my talk on collaboration. If people learned only one thing from me yesterday, let it be this:&lt;br /&gt;&lt;blockquote&gt;Talk to each other.&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;Don't use documents and processes as walls to hide behind. Don't look to Agile to be new wallpaper for those old barriers. Agile is a different mindset, and tenet number one is collaboration. Break down barriers and get rid of gate keepers. Here are some of the compelling benefits we've experienced. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Between the business and developers: &lt;/strong&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;We're able to react to changes (or new information) in the business process, and we're always working on the highest priority features.&lt;/li&gt;&lt;li&gt;Prototypes—or, really, quick shells of working code—clarify requirements. It's easier to communicate what you want when you have something to look at.&lt;/li&gt;&lt;li&gt;Developers can understand the &lt;em&gt;why&lt;/em&gt; of what they are building, which lets them build the right thing.&lt;/li&gt;&lt;li&gt;As the business gives feedback and sees that feedback incorporated into the code, they get more engaged and give more feedback. It's worth their bother.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Between the testers and the business:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Testers are able to understand the business reasons and user goals.&lt;/li&gt;&lt;li&gt;Testers will ask questions from a user perspective ("Wouldn't the user want to do &lt;em&gt;this&lt;/em&gt;?"), which makes a better product.&lt;/li&gt;&lt;li&gt;Here's a quote from one of our India-based testers, when asked about the advantage of our project's collaborative model: "Everyone in the team has the freedom to ask questions and concerns to the Business." Freedom. Right on.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Between the testers and the developers:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This code is more tested, period, than on any of my past projects.&lt;/li&gt;&lt;li&gt;Developers get feedback the very next day on code they have just written. &lt;/li&gt;&lt;li&gt;Testers are aware of changes in requirements and logic because they are attending the stand-up calls. No need for change requests and updating specification docs.&lt;/li&gt;&lt;li&gt;Visibility (in the form of the burndown chart) gives us a real, honest feel for where we are in the project timeline. You can look at it and really know whether we're on time or not.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This collaboration makes us successful, and it makes the work more fun. I mean, which would you rather do: talk to a teammate or fill out a 20-page template?&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/01/past-summit.html' title='Past the Summit'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=2867023908050392958' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/2867023908050392958'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/2867023908050392958'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-7895405991219307485</id><published>2008-01-12T14:20:00.000-06:00</published><updated>2008-01-12T14:28:43.574-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Dictionary as DropDownList Data Source</title><content type='html'>I have a Dictionary&amp;lt;T,T&amp;gt; called myListOptions. To use it as the datasource for an ASP.NET DropDownList called MyList...&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;MyList.DataSource = myListOptions;&lt;br /&gt;MyList.DataTextField = "Value";&lt;br /&gt;MyList.DataValueField = "Key";&lt;br /&gt;MyList.DataBind();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It took me some rummaging to realize that you use the actual strings "Value" and "Key," so I hope this post comes in handy for someone else in the future (even if it's me).</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2008/01/dictionary-as-dropdownlist-data-source.html' title='Dictionary as DropDownList Data Source'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=7895405991219307485' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7895405991219307485'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/7895405991219307485'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-4402684407503541985</id><published>2007-12-31T16:04:00.000-06:00</published><updated>2007-12-31T16:32:45.216-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Scrum of Scrums</title><content type='html'>Most of the developers on my team are in India, which means we're a little less than co-located. Yet we use scrum because it is &lt;em&gt;still&lt;/em&gt; better than waterfall.&lt;br /&gt;&lt;br /&gt;Early on, our strategy was to organize ourselves into two teams, and have the Austin-based team work on feature &lt;em&gt;A &lt;/em&gt;while the Bangalore-based team worked on feature &lt;em&gt;B&lt;/em&gt;. That way, we could reduce the impact of our globe-spanning timezones. (There are no normal working hours that overlap for either group. 11.5-hours difference.) We would stay out of each others' way and hardly need to talk at all.&lt;br /&gt;&lt;br /&gt;...Hardly need to talk at all? Yeah, that should have caught my attention right away.&lt;br /&gt;&lt;br /&gt;But we do learn&amp;mdash;this is why we have retrospectives. Exceeding any conference-call discomfort was the pain of not knowing what our teammates were doing, not being involved in additions to our code, not collaborating on a shared, emergent design. So we set both groups to work on the &lt;em&gt;same&lt;/em&gt; feature, and scheduled more conversations.&lt;br /&gt;&lt;br /&gt;We have two conference calls a week, one in the morning, one at night. Morning-aligned people take the early one; night owls attend the late one. The calls are just for developers, to talk shop. Some of our topics include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What we've done so far and what we're doing next;&lt;/li&gt;&lt;li&gt;How we'll structure our database tables;&lt;/li&gt;&lt;li&gt;The business domain;&lt;/li&gt;&lt;li&gt;Suggestions for improving the code.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I've started to enjoy these calls. Not only are they useful (essential, even) for building a coherent application, they are forming the social glue that allows us to collaborate and argue about the design, pulling us together into one effective team.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/12/scrum-of-scrums.html' title='Scrum of Scrums'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=4402684407503541985' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4402684407503541985'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4402684407503541985'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-1801909706008263850</id><published>2007-12-10T18:14:00.000-06:00</published><updated>2007-12-10T18:33:33.095-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Presenting to Managers</title><content type='html'>From Edward Tufte's one-day class "Presenting Data and Information," my key epiphany is this:&lt;br /&gt;&lt;blockquote&gt;Your audience is not dumb; they are busy.&lt;/blockquote&gt;&lt;br /&gt;There's a common "wisdom" that we need to dumb-down presentations to managers, but this is a hindrance to your message.&lt;br /&gt;&lt;br /&gt;No, instead, imagine you are &lt;span style="font-style: italic;"&gt;really busy&lt;/span&gt;, and you have a lot of demands on your time and, more importantly, your attention. In that mindset, what information do you need, and presented in what order, so that you can make a decision?&lt;br /&gt;&lt;br /&gt;As technical people, we like puzzles. We like climbing over multiple steps to discover an answer. We are at times prone to structuring our presentations this way, too: Here's a neat problem, and here are all of the things I tried before finding an answer.&lt;br /&gt;&lt;br /&gt;This is a waste of time.&lt;br /&gt;&lt;br /&gt;Professor Tufte's argument architecture is this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Problem&lt;/li&gt;&lt;li&gt;Relevance (why it is relevant)&lt;/li&gt;&lt;li&gt;Solution&lt;/li&gt;&lt;/ul&gt;Note that there is no time spent on how we came to the solution. Note also that there is no step for dumbing down the problem or the solution.&lt;br /&gt;&lt;br /&gt;Your audience is smart, but busy.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/12/presenting-to-managers.html' title='Presenting to Managers'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=1801909706008263850' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1801909706008263850'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/1801909706008263850'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-8844858425211448635</id><published>2007-12-03T21:37:00.000-06:00</published><updated>2007-12-03T22:51:16.941-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><title type='text'>My Kind of Cleaning</title><content type='html'>In answer to my previous &lt;a href="http://www.invisible-city.com/sharon/2007/12/climbing-logistics.html"&gt;puzzler&lt;/a&gt;—that was a real &lt;span style="font-style: italic;"&gt;cliffhanger&lt;/span&gt;—here's the walkthrough for cleaning my route. Recall that this was my first time, so I'm describing what it was like, not giving instructions. Learn to climb from a qualified guide. I mean it.&lt;br /&gt;&lt;br /&gt;First, think through the whole scenario and collect the gear you will need. Realizing you are one biner short when you are up in the air is too darn late. I needed two slings of webbing, each with its own locking-gate carabiner, plus an extra biner. For each sling, I used a &lt;a href="http://www.animatedknots.com/girth/"&gt;girth hitch&lt;/a&gt; to attach one end to the front of my harness, then clipped the loose end with a biner into a gear loop at my hip. I hung the spare biner in a gear loop, too.&lt;br /&gt;&lt;br /&gt;Next, you climb on &lt;a href="http://en.wikipedia.org/wiki/Top_rope"&gt;top-rope&lt;/a&gt; back up to the anchor, and ask your belayer to "take" (take your weight; hold your rope locked off). You clip each sling into a hanger, to set up your personal safety system, and screw shut the locking gates of the carabiners. At this point, you should be held to the rock by your slings and not depending on the rope. Test this by asking for some slack, and noting that, as the rope goes slack, your slings become taut and bear your weight. Then you can ask your belayer to take you "off belay."&lt;br /&gt;&lt;br /&gt;Now that you're set to hang out here all day, tie a backup knot to make sure you don't lose that dang rope: Grab a bight of rope and tie a quick knot and clip it into the spare carabiner. Because you're about to do the exact opposite of what your frightened little monkey brain would want you to do—you're going to untie the rope from your harness. And if you drop it, you &lt;span style="font-style: italic;"&gt;will &lt;/span&gt;get to hang out here all day.&lt;br /&gt;&lt;br /&gt;So, yes, untie the knot. The umbilical &lt;a href="http://www.animatedknots.com/fig8follow/"&gt;figure 8&lt;/a&gt; from which you so often hang your precious hide. Untie it.&lt;br /&gt;&lt;br /&gt;Remove the rope from the quickdraws and run it through the bottom links of the chains. We use the chains for lowering from the final climb out of necessity, but avoid using them all the time in order to minimize the erosion we subject them to. Retie your figure 8, untie the keeper knot, and retrieve your quickdraws.&lt;br /&gt;&lt;br /&gt;Hoist yourself up a bit and ask your belayer to take, so that you can confirm that you are back on belay and the rope will hold your weight. Unhook your personal safety slings and clip them back to your gear loops to keep them out of the way. You are ready to be lowered to terra firma.&lt;br /&gt;&lt;br /&gt;In addition to being a MYST-like brain teaser, I found route cleaning to be a good barometer of my mental state. Late in the afternoon, I'm hanging from the slings, and I think, "Okay, I have no idea what to do next... Must be time for dinner."&lt;br /&gt;&lt;br /&gt;And it was. So we three girls drove back into town and ate three cheeseburgers, and they were very, very good.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/12/my-kind-of-cleaning.html' title='My Kind of Cleaning'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=8844858425211448635' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8844858425211448635'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8844858425211448635'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-3395404582552129837</id><published>2007-12-03T10:53:00.000-06:00</published><updated>2007-12-03T11:29:36.248-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><title type='text'>Climbing Logistics</title><content type='html'>Great day of climbing yesterday with &lt;a href="http://www.sheclimbs.org/"&gt;SheClimbs&lt;/a&gt; on &lt;a href="http://www.rockclimbing.com/photos/Sport/Shanes_first_climb_65717.html"&gt;Zoe's Wall&lt;/a&gt; at Reimer's Ranch--never too hot, patches of sunshine and blue sky, great company. I &lt;em&gt;cleaned&lt;/em&gt; a sport route for the first time, and this was really neat. It's just like a MYST puzzle. I'll set up the challenge for you...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Before your climb, a teammate lead-climbed the route and set up an anchor for you at the top, using some of your equipment. Now you need to climb up there, retrieve your equipment, and get safely back down.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Setup:&lt;/strong&gt; At the top of the sport route, there is an anchor system. This system comprises two &lt;a href="http://www.soloarquitectura.com/foros/showthread.php?t=408"&gt;hangers&lt;/a&gt;, bolted into the rock, and a few links of chain hanging from each hanger. Your lead climber clipped a &lt;a href="http://www.gearexpress.biz/Merchant2/merchant.mv?Screen=PROD&amp;amp;Store_Code=G&amp;amp;Product_Code=9780"&gt;quickdraw&lt;/a&gt; into each hanger, and ran the rope through the bottom carabiners of the quickdraws. (Here's an &lt;a href="http://www.climbingwalls.net/IM000434.JPG"&gt;anchor using a rope&lt;/a&gt; instead of two quickdraws.) This allows many climbers to use this rope and anchor while minimizing the wear and erosion on the chains. But you want your quickdraws back.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Constraint:&lt;/strong&gt; You're 25 or 30 feet in the air. You climbed that high using your own muscle power, and you've been climbing for hours already. You're tired. You don't want to fiddle with ropes and clips and slings while hanging by the tender fingertips of one hand above the rocks and trees below.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Solution:&lt;/strong&gt; What to do? (Open the spigot to drain the water from the chest, close the spigot, fill the tower with water to make the chest float up...) I'll let you think about it for a bit. Perhaps if you look around, there might be some more gear here at the bottom that you could click on.&lt;br /&gt;&lt;br /&gt;The problem-solving challenges is one of my favorite things about this sport. Hanging with great people and the sense of accomplishment are two more. You really make a connection with the woods when you're that close to the rock.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/12/climbing-logistics.html' title='Climbing Logistics'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=3395404582552129837' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3395404582552129837'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3395404582552129837'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-8519503556077118564</id><published>2007-11-26T15:19:00.000-06:00</published><updated>2007-11-26T17:32:38.606-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Convincing through Understanding</title><content type='html'>People resist change out of fear. Winning people over to change requires identifying, discussing, and collaborating to resolve their fears.&lt;br /&gt;&lt;br /&gt;I had the opportunity last week to talk with a small software company about what's exciting about scrum. My battle scars all come from years in a BDUF (Big Design Up Front) shop, so I was non-plussed to find that this small, smart, co-located group was looking to scrum because they craved &lt;em&gt;more&lt;/em&gt; structure. It's an important reminder: Agile methodologies &lt;em&gt;are&lt;/em&gt; processes. They're just processes for adapting to change, instead of anticipating and squelching change.&lt;br /&gt;&lt;br /&gt;Not everyone in the audience was a fan of scrum. Some were skeptical, or intrigued but full of questions, while others were adamantly opposed. A totally different company from the one I work for, yet the objections were eerily similar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maybe that works for a [big/small] company, but it won't work in our [small/big] company.&lt;/li&gt;&lt;li&gt;More meetings?!&lt;/li&gt;&lt;li&gt;We don't have enough resources for [testing/support/pair programming/a Scrum Master who isn't a developer].&lt;/li&gt;&lt;li&gt;Constant feedback? That's so disruptive. They keep changing their minds. I'll never get anything done if I talk to them every day.&lt;/li&gt;&lt;li&gt;If you build the architecture as you go, what if you get it wrong?&lt;/li&gt;&lt;li&gt;When do you create documentation?&lt;/li&gt;&lt;li&gt;Who prioritizes the requirements? &lt;em&gt;How &lt;/em&gt;do you prioritize? How do I get infrastructure and foundation pieces onto the list?&lt;/li&gt;&lt;li&gt;How do you know if you're on time?&lt;/li&gt;&lt;li&gt;I prefer my private cubicle. I don't like talking with people all the time. I'd rather be efficient than social.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You can hear the fears behind these objections if you listen openly:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I know how to do what we do, and you're talking about &lt;em&gt;changing&lt;/em&gt; how we do what we do. That's going to make me look less competent.&lt;/li&gt;&lt;li&gt;I'm stressed about deadlines and my workload, and it sounds like you're &lt;em&gt;increasing &lt;/em&gt;my workload.&lt;/li&gt;&lt;li&gt;I'm constantly harrangued about dates and deadlines, and you're proposing a deadline every [1 to 4] weeks. That sounds like incessant stress.&lt;/li&gt;&lt;li&gt;My past conversations with my [customer/user/business partner/product owner] have been abusive and dysfunctional. Every time they tell me what they &lt;em&gt;really&lt;/em&gt; want, I have to disappoint them because of resource constraints. They have no faith in our estimates of effort or duration. I can't convince them to invest time in supportability, maintainability, or scalability requirements. There's no love here.&lt;/li&gt;&lt;li&gt;Face it, I'm an introvert. Why do you want to force me to be extroverted?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Once you're hearing what people are really telling you, then you can discuss the underlying concerns. Together, you and your audience can collaborate to clear up those concerns. What was initially a roadblock&amp;mdash;a rigid resistance to change&amp;mdash;becomes a challenge to be solved together.&lt;/p&gt;&lt;p&gt;I feel like a big cheese monkey for quoting &lt;em&gt;The Seven Habits&lt;/em&gt;, but it's elegant and succinct on this point: Seek first to understand, then to be understood.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/11/convincing-through-understanding.html' title='Convincing through Understanding'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=8519503556077118564' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8519503556077118564'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/8519503556077118564'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-6131884221572419516</id><published>2007-11-12T15:42:00.000-06:00</published><updated>2007-11-12T15:47:48.684-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><title type='text'>A little light reading</title><content type='html'>John Long's &lt;i&gt;&lt;a href="http://www.librarything.com/work/588749/book/16992117"&gt;Climbing Anchors&lt;/a&gt;&lt;/i&gt;, a technical guide to setting protection equipment into rock, could be subtitled "50 ways to leave your lover."&lt;br /&gt;&lt;br /&gt;Life-saving, perhaps, but not relaxing. Sheesh.</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/11/little-light-reading.html' title='A little light reading'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=6131884221572419516' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6131884221572419516'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/6131884221572419516'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-4039566619016152120</id><published>2007-10-29T08:53:00.000-05:00</published><updated>2007-10-29T08:57:24.546-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cooking'/><title type='text'>Kitchen Ah Has</title><content type='html'>Some incredibly useful forehead-slappers I have learned from Mr. Alton Brown...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Heat-proof gloves for oven mitts:&lt;/strong&gt; Go to the hardware store and look for welding gloves. They're leather, far more protective than kitchen-type oven mitts, and they have &lt;em&gt;fingers&lt;/em&gt;, so you can wrangle hot, difficult things like an evolved primate.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;#16 ice-cream scoop for muffins:&lt;/strong&gt; In art, my medium is muffins. Scooping the batter into the muffin tins is always the most difficult step: time-consuming, likely to spill on the counter, wispy scraps of batter around the outsides of the tin burn and affect the flavor, and you need to do it fast so you don't lose all the fluff from your baking powder. Enter: ice-cream scoop. A #16 is the perfect volume, and the thumb trigger dumps the batter right on target.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Egg slicer, with blades, for mushrooms, strawberries, what-have-you:&lt;/strong&gt; I used to think egg slicers were a unitasker, but I just wasn't thinking creatively enough. If you get one with metal blades instead of wimpy wires, you can quickly slice anything small and squishy. Which includes the tips of three fingers in one efficient pass, so watch yourself. *sniff*&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cast iron skillet:&lt;/strong&gt; Somehow I took it into my head that cast iron is difficult to clean or care for or cook with. I don't know where I got these ideas, because they are completely wrong. My cast iron skillet is the most used thing in my kitchen. Okay, to clean and care for: Follow &lt;a href="http://www.lodgemfg.com/useandcare.asp#natural"&gt;Lodge's instructions&lt;/a&gt; to season it once; from then on, clean only with water and a scrubbie, dry it right away, and coat it from time to time with a little fat (cooking spray, butter, or... bacon!). The easiest way to clean it is to dump water in it right after you take food out of it (deglazing, the foodies call this), scrape off the bits with your spatula, and dump the water out. The heat of the pan will probably dry it in a hurry, or you can wipe it with a towel if it has cooled. Then, as far as cooking goes: For nearly every application, the weight and heat inertia of a cast iron pan will make you so happy. With a wimpy aluminum pan, as soon as you add ingredients, you cool the pan way down. You'll never get a nice brown crust on a steak with an aluminum pan. And with teflon pans, you have to be so neurotic about which utensils you use and how you wield them. Mr. Cast Iron is not afraid of anything in my kitchen drawers.&lt;br /&gt;&lt;br /&gt;I could watch &lt;em&gt;Good Eats&lt;/em&gt; all day, and I have no self control when there are Alton Brown DVDs in the house. I like the nerdy food science, and I like his "Anyone can cook!" approach to cooking instruction, but my favorite parts are the world-altering revelations of new ways to use kitchen implements. "Holy cow, why didn't &lt;em&gt;I &lt;/em&gt;think of that? This changes everything..."&lt;br /&gt;&lt;br /&gt;Do you have any Ah Has?</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/10/kitchen-ah-has.html' title='Kitchen Ah Has'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=4039566619016152120' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4039566619016152120'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/4039566619016152120'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-2848815096957869647</id><published>2007-10-26T12:21:00.001-05:00</published><updated>2007-10-26T12:41:54.383-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>What tools do you use?</title><content type='html'>I've been meeting with other teams at work who are curious about how my team is using scrum. The most common first question is: "What tools do you use?"&lt;br /&gt;&lt;br /&gt;I've finally hit upon the answer. Previously, this question had been so daunting to answer because it is inherently the wrong question, when you're just starting out. At least, if you translate "tool" to mean "software application." eScrum or Mingle or VSTS does not make you agile. Your philosophies and your strategies make you agile.&lt;br /&gt;&lt;br /&gt;Here are the tools that we use:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The &lt;a href="http://agilemanifesto.org/"&gt;&lt;strong&gt;Agile Manifesto&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Shared sense of &lt;strong&gt;ownership&lt;/strong&gt;, where developers, testers, and business people have an equal stake in, and equal responsibility to, the success of the project. We're all pulling together.&lt;/li&gt;&lt;li&gt;Rigorous software &lt;strong&gt;engineering practices&lt;/strong&gt;, especially source control, continuous integration, readable (soluble? &lt;em&gt;grokkable&lt;/em&gt;?) code, and automated unit tests.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Communication&lt;/strong&gt;. All the damn time. As much like face-to-face as you can manage. We do our best with a globe-spanning agile team; if your teammates all reside in the same city, then for goodness sake take advantage of that luxury and meet in person.&lt;/li&gt;&lt;li&gt;Frequent &lt;strong&gt;feedback&lt;/strong&gt;, in many different forms. CruiseControl always tells us the health of our build; testers are testing functionality every day; business partners are reviewing and providing corrections all the time. The elapsed time between making a change and knowing if it is good is as short as possible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Retrospectives&lt;/strong&gt;, where the team talks honestly and candidly about what is going well and what could be improved, and then takes direct action on those improvements. Contrast this with end-of-waterfall "Lessons Learned" sessions; by the end of the project, it's too late, there's no point in trying to implement any changes because you won't be working with these people. Instead, meet every week or two weeks, or whatever works for your team, to decide what you want to do together to help your team.&lt;/li&gt;&lt;li&gt;Empowered, &lt;strong&gt;self-directed&lt;/strong&gt; team members, who collectively decide what fits best with their team. I'm happy to tell you which tools (from the "software application" sense of the word) we use and how long our sprints are and what processes we follow, but &lt;em&gt;your team &lt;/em&gt;is best qualified to determine what will work for &lt;em&gt;your team&lt;/em&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;From this sense, what tools do you recommend?&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/10/what-tools-do-you-use.html' title='What tools do you use?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=2848815096957869647' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/2848815096957869647'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/2848815096957869647'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-69451.post-3318019377952991397</id><published>2007-10-25T07:20:00.000-05:00</published><updated>2007-10-25T07:25:07.761-05:00</updated><title type='text'>Race, soon</title><content type='html'>In a week and a half, I'll be running in the Komen Race for the Cure again. I would gladly &lt;a href="http://www.komenaustin.org/site/TR/Race/General?px=1196593&amp;pg=personal&amp;fr_id=1060&amp;et=qXuzd7hGAfY_8jSIDHCbVg..&amp;s_tafId=9881"&gt;welcome your pledge&lt;/a&gt; to support breast cancer research.&lt;br /&gt;&lt;br /&gt;Will you be there on race day?</content><link rel='alternate' type='text/html' href='http://www.invisible-city.com/sharon/2007/10/race-soon.html' title='Race, soon'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=69451&amp;postID=3318019377952991397' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.invisible-city.com/sharon/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3318019377952991397'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/69451/posts/default/3318019377952991397'/><author><name>Sharon</name><uri>http://www.blogger.com/profile/13980506327238593790</uri><email>noreply@blogger.com</email></author></entry></feed>