<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkMMQXo5eCp7ImA9WxNbEU4.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662</id><updated>2009-11-13T12:48:00.420-05:00</updated><title>Abakas</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.abakas.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.abakas.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>531</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/Abakas" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;DkMMQXo5fip7ImA9WxNbEU4.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-8821800526963485009</id><published>2009-11-13T12:48:00.001-05:00</published><updated>2009-11-13T12:48:00.426-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-13T12:48:00.426-05:00</app:edited><title>Project Doldrums</title><content type="html">&lt;div&gt;Sometimes a project gets into a pretty frustrating state, in which:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;it's "mostly" done&lt;/li&gt;&lt;li&gt;it's highly visible&lt;/li&gt;&lt;li&gt;it's just starting to get tried by a broad audience, and not all of them know the background and details of the project, just this thing they have &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;been&lt;/span&gt; asked to try.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you're not careful, this is where you get stuck in the project &lt;a href="http://en.wikipedia.org/wiki/Doldrums"&gt;doldrums&lt;/a&gt;. Now is the time to avoid getting stagnated on the project. You're getting feedback, which is probably introducing new requirements or ideas. You're probably finding a few issues. It's likely that you have one or two things you already knew you needed to do. And those things just sort of keep piling on each other.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's now up to you to get control of it and get momentum again. (I could keep the doldrums metaphor going and say that you have to turn on the motor and get out of the listless winds.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Getting momentum isn't hard, really. There are only three key things that you must do:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Time box it.&lt;/b&gt; You should be happy to take feedback, but you're only giving people a set amount of time to provide it. After that, no new requirements, no whining. It will go into production as it is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;spec'd&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Make your task list public.&lt;/b&gt; You have a set of things you now need to do (fix bugs, update &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;config&lt;/span&gt;, add a few features). Publish it, and publish where you are on that list. That way you don't get the same complaints over and over, and when it's fixed, you can tell people to try again. It's a way to show that feedback is not ignored, that you will get to it, and that you are making progress.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Do only your tasks.&lt;/b&gt; Don't make random changes or other changes. Every change you make should be based on a task in your list. It is imperative that your task list be complete. If you find something else, add it to the task list, then do it. You don't want to give your (now very public) audience the impression that you're flailing around making random changes. It makes them lose confidence in you.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Projects can hit the doldrums. It will happen eventually. Don't worry about it overly; you can get out of them. Just do it with momentum, and do it with confidence.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-8821800526963485009?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/-_5bzB3hRlw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/8821800526963485009/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/project-doldrums.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8821800526963485009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8821800526963485009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/-_5bzB3hRlw/project-doldrums.html" title="Project Doldrums" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/project-doldrums.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAFRn45cSp7ImA9WxNbEEg.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-3240945129692648349</id><published>2009-11-12T14:32:00.004-05:00</published><updated>2009-11-12T14:38:37.029-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-12T14:38:37.029-05:00</app:edited><title>Rituals</title><content type="html">After you work in a team for long enough, you start to develop rituals, formal and informal. A &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;standup&lt;/span&gt; is a daily ritual. An iteration retrospective is a ritual. The guy who brings in donuts most Wednesdays is a ritual.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rituals are great. They are the affirmation that you're a team, and that the team is almost a living organism. It has a heartbeat and habits - and those are your rituals.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rituals are only affirming if they continue to have meaning. There's no point to having a retrospective if you're no longer coming to small stopping points every iteration. Otherwise it's just a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;standup&lt;/span&gt;, only longer; you can't retrospect in the middle of something. There's no point to having donuts on Wednesdays if you're forced to bring them in; the beauty of that ritual is the small thrill of informality.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Embrace the rituals you have. But evaluate them to make sure there is still meaning behind your rituals. As soon as they lose their meaning, stop doing them. There is no affirmation in empty rituals.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-3240945129692648349?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/DXZHIemMlbc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/3240945129692648349/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/rituals.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3240945129692648349?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3240945129692648349?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/DXZHIemMlbc/rituals.html" title="Rituals" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/rituals.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cFRnk7eSp7ImA9WxNUGUg.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-6963296169824529198</id><published>2009-11-11T10:30:00.003-05:00</published><updated>2009-11-11T12:03:37.701-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-11T12:03:37.701-05:00</app:edited><title>Break It Down</title><content type="html">&lt;div style="text-align: left;"&gt;We're working on an internal project that involves (among other things) sending notifications &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;programmatically&lt;/span&gt; to Jabber users. It's at that stage where it works for some people and not for others. There are two versions of code doing the sending (different OSes). There are two OSes on the clients, and there are about 10 different clients.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ACK&lt;/span&gt;!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So it's time to break it down. It's overwhelming to try to tackle it all at once, but if we make a table we can see what works and what doesn't, and start to try to get all "Y"s into the table, and see if there are any patterns. It gives us a base to work from.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hrCjqEFBjyE/SvruPjbuicI/AAAAAAAAALU/LrfR31aMxLE/s1600-h/screen-capture.png"&gt;&lt;img src="http://1.bp.blogspot.com/_hrCjqEFBjyE/SvruPjbuicI/AAAAAAAAALU/LrfR31aMxLE/s400/screen-capture.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5402892653961316802" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 135px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you're lost, write down what you know, manipulate the data to visualize it, and you'll see a way out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-6963296169824529198?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/_MiHkbCAxdk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/6963296169824529198/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/break-it-down.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/6963296169824529198?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/6963296169824529198?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/_MiHkbCAxdk/break-it-down.html" title="Break It Down" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hrCjqEFBjyE/SvruPjbuicI/AAAAAAAAALU/LrfR31aMxLE/s72-c/screen-capture.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/break-it-down.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8BSHc5eSp7ImA9WxNUGEo.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-9112329496088345196</id><published>2009-11-10T11:52:00.006-05:00</published><updated>2009-11-10T12:07:39.921-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-10T12:07:39.921-05:00</app:edited><title>Sufficient Quality</title><content type="html">&lt;div&gt;How do you measure yourself? How do you know your release is of acceptable quality? You've found a lot of bugs, and you've fixed a lot of bugs. You have a set of great new features, and you've done all sorts of interesting security and usability testing. It's a great release! Or is it?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Your release is of sufficient quality if your customers are sufficiently happy.&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The real trick here is to define "sufficient". You could have hundreds or thousands of bugs in the product, and if your customers don't hit them or don't mind them (or think a bug is a feature!), then it's still a release of acceptable quality. You could have a total of 5 bugs, but if your customers hit them a lot and they're bad, then this is not a release of sufficient quality.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So if you want to know how you as an engineering (and requirements gathering and sales) team are doing, ask your customers. They're the ultimate arbiters.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-9112329496088345196?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/5aYdeSUgCrQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/9112329496088345196/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/sufficient-quality.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/9112329496088345196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/9112329496088345196?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/5aYdeSUgCrQ/sufficient-quality.html" title="Sufficient Quality" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/sufficient-quality.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcDRnczcCp7ImA9WxNUF0U.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-8068344814025737295</id><published>2009-11-09T11:07:00.002-05:00</published><updated>2009-11-09T11:11:17.988-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-09T11:11:17.988-05:00</app:edited><title>Grunt Work</title><content type="html">&lt;div&gt;I've been working a bit on some data analytics projects. I've been looking at two major things:&lt;/div&gt;&lt;div&gt;(1) what kinds of issues we find in the field; and (2) what kinds of issues we find late in a release.  To do this, I go diving through our defect tracking system. We use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Jira&lt;/span&gt;, so this is mostly creating filters, and generally runs along the lines of "show me all the issues by client in the customer escalations project".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem - and this happens with many things - is that our reporting now has more data than it used to. For example, we didn't used to track which client an escalation was open at as a query-able field (it was just in the text). We now track it as a separate field, but that means that all the old issues were never updated. So I have two choices: I can either construct a special query that pulls the info out of the comments; or I can move the data into the field where that field is not populated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The advantage to a special query is that I can construct it and I don't have to touch a lot of bugs. The disadvantage is that I have to reuse and maintain that fairly complex query every time I need the information. (And if someone else wants to use it, well I hope they can figure out how!) So instead I'm going to make our old issues comply with our new practices - and populate the field we're now using.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The moral of today's story is:&lt;/div&gt;&lt;div&gt;&lt;b&gt;Sometimes, you just have to do the grunt work.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not fun, and sometimes it's more manual than I'd like, but your future self will thank you.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-8068344814025737295?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/PLP9_8pfQN4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/8068344814025737295/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/grunt-work.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8068344814025737295?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8068344814025737295?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/PLP9_8pfQN4/grunt-work.html" title="Grunt Work" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/grunt-work.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08NRns4cSp7ImA9WxNUFE4.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-3347896736506609394</id><published>2009-11-05T11:22:00.008-05:00</published><updated>2009-11-05T11:51:37.539-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-05T11:51:37.539-05:00</app:edited><title>Window of Opportunity</title><content type="html">It's relatively easy to decide to change things. It's even fairly easy to decide what you're going to do differently, generally. In order to be successful, though, you also have to consider when you make the change. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Any change has a window of opportunity,  time period during which it is most likely to be effective.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, let's say you decide to change your release process. Instead of simply sending an email to operations letting them know that the release is ready, you're going to appoint a "development &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;liaison&lt;/span&gt;" who will work with operations getting the release in production.  The goal of this change is to prevent unintentional &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;misconfigurations&lt;/span&gt; (which you've had a problem with in the past). You could do this change right at the beginning of your development effort, but it wouldn't really buy you a lot - after all, you're not releasing so you're not going to try your great new change. No, instead your window of opportunity is a bit before release.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As another example, let's say you're doing iterations and you're not quite perfect at it yet, so the end of an iteration is a bit... frantic. Don't introduce change when you're frantic - it'll only make you more frantic. Your window of opportunity is earlier in the iteration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So describe your goal, describe your change, and then think of your window of opportunity. All those together will help you gain success.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-3347896736506609394?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/1eYmxjrqipI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/3347896736506609394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/window-of-opportunity.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3347896736506609394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3347896736506609394?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/1eYmxjrqipI/window-of-opportunity.html" title="Window of Opportunity" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/window-of-opportunity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cAQXo_fyp7ImA9WxNUE0k.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-7882033060876139630</id><published>2009-11-04T08:24:00.008-05:00</published><updated>2009-11-04T08:24:00.447-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-04T08:24:00.447-05:00</app:edited><title>State Your Purpose</title><content type="html">Being a tester, I see a lot of tickets. Some tickets, unfortunately, hang around for a while, and tend to be worked on by multiple people. These wind up with the basic ticket writeup and a series of comments by different people. Particularly when the ticket is a difficult one, there are theories being tried and discarded.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's use an example:&lt;/div&gt;&lt;div&gt;We have an issue where access to the system, either for standard use (reading, writing data over mounts) or for diagnosis (logging in to the box) was slow. The system had several exported mounts, was performing replication, and was deployed in our lab. That's about all we knew going in to it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As we're working on the ticket, a lot of theories came up, ranging from load on the box to a kernel problem to a network issue (turned out to be saturation of the switch when other system using that same switch we engaging in network-intensive operations).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So the question becomes, how do we talk about this in the ticket? There are good and bad ways to write this up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A Poorly Written Comment&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The replication schedule is:&lt;/div&gt;&lt;div&gt;- 20:00 (average duration: 90 min)&lt;/div&gt;&lt;div&gt;- 07:00 (average duration: 45 min)&lt;/div&gt;&lt;div&gt;- 13:15 (average duration: 80 min)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A Well Written Comment&lt;/b&gt;&lt;/div&gt;&lt;div&gt;We noticed that the slowness described only occurs sometimes. Looking at what the box is doing at the time, it always seems to be replicating.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The replication schedule is:&lt;/div&gt;&lt;div&gt;- 20:00 (average duration: 90 min)&lt;/div&gt;&lt;div&gt;- 07:00 (average duration: 45 min)&lt;/div&gt;&lt;div&gt;- 13:15 (average duration: 80 min)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We've seen slowness at:&lt;/div&gt;&lt;div&gt;9/12 21:10&lt;/div&gt;&lt;div&gt;9/13 07:08&lt;/div&gt;&lt;div&gt;9/16 07:14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Earlier comments in this ticket indicate that load average is not the problem, but what else might replication be triggering? Early thoughts: increased threads, increased memory use, increased network use...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;The Six Month Test&lt;/span&gt;&lt;/div&gt;&lt;div&gt;A good comment is one that makes sense six months later, after you've forgotten all the details. This means it needs to:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;describe how it relates to the issue as a whole&lt;/li&gt;&lt;li&gt;describe what the reader is intended to do or take away from the comment&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Just like your bugs, write your comments for posterity. Future you will thank you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-7882033060876139630?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/h7hbF2wo_dE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/7882033060876139630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/state-your-purpose.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/7882033060876139630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/7882033060876139630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/h7hbF2wo_dE/state-your-purpose.html" title="State Your Purpose" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/state-your-purpose.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcAQXgzeyp7ImA9WxNUEks.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-5086374783987553038</id><published>2009-11-03T11:34:00.002-05:00</published><updated>2009-11-03T11:34:00.683-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T11:34:00.683-05:00</app:edited><title>Paralysis</title><content type="html">There are days when I walk into work and have a whole lot of different things that need doing, none of them short.  A typical list would look like:&lt;div&gt;- reinstall an object store (1 hour)&lt;/div&gt;&lt;div&gt;- finalize a task list (45 min, and needs people)&lt;/div&gt;&lt;div&gt;- run a scanner utility against a test data set to gather a baseline (2 hours)&lt;/div&gt;&lt;div&gt;- write up how to do a big configuration I've been working on (3 hours)&lt;/div&gt;&lt;div&gt;&lt;div&gt;- provide feedback on a document (1 hour or so)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;And I don't want to start any of 'em because that means I'm not making progress on the others! This is a form of paralysis. Fortunately, it's mild.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's only one way I know to get out of it, and that's to write down my task list for the day, pick one, and start. It doesn't matter which one I pick, as long as it's one single item.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this case, I invoked my particular prioritization method:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;first the stuff that's blocking other people&lt;/li&gt;&lt;li&gt;then the stuff I'm going to forget if I don't do&lt;/li&gt;&lt;li&gt;then the stuff that others are waiting for but not blocked by&lt;/li&gt;&lt;li&gt;then everything else.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;In this case, I did the feedback on the document, followed by the task list (also needed by others). After that, I did the configuration writeup, and then started on the scanner utility (and then the day was over!).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Does this ever happen to you? How do you deal with the "too much to do to even get started" problem?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-5086374783987553038?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/WZ2TeAld-n0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/5086374783987553038/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/paralysis.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/5086374783987553038?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/5086374783987553038?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/WZ2TeAld-n0/paralysis.html" title="Paralysis" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/paralysis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECQXczfSp7ImA9WxNUEUs.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-2016997540329637498</id><published>2009-11-02T08:31:00.010-05:00</published><updated>2009-11-02T08:31:00.985-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T08:31:00.985-05:00</app:edited><title>The Rest of the Product</title><content type="html">We have a test plan, and it's great. It covers all the features, and all the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;workflows&lt;/span&gt; of the application. We've got stories, we've accepted them. We've written some automated tests.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Congratulations, you're now half done with the product.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The product is not useful until you can actually use it in production. So now that you've built the darn thing, it's time to think about:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;What's production going to look like? How many machines? What configuration?&lt;/li&gt;&lt;li&gt;How are you going to get the software into production? &lt;/li&gt;&lt;li&gt;How about the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;config&lt;/span&gt; info? &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;How're&lt;/span&gt; you going to go from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;dev&lt;/span&gt; to test to prod? (hope it's not hard coded into the war file or rpm somewhere!)&lt;/li&gt;&lt;li&gt;Okay, once you got it into production, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;how're&lt;/span&gt; you going to start it?&lt;/li&gt;&lt;li&gt;Come to think of it, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;how're&lt;/span&gt; you going to stop it?&lt;/li&gt;&lt;li&gt;One day you're going to have to maintain this thing. Got a plan for that? Is down time okay? Can you do some rolling upgrades or maintenance?&lt;/li&gt;&lt;li&gt;How are you going to see what's going on? Got logs? Got a way to get logs back to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;dev&lt;/span&gt; for analysis?&lt;/li&gt;&lt;li&gt;How will you know it's running? Any monitoring? Notifications?&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;There are a lot of questions to answer once you've done the basic implementation.  Don't forget to include those when you're thinking about testing it, too.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-2016997540329637498?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/7NyIblo5ByM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/2016997540329637498/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/11/rest-of-product.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/2016997540329637498?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/2016997540329637498?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/7NyIblo5ByM/rest-of-product.html" title="The Rest of the Product" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.abakas.com/2009/11/rest-of-product.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UDSX87fCp7ImA9WxNVGU4.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-2973513614679615777</id><published>2009-10-30T15:18:00.002-04:00</published><updated>2009-10-30T15:34:38.104-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-30T15:34:38.104-04:00</app:edited><title>Taking Notes</title><content type="html">I tend to take notes in meetings. As I was doing that today, it occurred to me that there are different kind of notes that I take:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;All notes all the time.&lt;/b&gt; These are extremely extensive notes. It almost gets everything (but not quite - I'm not that fast). I take these kind of notes when I'm not sure what's going to be important. Typically these are Q&amp;amp;A sessions with customers, or a presentation for which I'm totally unprepared. I try not to do this often because it's really hard to listen and take these kind of notes at the same time. If I'm going to have to share notes with people not in the meeting, these are the notes I take.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Reminder notes.&lt;/b&gt; These are much more outline-like notes that I take for most meetings. These are intended to just provide triggers for my memory. These are the notes I take if I need to share them with people who are in the meeting.&lt;/li&gt;&lt;li&gt;&lt;b&gt;No notes.&lt;/b&gt; I do this for a lot of meetings. If I need to be actively participating (or leading) a meeting, I generally don't take notes. I'd rather be fully engaged while I'm there.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Do you take notes?&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-2973513614679615777?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/MZ3ryu_AKdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/2973513614679615777/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/taking-notes.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/2973513614679615777?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/2973513614679615777?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/MZ3ryu_AKdQ/taking-notes.html" title="Taking Notes" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/taking-notes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIDSHkzcSp7ImA9WxNVGE4.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-3288258973069057316</id><published>2009-10-29T12:39:00.000-04:00</published><updated>2009-10-29T12:42:59.789-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T12:42:59.789-04:00</app:edited><title>Choosing</title><content type="html">We make tool choices constantly, sometimes explicitly and sometimes implicitly. For example:&lt;div&gt;&lt;ul&gt;&lt;li&gt;I write a bash script to grab some network info off multiple machines. Tool chosen: bash. Didn't even think about it, just did it.&lt;/li&gt;&lt;li&gt;We're moving parts of our test plan into &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Jira&lt;/span&gt;. Tool chosen: wiki + &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Jira&lt;/span&gt;. This one we discussed for a while, and eventually made our choice based on some cruft with the wiki. I'm not sure it's going to work, but we're giving it a shot.&lt;/li&gt;&lt;li&gt;I burned a CD of  our latest installer. Tool chosen: Disk Utility on my mac. This one is quick and handy, and I haven't gotten a bad burn off it yet.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;As we make all these tool choices, we're implicitly considering the properties of the tool and comparing that to the requirements of the task. We have to think about only a few things:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;What is the tool good for?&lt;/b&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Jira&lt;/span&gt;, for example, is good for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;workflows&lt;/span&gt;. It's horrible for documentation. A wiki is good for documentation but &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;workflow&lt;/span&gt; is simply awful. Some tools are more equipped for long term projects and growth than others. Other tools are a lot lighter and good for quick or small projects.&lt;/li&gt;&lt;li&gt;&lt;b&gt;How convenient is it?&lt;/b&gt; The tool I already have will usually trump the tool I don't have, just because of setup overhead. It's not universally true, but it takes a really great feature - or a seriously large annoyance with what I have - for me to switch.&lt;/li&gt;&lt;li&gt;&lt;b&gt;How accessible is it? &lt;/b&gt;Whatever tool I use needs to be accessible to everyone who needs it. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;IMing&lt;/span&gt; out info is no good for my boss, for example, who doesn't use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;IM&lt;/span&gt;. If he needs to know, then I can't use the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;IM&lt;/span&gt; tool.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Many times tool choice is a really quick, almost unconscious decision. Other times it takes a lot of evaluation and explicit consideration (especially when it's expensive or has far-reaching ramifications). In the end, though, what tool you choose really only comes down to a few simple questions. So don't stress about it too much. In the end, it is just a tool.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-3288258973069057316?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/xqZaJjN0JKk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/3288258973069057316/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/choosing.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3288258973069057316?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3288258973069057316?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/xqZaJjN0JKk/choosing.html" title="Choosing" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/choosing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcAQX0_fSp7ImA9WxNVF0g.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-4497118585003865564</id><published>2009-10-28T14:04:00.006-04:00</published><updated>2009-10-28T14:04:00.345-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T14:04:00.345-04:00</app:edited><title>Postmortems</title><content type="html">After a release goes out the door, we hold a postmortem. It's pretty standard stuff, usually. We talk about what we did well, what really didn't work out, and what we didn't anticipate.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Timing is an issue, though. You can hold a postmortem right after release, or you can wait to see how it actually does in the field and then hold a postmortem. They each have benefits.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you hold a postmortem right after you release, you get:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Motivation.&lt;/b&gt; People are still stinging from the things we didn't do so well, and are generally aching to fix them. If it was a good release, getting together to remember it will also provide a good boost to people's egos (rightly so!).&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Recency&lt;/span&gt;.&lt;/b&gt; Memories are better right after the release, and you'll be able to have a better discussion about why you did things and what specifically didn't work about them. You'll have a much more precise discussion while &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;everyone's&lt;/span&gt; memories are fresh.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ability to change.&lt;/b&gt; If you want to make changes, the sooner you start them, the better chance you have.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;When you hold a postmortem after you have some field experience with it, you get:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Perspective.&lt;/b&gt; That process &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ya'll&lt;/span&gt; tried that seemed painful right after you did it might not be so painful now. Maybe you've learned it better, maybe you've started reaping benefits, maybe it wasn't as bad as it seemed.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Field Experience.&lt;/b&gt; Maybe that release that seemed really shaky has performed like a champion in the field. Perhaps that awesome release &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;ya'll&lt;/span&gt; tested extensively has had all sorts of problems. These are things you don't know until it's been out for a while.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;My not-so-innovative solution is to realize that our postmortems take us about 45 minutes. That's not very long, so we do both! We hold a postmortem within a week after we release. Then, we hold another one about 6 months later, when the release has been in the field for a while, and we ask ourselves how we &lt;i&gt;really&lt;/i&gt; did.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the land of making things better for ourselves, postmortems are a valuable tool. Holding them twice just lets us learn more from the software and from our development process than we could with just one. Give it a shot.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-4497118585003865564?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/-AkglUZIB5Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/4497118585003865564/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/postmortems.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4497118585003865564?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4497118585003865564?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/-AkglUZIB5Q/postmortems.html" title="Postmortems" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/postmortems.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIAQX8_fip7ImA9WxNVFks.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-7284898089157201592</id><published>2009-10-27T13:29:00.001-04:00</published><updated>2009-10-27T13:29:00.146-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T13:29:00.146-04:00</app:edited><title>The Other Fence</title><content type="html">A lot of derision has (rightly) been spilled on the idea that development writes code and chucks it over the fence at QA. Fortunately, at least in the places I've worked, this doesn't really happen any more.  That development-QA fence is basically gone (hooray!).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now maybe we should start working on the other fence.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other fence?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Think for a second about what happens when you're done testing (and developing) on a release. What do we do? We chuck it over the fence at operations (or professional services, depending on how installations and upgrades get done).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, &lt;i&gt;that&lt;/i&gt; other fence.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been thinking about this fence, and wondering if it's bad. After all, we didn't used to think it was bad that development finished and chucked the code to QA for work! Now we know better. Maybe we should be starting to learn better as we chuck a build out of engineering and into Operations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's posit for the moment that the engineering-ops fence is bad. What kinds of things might we do to break down the fence, and how might that help?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Change how we structure our builds to make them more releasable.&lt;/b&gt; This is somewhat analogous to writing more testable code.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Help deploy&lt;/b&gt;. Just like our developers do some testing now, maybe we can help deploy, or create some utilities to help. Rake tasks, deployment scripts, hand installations - how does this stuff get deployed, and can we make it easier or better?&lt;/li&gt;&lt;li&gt;&lt;b&gt;Get help building and packaging.&lt;/b&gt; Just like development sometimes asks a tester how best to approach a TDD problem, engineering can get some advice from operations on how to handle a configuration issue, or a packaging question.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Pair on problems.&lt;/b&gt; When there's a problem in the field, we don't have to look in isolation, or bounce questions back and forth. We can work on it together. With two different views and skills looking at the problem, you're more likely to figure out a problem that has a foot in both worlds.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Depending on your current organization, and on who receives your code, your list may be different. Maybe you're working with support right after release, or sales. Maybe engineering owns operations, so you don't have this problem. At this point, this is just something to think about.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What do ya'll think? Is there a fence after engineering? And is it time to start talking about that fence?&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-7284898089157201592?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/LRWl6BCGKsw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/7284898089157201592/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/other-fence.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/7284898089157201592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/7284898089157201592?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/LRWl6BCGKsw/other-fence.html" title="The Other Fence" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/other-fence.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UCSXk5fyp7ImA9WxNVFUo.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-4984780899221371014</id><published>2009-10-26T11:37:00.003-04:00</published><updated>2009-10-26T13:47:48.727-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T13:47:48.727-04:00</app:edited><title>Org Charts</title><content type="html">&lt;div style="text-align: left;"&gt;There are a lot of different ways to set up an engineering organization.  Generally, they fall into one of two categories: function-oriented, and team-oriented.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A function-oriented structure says that people with similar skills and responsibilities should be a team. That team then provides their collective services to other teams. A team-oriented structure says that everyone working on one goal (project, product, feature area, whatever) should be on the same team.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A Function-Oriented Organization&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hrCjqEFBjyE/SuWku5V8XFI/AAAAAAAAALE/uxTjzm6ZzEg/s1600-h/orgchart-function.png"&gt;&lt;img src="http://3.bp.blogspot.com/_hrCjqEFBjyE/SuWku5V8XFI/AAAAAAAAALE/uxTjzm6ZzEg/s400/orgchart-function.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5396900854047202386" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 157px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;This is a simplistic example of a function-oriented organization. You have your basic disciplines (development, test, product management) as separate groups, and within those groups you have different breakdowns based on the projects that you do. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pros:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;In-discipline learning is easier and more fruitful. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Devs&lt;/span&gt; will feed off what other &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;devs&lt;/span&gt; are doing, testers will see test innovation and build on it - all because you're working with people who are thinking about the same things you are.&lt;/li&gt;&lt;li&gt;Allows dynamic resource allocations. If you need an extra tester on a project, great, we can add a tester.&lt;/li&gt;&lt;li&gt;Explicit thought leadership. You have a head developer who is explicitly charged with improving architecture and development practices. You have a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;QA&lt;/span&gt; manager who is explicitly responsible for evaluating and refining test practices.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Cons:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;People are serving multiple masters. They're trying to help their teams and also to conform to their (function-oriented) organization structure. This leads to some conflicts of interest.&lt;/li&gt;&lt;li&gt;Higher risk of silos. If it's a separate group, then you're more likely to have problems with communication.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Use this when:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;You lack predictability in your projects. This happens in consulting a lot, but it can happen in other places, too. If you can't predict how many &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;devs&lt;/span&gt; you'll need, it helps to have a pool of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;devs&lt;/span&gt; to draw from.&lt;/li&gt;&lt;li&gt;You have unusual requirements on one or more of your groups. If you're doing some really unusual testing, for example, you may need to keep your testers together so you pick up the learning and innovation effect.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Warning:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Avoid this if you're attempting to embrace SCRUM or some other cross-functional team ownership mentality. The "multiple master" problem will get you in this case.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;A Team-Oriented Organization&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hrCjqEFBjyE/SuWkvJ93XyI/AAAAAAAAALM/YqQmURwVTNg/s1600-h/orgchart-team.png" style="text-decoration: none; "&gt;&lt;img src="http://3.bp.blogspot.com/_hrCjqEFBjyE/SuWkvJ93XyI/AAAAAAAAALM/YqQmURwVTNg/s400/orgchart-team.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5396900858509614882" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 112px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;This is a simplistic example of a team-oriented organization. Each team is a group, and contains members from all relevant disciplines.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pros:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Unity of purpose. The team is all working toward the same goals. There is no secondary or other goal.&lt;/li&gt;&lt;li&gt;Breakdown of silos. If you can get true team ownership, you start to find developers testing, and testers helping with product management, etc.&lt;/li&gt;&lt;li&gt;No need for functional management. The role of "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;QA&lt;/span&gt; Manager" goes away here. Instead you have team leads.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Cons:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Harder to drive functional change. When you have several teams with a few testers each, it's a lot harder for testers to innovate or learn from each other. The same goes for developers. The groups are simply too small to get that kind of momentum.&lt;/li&gt;&lt;li&gt;Hard to handle changing needs and moving through software development phases. You run the risk of having idle testers as you start an effort, and idle developers at the end of an effort. This is something that can be overcome, but you have to encourage cross-functional work, and be sure to plan appropriately.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Use this when:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;You're using SCRUM.&lt;/li&gt;&lt;li&gt;You can have generally stable teams. This implies your projects (or products) are pretty consistent in size and resource needs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Warning:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Avoid this if you have a particularly weak functional area (or more than one). There's a large risk that isolation within a stronger team will make them even weaker.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;So Which To Use?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I've seen organizations of both types - functional and team - work great. And I've seen them both fail spectacularly. The trick is to align your teams with your development and business philosophies. Have you embraced SCRUM? Are your projects generally consistent in size and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;skill sets&lt;/span&gt; needed? Cool - you probably want a team-oriented structure. Do you have highly specialized needs in one or more areas, or an extremely lumpy (in terms of resources wanted) plan? Consider a functional-oriented structure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the end, pick the structure that works for you. Just do yourself a favor and pick a single structure. Trying to mix and match will lead to heartache, but pick a single way and you'll give yourself a good chance at success.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-4984780899221371014?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/JkDFG9DFryQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/4984780899221371014/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/org-charts.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4984780899221371014?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4984780899221371014?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/JkDFG9DFryQ/org-charts.html" title="Org Charts" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_hrCjqEFBjyE/SuWku5V8XFI/AAAAAAAAALE/uxTjzm6ZzEg/s72-c/orgchart-function.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/org-charts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04AQX0-fyp7ImA9WxNVE08.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-8138999530441990906</id><published>2009-10-23T14:19:00.001-04:00</published><updated>2009-10-23T14:19:00.357-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-23T14:19:00.357-04:00</app:edited><title>Merging</title><content type="html">We work in what I imagine is a fairly typical environment. We code away on HEAD for a while. Once we're feature complete, we branch (so now we have HEAD and RELEASE). Then we fix stuff on HEAD and merge it to release until we hit code complete. We also go ahead with the next features on HEAD, but that's not currently the point.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The closer you get to code complete, and particularly after code complete, things get tricky. What do you merge?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are, after all, several kinds of changes that might be candidates for merging into your branch:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Code changes to production code.&lt;/i&gt; Bug fixes, new features, etc.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Code changes to test code&lt;/i&gt;. Change the tests, not the code that actually ships.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Infrastructure changes.&lt;/i&gt; Change something underlying about the lab or environment (e.g., update the default &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;fstab&lt;/span&gt; that gets installed)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So what do we do?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code changes to production code tends to be the most commonly considered case. You evaluate the risk of the change, how much retesting you need to do, the benefit of the change (and how many of your customers are likely to benefit), and the amount of time left before you really really have to ship. Based on that, you choose to take it or not.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code changes to test code are trickier. On the one hand, change is change and all change introduces risk. Sure, this code doesn't ship with your product, but it's still change. Plus, you have to consider risk here, too. If your test change breaks something, you might get less information out of your tests in the future, and that would be bad. On the other hand, it probably has some benefit, too: tests run faster so you can do more of them; or a test passes a failure point and lets you expose any other problems that occur later in the test; or perhaps you just spend less time looking at the error that isn't telling you anything new. For me, the bar to test code is lower than the bar to taking production code, simply because the risk to our actual (field) customers is lower, but there are some things that I try to consider:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Is the change caused by a failure or just a cleanup/enhancement/nice to have? The former is more likely to get put in than the latter.&lt;/li&gt;&lt;li&gt;Is the change going to fix something that causes problems for other tests? (e.g., a hang that stops all later tests in the suite from executing). A bad citizen like that is more likely to get fixed.&lt;/li&gt;&lt;li&gt;Is the change risky? The same types of analysis apply here as for product code. Avoid big, sweeping, likely-to-break-something changes.&lt;/li&gt;&lt;li&gt;How many more test runs are we going to have? The closer we get to the end, the longer we can just deal with the problem and not bother to fix it.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Infrastructure changes are generally not really optional. If you want your release tests to keep running in your infrastructure, they have to keep up with changes to your infrastructure. That being said, make sure you really need that infrastructure change, and be mindful of making the changes as small and safe as possible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Merging is a tricky business, and the closer you get to a release the more of a "gut feel" kind of thing it turns into. So before you get into the thick of it, think about what you will merge and why. It'll save you some arguments later!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-8138999530441990906?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/LR2PVPgP3v4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/8138999530441990906/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/merging.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8138999530441990906?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8138999530441990906?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/LR2PVPgP3v4/merging.html" title="Merging" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/merging.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IMQXk8cSp7ImA9WxNVEk4.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-8409271884428147713</id><published>2009-10-22T13:13:00.001-04:00</published><updated>2009-10-22T13:13:00.779-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-22T13:13:00.779-04:00</app:edited><title>All The Other Tests You Did</title><content type="html">I've been verifying bugs for the past day or so. It's actually work I really enjoy. The vast majority of the time, it's concrete evidence of the product being better, which is awesome. Plus it's very easy to see the progress I'm making, which appeals to the list maker in me (I &lt;i&gt;love&lt;/i&gt; checking things off!).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the thing, though: I'm not just verifying bugs. I'm performing lots of other tests at the same time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, a bug I verified was a display problem with replication progress. This is a small issue, but, hey, it's fixed, so we'll verify it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To verify it, I had to:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;install two systems&lt;/li&gt;&lt;li&gt;create a volume on one system&lt;/li&gt;&lt;li&gt;configure replication between the two systems&lt;/li&gt;&lt;li&gt;configure replication on the volume&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, just to verify one bug, I had to do an installation test, a volume creation test, and a replication test. All I had to do was a quick check to confirm these weren't throwing errors not visible to the end user, and then I have a small other thing done. Repeat enough time, and this adds up to rather a lot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So next time you're verifying a simple bug, ask yourself what other tests you're doing. You may be accomplishing more than you think!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-8409271884428147713?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/s9QvFEPs8qk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/8409271884428147713/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/all-other-tests-you-did.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8409271884428147713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/8409271884428147713?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/s9QvFEPs8qk/all-other-tests-you-did.html" title="All The Other Tests You Did" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/all-other-tests-you-did.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUCQXc7eip7ImA9WxNVEUg.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-4187694385504551816</id><published>2009-10-21T16:51:00.001-04:00</published><updated>2009-10-21T16:51:00.902-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-21T16:51:00.902-04:00</app:edited><title>Today's Top N</title><content type="html">I don't drive very often - I live and work within the city, and I tend to take the &lt;a href="http://www.mbta.com"&gt;T&lt;/a&gt; to work and pretty much everywhere else, too. Consequently, I don't listen to the radio very often. But this weekend I was on a road trip and I had the radio going. I kept hearing the same theme over and over as I flipped around the stations:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Today's Top 10"&lt;/div&gt;&lt;div&gt;"the Weekly Top 20"&lt;/div&gt;&lt;div&gt;"Top 5 Countdown"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And I remember thinking, "What a good idea!"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After all, the top 10 songs, or top 20 albums, or whatever, are in some ways like the parts of our test plans:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;some of them are the same over and over again&lt;/i&gt;: how many weeks is one song at the top of the charts, or at position two or five? Same thing with areas of code.&lt;/li&gt;&lt;li&gt;&lt;i&gt;some of them change each time&lt;/i&gt;: eventually a song falls off the list, and eventually we're comfortable enough with an area of our test plan that we move on.&lt;/li&gt;&lt;li&gt;&lt;i&gt;they sound a little different every time&lt;/i&gt;: maybe this week it's the dance mix and next week it's the acoustic version - same underlying thing, just a bit different.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So why not? Let's embrace the theme!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We happen to be really close to a release. So for this week, we're having the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;QA&lt;/span&gt; Top 4 (there are four of us, so this makes it easy). Every morning, we come in and pick the four areas we're currently least comfortable with, as a group. We all throw ideas around until we agree on the four. Then we go work mostly on those four items - they're the top of our list for the day. The next day, we repeat the procedure. Maybe it's four different items, maybe some of them are the same and some new - doesn't matter, really. But that's the new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;QA&lt;/span&gt; Top 4. So we work those new four for the day.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The idea here is that we get a chance, every day, to re-identify the scariest areas of the code. And then we work on them. If they're still scary, we'll work on them again the next day. If not, we'll work on the new scariest areas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are a lot of ways to prioritize things, but having new ways to think about it sparks new ideas. This is just a new (to me, anyway) way to present that old risk evaluation, and hey, it's kind of fun.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(And by the way, you should see the jokes.... "Replication, by the Again &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Agains&lt;/span&gt;" at #1, and "Defect Verification" off the "Oh Boy It Worked!" album at #2. We're pretty easily amused!)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-4187694385504551816?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/FYkQ5dV6E7M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/4187694385504551816/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/todays-top-n.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4187694385504551816?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4187694385504551816?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/FYkQ5dV6E7M/todays-top-n.html" title="Today's Top N" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/todays-top-n.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8AQX45eSp7ImA9WxNVEEg.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-7248053655872209422</id><published>2009-10-20T11:34:00.001-04:00</published><updated>2009-10-20T11:34:00.021-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T11:34:00.021-04:00</app:edited><title>Good Citizen</title><content type="html">As we're testing our software, we have lots of different kinds of requirements. We have use cases, functional requirements, performance requirements, usability requirements, testability requirements, etc. One of the requirements that we don't usually talk about explicitly is the good citizen requirement.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wait, what's  a "good citizen"? &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A bit of definition:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Software that is a good citizen behaves in a manner consistent with other software, with regard to interaction with other assets with which it interacts.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's kind of a pompous way of saying that software is behaving like a good citizen when it does what the systems around it expect (e.g., log in a way that centralized logging tools can handle it) and does create excessive load or resource usage (e.g., doesn't attempt to create hundreds of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;DNS&lt;/span&gt; entries when one will do). In other words, this is software that does what it ought to do, and doesn't behave badly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Software that is being a good citizen does:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;support logging in a common format (e.g., NT Event logs, etc)&lt;/li&gt;&lt;li&gt;use centralized user or machine management (e.g., Active Directory or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;NIS&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;does automatic log rolling&lt;/li&gt;&lt;li&gt;can be configured to start on its own after a power outage or other event&lt;/li&gt;&lt;li&gt;can be disabled or somehow turned off cleanly (to allow for maintenance, etc)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Software that is being a good citizen does not:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;log excessively (at least, except maybe in debug, which should be used sparingly)&lt;/li&gt;&lt;li&gt;create excessive traffic on infrastructure servers (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;DNS&lt;/span&gt;, Active Directory, mail, firewall, etc)&lt;/li&gt;&lt;li&gt;send excessive notifications (e.g., a notification for every user logging in would probably be overkill)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Normally, the good citizen requirement is not explicit. Sometimes you'll find mention of it in requirements indirectly (e.g., must support Active Directory for user interaction), but sometimes you won't. You usually won't find the negative requirements (e.g., doesn't renew its &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;DHCP&lt;/span&gt; lease too often) at all. But if you miss one and your software misbehaves, you can bet you'll hear about it! Good citizen requirements are generally assumed, even though they're often not mentioned directly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you're testing, ask yourself, "is my software being a good citizen?"&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-7248053655872209422?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/fnAVln6lnRg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/7248053655872209422/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/good-citizen.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/7248053655872209422?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/7248053655872209422?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/fnAVln6lnRg/good-citizen.html" title="Good Citizen" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/good-citizen.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcAQX88eSp7ImA9WxNWGUU.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-9190412897974569796</id><published>2009-10-19T17:34:00.002-04:00</published><updated>2009-10-19T17:34:00.171-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T17:34:00.171-04:00</app:edited><title>"Certifying" Clients</title><content type="html">We're a storage company. Lots of people write to us with lots of different programs. These run the gamut from drag-and-drop to homegrown bash script to full &lt;a href="http://en.wikipedia.org/wiki/Hierarchical_storage_management"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;HSM&lt;/span&gt;&lt;/a&gt; solutions, and lots of points in between. Sometimes we'll get asked to "certify a client" application. What's going on here?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's break it down:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Who's asking&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Usually for us sales or support is asking. Sometimes sales has a client who wants to use a program and wants a guarantee it will work. Other times sales has a client who has not picked a client and wants to know what we recommend. Alternatively, support might have a client who's attempting to use a program and finds something they don't like about it (doesn't work, works too slowly, etc).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's say you're not in a storage company (some of us aren't!). This could be a browser, if you're a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;web app&lt;/span&gt;. It could be a reporting or monitoring tool (anyone else ever had a client ask to point Crystal Reports directly at your database?).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Either way, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;someone's&lt;/span&gt; now looking for a guarantee that a client program will work with our software.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;"Guarantee"&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I'm usually afraid of the word "guarantee". You can do all the testing in the world, and a new patch of a client program will come out and break in a truly spectacular manner.  Or the customer will use an obscure undocumented flag you didn't test and... &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;kablooey&lt;/span&gt;! (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;tm&lt;/span&gt; Calvin and Hobbes). Or the client will install it on some totally unsupported hardware and scratch his head when it doesn't work. "Guarantee" is a very strong word that means "it's totally my problem to fix".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I usually get around this by saying, "here's what we've tested" rather than "we guarantee this".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Certification Levels&lt;/b&gt;&lt;/div&gt;&lt;div&gt;There are a number of different things you can do and call it certification.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;The standards approach.&lt;/i&gt; This is where you point to some external standard and say, "we conform to this. Any client that works with this will work with us." By external standard, you should make sure you choose a public standard: &lt;a href="http://www.faqs.org/rfcs/rfc1813.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;NFS&lt;/span&gt; v3&lt;/a&gt;, or &lt;a href="http://validator.w3.org/"&gt;W3C compliance&lt;/a&gt;, or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;whatever's&lt;/span&gt; appropriate for you. In this case, you don't actually have to test the client. However, you'd better be darn sure you conform to the standard, or this one may eventually bite you.&lt;/li&gt;&lt;li&gt;&lt;i&gt;The "we test this" approach.&lt;/i&gt; This is where you offer up the version and configuration you test, and you say that has been tested and will work. Any deviance from that configuration or version may work but isn't guaranteed.&lt;/li&gt;&lt;li&gt;&lt;i&gt;The "certification program" approach.&lt;/i&gt; This is where you turn it around on the client application, and offer a certification program. The idea is that they conform to you, rather than the other way around. You offer a set of criteria, test systems (or a lab for people to come test in), possibly scripts and reporting mechanisms, and you let people run your tests. Then you analyze their results, and either put your stamp of approval on or not (think "runs on Vista", etc). If you're large enough and important enough, people will do the compatibility testing for you. This doesn't work so well if you're kind of a tiny nobody in your industry. I've not done this one personally.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;So What to Do?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In the end what you do is driven by how much team, time and sensitivity you have. The real goal here is customer (or potential customer) comfort. So you do what you have to do to achieve that customer comfort, within the bounds of the worth of that customer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My first approach generally is to do a test for that client. If this is an important client, we can get from them (or create if they don't know), a configuration that will work for their situation. Then we test this (and retest it on new versions of our code). It's client-specific, but it gives us the comfort to go to the client and say, "follow our advice and this will work."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My next approach, if this starts to get to be too much volume, is to publish a "known good" configuration (including version) of the client software. We test that client &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;config&lt;/span&gt; with every release we do. We tell clients what works, and then let them experiment from there, if they need to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These two approaches have gotten me far enough, so far. In the end, there's no substitute for trying it at the customer, but short of that, you can give them comfort. And all "certification" really means, at least in this sense, is comfort.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-9190412897974569796?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/Umj-DRDRE_0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/9190412897974569796/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/certifying-clients.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/9190412897974569796?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/9190412897974569796?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/Umj-DRDRE_0/certifying-clients.html" title="&quot;Certifying&quot; Clients" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/certifying-clients.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MQX4-cSp7ImA9WxNWFU8.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-375403560578909814</id><published>2009-10-14T10:18:00.003-04:00</published><updated>2009-10-14T10:18:00.059-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-14T10:18:00.059-04:00</app:edited><title>Strict</title><content type="html">&lt;div style="text-align: left;"&gt;We're making a big switch in the lab; we're upgrading the underlying operating system on our machines. This is something that we kind of have to do - wouldn't want to be on an ancient OS because it only makes things like security patching harder. I can't say it's my idea of a good time, though - it's a lot of work!&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Anyway, once we've done all the basics - setting up &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;FAI&lt;/span&gt;, setting up build and test systems, getting the lab &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;migrator&lt;/span&gt; to run (so we can move machines from old to new and back again), etc. - then we can start the tests.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;We start slowly - one night on the new OS, and then not again for a while. This way teams get a chance to go through their problem areas and fix them before they get hit with the same ticket again. At this point, too, our number of failures is generally quite high, and one or two problems will take out entire swaths of tests ("can't talk to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;NTP&lt;/span&gt; server: 42 machines can't be cleaned up!" or "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;stunnel&lt;/span&gt; configuration is different: killed two entire suites!"). It's a fairly quick and easy way to find problems that affect each of the teams. It's a learning experience, it makes a bit of a mess, and we all join in cleaning up after it.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;At some later point, then, we make the decision that it's time to switch. At this point it's time to get strict. So now we worry about things in the following order:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;First, resolve compilation errors. &lt;/b&gt;If it doesn't compile, not much is going to run.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Second, resolve bugs that cause machines to leak.&lt;/b&gt; If a test causes machines to not clean up after it's done, then they're not available for other later tests. This causes the entire lab to grind to a halt. Generally this is accompanied by cries of "we're out of machines!" and tests just not finishing because there's no machine for them to run on.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Third, resolve bugs that are likely to hide other bugs.&lt;/b&gt; If I have a bug in my test setup, who knows what will happen when I get to actually exercising the thing I thought I was testing!&lt;/li&gt;&lt;li&gt;&lt;b&gt;Fourth, handle everything else. &lt;/b&gt;Once you've gotten through the first three items, then just start fixing bugs according to your preference.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;The overall goal is to expose the bugs. Get things running, then follow up with getting them running right. Hopefully this whole process doesn't take you too long, but sometimes when you're mired in the land of "this underlying thing broke a lot!" it helps to step back and think about what to prioritize. You can make the whole process go a bit more smoothly if you think for a minute, then leap in and start fixing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Good luck, and happy resolution!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-375403560578909814?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/J_2X0kM131A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/375403560578909814/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/strict.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/375403560578909814?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/375403560578909814?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/J_2X0kM131A/strict.html" title="Strict" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/strict.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEHR3s_eip7ImA9WxNWFEU.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-3853996332912115188</id><published>2009-10-13T22:09:00.004-04:00</published><updated>2009-10-13T22:17:16.542-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-13T22:17:16.542-04:00</app:edited><title>Just Do It</title><content type="html">At any point in time, when I sit down at my desk, there are about fifteen things I could do. For example, when I sat down after today's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;dev&lt;/span&gt; leads meeting, I had my choice of:&lt;div&gt;&lt;ul&gt;&lt;li&gt;verify some bugs targeted for the next release&lt;/li&gt;&lt;li&gt;verify some bugs on head&lt;/li&gt;&lt;li&gt;answer a question from a sales engineer&lt;/li&gt;&lt;li&gt;review a potential client sizing worksheet&lt;/li&gt;&lt;li&gt;fix one or more of about three small-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ish&lt;/span&gt; bugs assigned to me ("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;fetchlogs&lt;/span&gt; doesn't fetch when... whoops!")&lt;/li&gt;&lt;li&gt;read a white paper&lt;/li&gt;&lt;li&gt;work on an in-progress &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;FAI&lt;/span&gt; server I'm configuring&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In the end, which one I pick isn't nearly as important as one thing:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Just pick something already. Then just do it.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To a certain an extent, what I do doesn't matter as much as simply accomplishing &lt;i&gt;something&lt;/i&gt;. I have a general priority list:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;active fires&lt;/li&gt;&lt;li&gt;stuff for clients&lt;/li&gt;&lt;li&gt;stuff for sales&lt;/li&gt;&lt;li&gt;stuff other people on my team can't do&lt;/li&gt;&lt;li&gt;other stuff&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Based on that, I chose to answer the email first (and do the analysis that I needed to do to provide a good answer). But I could have chosen almost any one of these, and it all would have helped our current situation. And that's the point - just do something. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;That'll&lt;/span&gt; help.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-3853996332912115188?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/O28-_PnFoag" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/3853996332912115188/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/just-do-it.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3853996332912115188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/3853996332912115188?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/O28-_PnFoag/just-do-it.html" title="Just Do It" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/just-do-it.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGQXw5fip7ImA9WxNWE0s.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-515108856888752355</id><published>2009-10-12T11:32:00.007-04:00</published><updated>2009-10-12T11:32:00.226-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-12T11:32:00.226-04:00</app:edited><title>Chatting</title><content type="html">I just read this article by &lt;a href="http://jrothman.com/blog/mpd/2009/10/what-would-a-successful-agile-all-remote-team-look-like.html"&gt;Joanne &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Rothman&lt;/span&gt;&lt;/a&gt;, talking about a "low level buzz"  with chats, emails, and talking going on all the time. She basically says that maybe having a chat open all day, or high email traffic with quick responses might work for some people but not for her.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Our team is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;colocated&lt;/span&gt;, and we still chat all the time. It's a little odd. Basically, most of us have a chat window open on our desktops constantly, and we take a look at it when we're waiting (for compilation, a grep to finish, etc). It's that low-level background buzz. In addition we have, and frequently use, the option of simply walking over and talking to each other.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We tend to use chat for things that the entire group might be interested in, like:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;build failure notifications, and their causes&lt;/li&gt;&lt;li&gt;discussion of which branch to run in the nightly automated tests&lt;/li&gt;&lt;li&gt;notification when weekly lunch arrives (the important stuff!)&lt;/li&gt;&lt;li&gt;code review requests&lt;/li&gt;&lt;li&gt;heads up about interesting or risky &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;checkins&lt;/span&gt;&lt;/li&gt;&lt;li&gt;pairing requests&lt;/li&gt;&lt;li&gt;general pleas for help (e.g, "how do I do X in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;perl&lt;/span&gt;?")&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;We get together from there. Someone will wander over and answer how to do X in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;perl&lt;/span&gt;, if it's non-trivial, or will start pairing. It generally works for most of us. I like it in particular because that way you don't have to feel bad about asking questions - you just ask the collective group and whoever is least concentrating at that point, or currently waiting for something, will answer. I'm not then interrupting someone who's really deep in something.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Use for yourself with caution!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-515108856888752355?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/ZGB2RBeS1GM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/515108856888752355/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/chatting.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/515108856888752355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/515108856888752355?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/ZGB2RBeS1GM/chatting.html" title="Chatting" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/chatting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMCQX86fyp7ImA9WxNWEEw.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-6426829222069895212</id><published>2009-10-08T11:41:00.001-04:00</published><updated>2009-10-08T11:41:00.117-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T11:41:00.117-04:00</app:edited><title>Magic Words</title><content type="html">Just like there are some &lt;a href="http://blog.abakas.com/2009/10/magic-numbers.html"&gt;magic numbers&lt;/a&gt; that can point you to the source of a problem, there are some magic words that also have power. The words you use to describe a problem will color how other engineers (developers, other testers, managers, even you) look at the problem and what they do to track it down.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just like with the numbers, some of these are common to many systems:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Crash&lt;/b&gt;. Most people will be looking for a core file and an uncontrolled shutdown in this case.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Hang&lt;/b&gt;. Often you'll get asked how long before you mark something as being hung. Also, this word means that absolutely no progress is being made. If it's progressing at a snail's pace, it's still not a hang; it's just really slow.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Failed&lt;/b&gt;. This one means completed with error. It doesn't mean "still going".&lt;/li&gt;&lt;li&gt;&lt;b&gt;Wedged&lt;/b&gt;. This is imprecise but generally seems to make people think deadlock.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Other magic words are more specific to your product. For example, in our product we discuss:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Data loss&lt;/b&gt;. The system could lose data in this scenario (YIKES!). This one raises red flags all over the place.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Failure&lt;/b&gt;. This word means system change that resulted in the loss of availability of a system component. Generally its used for hardware failure (of a disk, node, power supply, network connection, etc). Generally "failure" does is modified by some component name (e.g., power supply failure), and is not used for the more general "software didn't work" case.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Simultaneous Failure Vs Sequential Failure&lt;/b&gt;. In a redundant self-healing system like ours, number of failures (see above) matters, as does whether the second one occurred at the same time as the first or after. Depending on which one happened, a whole different debug path will be invoked.&lt;/li&gt;&lt;/ul&gt;What other magic words are there? I'm pretty sure I've missed some.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-6426829222069895212?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/LB2-jfTQZ7Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/6426829222069895212/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/magic-words.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/6426829222069895212?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/6426829222069895212?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/LB2-jfTQZ7Y/magic-words.html" title="Magic Words" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/magic-words.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YHR385cCp7ImA9WxNXGUo.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-5278046737528856536</id><published>2009-10-07T23:34:00.010-04:00</published><updated>2009-10-08T00:12:16.128-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T00:12:16.128-04:00</app:edited><title>Magic Numbers</title><content type="html">There are some numbers that I call magic numbers. These are the special numbers that have meaning in the context of your system. These numbers are typically diagnostically important, or triggers to identify problems or potential problems.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some of these are common on many systems:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;86400 seconds&lt;/b&gt;: As in, "the test timed out after 86400 seconds". This is a day. As in, the darned thing didn't finish up in a whole day. Oops.&lt;/li&gt;&lt;li&gt;&lt;b&gt;2^32 or 2^32 -1&lt;/b&gt;: If you're on a 32 bit system, you're starting to wrap address space here. Look for really large negative numbers where you're expecting positives, etc.&lt;/li&gt;&lt;li&gt;&lt;b&gt;45 seconds&lt;/b&gt;: the default connection timeout for network mounts in Windows. If something fails after this long, you're looking at a timeout probably.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some of these are specific to your system. For example, in our system we know:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;6 minutes&lt;/b&gt;: The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;RPC&lt;/span&gt; timeout for a query to a remote system is 2 minutes, and it does 3 tries. 6 minute waits mean you're hitting this.&lt;/li&gt;&lt;li&gt;&lt;b&gt;5 minutes&lt;/b&gt;: The frequency of heartbeat checks for certain operations. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Failover&lt;/span&gt; after 5 min means these never succeeded.&lt;/li&gt;&lt;li&gt;&lt;b&gt;25&lt;/b&gt;: default max number of simultaneous connections. Can be increased indefinitely, but if you start to see slowdowns or connection timeouts and you have 25 clients in use, you're probably going to want to change it.&lt;/li&gt;&lt;li&gt;XX: Java heap size. (I don't remember this one off the top of my head, but I know it when I see it)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;What is interesting is not simply knowing the numbers. What is interesting is the shorthand debugging that it offers you. For example, if support calls up and says that a customer is complaining that the management functions are "very slow to load", and it turns out to be about 6 minutes, then the first place I'll look is to see if it's trying to talk to a remote system, and if there's some sort of problem in that communication.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not perfect, but knowing your system's magic numbers can often be a shortcut to finding its problems.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-5278046737528856536?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/3CVqUN2qNFw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/5278046737528856536/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/magic-numbers.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/5278046737528856536?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/5278046737528856536?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/3CVqUN2qNFw/magic-numbers.html" title="Magic Numbers" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/magic-numbers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUEQXY-eSp7ImA9WxNXGE4.&quot;"><id>tag:blogger.com,1999:blog-8341729382206275662.post-4270004987145201069</id><published>2009-10-06T10:10:00.004-04:00</published><updated>2009-10-06T10:10:00.851-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-06T10:10:00.851-04:00</app:edited><title>Real Time Feedback</title><content type="html">&lt;div style="text-align: left;"&gt;This is a trick I use in particular for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;UI&lt;/span&gt; bugs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Problem&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I'm working on a web-based application and am testing it across five browsers - Safari, IE 7/8, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Firefox&lt;/span&gt; 3/3.5. At the moment I'm working on layout and styling.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have identified an issue related to buttons. Specifically, they look like this on IE7:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hrCjqEFBjyE/SstFUuB7JjI/AAAAAAAAAK0/_Frtohu7SpU/s1600-h/screen-capture-4.png"&gt;&lt;img src="http://3.bp.blogspot.com/_hrCjqEFBjyE/SstFUuB7JjI/AAAAAAAAAK0/_Frtohu7SpU/s400/screen-capture-4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5389477601334732338" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 372px; height: 56px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Normally I would do what I generally do when I find a bug: log it. I'd attach a screenshot, explain which browser(s) were affected, and move on. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;There'd&lt;/span&gt; be a cute title like "buttons look funny", but most of the explanation would be in the screenshot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And then a developer would decide to work on it, and he'd move pixels around, and he'd &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;recut&lt;/span&gt; the button so his &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CSS&lt;/span&gt; sprites were lined up. And he'd generally getting it looking okay. Mark the bug resolved, and it's time to go to lunch!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So along I'd go, and great, it looks fine on IE7 but now the text is way too high and falling off the button on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Firefox&lt;/span&gt; 3. I reopen the bug (or log a new one), and kick it back to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;developer&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Launder, rinse, repeat.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;The Approach&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Let's bypass the defect tracking system as communication tool technique that we're currently using. The developer and I set up a time to properly fix the buttons. He's got Safari and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Firefox&lt;/span&gt; 3.5. I launch IE7, IE8, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Firefox&lt;/span&gt; 3.  We're going to sit next to each other, make a change, and check it until we're both happy with those darn buttons in all browsers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's how it goes:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Both of us open our various browsers &lt;/li&gt;&lt;li&gt;Both of us point all those browsers to the developer's machine. Now we can see everything in all browsers pretty quickly.&lt;/li&gt;&lt;li&gt;We make sure no one's caching &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;CSS&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;JS&lt;/span&gt; (Often this is a configuration setting on the development environment, and probably already set up, but it's worth checking.)&lt;/li&gt;&lt;li&gt;Developer makes a change.&lt;/li&gt;&lt;li&gt;We both reload all browsers. Nope. Not there yet.&lt;/li&gt;&lt;li&gt;Developer makes a change.&lt;/li&gt;&lt;li&gt;We both reload all browsers. Success on IE7, but we broke &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Firefox&lt;/span&gt; 3. Darn.&lt;/li&gt;&lt;li&gt;Developer makes a change.&lt;/li&gt;&lt;li&gt;We both reload... &lt;/li&gt;&lt;li&gt;... etc etc etc ...&lt;/li&gt;&lt;li&gt;Developer makes a change.&lt;/li&gt;&lt;li&gt;We both reload all browsers. Success!&lt;/li&gt;&lt;li&gt;Check in.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;What We've Done&lt;/b&gt;&lt;/div&gt;&lt;div&gt;By sitting side by side and knocking out the problem, we've substantially reduced the feedback loop duration. It's easy for the developer and for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;QA&lt;/span&gt; both to see the behavior in all the browsers we care about; everyone can look at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;everyone's&lt;/span&gt; machine and we don't have any lost information in terms of visual behavior. I should note that this can work virtually, but in that case it's easier if you can see each other's screens in some way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously, this technique won't work for all bugs. But for the visual ones that are mostly a matter of messing around with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;CSS&lt;/span&gt; or with JavaScript, it tends to work really well. The total time to get rid of the bug is much much shorter than if you'd both sat at your respective desks and bounced the bug back and forth.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Give it a shot!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8341729382206275662-4270004987145201069?l=blog.abakas.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Abakas/~4/OONhXYzDNQU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.abakas.com/feeds/4270004987145201069/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.abakas.com/2009/10/real-time-feedback.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4270004987145201069?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8341729382206275662/posts/default/4270004987145201069?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Abakas/~3/OONhXYzDNQU/real-time-feedback.html" title="Real Time Feedback" /><author><name>Catherine Powell</name><uri>http://www.blogger.com/profile/15459370385548771048</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00422608762543242492" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_hrCjqEFBjyE/SstFUuB7JjI/AAAAAAAAAK0/_Frtohu7SpU/s72-c/screen-capture-4.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.abakas.com/2009/10/real-time-feedback.html</feedburner:origLink></entry></feed>
