<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34632793</id><updated>2010-09-08T23:56:23.336-05:00</updated><title type='text'>Sprout.  We Are Mammoth's technology, software, and business blog.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default?orderby=updated'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default?start-index=26&amp;max-results=25&amp;orderby=updated'/><author><name>Ka Wai Cheung</name><uri>http://www.blogger.com/profile/06985030207423187429</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>247</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34632793.post-2966441175463267106</id><published>2010-08-30T08:00:00.002-05:00</published><updated>2010-09-06T09:02:57.176-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone Tip: Defect or Enhancement?</title><content type='html'>During our client testing phases, we get a good percentage of issues assigned to us which really aren't defects or problems at all. They're requests to have things built differently. It's inevitable that certain features of a product will be met with varying degrees of satisfaction, so it's important as a development team (in any industry) to stand your ground and help your stakeholder team distinguish the difference between "this is built wrong" and "this is built right, but I think it should ...". &lt;br /&gt;&lt;br /&gt;One way &lt;a href="http://www.getdonedone.com/"&gt;DoneDone &lt;/a&gt;can help is with tags:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make sure testers tag all new issues as "defects" or&amp;nbsp; "enhancements"  (&lt;a href="http://screencast.com/t/Y2M0MmEw"&gt;http://screencast.com/t/Y2M0MmEw&lt;/a&gt;). &lt;/li&gt;&lt;li&gt;Next, set up (and save) custom searches for each tag to help prioritize tasks (&lt;a href="http://screencast.com/t/NTViZGUzZ"&gt;http://screencast.com/t/NTViZGUzZ&lt;/a&gt;).&amp;nbsp;&lt;/li&gt;&lt;li&gt;Finally, when an issue is assigned to a developer, but not tagged correctly, the dev can edit the tags themselves to get them in the right queue (&lt;a href="http://screencast.com/t/ZDVlNmQ1M2U"&gt;http://screencast.com/t/ZDVlNmQ1M2U&lt;/a&gt;).&amp;nbsp;&lt;/li&gt;&lt;li&gt;As for the conversation between the developer and the tester to point out the difference? Sometimes you need a &lt;a href="http://en.wikipedia.org/wiki/Bill_Clinton"&gt;guy like this to help with the smooth talk&lt;/a&gt;. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Have a good week, DoneDone'rs&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-2966441175463267106?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/2966441175463267106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=2966441175463267106&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2966441175463267106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2966441175463267106'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedone-tip-defect-or-enhancement.html' title='DoneDone Tip: Defect or Enhancement?'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-5260814885659811221</id><published>2010-09-06T08:52:00.001-05:00</published><updated>2010-09-06T08:56:56.835-05:00</updated><title type='text'>DoneDone Tip: Linking between issues</title><content type='html'>To link between issues in a DoneDone project, use the pound sign (#) followed by your issue number, as in "#132". DoneDone will automatically check if the issue exists, then create a hyperlink for you.&lt;br /&gt;&lt;br /&gt;The syntax: &lt;a href="http://screencast.com/t/YzVjNDNlNjIt"&gt;http://screencast.com/t/YzVjNDNlNjIt&lt;/a&gt;&lt;br /&gt;Next, the results:&amp;nbsp; &lt;a href="http://screencast.com/t/OTEzNGVkZj"&gt;http://screencast.com/t/OTEzNGVkZj&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have a productive week DoneDone'rs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-5260814885659811221?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/5260814885659811221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=5260814885659811221&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/5260814885659811221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/5260814885659811221'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/09/donedone-tip-linking-between-issues.html' title='DoneDone Tip: Linking between issues'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-6476537303268360180</id><published>2010-09-02T12:25:00.003-05:00</published><updated>2010-09-02T12:29:00.195-05:00</updated><title type='text'>We Are Mammoth is 4 years old. This is why.</title><content type='html'>Yesterday, September 1st 2010, &lt;b&gt;We Are Mammoth&lt;/b&gt; turned 4 years old. Thanks. Thank you very much. &lt;br /&gt;&lt;br /&gt;However, we're still not driving Ferraris. We're also not funding private sector space programs. Nor are we so culturally relevant that we're strong-armed by governments to allow access to decrypted customer data. We are, however, in possession of something I'd attest to being harder to attain, and harder yet to keep possession of. The &lt;i&gt;ability to design. &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;We first set out to design a better work environment for ourselves as programmers. Amongst other things, it required that &lt;a href="http://www.x2oframework.com/"&gt;we design better software to deal with ever changing client requirements&lt;/a&gt;. We were so proud of our process that we designed &lt;a href="http://www.getdonedone.com/"&gt;a better tool for organizing a development team&lt;/a&gt;.&amp;nbsp; And yes, we &lt;a href="http://www.wearemammoth.com/"&gt;built several fantastic websites along the way&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;It sounds simple. But lacking the true power to design is the biggest hurdle working "somewhere else". You get lost in the echoes. Our greatest opportunities? The power to design technical harmony within our team. The modesty to design transparency with our clients &amp;amp; customers. It's yielded &lt;i&gt;real quality &lt;/i&gt;in our transactions with one another. And quality makes everyone feel good.&lt;br /&gt;&lt;br /&gt;So what's the next four years have in store for us?&lt;br /&gt;&lt;br /&gt;More of the same, I'm thinking. Our mission, above all, is to continue to design. Design tools and work flows which encourage better collaboration between people. Design a straight line, not a jagged one .... it's shorter. We're a software and web development company, yes. But who cares what the end of the voyage brings if the only road to get there was paved with hot coals.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Long live &lt;b&gt;We Are Mammoth&lt;/b&gt;. Long live the human.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-6476537303268360180?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/6476537303268360180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=6476537303268360180&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6476537303268360180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6476537303268360180'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/09/we-are-mammoth-is-4-years-old-and-heres.html' title='We Are Mammoth is 4 years old. This is why.'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-2853948984062138418</id><published>2010-08-31T10:57:00.000-05:00</published><updated>2010-08-31T10:57:27.825-05:00</updated><title type='text'>Road traffic management for your life.</title><content type='html'>An interesting article this week about &lt;a href="http://online.wsj.com/article/SB10001424052748703959704575453921039632134.html"&gt;the ways researchers are trying to solve the ever growing problem of traffic congestion&lt;/a&gt;. The brutal truth? So long as the economy and population expand, so will congestion despite new roads, technologies and controls.&lt;br /&gt;&lt;br /&gt;Commuters have altered their behavior to deal with the problem. Some get up early and leave early. Some, the other way around. So, what happens when new lanes or roads are installed to deal with congestion? All these people give up the altered times and join the herd again, quickly filling the excess capacity. More money, more cars. More roads, more traffic. China was the focus of media attention over the &lt;a href="http://www.bbc.co.uk/news/world-asia-pacific-11062708"&gt;past couple of weeks for this problem precisely&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The same thing happens in business. Add employees to meet demand. Then get too busy again. Rinse, repeat. A never ending cycle, until there's a recession. Also at home. Got too much stuff, get a bigger house. Move in, get more stuff. Funny enough though, this week also drew light to the "end of the mcmansion era" - &lt;a href="http://www.walletpop.com/blog/2010/08/27/the-end-of-the-mcmansion-era/"&gt;smaller houses are being built to match changing consumer values&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;What'd happen if we just maintained what we had, and kept those behaviors altered, like, forever? Fewer roads, but &lt;a href="http://articles.chicagotribune.com/2009-03-17/news/0903160649_1_potholes-resurfacing-north-lake-shore-drive"&gt;better ones&lt;/a&gt;? Smaller houses, but smarter ones? Fewer businesses bent on growth, and more focused on quality? My hunch is the fear that China, India and Brazil will steal our milk money is simply too great to find out. Sip, sip. Grunt, grunt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-2853948984062138418?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/2853948984062138418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=2853948984062138418&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2853948984062138418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2853948984062138418'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/road-traffic-management-for-your-life.html' title='Road traffic management for your life.'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-7030158971608774663</id><published>2010-08-18T08:00:00.014-05:00</published><updated>2010-08-25T11:19:35.696-05:00</updated><title type='text'>Get Tusks: We need a Front-end developer (XHTML/CSS/JS)</title><content type='html'>&lt;div&gt;Well, look at that. We Are Mammoth needs some help. It's true.  &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;A couple of us are database and backend experts (SQL, C#, .NET MVC, LINQ,  to be specific).  A couple of us are front-end integrators (Flex/Flash  Actionscripters who can also be dangerous in .NET).  We are a lean,  well-oiled machine. All true.&lt;br /&gt;&lt;br /&gt;But, we're missing a big component. &lt;b style="color: rgb(230, 145, 56);"&gt;We need a true HTML/CSS/JavaScript lover who also blends into the wonderful world of .NET programming.&lt;/b&gt;&lt;b style="color: rgb(230, 145, 56);"&gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, we're hoping:&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;You love Javascript.  More specifically, you love jQuery.  You think jQuery selectors are God's gift to HTML.&lt;/li&gt;&lt;li&gt;You have a compulsion for clean, skinny, simple-as-possible-but-no-simpler code.&lt;/li&gt;&lt;li&gt;You've  solved problems like "How do we implement site-wide modal popups, make  it still work with Javascript turned off, and also be SEO-friendly?"&lt;/li&gt;&lt;li&gt;You have a clear opinion on how Javascript and HTML should be written and ensure that standard is upheld.&lt;/li&gt;&lt;li&gt;You work as well individually as you do in a small, collaborative team.&lt;/li&gt;&lt;li&gt;You can take existing, HTML-Strict compliant templates and integrate them to server-side code and Javascript.&lt;/li&gt;&lt;li&gt;You  can maintain an HTML code-base and CSS cleanly.  When there's a big  feature addition down-the-road, you've got a clear-minded plan of attack  on how to add it without the need for extra-strength duct tape.&lt;/li&gt;&lt;li&gt;You absolutely despise IE6, but you know the usual workarounds.&lt;/li&gt;&lt;li&gt;You  spend 80% of your time on the front-end, but occasionally dip into  server-side code (C#, .NET) to tweak and modify code as needed.&lt;/li&gt;&lt;li&gt;You  love problem-solving.  For instance, you can connect all 9 dots in this  picture with just 4 straight lines, without lifting your pen: &lt;a href="http://bit.ly/zn8mh"&gt;http://bit.ly/zn8mh&lt;/a&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;These are great additional bonuses:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You  have experience with Flash and Flex, and some animation skills to-boot.  If javascript is the new actionscript, it'd be great if you knew all  the usability pitfalls. &lt;/li&gt;&lt;li&gt;You are articulate and love to write (words not just code).&lt;/li&gt;&lt;li&gt;When you speak, people feel warm and fuzzy inside&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="paragraph_break"&gt;&lt;/div&gt;&lt;span style="font-size:large;"&gt;&lt;b&gt;&lt;span style="color:black;"&gt;&lt;br /&gt;Have ya got it? Really? Then, if you're NOT a staffing service, please send a nice introduction of yourself along with your resume to &lt;span style="color: rgb(230, 145, 56);"&gt;Let.Me.In[at]wearemammoth[dot]com&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;This is a contract (and possibly to hire) position, and we'd prefer you be on site. &lt;/i&gt;&lt;br /&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/34632793-7030158971608774663?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/7030158971608774663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=7030158971608774663&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/7030158971608774663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/7030158971608774663'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/get-tusks-we-need-front-end-developer.html' title='Get Tusks: We need a Front-end developer (XHTML/CSS/JS)'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-3811464129498374656</id><published>2010-08-25T11:13:00.002-05:00</published><updated>2010-08-25T11:15:19.593-05:00</updated><title type='text'>Simple design ideas: A better bill presenter</title><content type='html'>I have an idea for a restaurant bill presenter design that would save me minutes a year.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_y5qjqN8IwL4/THVBZLXAwMI/AAAAAAAAAN0/LlLZ90Rz394/s1600/bill-presenter-discover.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://4.bp.blogspot.com/_y5qjqN8IwL4/THVBZLXAwMI/AAAAAAAAAN0/LlLZ90Rz394/s400/bill-presenter-discover.png" alt="" id="BLOGGER_PHOTO_ID_5509381619959513282" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-3811464129498374656?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/3811464129498374656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=3811464129498374656&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3811464129498374656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3811464129498374656'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/simple-design-ideas-better-bill.html' title='Simple design ideas: A better bill presenter'/><author><name>Ka Wai Cheung</name><uri>http://www.blogger.com/profile/06985030207423187429</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02842674069213617206'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y5qjqN8IwL4/THVBZLXAwMI/AAAAAAAAAN0/LlLZ90Rz394/s72-c/bill-presenter-discover.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-6720369042544849446</id><published>2010-08-20T15:45:00.002-05:00</published><updated>2010-08-24T12:16:08.181-05:00</updated><title type='text'>DoneDone'rs : Critical, 13% of the time</title><content type='html'>Here's a historical breakdown of how issue priority labels have been used since the beginning of time (2009):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;24% low / 31% medium / 32% high / 13% critical&lt;/blockquote&gt;Have a great weekend DoneDone'rs,&lt;br /&gt;&lt;br /&gt;- The DoneDone Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-6720369042544849446?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/6720369042544849446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=6720369042544849446&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6720369042544849446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6720369042544849446'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedoners-critical-13-of-time.html' title='DoneDone&apos;rs : Critical, 13% of the time'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-2978046802771022926</id><published>2010-08-16T08:00:00.005-05:00</published><updated>2010-08-24T12:14:04.218-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone Tip: Good Issue Ettiquette</title><content type='html'>Even though DoneDone has an issue status called "Need more information", it'd be ideal if it was never used in 90% of all cases. Help the developer get you a fix by providing the quick facts you know they need.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Provide a screenshot and/or link to the page where the issue is happening&lt;/li&gt;&lt;li&gt;Which browser, browser version, and operating system did the issue occur in?&lt;/li&gt;&lt;li&gt;Detail the prior steps and clicks you took to recreate the bug. &lt;/li&gt;&lt;li&gt; Were you logged in as a test user when the bug occurred? What were the credentials of that user?&lt;/li&gt;&lt;li&gt;Finally, only log one problem per issue. Here's why: &lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="entry-content"&gt;&lt;a class="tweet-url web" href="http://codebeef.com/one-issue-per-ticket" rel="nofollow" target="_blank"&gt;http://codebeef.com/one-issue-per-ticket&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;If you're tired of typing "IE 6 on PC, duh" then create a Tag for that browser/OS combination.&lt;br /&gt;&lt;br /&gt;The little bit of time it takes to provide this info will go a long way towards getting everyone home in time for dinner. Let there be pizza.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-2978046802771022926?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/2978046802771022926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=2978046802771022926&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2978046802771022926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2978046802771022926'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedone-tip-good-issue-ettiquette.html' title='DoneDone Tip: Good Issue Ettiquette'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-1173314992663250877</id><published>2010-08-23T13:11:00.002-05:00</published><updated>2010-08-24T12:13:39.615-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone Tip: Basecamp or DoneDone?</title><content type='html'>A few customers have asked when the best time to start using &lt;a href="http://www.getdonedone.com/"&gt;DoneDone&lt;/a&gt; is during a project, and how it works best alongside &lt;a href="http://www.basecamphq.com/"&gt;Basecamp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The best example I can think of is how we use it here at &lt;a href="http://www.wearemammoth.com/"&gt;We Are Mammoth&lt;/a&gt;.  Afterall, we built DoneDone for our team originally, then thought the rest of the world might be interested in a simpler way to get through the most stressful phase of a project.&lt;br /&gt;&lt;br /&gt;Here at We Are Mammoth, Basecamp is used from day one of a project and kept around for as long as that site or application exists. We use it whenever group collaboration is necessary: Production-related messaging, sharing files, managing development calendars, server information, etc.  It eliminates the bottlenecking of information, and brings clarity to client projects where emails, meetings and phone calls fall well short.&lt;br /&gt;&lt;br /&gt;DoneDone on the other hand gets folded in about two-thirds of the way through a project, when testing begins.  At this point, the team needs an explicit way of telling someone 'something' needs fixing, and an effective way of managing that something until it's fixed.  ToDo items, excel sheets, and email do nothing more than keep inventory of unfinished 'somethings'. DoneDone helps the cause by &lt;a href="http://blog.wearemammoth.com/2010/03/why-we-is-bad-for-all-of-us.html"&gt;cutting down on the herd mentality&lt;/a&gt;, making responsibilities more clear to each individual.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If you're using Basecamp ToDo's to manage your development team during testing instead of a real issue tracker, there's a good chance at least one programmer would like to drag you along behind a &lt;a href="http://biology.usgs.gov/cro/ScienceInYourState/Wyoming/images/peaks%20herd%204.jpg"&gt;herd of wild horses&lt;/a&gt;. &lt;/blockquote&gt;If ya have any more questions about how DoneDone might help you out, please leave a comment or email us at admin[at]mydonedone.com.&lt;br /&gt;&lt;br /&gt;Have a good week everyone.&lt;br /&gt;&lt;br /&gt;- The DoneDone team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-1173314992663250877?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/1173314992663250877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=1173314992663250877&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/1173314992663250877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/1173314992663250877'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedone-tip-basecamp-or-donedone.html' title='DoneDone Tip: Basecamp or DoneDone?'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-250854623364977509</id><published>2010-08-24T09:47:00.001-05:00</published><updated>2010-08-24T12:12:18.663-05:00</updated><title type='text'>On creating something from nothing</title><content type='html'>&lt;blockquote&gt;"...with a respectable body of work under my belt, I finally understood that  the ability to imagine and then build where nothing had existed before  was  an ability worth valuing"&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;- Eric Smith, from his &lt;a href="http://www.nytimes.com/2010/08/22/jobs/22pre.html?_r=1"&gt;nytimes article The Healing Power of Construction Work&lt;/a&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-250854623364977509?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/250854623364977509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=250854623364977509&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/250854623364977509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/250854623364977509'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/on-creating-something-from-nothing.html' title='On creating something from nothing'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-4545028361035883780</id><published>2010-08-18T08:00:00.011-05:00</published><updated>2010-08-24T12:11:28.021-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone's Weekend Warriors</title><content type='html'>&lt;i&gt;Correction:  'Tim' correctly pointed out that the start dates for both sets of points actually are different weekdays. I stand corrected. And slightly flushed.  So, read on if you'd like to live in my dream world. If not, might I suggest reading about &lt;a href="http://en.wikipedia.org/wiki/Aztec_calendar"&gt;my kinda calendar&lt;/a&gt;. &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Original post:&lt;br /&gt;&lt;br /&gt;Heres a month-over-month snapshot of DoneDone usage. The blue line has dips on the weekend. The green line (representing the previous month's activity) saw greater usage during the weekends.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_qpIIGilVg8U/TGWr6KEYBhI/AAAAAAAAAms/PbYvogqR60M/s1600/done-done-monthOvrMonth.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img src="http://4.bp.blogspot.com/_qpIIGilVg8U/TGWr6KEYBhI/AAAAAAAAAms/PbYvogqR60M/s640/done-done-monthOvrMonth.png" width="480" border="0" height="54" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Weekend warriors, we salute you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-4545028361035883780?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/4545028361035883780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=4545028361035883780&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/4545028361035883780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/4545028361035883780'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedones-weekend-warriors.html' title='DoneDone&apos;s Weekend Warriors'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qpIIGilVg8U/TGWr6KEYBhI/AAAAAAAAAms/PbYvogqR60M/s72-c/done-done-monthOvrMonth.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-1867726653139661420</id><published>2010-08-16T15:32:00.004-05:00</published><updated>2010-08-14T22:22:20.527-05:00</updated><title type='text'>Refactoring in jQuery:  ID-happiness to code happiness</title><content type='html'>&lt;div&gt;Most jQuery advocates will agree that the single most powerful component of jQuery is its ability to query elements from the DOM. Power means freedom. It means you can do how you please. But, with anything that powerful, there’s a flipside to the story.  It’s too easy to write unwieldy jQuery code without some basic constraints. That’s where we need to think of some simple conventions to make sure we are painting pretty pictures with our code. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ID-happy&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Whenever I need to do something substantial in jQuery, I usually start by getting too "ID-happy."  The thought-process is simple and lazy: I want to make this button change this element when you click it.  Simple.  Let’s give it a unique ID and then write a quick click handler for it!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$('#my_unique_button_28').click(function() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   /*Make something happen!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;*/}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I can write this kind of code quickly, throw it at the end of my quickly expanding &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$(document).ready()&lt;/span&gt;function and move on.  I can get something running and working on the order of minutes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, this is where the freedom can &lt;i&gt;hurt&lt;/i&gt;.  Do this enough and you’re left with a host of event handlers applied to elements without giving much thought to &lt;i&gt;what or who or why&lt;/i&gt; this page behaves the way it does.  In the end, you’re only looking at the trees and not the forest.  You end up with what amounts to a laundry list of "things-just-happening" without seeing the greater connection.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$('#my_unique_button_28').click(function() { doThingA(); }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$('#my_unique_button_29').click(function() { doThingB(); }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$('li a').click(function() { doThingA(); doThingC(); }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$(".some_random_class").click(function() { doThingD(); }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;But, converting this chaotic mess into something more elegant is also very easy.  That’s what really makes jQuery so powerful.  I can take a "dust-settling" approach after I get things to work.  That’s where you need to apply your own mental framework on top of what jQuery gives you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;IDs vs. Classes&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Because I tend to be ID-happy, my jQuery code ends up being a laundry list of ID-specific events.  I’ll notice that a ton of almost-the-same functional code lives in these various event handlers, and, like I’d do in any programming language, I find an opportunity to refactor.  Take the common bits out into its own method, pass the differences in as parameters, and shrink your code accordingly.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, I’m still left with a bunch of events on too many IDs doing the same things.  That’s where I can take advantage of the polymorphic nature of jQuery - instead of tying similar functions to IDs, I can move them to classes.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you get in the habit of doing this, the&lt;i&gt; forest starts to come into view&lt;/i&gt;.  You’ll find that many elements on your page have some common set of behaviors.  This is functionality that should be represented by a class rather than an ID.  You’ll also find lots of behavior that only applies to one specific element - that’s functionality that should be represented by an ID, rather than a class. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;In jQuery,&lt;/b&gt; &lt;b&gt;the class attribute should represent an inherited piece of behavior whereas the ID attribute should represent unique behavior or a unique identifier&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In other words, I find where my ID-happiness is really just ID-abuse, and where it makes sense.  It's then a fairly clean exercise to add classes to the appropriate elements and apply the right event handlers to the right jQuery selectors.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That’s what makes jQuery so elegant - any two elements can share a similar set of behavior and have their own unique set of behavior.  The &lt;i&gt;polymorphic nature&lt;/i&gt; of jQuery selectors works perfectly with the medium.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A quick example&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Let me show you a quick example.  I'll focus solely on the thought-process that led me to the final code, rather than the code itself.  In the end, this is a fairly pedestrian example but the process of getting to the forest is what I find valuable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I recently built a simple panel rotator in jQuery:&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/_y5qjqN8IwL4/TGcRo6IQK3I/AAAAAAAAANs/jRe-5Ff9woE/s1600/jquery-post-1.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 398px; height: 341px;" src="http://1.bp.blogspot.com/_y5qjqN8IwL4/TGcRo6IQK3I/AAAAAAAAANs/jRe-5Ff9woE/s400/jquery-post-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5505388463980030834" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The rotator has a series of X-number of divs with a chronologically-ordered naming convention for each div’s ID (e.g. "div_0", "div_1", "div_2", "div_3", and so forth).   Here, the default div is just a picture of a divi-divi tree.*&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;* - I swear to you, it is only now as I write this that I realize the dual irony of (a) showing a tree after using the "forest-through-the-trees" cliché, and (b) showing a &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;div&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;i-&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;div&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;i tree.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Back to business. I set the CSS &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;display:none&lt;/span&gt; for all but the one that should display (I set that to "d&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;isplay:block&lt;/span&gt;").    The navigation, where the meat of the jQuery work lives, is at the bottom.  There’s a "previous" and "next" arrow along with a line of X-number of circular buttons.  Clicking on any of the arrows or buttons swaps out the divs while also changing the selected state of the corresponding circular button.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I start as I normally do.  I get ID-happy.  Let’s start with the "next" arrow.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Step 1: Apply behavior to the "Next" arrow&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I apply an ID to the "next" arrow ("&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;next_btn&lt;/span&gt;") and write a click handler to swap the current div with the next div.  In so doing, I end up adding a hidden input field that tracks the current div number.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;input id="cur_div_shown" type="hidden"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When a person clicks the arrow, I increment the current div number, check that it exists in the DOM, and, if it does, I hide the current div and show the new div.  Then, I set the hidden input field's value to that new number.  Applying the same ID naming convention to the circular buttons, I can show the selected state of the appropriate buttons as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Step 2: Apply behavior to the "Previous" arrow&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I apply the same process to the "previous" arrow.  It gets an ID ("&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;prev_btn&lt;/span&gt;") and a click handler.  Knowing I’m doing mainly the same thing, I just copy-and-paste the code for the next arrow over as a start.  I quickly see the only real difference is that the div I want to show is found by decrementing the hidden input value.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, a quick refactor pulls the logic out into its own function (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;toggleDivs(show)&lt;/span&gt;).  The function takes in the one differentiator - which parameter to show.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Step 3: Apply behavior to the circular buttons&lt;/b&gt;&lt;/div&gt;&lt;div&gt;With the circular buttons, it’s immediately obvious that they all share the same functionality, except that each one represents a different div in the rotating stack.  In fact, they apply the exact same behavior to the panels as with the previous and next arrows.  The difference is, each specific button shows its selected state when its corresponding div is displayed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The dust-settles and the picture gets clear&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Once we get the code to a working, despite ugly, state, we get to work on refactoring and taking advantage of the loose, polymorphic nature of jQuery selectors.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Taking a closer look, we’ve separated unique identification (ID) from common behavior (class).  Take a look again:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_y5qjqN8IwL4/TGb-gd0defI/AAAAAAAAANM/6f_DM0PROdk/s1600/jquery-post-2.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 116px;" src="http://3.bp.blogspot.com/_y5qjqN8IwL4/TGb-gd0defI/AAAAAAAAANM/6f_DM0PROdk/s400/jquery-post-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5505367428220942834" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;All seven buttons have common behavior - they toggle the div stack.  But each button individually reacts to the behavior differently.  The previous and next arrows aren’t affected at all, while the circular buttons show their selected state if their corresponding div is displayed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There’s a bit of adjustment to make to the prior statement, though.  While all seven buttons have the same common behavior, they each toggle a different div.  In my final code, I store the ID of that div in the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel&lt;/span&gt; attribute (There are probably more elegant, correct ways of doing this, but it suffices my needs right now).  For the circular buttons, the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel&lt;/span&gt; value maps directly to their own IDs (e.g. Circle button 2 toggles to &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;div_2&lt;/span&gt; when clicked, and so forth).  For the previous and next buttons, their &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel&lt;/span&gt; values change each time any button is clicked.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can then pull apart what ought to be represented as a class from what ought to be represented as an ID.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Behavior that should be represented by a class&lt;/b&gt;&lt;/div&gt;&lt;div&gt;So, what behavior should use classes?  There are three I came up with:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;All seven buttons share a common behavior - they all toggle the div stack.  In my code, I create a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;toggle&lt;/span&gt; class and write a specific event handler for all toggle classes.&lt;/li&gt;&lt;li&gt;All five of the circular buttons share a common behavior - they may be affected whenever the div stack changes.  I create a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;circle&lt;/span&gt; class.  Then, in my click event for the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;toggle&lt;/span&gt; class, I can use &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$('.circle')&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;to first set all &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;circle&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt; elements to their unselected state before finding the specific circle that needs to be selected.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;And naturally, all five of the circular buttons share another common trait - they may be in a selected state.  I create a &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;selected&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt; class and, in my click event for the &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;toggle &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;class, I can add the selected class to the appropriate circle.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_y5qjqN8IwL4/TGcFx-esQCI/AAAAAAAAANk/0aS_hkcT04I/s1600/jquery-post-3.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 175px;" src="http://1.bp.blogspot.com/_y5qjqN8IwL4/TGcFx-esQCI/AAAAAAAAANk/0aS_hkcT04I/s400/jquery-post-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5505375425627176994" border="0" /&gt;&lt;/a&gt;Because I can apply multiple classes to any DOM element, separating behavior into specific classes makes the HTML changes really easy and semantically sensible.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Each circular button should have a class of both &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;toggle &lt;/span&gt;and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;circle&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;The "previous" and "next" buttons should have a class of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;toggle.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Whenever the div stack changes (because an element with a class of toggle is clicked), we should add the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;selected &lt;/span&gt;class to the relevant circular button, using &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;addClass()&lt;/span&gt;.&lt;/li&gt;&lt;/ul&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;Behavior that should be represented by an ID&lt;/b&gt;&lt;/div&gt;&lt;div&gt;But each button also needs its own ID.  We use the ID of the circular buttons so that jQuery can select the exact button to display as selected.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_y5qjqN8IwL4/TGb-8frv4nI/AAAAAAAAANU/1KtJioYPLn0/s1600/jquery-post-4.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 175px;" src="http://1.bp.blogspot.com/_y5qjqN8IwL4/TGb-8frv4nI/AAAAAAAAANU/1KtJioYPLn0/s400/jquery-post-4.jpg" alt="" id="BLOGGER_PHOTO_ID_5505367909757608562" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;We also will use the ID of the previous and next buttons so that jQuery can modify their &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel&lt;/span&gt; values after any button is clicked.&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/_y5qjqN8IwL4/TGb_EHbESJI/AAAAAAAAANc/Hx8rVnoJKNg/s1600/jquery-post-5.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 175px;" src="http://1.bp.blogspot.com/_y5qjqN8IwL4/TGb_EHbESJI/AAAAAAAAANc/Hx8rVnoJKNg/s400/jquery-post-5.jpg" alt="" id="BLOGGER_PHOTO_ID_5505368040684144786" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So there we have it.  I start off ID-happy, writing functionality without really caring about elegance.  Once the dust settles, I decide what behaviors fall under a class construct (because they are used by more than one element) and what behavior falls under an ID construct (because they represent something specific to just one unique element).  I then just have to modify the ID and class attributes of the participating DOM elements.   The refactoring is quick and easy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;As I mentioned earlier, I purposely didn't get into the code in great detail here.  Instead, &lt;a href="http://www.wearemammoth.com/download/toggle-divs.zip"&gt;download this zip&lt;/a&gt; and run it locally.  Take a look at &lt;span style="font-family:courier new;"&gt;index.html&lt;/span&gt; for the details, and notice how the IDs and classes are employed after the refactoring.&lt;br /&gt;&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/34632793-1867726653139661420?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/1867726653139661420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=1867726653139661420&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/1867726653139661420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/1867726653139661420'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/thinking-in-jquery.html' title='Refactoring in jQuery:  ID-happiness to code happiness'/><author><name>Ka Wai Cheung</name><uri>http://www.blogger.com/profile/06985030207423187429</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02842674069213617206'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_y5qjqN8IwL4/TGcRo6IQK3I/AAAAAAAAANs/jRe-5Ff9woE/s72-c/jquery-post-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-7979670062457134425</id><published>2010-08-12T09:00:00.002-05:00</published><updated>2010-08-13T16:14:30.035-05:00</updated><title type='text'>What my browser tab bar looks like 90% of the time.</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qpIIGilVg8U/TGLUV1j6CbI/AAAAAAAAAmY/ChK2HumfAxA/s1600/1-2-3-Punch.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;My 1-2-3 punch.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-7979670062457134425?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/7979670062457134425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=7979670062457134425&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/7979670062457134425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/7979670062457134425'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/what-my-browser-tab-bar-looks-like-90.html' title='What my browser tab bar looks like 90% of the time.'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-5931953907701747987</id><published>2010-08-13T14:59:00.001-05:00</published><updated>2010-08-13T15:00:03.728-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone'rs : Total issues closed by guys named Jason: 914</title><content type='html'>That's an 81% hit rate, guys. Watch your backs, and &lt;a href="http://www.youtube.com/watch?v=qkuZDafSsSs"&gt;stay out of the woods&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;-the DoneDone team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-5931953907701747987?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/5931953907701747987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=5931953907701747987&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/5931953907701747987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/5931953907701747987'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedoners-total-issues-closed-by-guys.html' title='DoneDone&apos;rs : Total issues closed by guys named Jason: 914'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-3756474180777624530</id><published>2010-08-13T09:00:00.000-05:00</published><updated>2010-08-13T09:00:07.210-05:00</updated><title type='text'>Jared Spool's Facilitator</title><content type='html'>&lt;blockquote&gt;The facilitator is a momentary leader. They step in and  take over, with everyone's support and respect, to push through the  group's next activity. Team members often take turns facilitating,  spreading the effort around, giving everyone a chance to guide the team  for that moment.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;- Jared Spool&amp;nbsp; in "&lt;a href="http://www.uie.com/articles/indispensable_skills"&gt;Five Indispensable Skills for UX Mastery&lt;/a&gt;"&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-3756474180777624530?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/3756474180777624530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=3756474180777624530&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3756474180777624530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3756474180777624530'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/jared-spools-facilitator.html' title='Jared Spool&apos;s Facilitator'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-4132400908902413712</id><published>2010-08-11T09:56:00.001-05:00</published><updated>2010-08-11T10:00:08.734-05:00</updated><title type='text'>Gmail's Pixel Pruning</title><content type='html'>An update from Gmail today ...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_qpIIGilVg8U/TGK62h3YEoI/AAAAAAAAAmQ/-SGlOnURpe0/s1600/2010-08-11_0950+copy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_qpIIGilVg8U/TGK62h3YEoI/AAAAAAAAAmQ/-SGlOnURpe0/s320/2010-08-11_0950+copy.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Relevant because it points to where the change has occurred. Friendly  because they take the time to craft a pleasant message about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-4132400908902413712?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/4132400908902413712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=4132400908902413712&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/4132400908902413712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/4132400908902413712'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/gmails-pixel-pruning.html' title='Gmail&apos;s Pixel Pruning'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qpIIGilVg8U/TGK62h3YEoI/AAAAAAAAAmQ/-SGlOnURpe0/s72-c/2010-08-11_0950+copy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-6116793727696664166</id><published>2010-08-09T07:00:00.001-05:00</published><updated>2010-08-09T07:00:05.186-05:00</updated><title type='text'>DoneDone Tip: Critical is the new Low</title><content type='html'>Some testers tend to use an issue's Priority label to negotiate their way to the top of a developers list. More than likely, it has the opposite effect. DoneDone has an alert to help these testers give a little extra thought to the Priority they're assigning to their issues. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_qpIIGilVg8U/TFxjMPRM5wI/AAAAAAAAAmA/oqjfc7B8PWM/s1600/priority.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_qpIIGilVg8U/TFxjMPRM5wI/AAAAAAAAAmA/oqjfc7B8PWM/s320/priority.png" /&gt;&lt;/a&gt;&lt;/div&gt;When a tester consistently labels issues with the same Priority, it gives them a quick prompt asking them if they're aware that xx% of their issues are of the same Priority. Hmmmm, could be, but I'll be they're not!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-6116793727696664166?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/6116793727696664166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=6116793727696664166&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6116793727696664166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6116793727696664166'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedone-tip-critical-is-new-low.html' title='DoneDone Tip: Critical is the new Low'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qpIIGilVg8U/TFxjMPRM5wI/AAAAAAAAAmA/oqjfc7B8PWM/s72-c/priority.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-3719688630647659644</id><published>2010-08-06T15:10:00.001-05:00</published><updated>2010-08-06T15:10:57.452-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone'rs :  38,783 issues whacked.</title><content type='html'>As of 3pm CST today &lt;b&gt;38,783 &lt;/b&gt;issues have been closed out. Have a good weekend, warriors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-3719688630647659644?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/3719688630647659644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=3719688630647659644&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3719688630647659644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3719688630647659644'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedoners-38783-issues-whacked.html' title='DoneDone&apos;rs :  38,783 issues whacked.'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-3165463180844975088</id><published>2010-08-03T21:38:00.001-05:00</published><updated>2010-08-03T21:42:33.329-05:00</updated><title type='text'>A quote from Pascal.</title><content type='html'>&lt;blockquote&gt;“I wrote you a long letter because I didn’t have time to make it shorter.” - Pascal&lt;/blockquote&gt;Noticed in a &lt;a href="http://www.alistapart.com/articles/no-one-nos-learning-to-say-no-to-bad-ideas/"&gt;good post over&lt;/a&gt; at A List Apart&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-3165463180844975088?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/3165463180844975088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=3165463180844975088&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3165463180844975088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3165463180844975088'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/quote-from-pascal.html' title='A quote from Pascal.'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-8300598777445152853</id><published>2010-07-19T08:00:00.004-05:00</published><updated>2010-08-02T22:08:18.322-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone Tip: Issue gatekeepers</title><content type='html'>DoneDone Tip: At the onset of the testing phase, it's helpful to have your client assign issues to a single, designated person on the development team. This gatekeeper's job is to quickly route issues to the person best-fit to tackle the problem. Longer term, the client will get familiar with individual team members and their responsibilities.&amp;nbsp; Doing this at the start though helps smooth the transition into testing and keeps a single member on your team aware of everything that's going on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-8300598777445152853?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/8300598777445152853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=8300598777445152853&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/8300598777445152853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/8300598777445152853'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/07/donedone-tip-issue-gatekeepers.html' title='DoneDone Tip: Issue gatekeepers'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-3640854496482163150</id><published>2010-08-02T08:00:00.002-05:00</published><updated>2010-08-02T22:07:55.054-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone Tip: Release Builds</title><content type='html'>Using the “Release Builds” feature is a great way to notify your extended team that you’ve wrapped up work for the day. It sends emails to the entire team letting them know that their specific issues are ready for re-test. If you find yourself overwhelmed with new issues, not-fixed issues, emails, and constant banter about all the above, your team may benefit from using Release Builds. It creates a more cadenced fix/test cycle, putting everyone on a more predictable schedule.&lt;br /&gt;&lt;br /&gt;How do you use 'em?  Click "project settings" from your project's dashboard, scroll down, and click "enable release builds".&lt;br /&gt;&lt;br /&gt;Read a bit more at: &lt;a href="http://getdonedone.com/faq.aspx#projects_3" target="_blank"&gt;http://getdonedone.com/faq.aspx#projects_3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-3640854496482163150?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/3640854496482163150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=3640854496482163150&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3640854496482163150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/3640854496482163150'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/08/donedone-tip-release-builds.html' title='DoneDone Tip: Release Builds'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-2441240041627120511</id><published>2010-07-30T17:26:00.001-05:00</published><updated>2010-08-02T22:07:14.628-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone users: 41% done as of 7/30</title><content type='html'>As of Friday 7/30 at 3pm CT, the DoneDone community was wrapping up the  week with 41% of it's issues closed out. Alas, next week is another chance to battle the other 59%&lt;br /&gt;&lt;br /&gt;Want to see your own status report? Click the "Status report" link from  your project's dashboard for a quick overview of where you're all at.&lt;br /&gt;&lt;br /&gt;Have a great weekend, everyone.&lt;br /&gt;&lt;br /&gt;-The DoneDone team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-2441240041627120511?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/2441240041627120511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=2441240041627120511&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2441240041627120511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/2441240041627120511'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/07/donedone-users-41-done-as-of-730.html' title='DoneDone users: 41% done as of 7/30'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-8493533652429918475</id><published>2010-07-26T11:07:00.001-05:00</published><updated>2010-08-02T22:06:06.845-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone users: 48% done as of 7/23</title><content type='html'>As of Friday 7/23 at 3pm CT, the DoneDone community was wrapping up the week with 48% of it's issues closed out. Hope everyone's getting a good start on that other 52%. Keep on gettin' Done'r.&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;Want to see your own status report? Click the "Status report" link from your project's dashboard for a quick overview of where you're all at.&lt;br /&gt;&lt;br /&gt;-The DoneDone team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-8493533652429918475?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/8493533652429918475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=8493533652429918475&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/8493533652429918475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/8493533652429918475'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/07/donedone-users-48-done-as-of-723.html' title='DoneDone users: 48% done as of 7/23'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-6316700537082461124</id><published>2010-07-26T08:00:00.004-05:00</published><updated>2010-07-26T08:00:00.674-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoneDone'/><title type='text'>DoneDone Tip: Screenshot tools</title><content type='html'>Two indispensable and free screenshot tools are &lt;a href="http://www.jingproject.com/"&gt;Jing&lt;/a&gt; and &lt;a href="http://bugshooting.com/"&gt;BugShooter&lt;/a&gt;. Jing uploads your screenshot to the web and copies the link to it to your clipboard so you can just share a URL in your DoneDone issue. Bugshooter integrates with DoneDone, so all you do is point, shoot, and tell it which issue to upload it to.&lt;br /&gt;&lt;br /&gt;No more saving to your desktop, or using photoshop, or plopping into powerpoint. Bam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-6316700537082461124?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/6316700537082461124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=6316700537082461124&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6316700537082461124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6316700537082461124'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/07/donedone-tip-screenshot-tools.html' title='DoneDone Tip: Screenshot tools'/><author><name>Craig Bryant</name><uri>http://www.blogger.com/profile/03011758970927946992</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01672317134488946607'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34632793.post-6872408744847210814</id><published>2010-07-23T14:44:00.009-05:00</published><updated>2010-07-23T16:12:43.830-05:00</updated><title type='text'>Unexpected User Experiences: Help That Doesn’t Hurt</title><content type='html'>Excessive UI makes computing a drag. &lt;span style="FONT-STYLE: italic"&gt;I am emptying the trash, and yes, I'm certain.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But sometimes UI help is right on time.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;I draw stuff. Sometimes lots of stuff.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I like &lt;a href="http://www.gliffy.com/"&gt;Gliffy&lt;/a&gt;. I use it for UI sketches. I use &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsmiq&lt;/a&gt; too. They're both handy.&lt;br /&gt;&lt;br /&gt;When I'm sketching with either tool I jump right to what matters - the interface itself. As you would expect, each time you draw something new, it’s placed in front of everything else.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Flt9WhER2NA/TEnyD5M7MEI/AAAAAAAAADE/Q3jdGqCI1SM/s1600/Gliffy_Interface.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5497190968890961986" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: pointer; HEIGHT: 205px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_Flt9WhER2NA/TEnyD5M7MEI/AAAAAAAAADE/Q3jdGqCI1SM/s320/Gliffy_Interface.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;When I'm ready to share my idea I create a window behind my UI sketch. I usually don’t draw the window first because I’m not sure how wide or tall it should be. And sometimes I just forget.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5497209419770810306" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 151px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_Flt9WhER2NA/TEoC14Fez8I/AAAAAAAAADM/kKfZBntqGhI/s320/Gliffy_Interface_Window_Back.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;I was delighted by Gliffy because it automatically sends newly created window objects to the back. &lt;strong&gt;Controls in context, baby!&lt;/strong&gt; The window object is treated differently from all other objects because it has a unique function. It's function is (usually) to sit behind everything else.&lt;br /&gt;&lt;br /&gt;Is it the right choice every time? Nah. But it saves me a click 95% of the time and I appreciate that. If I need the window in front for some reason I can always bring it forward.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Good Catch, Gmail.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I’ve been That Guy who send emails with attachments who forgets to actually attach the file. Thankfully, Gmail does it’s best to save me.&lt;br /&gt;&lt;br /&gt;If I’ve typed “I have attached” in the message but haven’t attached a file, I get a reprieve.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5497209663939155602" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 186px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_Flt9WhER2NA/TEoDEFrwFpI/AAAAAAAAADU/-8TgMg7LpdE/s320/Gmail_He_Hate_Me.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;If you’re in the business of attaching things other than email attachments, like human arms, maybe it’s really annoying. I wouldn’t know because I have never seen this message unless I needed it and I’ve always been thankful when it pops up.&lt;br /&gt;&lt;br /&gt;Jump in the comments and tell me about unexpected UI behavior, good or bad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34632793-6872408744847210814?l=blog.wearemammoth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.wearemammoth.com/feeds/6872408744847210814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=34632793&amp;postID=6872408744847210814&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6872408744847210814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34632793/posts/default/6872408744847210814'/><link rel='alternate' type='text/html' href='http://blog.wearemammoth.com/2010/07/unexpected-user-experiences-help-that.html' title='Unexpected User Experiences: Help That Doesn’t Hurt'/><author><name>sam bennett</name><uri>http://www.blogger.com/profile/02599875103395318607</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12955993698654993898'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Flt9WhER2NA/TEnyD5M7MEI/AAAAAAAAADE/Q3jdGqCI1SM/s72-c/Gliffy_Interface.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>