<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Technology Development, Engineering Management and Agile Processes</title>
	<atom:link href="http://johnragan.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://johnragan.wordpress.com</link>
	<description>My experiences in developing, managing and applying Agile processes</description>
	<lastBuildDate>Wed, 11 Jan 2012 17:53:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='johnragan.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/2d3be32dc1107f273b88154afd16d2e8?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Technology Development, Engineering Management and Agile Processes</title>
		<link>http://johnragan.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://johnragan.wordpress.com/osd.xml" title="Technology Development, Engineering Management and Agile Processes" />
	<atom:link rel='hub' href='http://johnragan.wordpress.com/?pushpress=hub'/>
		<item>
		<title>More Effective Studying</title>
		<link>http://johnragan.wordpress.com/2011/07/31/more-effective-studying/</link>
		<comments>http://johnragan.wordpress.com/2011/07/31/more-effective-studying/#comments</comments>
		<pubDate>Sun, 31 Jul 2011 18:41:56 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[The Softer Side]]></category>

		<guid isPermaLink="false">http://johnragan.wordpress.com/?p=1031</guid>
		<description><![CDATA[I spend a lot of my free time studying computer science.  For about a year and half, I spent about 20 hours/week.  Now I am down to only about 10 or 12. Historically, I typically studied only one item at a time, whereas I had a friend who would do two or three.  I believe [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=1031&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I spend a lot of my free time studying computer science.  For about a year and half, I spent about 20 hours/week.  Now I am down to only about 10 or 12.</p>
<p>Historically, I typically studied only one item at a time, whereas I had a friend who would do two or three.  I believe his approach to be better and have adopted it.</p>
<p>When you study a single technical book, all items are not equal.  The earlier items provide a required base for the later items; you have to fully understand and recall them in addition to the later material you are studying.  What helps with that fuller comprehension?  Removal and time.</p>
<p>If I read part A of a book and wait until the next day to read part B, my subconscious mind has a chance to process that material and master it.  Thus, coming back the next day makes reading and comprehending part B all that much easier.  It the same science that allows me to suddenly make connections on problems I have been working on when taking a shower.</p>
<p>Sometimes you may be aware of that processing.  For example, some nights I may recall having intense problem solving dreams around something I am studying as my brain forms new neural networks.  This also works for new video games.</p>
<p>Now, I am studying about five different subjects simultaneously.  Not only is the process less taxing and stressful, but I am mastering it more effectively.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/1031/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/1031/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/1031/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/1031/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/1031/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/1031/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/1031/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/1031/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/1031/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/1031/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/1031/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/1031/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/1031/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/1031/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=1031&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2011/07/31/more-effective-studying/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Information Architecture &#8211; Part 2</title>
		<link>http://johnragan.wordpress.com/2010/06/02/information-architecture-part-2/</link>
		<comments>http://johnragan.wordpress.com/2010/06/02/information-architecture-part-2/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 21:58:19 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Development Techologies]]></category>
		<category><![CDATA[The Softer Side]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=953</guid>
		<description><![CDATA[I read about half of the &#8220;Information Architecture for the World Wide Web&#8221;, and then stopped at that.   Not because it is not a good book; I just don&#8217;t plan to become a professional Information Architect.  If I need to go deeper at some point, I&#8217;ll read the rest.  All in all, I definitely recommend [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=953&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I read about half of the &#8220;Information Architecture for the World Wide Web&#8221;, and then stopped at that.   Not because it is not a good book; I just don&#8217;t plan to become a professional Information Architect.  If I need to go deeper at some point, I&#8217;ll read the rest.  All in all, I definitely recommend the book.</p>
<p>Nonetheless, it is really interesting to think about information architecture, organization, structure and search as abstract concept independent of an actual application, as well as applying to the real world of grocery stores, department stores, libraries, etc.</p>
<p>A couple of things really stuck out for me in addition to what I learned in &#8220;Don&#8217;t Make Me Think&#8221;:</p>
<p>There are two main ways to organize based upon the needs of your users:</p>
<ul>
<li><strong>Exact organizational scheme.</strong> When the user knows exactly what they are looking for (e.g., white pages)</li>
<li><strong>Ambiguous organizational scheme.</strong> When users don&#8217;t know what they are looking for.  Some types include organizing by task or topic, among other things</li>
</ul>
<p>Hierarchical organizational structures can be tricky as many things do not neatly fit into a strict taxonomy.  A taxonomy that allows cross-listing is referred to as polyhierarchical.  However, if too much of this takes place, the value of the organization is reduced.</p>
<p>In addition, there is tension between the breadth and depth of the hierarchies.  It is generally better to go for greater breadth, particularly as your site grows.</p>
<p>My knowledge grew the most in the area of search.  I have a friend whose site needs search capability.  I had thought of plugging something in for him for the entire site, and until did not realize the complexities involved in matching the users needs to the search capabilities.</p>
<p>For one, your users may need recall or precision, but they can&#8217;t have simultaneously as these are mutually exclusive:</p>
<ul>
<li><strong>Recall.</strong> Recall is oriented toward finding a greater number of relevant matches (e.g., doing due dilligence on a company you are considering joining)</li>
<li><strong>Precision.</strong> Precision is oriented toward finding just a few very high quality matches (e.g., instructions on deck staining)</li>
</ul>
<p>You will need to configure or choose your search engine accordingly.  In addition, choosing to take advantage of automatic stemming (e.g., using thesauri) in your searching will result in greater recall at the expense of the precision.  Your users&#8217; goals needs to play an important part in this configuration.</p>
<p>In addition, you can choose to index your entire site, or break it up different search zones.  Once again, the former increases recall, while the latter increases precision.</p>
<p>Finally, there are numerous ways and levels of details to provide around search results.  Once again, this will be based upon your users goals.</p>
<p>In the end, you need to really understand your users&#8217; goals to be able to create the appropriate Information Architecture.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/953/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/953/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/953/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/953/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/953/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/953/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/953/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/953/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/953/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/953/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/953/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/953/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/953/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/953/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=953&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/06/02/information-architecture-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>User Stories Applied: For Agile Software Development by Mike Cohn</title>
		<link>http://johnragan.wordpress.com/2010/05/27/user-stories-applied-for-agile-software-development-by-mike-cohn/</link>
		<comments>http://johnragan.wordpress.com/2010/05/27/user-stories-applied-for-agile-software-development-by-mike-cohn/#comments</comments>
		<pubDate>Thu, 27 May 2010 21:01:19 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Agile and Management]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=930</guid>
		<description><![CDATA[So, I have been busy the last number of weeks rolling out Scrum along with complementary Agile practices to a new team.  I saw this book, thumbed through it, and felt it would help me address some of the challenges I saw down the road.  I put a brown bag together that morning, and then [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=930&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So, I have been busy the last number of weeks rolling out Scrum along with complementary Agile practices to a new team.  I saw this book, thumbed through it, and felt it would help me address some of the challenges I saw down the road.  I put a brown bag together that morning, and then off we went on planning our new release!</p>
<p>I (as Scrum Master) had already worked with the PM (e.g., Product Owner) to prioritize the features. We did not have them in user story format yet, but that was okay as we had a set of one to two sentence feature descriptions.</p>
<p>How could that possibly be okay?  Well, the real purpose of user stories is not so much to fully document the desired functionality but to serve as placeholders to drive face to face discussions between developers and PM.  From the Agile Manifesto:  &#8220;Individuals and Interactions over processes  and tools&#8221;.  With only a few sentences, you have to talk.  You can add a  few notes and assumptions, but I like the general advice about how if  your user story notecard is not large enough to hold all the  information, try a <strong>smaller</strong> notecard.</p>
<p>In other companies I had worked unsuccessfully with PM&#8217;s trying to leverage Use Cases as the new solution.  They were taking too long to write, the PM&#8217;s did not have time to do it, and often the PM&#8217;s would write use cases based upon the UI design they had in mind for a feature as opposed to addressing the harder task of writing it based upon users&#8217; needs.  User stories force you to address the latter.</p>
<p>Make no mistake, designing features based upon the users&#8217; real needs is challenging, hard, and painful.  The work we spent the last 1.5 days was much harder than the coding I expect to be doing in support of these features &#8211; I would go home exhausted!</p>
<p>First, we gathered the developers, QA and Doc together.  PM and UX served as the customer representatives in the Estimating Game.  We have our upcoming release, and needed to get a rough estimate for each feature for initial release planning and re-prioritization based upon effort.</p>
<p>The PM would grab the next highest priority user story (feature) and present it.  Then, all of us would ask a number of questions about the feature.  After that, developers would write their estimates down, and then they would reveal all at once.  The estimates would often differ wildly, so the developers would discuss their rationale.  We would repeat a couple times and come to consensus.  QA and Doc would give their estimates, and then it was tracked.</p>
<p>The meeting went well at first, but then started to bog down as the PM had to leave early and we were missing the business value.  So, for our next meeting, I asked the PM to convert each feature to an epic user story on the fly.  It was epic because it was too large in term of what would need to be done, and required being broken down into multiple user stories.</p>
<p>We would then raise a number of questions, continue to take the initial user story and break it down into other user stories based upon user end-to-end functionality.  We all worked extra hard to keep UI out of the stories, and to use implementation only as examples to flesh out desired behavior.  What was particularly helpful was using this format from the book:</p>
<p style="padding-left:30px;"><em>I (as role) want to be able to do (feature) because (business value)</em></p>
<p>Since our PM is busy, I decided to use the meetings with him to focus on  user stories, and then have separate meetings with the implementers to  play the estimating game (and later sync back together).</p>
<p>Now that we had this, it was much easier for the developers to work with UX on how to approach the feature, and how to design it at a high-level for estimation in separate sessions (we&#8217;ll pull the PM back in to these as well as his time frees up).</p>
<p>For one user story, a developer pointed out that the user story presented a solution for solving a problem rather than stating the problem that needed to be solved.  It was subtle, but by being able to back the user story up to the more abstract representation of the problem to be solved, we can design a much better feature.</p>
<p>In general, it takes longer for the development team to complete the estimating game for the user stories associated with each feature than it does to work with PM to break them up.</p>
<p>Initially, I had hoped to approach the features planned for the release in a Just in Time (JIT) approach on each Sprint, but given dependencies between the features and user stories, it was important to spend a few days up front establishing the user stories associated with the release, even if all may not end up making it.</p>
<p>It was painful, but necessary and effective.  Sitting down together and talking through these features was highly effective.  We have a much better understanding of how to design the features in a way that will best meet the end user&#8217;s needs.  The Developers picked up a much deeper domain knowledge of the problems our customers are facing, as well as an increased respect for the PM (as did I).  I think the PM (by participating in the initial estimating game) had a better understanding of why the estimates were as high as they were.  All in all, we are much better positioned for success.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/930/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/930/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/930/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=930&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/05/27/user-stories-applied-for-agile-software-development-by-mike-cohn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Information Architecture &#8211; Part 1</title>
		<link>http://johnragan.wordpress.com/2010/05/22/information-architecture/</link>
		<comments>http://johnragan.wordpress.com/2010/05/22/information-architecture/#comments</comments>
		<pubDate>Sat, 22 May 2010 13:01:32 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Development Techologies]]></category>
		<category><![CDATA[The Softer Side]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=921</guid>
		<description><![CDATA[Taking a break from development and Agile activities, I have started reading &#8220;Information Architecture for the World Wide Web&#8221; by Peter Morville &#38; Louis Rosenfeld.  This is part of my attempt to increase the user-oriented side of my skills in addition to more technical web development skills. The book begins by using an analogy of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=921&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Taking a break from development and Agile activities, I have started reading &#8220;Information Architecture for the World Wide Web&#8221; by Peter Morville &amp; Louis Rosenfeld.  This is part of my attempt to increase the user-oriented side of my skills in addition to more technical web development skills.</p>
<p>The book begins by using an analogy of physical building architecture, which builds nicely on the mental model I started to build up from Steve Krug&#8217;s &#8220;Don&#8217;t Make Me Think&#8221;.  Different building architectural styles serve different user purposes, labeling and classification enable users to navigate effectively, and the importance of search.  While there are also similarities with physical libraries, the multi-dimensionalities associated with the web present a different set of problems.</p>
<p>What I found interesting is their discussion on Information Needs and Information Seeking Behaviors.  They discussed four types of Information Needs:</p>
<ul>
<li><strong>The Perfect Catch.</strong> You know exactly what you are looking for &#8211; someone&#8217;s telephone number, a fact about the population of the state of Louisiana, etc.  Basically, you are looking for &#8220;the right answer&#8221;</li>
<li><strong>Information Exploration.</strong> You might looking for the best apartment swapping services in Paris, or different investment options in your online 401K service (as I was recently).  There are multiple good matches.</li>
<li><strong>Exhaustive Research.</strong> You might be doing research for your thesis, or conducting medical research about a disease a friend may have acquired.  You want to leave no stone unturned.</li>
<li><strong>Refinding.</strong> This is where services like del.icio.us come in handy, or the &#8220;Favorites&#8221;  link in YouTube</li>
</ul>
<p>The point is, how you design search capability and organize your site is going to differ vastly for these purposes, and an understanding of how your users will want to use your site will play a major role in your information architecture.  How you organize search, links, content and navigation will either enable or befuddle your users in their goals.  In other words, you want to set things up in such a way that your users do not need to think.</p>
<p>Another thing I found interesting (I am only through Part 1) is the Berry Picking Model by Dr. Marcia Bates of USC:</p>
<ol>
<li>Start with an information need</li>
<li>Formulate an information request (query)</li>
<li>Move through the site(s) in different ways</li>
<li>Pick up important bits of information (berries)</li>
<li>Refine your query based upon what you already found and repeat</li>
</ol>
<p>This stuck out because I was just doing this this morning before reading this:</p>
<ol>
<li>Searching for help on using a particular technique</li>
<li>Finding some helpful articles (and either adding to del.icio.us or Evernote) while browsing then rejecting unhelpful ones</li>
<li>Altering the search query in the hopes that it would offer more links that better fit my need</li>
</ol>
<p>Finally, even though the product I work on a web-based application as opposed to a site, an understanding of Information Architecture can also be helpful in terms of how we present information and work with user requests.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/921/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=921&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/05/22/information-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Using WATIR for Browser Based Testing</title>
		<link>http://johnragan.wordpress.com/2010/05/01/using-watir-for-browser-based-testing/</link>
		<comments>http://johnragan.wordpress.com/2010/05/01/using-watir-for-browser-based-testing/#comments</comments>
		<pubDate>Sat, 01 May 2010 14:29:40 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Development Techologies]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=903</guid>
		<description><![CDATA[I had wanted to learn to use Selenium to automate browser-based testing, but a QA person at work gave a brown bag on WATIR.  Given the number of browsers I could use it with, I decided to play around with it. The WATIR site has a page on installation which is pretty straight-forward (I didn&#8217;t [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=903&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I had wanted to learn to use Selenium to automate browser-based testing, but a QA person at work gave a brown bag on WATIR.  Given the number of browsers I could use it with, I decided to play around with it.</p>
<p>The <a href="http://watir.com/">WATIR site</a> has a <a href="http://watir.com/installation/">page on installation</a> which is pretty straight-forward (I didn&#8217;t bother with supporting Safari on my Mac, and the Windows install was pretty straight forward as well).  Installing the plugins for FireFox referenced on the <a href="http://watir.com/installation/">install page</a> was also straightforward.</p>
<p>You do need to start Firefox up initially using the <em>-jssh</em> option (for IE on Windows, it comes up automatically).  Here is how I did it for Mac:</p>
<p style="padding-left:30px;"><em>cd into /applications/Firefox.app/Contents/MacOS<br />
./firefox-bin -jssh</em></p>
<p>For Windows 7:</p>
<p style="padding-left:30px;"><em>cd into Program Files (x86)\Mozilla Firefox </em><br />
<em>firefox.exe -jssh</em></p>
<p>I brought up Ruby&#8217;s IRB to start playing around.  On my Mac, I could execute commands in the IRB, but in my ruby script file, it was failing on the following:</p>
<p style="padding-left:30px;"><em>require &#8216;watir&#8217;</em></p>
<p>For the scripts, I needed to add <em>require &#8216;rubygems&#8217;</em> first.  On Windows, I needed to do this for both IRB and ruby scripts:</p>
<p style="padding-left:30px;"><em>require &#8216;rubygems&#8217;</em><br />
<em>require &#8216;watir&#8217;<br />
</em></p>
<p>To bring Firefox, I did the following (you can just comment out the first line to bring up IE):</p>
<p style="padding-left:30px;"><em>Watir::Browser.default = &#8220;firefox&#8221;</em><br />
<em>b = Watir::Browser.start &#8220;http://mysite.com&#8221;</em></p>
<p>The browser popped up to this site.  I needed to login, so I specified the name and password by finding the element by id and then specifying the text to be typed in:</p>
<p style="padding-left:30px;"><em>b.text_field(:id, &#8220;user&#8221;).set(&#8220;name_of_user&#8221;)</em><br />
<em>b.text_field(:id, &#8220;password&#8221;).set(&#8220;the_password&#8221;)<br />
</em></p>
<p>In the browser, it was almost as if an invisible person typed in the text.  Next, I needed to the &#8220;Sign In&#8221; button, but there was no id associated with it, so I had to click it after finding it by its value:</p>
<p style="padding-left:30px;"><em>b.button(:value, &#8216;Sign In).click</em></p>
<p>Now the home page came up.  I wanted to create a new Foo, so I needed to get to the Foo page, which is referenced by a link and is called &#8220;New Foo&#8221; on the page:</p>
<p style="padding-left:30px;"><em>b.link(:text, &#8216;New Foo&#8217;).click</em></p>
<p>I was now on the new page, and starting following the steps to fill out the fields to create the new Foo.  However, I was getting the following error:</p>
<pre><code> C:/Ruby/lib/ruby/gems/1.8/gems/watir-1.6.5/lib/watir/element.rb:56:in `assert_ex ists': Unable to locate element, using :id, "username" (Watir::Exception::Unknow nObjectException) from C:/Ruby/lib/ruby/gems/1.8/gems/watir-1.6.5/lib/watir/element.rb:288 :in `enabled?' from C:/Ruby/lib/ruby/gems/1.8/gems/watir-1.6.5/lib/watir/element.rb:60: in `assert_enabled' from C:/Ruby/lib/ruby/gems/1.8/gems/watir-1.6.5/lib/watir/input_elements .rb:327:in `set' from watir_fun.rb:6 </code></pre>
<p>I double checked the id&#8217;s; all looked well.  It turned out that that page was doing some additional javascript after having been loaded, so these fields were not ready for me to access.  By adding &#8216;sleep 2&#8242; to the script prior, the page had time to load; and I was able to follow the steps to create the entity.</p>
<p>But was the entity created successfully?  Because none of the displayed fields had a unique id (and this was only a quick experiment), I simply checked with something like the following:</p>
<p style="padding-left:30px;"><em>b.text.include?(&#8220;Hot Stocks&#8221;)</em></p>
<p>Obviously, for production readiness this is not acceptable, so we would likely had keys or some easier way to access via XPATH and so forth.   The point is, WATIR gives you an easy way to automate interacting with a browser and seeing what the results are.</p>
<p>In the end, I found picking up WATIR to be quite straightforward.  Back when I was at my current company previously, I used to go through a short manual test script before checking it to make sure my changes didn&#8217;t break anything.  This weekend (for fun), I hope to code up this former script in WATIR in just a few hours and start having us use it in Development next week.</p>
<p>Additionally, the WATIR web-site is helpful, well-organized, and I hear the help and mailing lists are quite responsive and friendly.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/903/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/903/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/903/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/903/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/903/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/903/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/903/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/903/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/903/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/903/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/903/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/903/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/903/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/903/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=903&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/05/01/using-watir-for-browser-based-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Choosing Clojure Over Scala</title>
		<link>http://johnragan.wordpress.com/2010/04/13/choosing-clojure-over-scala/</link>
		<comments>http://johnragan.wordpress.com/2010/04/13/choosing-clojure-over-scala/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 21:47:23 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Development Techologies]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=888</guid>
		<description><![CDATA[I saw Venkat Subramanian given a presentation on Scala at one of the NOVAJUG meetings. Venket is an excellent presenter and a very smart guy. Two weeks or so ago Stuart Halloway gave a presentation on Clojure at another NOVAJUG meeting held at Oracle. Stuart is one of those guys who makes you marvel how [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=888&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I saw Venkat Subramanian given a presentation on Scala at one of the NOVAJUG meetings.  Venket is an excellent presenter and a very smart guy.</p>
<p>Two weeks or so ago Stuart Halloway gave a presentation on Clojure at another NOVAJUG meeting held at Oracle.  Stuart is one of those guys who makes you marvel how fast his brain works.  Unfortunately, his one hour presentation probably could have used 90 minutes to two hours to fully absorb.  I went by the book store the next night, and all copies of his Clojure book were gone.</p>
<p>For the last five months or so, I have been trying to figure out whether to study Clojure or Scala.  Given the fact that I am in chapter 2 of Stuart&#8217;s Clojure (as well as the subtle title of this post), I have decided to go with Clojure.</p>
<p>Scala looked very promising, but Clojure seemed far more different than Java.  I view that as a good thing.  Getting experience in a variety of language styles as opposed to those that seem closer to Java can only be a good thing,  No, I am not saying the Scala is just like Java.</p>
<p>Clojure does have a lot of common with LISP, which I enjoyed programming in in college.  But it appears to have made some improvements over standard LISP.</p>
<p>Its functional and transactional approach to concurrency (as opposed to manual locking) seems interesting.</p>
<p>Finally, as Ruby is a more expressive language than Java, Clojure appears to be even more expressive than Ruby.  Clojure may be very different than Java, but it is easier to program in (as claimed by Stuart).</p>
<p>Will Clojure be the next big language?  Possibly.  Will I be a much better developer by learning a language such as Clojure?  Definitely.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/888/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/888/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/888/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/888/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/888/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/888/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/888/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/888/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/888/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/888/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/888/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/888/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/888/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/888/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=888&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/04/13/choosing-clojure-over-scala/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Ruby Strings &#8211; How to Put String With Single Quotes in Single Quotes</title>
		<link>http://johnragan.wordpress.com/2010/04/08/ruby-strings-how-to-put-string-with-single-quotes-in-single-quotes/</link>
		<comments>http://johnragan.wordpress.com/2010/04/08/ruby-strings-how-to-put-string-with-single-quotes-in-single-quotes/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 21:26:06 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Development Techologies]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=880</guid>
		<description><![CDATA[I set up a series of Ruby unit tests to better explore SED.  Basically, I invoke it as follows: def sed_result(input_str, sed_str) %x[echo #{input_str} &#124; #{sed_str}] end It worked well, until I did this: assert_equal("howdy\n", sed_result("howdy from Texas", "sed 's/\([a-zA-Z]*\).*/\1/'")) Assigning the latter string to a variable in ruby produces a different string, because strings [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=880&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I set up a series of Ruby unit tests to better explore SED.  Basically, I invoke it as follows:</p>
<pre><code>def sed_result(input_str, sed_str)
     %x[echo #{input_str} | #{sed_str}]
end
</code></pre>
<p>It worked well, until I did this:</p>
<pre><code>assert_equal("howdy\n", sed_result("howdy from Texas", "sed 's/\([a-zA-Z]*\).*/\1/'"))
</code></pre>
<p>Assigning the latter string to a variable in ruby produces a different string, because strings in double quotes are processed:  &#8220;sed &#8216;s/([a-zA-Z]*).*/01/&#8217;&#8221;</p>
<p>For example, when I want to do string interpolation, I have double quotes instead of single quotes as follows:  &#8220;The value of foo is #{foo}&#8221; to the string &#8220;The value of foo is bar&#8221;.  This time, I don&#8217;t want any processing of the string, but want to pass it as is.  Thus, I need to use single quotes, except my string contains single quotes.  What to do?</p>
<p>Well, the following use of %q[] is the same as using single quotes, and worked well:</p>
<pre><code>
assert_equal("howdy\n", sed_result("howdy from Texas", %q[sed 's/\([a-zA-Z]*\).*/\1/']))
</code></pre>
<p>Additionally, you can use %Q[] in place of double quotes.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/880/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=880&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/04/08/ruby-strings-how-to-put-string-with-single-quotes-in-single-quotes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Spawning a Process in Ruby</title>
		<link>http://johnragan.wordpress.com/2010/04/04/spawning-a-process-in-ruby/</link>
		<comments>http://johnragan.wordpress.com/2010/04/04/spawning-a-process-in-ruby/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 00:48:34 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Development Techologies]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=859</guid>
		<description><![CDATA[A good way for me to learn code-related technologies is to write unit tests.  It helps to work through the nuances, and gives me something I can go back to refresh myself as needed. Right now, I have been going through SED, which does not have an associated unit test framework.  To test this, I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=859&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A good way for me to learn code-related technologies is to write unit tests.  It helps to work through the nuances, and gives me something I can go back to refresh myself as needed.</p>
<p>Right now, I have been going through SED, which does not have an associated unit test framework.  To test this, I want to use Ruby and then spawn a process to execute SED and then get the results back for the <em>assert_equal</em> call of all my tests.  I want to do this while avoiding the overhead of using files and file redirection (where possible).</p>
<p>I obviously can&#8217;t use <em>Kernel::exec</em>, as that will replace my currently running process and end my testing real quick.  I want to do the following:</p>
<pre><code>
     system("echo #{input_str} | #{sed_str}")
</code></pre>
<p>Where <em>input_str</em> is the input SED is processing, the <em>sed_str</em> is the SED command str.</p>
<p>Of course, I can&#8217;t do this as this is two processes being piped together.</p>
<p>If I use read and write files, I can do the following:</p>
<pre><code>
     system("#{sed_str} output.txt")
</code></pre>
<p>In the end, I got it to work as follows:</p>
<pre><code>
def sed_result(input_str, sed_str)
     %x[echo #{input_str} | #{sed_str}]
end
</code></pre>
<p>There are other options to look into &#8211; IO.pipe, IO.popen and Open3 (among others).  But I have a lot of SED unit tests to write first!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/859/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/859/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/859/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/859/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/859/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/859/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/859/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/859/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/859/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/859/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/859/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/859/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/859/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/859/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=859&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/04/04/spawning-a-process-in-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Talent is Overrated and Deliberate Practice</title>
		<link>http://johnragan.wordpress.com/2010/03/30/talent-is-overrated-and-deliberate-practice/</link>
		<comments>http://johnragan.wordpress.com/2010/03/30/talent-is-overrated-and-deliberate-practice/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 14:00:25 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[The Softer Side]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=847</guid>
		<description><![CDATA[Recently on the This Week in Tech podcast, I listened to Jason Calicanis extol the book Talent is Overrated.  I picked it up on Audible and listened to it back and forth from work for the past two weeks. The major premise of the book is that we often grow up with the myth that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=847&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently on the <em>This Week in Tech</em> podcast, I listened to Jason Calicanis extol the book <em>Talent is Overrated</em>.  I picked it up on Audible and listened to it back and forth from work for the past two weeks.</p>
<p>The major premise of the book is that we often grow up with the myth that people either have a talent or they don&#8217;t, and that that is what their determines their successful (or its corollary &#8211; you must have a great inborn talent and practice).   It vigorously tears down this myth in regard to Mozart, and then Tiger Woods.  In a nutshell, sustained practice is what determines your level of success.  And not just any practice &#8211; deliberate practice, which is often not very fun.</p>
<p>It reminded me of &#8220;Asians are intrinsically better a math&#8221; myth that is debunked in Malcolm Gladwell&#8217;s <em>Outliers</em>.  A hard work culture that results in lots of hard work and practice in math, a discipline that requires a lot of practice.  I have shared this with my daughter many times vis-a-vis math as she studies to get into college and become a doctor.  But have I shared it with myself enough?</p>
<p>How many times have you worked with a programming wonderboy and attributed it to a natural talent that very few people have?  How often have you let yourself off the hook due to this?</p>
<p>This last year has been an intense year of deliberate practice for me.  Outside of work, I spend 15-20 hours a week studying computer science &#8211; learning new languages, mastering old ones, new OS&#8217;s, techniques, technologies, etc.  It has been a lot of deliberate practice, and my skills are far superior to what they were a year ago.</p>
<p>I have also noticed that the more I study, the easier it is to pick up new concepts I come across.</p>
<p>In addition, I have developed an absolute passion for programming that I had not experienced in a while.  All of this is leading to more deliberate practice and greater proficiency, as well as widening of the areas I am interested in and studying.</p>
<p>My latest thing is going through the <em>Ruby Quizzes</em> from <em>Pragmatic Programmers</em>.  I am not doing it to learn Ruby, but to write better Ruby.  The exercise in writing the best Ruby code I can, comparing it to example, and making changes it making me a much better Ruby developer.  I am learning about my strengths and weaknesses as a developer, and focusing on improving those weaknesses instead of doing the same old thing over and over.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/847/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/847/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/847/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/847/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/847/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/847/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/847/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/847/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/847/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/847/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/847/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/847/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/847/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/847/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=847&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/03/30/talent-is-overrated-and-deliberate-practice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
		<item>
		<title>Clean Code</title>
		<link>http://johnragan.wordpress.com/2010/03/24/clean-code/</link>
		<comments>http://johnragan.wordpress.com/2010/03/24/clean-code/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 09:39:51 +0000</pubDate>
		<dc:creator>John Ragan</dc:creator>
				<category><![CDATA[Development Techologies]]></category>
		<category><![CDATA[The Softer Side]]></category>

		<guid isPermaLink="false">http://johnragan.org/?p=830</guid>
		<description><![CDATA[I listened to &#8220;Uncle Bob&#8221; Robert Martin talk about Software Craftsmanship on either the Software Engineering Radio or Pragmatic Programmer podcast.  It got me thinking.  I have been studying a lot of programming languages and technologies lately, but when was the last time I focused on pure coding itself?  I was a like a painter [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=830&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I listened to &#8220;Uncle Bob&#8221; Robert Martin talk about <em>Software Craftsmanship</em> on either the <em>Software Engineering Radio</em> or <em>Pragmatic Programmer</em> podcast.  It got me thinking.  I have been studying a lot of programming languages and technologies lately, but when was the last time I focused on pure coding itself?  I was a like a painter learning about oils, acrylics and water colors &#8211; but it was time to focus on the cross-cutting techniques of painting applicable in any medium.</p>
<p>So I picked up his book &#8211; <em>Clean Code</em>, and summarized the contents to be able to repeatedly refer back it.  A number of the things he covered I already knew from an earlier study group on Martin Fowler&#8217;s <em>Refactoring</em> book.</p>
<p>Understanding it intellectually was not going to be enough so I picked out one of the quizzes from the <em>Ruby Quiz</em> (<em>Pragmatic Programmers</em>) and tried to apply it.  At the same time, I also decided to do full &#8220;Orthodox TDD&#8221;, where I did not do any development until I had a failing test.  I worked through some design alternatives up front, and then proceeded with the one I liked.</p>
<p>It was slow going.  I tried to be as true to the book as possible, and then meant a lot of refactoring as I thought of new ways to create cleaner code based upon the book.  As much as I like Ruby, Java is definitely an easier language to refactor (but thank heavens for all the unit tests &#8211; a necessity in Ruby).  I have seen a book out there on Refactoring in Ruby, and I may pick that one up.</p>
<p>But slow going is okay.  When you study martial arts, you are supposed to go slow as you apply the techniques.  With practice, speed comes later on top of perfect technique.  In this practice scenario, I was doing just that.  This was the major reason I was doing this on a home project as opposed to work, where speed is obviously more important.</p>
<p>More challenging than I expected was creating extremely well named entities &#8211; a lot of rename refactoring took place.  Nonetheless, the number of comments I had in my code was extremely small &#8211; it was unnecessary as the naming told the story.  I tried to follow his newspaper model of letting my code tell the story in various levels of detail &#8211; this worked out well in the end.  Plus, the lack of comments that were not there that typically were &#8220;because they are supposed to be&#8221; made the code much easier to understand.  It was better, and liberating.</p>
<p>I did struggle with some things.  The breaking down of all the methods into small methods ended up with a lot of lower level methods.  While the methods were extremely cohesive, there were a lot of them.  A good signal to me that I had broken them down into too many sub-methods was the extreme difficulty I had in creating names for them to show their intent without using any type of synonyms.  Based upon that, I recombined some of the methods.</p>
<p>I also struggled with his advice on not using return codes or error codes.  In his statement, if your method performs a state change on the object and returns a return code, it is doing both a state change and a query, violating the cohesiveness of the method.  By throwing an exception instead, the method is more cohesive and the consumer can write less complex code.  Plus, if you refactor complex methods into multiple more cohesive methods, having to check for return codes permeates through each invocation, increasing code bloat.</p>
<p>Nonetheless, this seemed to run against Joshua Bloch&#8217;s advice in Effective Java on using Exceptions only for exceptional conditions as well as the overhead associated with them.  I also did not like having to create a new Exception class as this seemed to increase the necessary mental model for code.</p>
<p>Then, I thought on the pattern typically found in Enumerators &#8211; a cohesive querying hasNext() method along with a next() method that either returns the next entity or throws an exception if one is not found.  How many API&#8217;s had I seen lately where they had been modified to offer a similar query method, or offer variations of methods that either returned an error code or threw an exception.  I am seeing the value, but I am continuing to work through this.</p>
<p>Overall, this is an excellent book to study.  I will continue to apply it as I work with other technologies at home to improve my general coding abilities.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/johnragan.wordpress.com/830/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/johnragan.wordpress.com/830/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/johnragan.wordpress.com/830/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/johnragan.wordpress.com/830/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/johnragan.wordpress.com/830/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/johnragan.wordpress.com/830/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/johnragan.wordpress.com/830/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/johnragan.wordpress.com/830/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/johnragan.wordpress.com/830/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/johnragan.wordpress.com/830/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/johnragan.wordpress.com/830/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/johnragan.wordpress.com/830/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/johnragan.wordpress.com/830/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/johnragan.wordpress.com/830/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=johnragan.wordpress.com&amp;blog=6643405&amp;post=830&amp;subd=johnragan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://johnragan.wordpress.com/2010/03/24/clean-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/157b41fc8320e0abfad285db47311e80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">John Ragan</media:title>
		</media:content>
	</item>
	</channel>
</rss>
