<?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/"
	>

<channel>
	<title>ThotSpots</title>
	<atom:link href="http://www.thotspots.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thotspots.com</link>
	<description>Agile Software Development</description>
	<lastBuildDate>Wed, 09 Sep 2009 18:13:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Outsmarting the Competition in a Down Economy &#8211; Part 4: Keep Your Good People</title>
		<link>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-4-keep-your-good-people/</link>
		<comments>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-4-keep-your-good-people/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 17:21:49 +0000</pubDate>
		<dc:creator>Vladimir Drndarski</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=208</guid>
		<description><![CDATA[You might be laying people off, but don&#8217;t be penny wise and pound foolish.  There&#8217;s a reason your most expensive people are expensive.  Going through a spreadsheet with names and salaries to make cuts is probably the worst way you can accomplish cost savings. After all, these are the people that provide you with your [...]]]></description>
			<content:encoded><![CDATA[<p>You might be laying people off, but don&#8217;t be penny wise and pound foolish.  There&#8217;s a reason your most expensive people are expensive.  Going through a spreadsheet with names and salaries to make cuts is probably the worst way you can accomplish cost savings. After all, these are the people that provide you with your core-competency, right? You have to make sure that you’re keeping the cream of your crop.</p>
<p>If you don&#8217;t know who those people are, you have bigger issues going on than just the economy.  Some management has no idea what its people do day-to-day.  Find out what your people do – and not just their role or job title. In fact, find out as much as you can about your people&#8217;s skills beyond their work.  One company, through several rounds of layoffs, let go of the last person who was familiar with the design of an electrical component still in production and being sold to customers.  This is stupidity at its best. Your thought workers are the essence of your company.</p>
<p>Consider Wendy’s founder Dave Thomas.  Prior to starting his hamburger chain, he was in the fried chicken business.  Thomas turned around four failing Kentucky Fried Chicken restaurants, introduced the famous rotating bucket of chicken sign, reorganized the famous chain’s menu and sold the franchises back to the company for a cool $1.5 million (if that doesn’t sound like much, keep in mind that this was back in the 1960s).  His departure to start his own place was a friendly one, but imagine what he could have done for KFC had they offered him incentive to stay.</p>
<p>Then there’s Michael Bloomberg.  Before becoming mayor of New York City, Bloomberg and 61 other partners at investment bank Salomon Bros. were laid off as part of a corporate merger.  Bloomberg turned the $10 million severance he received from the proceeds of the company’s sale into his own $20 billion business, financial information giant Bloomberg LP.  Wouldn’t you like an entrepreneur like that in your idea department?</p>
<p>Of course, not all workers have the potential to make your company better.  Removing truly weak links can only strengthen the structure.  But accidentally do away with the best and the brightest, and be prepared to watch your competition grow stronger.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-4-keep-your-good-people/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Outsmarting the Competition in a Down Economy &#8211; Part 3: Grow</title>
		<link>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-3-grow/</link>
		<comments>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-3-grow/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 17:17:58 +0000</pubDate>
		<dc:creator>Vladimir Drndarski</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=204</guid>
		<description><![CDATA[What!? Yes, grow your company now.  It&#8217;s a buyers market for just about everything; real estate, employees, equipment, services, you name it. Buying low and selling high is not just a stock market axiom. Andrew Carnegie introduced the concept of counter-cyclical investing in the late 1800s.  It was his secret sauce.  During the slump between [...]]]></description>
			<content:encoded><![CDATA[<p>What!? Yes, grow your company now.  It&#8217;s a buyers market for just about everything; real estate, employees, equipment, services, you name it. Buying low and selling high is not just a stock market axiom. Andrew Carnegie introduced the concept of counter-cyclical investing in the late 1800s.  It was his secret sauce.  During the slump between 1893 and 1897, he upgraded his entire operation to the latest equipment at rock bottom prices.  In 1900 when the economy had turned around, the profits of his companies were $40 million for the year.</p>
<p>You should be looking at liquidation auctions for your industry, surfing Craigslist and eBay for equipment and generally bargain hunting constantly. In the meantime, don’t forget about human capital.  Great employees are getting pink slips left and right simply because the companies they work for are going under.  Your company is only as good as the people who run it – this is the time to make their losses your gain.</p>
<p>Of course, growth isn’t just about your assets; it’s about your product.  But at the first signs of economic slowing, many firms seem to forget that, instinctively scaling back marketing to lower costs.  That’s exactly what most companies did during the Great Depression – all except for Proctor &#038; Gamble, that is.  To the initial chagrin of its shareholders, P&#038;G actually increased its advertising campaign and expanded into a brand new territory known as radio.  Its creative ads, known as “soap operas” (sound familiar?), were such a smash hit that P&#038;G doubled it’s radio budget every two years during the Depression and by 1939 sponsored 21 programs, essentially creating the modern radio industry.  P&#038;G bet that Americans would keep buying household goods during the Depression, and they figured branding was the only way to differentiate their products from other companies’.  It paid off.  When tough times ended and Americans wallets expanded again, consumers stayed loyal to P&#038;G.</p>
<p>It might feel counter intuitive to push for growth when business is slow, but this is when the time is ripe to grab more market share.  If you actively manage business while your competitors bury their heads in the sand, your company can shine.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-3-grow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Outsmarting the Competition in a Down Economy &#8211; Part 2: Improve Efficiency</title>
		<link>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-2-improve-efficiency/</link>
		<comments>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-2-improve-efficiency/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 17:07:45 +0000</pubDate>
		<dc:creator>Vladimir Drndarski</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=202</guid>
		<description><![CDATA[If your costs are lower than all of your competitors, you’re in a much better position than they are to weather a financial storm.  You&#8217;re also in a better position in the good times as well.  An athlete processes food and oxygen and turns it into energy much more efficiently than I do. Money [...]]]></description>
			<content:encoded><![CDATA[<p>If your costs are lower than all of your competitors, you’re in a much better position than they are to weather a financial storm.  You&#8217;re also in a better position in the good times as well.  An athlete processes food and oxygen and turns it into energy much more efficiently than I do. Money is the food and oxygen of a company and you need to process it as efficiently as possible.  Some companies have done this to an uncanny science.  Aldi Foods is a great example of a company that&#8217;s done this perfectly in grocery retail.  Where a normal grocery store has 70,000 SKUs (different items), Aldi has 1,400. They eliminate any features that raise cost without providing substantial benefit.  Southwest Airlines does the same thing.  Their flight attendants clean up as the plane lands and reduce the airplane&#8217;s on-ground time.  Flying planes make money, planes on the ground don’t.</p>
<p>You don’t have to be a low price leader to focus on efficiency.  Apple Computers isn&#8217;t thought of as cheap in any sense of the term.  But they&#8217;re very efficient at producing new, innovative, appealing products very quickly.  They push products to market quickly, and then, as Guy Kawasaki says, they &#8220;churn, baby, churn&#8221;.  Maybe even more important, they never stop.  Just three weeks after Apple introduced its groundbreaking iPhone, it was back with a shuffle version.</p>
<p>So what around you is inefficient? You don&#8217;t have to be a CEO or manager to initiate process improvement.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-2-improve-efficiency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Outsmarting the Competition in a Down Economy &#8211; Part 1: Focus on Core Competencies</title>
		<link>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-1-focus-on-core-competencies/</link>
		<comments>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-1-focus-on-core-competencies/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 16:53:22 +0000</pubDate>
		<dc:creator>Vladimir Drndarski</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=196</guid>
		<description><![CDATA[It sounds obvious to say "focus on core competencies" but it's really surprising the kinds of things companies will do in-house.  They do it in the name of saving money, but in the long run it's a distraction at best and a disaster at worst.  What is a core competency?  It's anything that distinguishes your company from the competition.]]></description>
			<content:encoded><![CDATA[<p>It sounds obvious to say &#8220;focus on core competencies&#8221; but it&#8217;s really surprising the kinds of things companies will do in-house.  They do it in the name of saving money, but in the long run it&#8217;s a distraction at best and a disaster at worst.  What is a core competency?  It&#8217;s anything that distinguishes your company from the competition.  <span id="more-196"></span>Google, for instance, has written custom operating system and web server software.  Blazing fast searches are a core competency for Google, but even for us at ThotSpots, a software development company focused on web development, it makes no sense at all to write or modify the server software.</p>
<p>Two years ago, LA Unified School District made the national news when their custom $95 million payroll system failed to properly process paychecks. I&#8217;m not going out on a limb by asserting that payroll processing is not LAUSD&#8217;s core competence.  If your company is not in the business of providing payroll services, why do you have a full-time payroll staff? Does that distinguish you from the competition? Or if you&#8217;re not a software company, why do you employ a team of developers? Hire us, or another software consulting company with expertise in software engineering, an environment and structure centered around developing excellent software, and let your management team focus on your core business.</p>
<p>If you think your ancillary service teams are critical to your success, could you spin them off as a separate company? Are they so good that they could compete with other companies and win?  If they are that good, why haven&#8217;t you spun them off yet!?  If they&#8217;re not, why do you hold on to them?</p>
<p>Instead of struggling to cover your company’s low value, high cost operations, why not outsource?  Case-in-point: Hansen’s Natural Soda. You’d think they focus on beverages, right?  But Hansen’s is really in the business of marketing.  They have two main products – a line of natural sodas aimed at the health-conscious and a line of high-sugar energy drinks aimed at young adults looking for a jolt, two pretty distinct demographics.  Rather than deal with costly operations and distribution (and labor associated with them), Hansen’s purchases its ingredients and bottling supplies and lets other beverage plants make its product while it focuses on their image.  As a result, Hansen’s was able to reach sales of $988 million and a profit of $170 million in 2008 with less than 1,000 people on its payroll.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/outsmarting-the-competition-in-a-down-economy-part-1-focus-on-core-competencies/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Demystifying Domain-Specific-Languages (DSL)</title>
		<link>http://www.thotspots.com/demystifying-domain-specific-languages-dsl/</link>
		<comments>http://www.thotspots.com/demystifying-domain-specific-languages-dsl/#comments</comments>
		<pubDate>Mon, 04 May 2009 01:45:47 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=194</guid>
		<description><![CDATA[Groovy supports creating Domain Specific Languages.  A DSL is simply a mini programming language tailored to a specific situation or domain.  The idea is to hide the characteristics of the underlying programming language as much as possible (in this case, Groovy/Java), and let the vocabulary of the application domain shine through.
DSLs are nothing [...]]]></description>
			<content:encoded><![CDATA[<p>Groovy supports creating Domain Specific Languages.  A DSL is simply a mini programming language tailored to a specific situation or domain.  The idea is to hide the characteristics of the underlying programming language as much as possible (in this case, Groovy/Java), and let the vocabulary of the application domain shine through.</p>
<p>DSLs are nothing new.  Just by encapsulating the concepts of a domain in classes (&#8221;domain objects&#8221;) and by defining the methods on those classes that act on them (&#8221;actions&#8221; and &#8220;messages&#8221;), you create a DSL of sorts.  You see this a lot in unit testing.  As a body of unit tests evolves, common SetUp and TearDown code is often extracted to avoid duplication.  As the extracted classes and methods grow and evolve, a DSL emerges. For an excellent example of this, see <a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&amp;tag=thotspots-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0132350882">Clean Code: A Handbook of Agile Software Craftsmanship</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&amp;l=as2&amp;o=1&amp;a=0132350882" border="0" alt="" width="1" height="1" /> by Robert Martin.</p>
<p>Groovy accomplishes the creation of DSLs in a number of ways:<br />
<span id="more-194"></span></p>
<ol>
<li><strong>Optional Syntax:</strong> In Groovy, much of the syntax is optional:  semicolons at the end of statements when they are the only statement on the line, parenthesis around arguments in a method call, etc.  Dropping away such &#8220;noise&#8221; is one way that the user can then focus on the domain at hand.</li>
<li><strong>Missing-Method Methods:</strong> In Java, if you call a method that does not exist, you get a compiler error.  In Groovy, it waits until runtime to decide if it&#8217;s a problem, giving the class with the missing method a chance to make up a method on the spot.  This is done with a special &#8220;missing-method method.&#8221;  For example, this is how GORM allows you to make up method calls like findByPersonAndJobTitle().  There&#8217;s a missing-method method that knows how to parse out the name, &#8220;findByPersonAndJobTitle&#8221;  see that it&#8217;s comprised of pieces it understands (a find action and two field names) and thereby construct the logic to perform that action.</li>
<li><strong>Operator overloading:</strong> Groovy allows you to define methods that correspond to the various operators, like plus() for the + sign.  This means your DSL could allow for expression like &#8220;car = chassis + 4 * tires&#8221; and &#8220;truck = (cab + 6 * tires) + (trailer + 4 * tires) + (trolley + 4 * tires) + (trailer + 4 * tires)&#8221;</li>
<li><strong>Named Parameters:</strong> Grails has the ability to emulate named-parameters (which means that having to know the order in which to pass parameters is no longer a concern).  This is done by defining the method to accept a single map as a parameter.  Then, in the call, a map is created on the fly with hard-coded keys that look like parameter names, and expressions that are the corresponding arguments.  Leave out the optional square brackets that normally enclose a map constant, and wallah! Named parameters:</li>
<li><strong>Closures:</strong> Groovy&#8217;s strong support for Closures means it&#8217;s easy to define custom control structures</li>
<li><strong>Categories, MetaClasses, and GroovyObject:</strong> Without going into details, these are some of the core facilities in Groovy that make it a dynamic &#8220;scripting&#8221; language and so suitable for expressing DSLs</li>
</ol>
<p><strong>Builders:</strong><br />
The most common use of DSLs in Grails is the idiomatic &#8220;builder.&#8221;  This is for when there is a distinct hierarchy, or tree-structure to the elements of the domain.  There are pre-defined builders for Swing, XML, HTTP, Hibernate Criteria, HTML, ANT, and the Constraints builder in Grails that drives the validation mechanism, just to name a few.  It&#8217;s easy to create your own builders as well.</p>
<p>With the groovy.xml.MarkupBuilder(), for example, instead of having to write your own XML&#8230;</p>
<pre>&lt;stocks&gt;
  &lt;stock symbol='JAVA'&gt;
    &lt;quote day='Mon' price="53.125" /&gt;
    &lt;quote day='Tue' price="54.5" /&gt;
    &lt;quote day='Wed' price="51.75" /&gt;
  &lt;/stock&gt;
  &lt;stock symbol='MSFT' /&gt;
  &lt;stock symbol='IBM' /&gt;
&lt;/stocks&gt;</pre>
<p>You can express the information like this:</p>
<pre>builder.stocks {
    stock(symbol: 'JAVA') {
        quote(day: 'Mon', price: 53.125)
        quote(day: 'Tue', price: 54.5)
        quote(day: 'Wed', price: 51.75)
    }
    stock(symbol: 'MSFT')
    stock(symbol: 'IBM' )
}</pre>
<p>At first glance, it might seem like you&#8217;re just trading one arbitrary syntax for another: parenthesis, braces, colons and commas, rather than angle-brackets, equal signs, and  matched-up start and end tags.  However, this is merely a dumbed-down example.  The benefits of using a builder are enormous:</p>
<p>For one thing, the Builder syntax is universal.  Once you know who to write XML markup using Builder syntax, you also know how to write HTML markup, Swing forms, Grails criteria, and all of the other pre-defined builders mentioned above, and more .</p>
<p>Also, since Builder syntax is built on top of Groovy, Groovy code can be intermixed with the DSL code.  For example, we can use each-loops to build the XML markup from a &#8220;tickerInfo&#8221; object:</p>
<pre>builder.stocks {
    tickerInfo.each {ticker -&gt;
        stock(symbol: ticker.symbol) {
            ticker.dailyQuotes.each{
                quote(day: it.day, price: it.price)
            }
        }
    }
}</pre>
<p>DSLs are a key reason for the success of Grails.  Taking advantage of Groovy&#8217;s DSL support is a prime example of how much thought has gone into the architecture Grails with it&#8217;s prime directive to be as idiomatic-Grails as possible.</p>
<p>We&#8217;ve only just scratched the surface of what DSLs are and how they are supported in Groovy.  Here is some recommended further reading:</p>
<ul>
<li><a href="http://docs.codehaus.org/display/GROOVY/Writing+Domain-Specific+Languages" target="_blank">docs.codehaus.org/display/GROOVY/Writing+Domain-Specific+Languages</a></li>
<li><a href="http://docs.codehaus.org/display/GROOVY/How+Builders+Work" target="_blank">How Builders Work</a></li>
<li><a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&amp;tag=thotspots-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0132350882">Clean Code: A Handbook of Agile Software Craftsmanship</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&amp;l=as2&amp;o=1&amp;a=0132350882" border="0" alt="" width="1" height="1" /> by Robert Martin</li>
</ul>
<p><strong>Related articles:</strong></p>
<ul>
<li><a href="http://www.thotspots.com/clean-code-book/" target="_blank">A brief review of <em>Clean Code</em></a></li>
<li><a href="http://www.thotspots.com/everythings-groovy/" target="_blank">Everything&#8217;s Groovy</a></li>
<li><a href="http://www.thotspots.com/ides-for-groovygrails/" target="_blank">IDEs for Groovy/Grails</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/demystifying-domain-specific-languages-dsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum and XP Books for Getting Started</title>
		<link>http://www.thotspots.com/scrum-and-xp-books-for-getting-started/</link>
		<comments>http://www.thotspots.com/scrum-and-xp-books-for-getting-started/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 05:49:50 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Agile development]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/scrum-and-xp-books-for-getting-started/</guid>
		<description><![CDATA[For any programmer who wants to learn the particulars of Scrum (short of attending a Scrum training seminar, that is), if you are already somewhat familiar with agile practices like XP, then probably the best place to start is with Ken Schwaber&#8217;s second book, Agile Project Management with Scrum.
Schwaber&#8217;s first book, Agile Software Development with [...]]]></description>
			<content:encoded><![CDATA[<p>For any programmer who wants to learn the particulars of Scrum (short of attending a Scrum training seminar, that is), if you are already somewhat familiar with agile practices like XP, then probably the best place to start is with Ken Schwaber&#8217;s second book, <a href="http://www.amazon.com/gp/product/073561993X?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=073561993X">Agile Project Management with Scrum</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=073561993X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>
<p>Schwaber&#8217;s first book, <a href="http://www.amazon.com/gp/product/0130676349?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0130676349">Agile Software Development with Scrum</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=0130676349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, is more of a reference book than a how-to.  It describes what Scrum is, but not so much the nuances of how to use it. <span id="more-164"></span> The second book includes a reference section in the back that pretty much recaps the first book.  So, start there.  If a pass through the reference section makes sense to you, then proceed directly with the second book.  Otherwise, pick up the first book as well and use it to get up to speed.</p>
<p>If you are not yet up to speed on XP, the quintessential tome, <a href="http://www.amazon.com/gp/product/0321278658?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0321278658">Extreme Programming Explained: Embrace Change (2nd Edition)</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=0321278658" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Kent Beck, is still the best starting place.  I&#8217;d recommend reading that before reading up on Scrum.  As you do, just keep in mind that Scrum essentially replaces and expands upon the XP &#8220;planning game.&#8221;  Don&#8217;t skip reading about the planning game.  Just understand that if you have questions about how the planning game works in the real world, hold those questions until you get to Scrum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/scrum-and-xp-books-for-getting-started/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Clean Code&#8221; &#8212; Crafting On Principles</title>
		<link>http://www.thotspots.com/clean-code-book/</link>
		<comments>http://www.thotspots.com/clean-code-book/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 21:26:00 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[naming conventions]]></category>
		<category><![CDATA[Robert Martin]]></category>
		<category><![CDATA[simplicity]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=109</guid>
		<description><![CDATA[I&#8217;ve been reading &#8220;Clean Code: A Handbook of Agile Software Craftsmanship&#8221; by Robert Martin.  This is no ordinary book on writing better software.  It&#8217;s not just a rehash of &#8220;Code Complete&#8221; or &#8220;The Pragmatic Programmer.&#8221;  Those are both fine books, but &#8220;Clean Code&#8221; is different.  So, please don&#8217;t think that if [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading &#8220;<a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&#038;tag=thotspots-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0132350882">Clean Code: A Handbook of Agile Software Craftsmanship</a><img src="http://www.assoc-amazon.com/e/ir?t=thotspots-20&#038;l=as2&#038;o=1&#038;a=0132350882" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />&#8221; by Robert Martin.  This is no ordinary book on writing better software.  It&#8217;s not just a rehash of &#8220;Code Complete&#8221; or &#8220;The Pragmatic Programmer.&#8221;  Those are both fine books, but &#8220;Clean Code&#8221; is different.  So, please don&#8217;t think that if you&#8217;ve read one, you&#8217;ve read them all.</p>
<p>In Clean Code, Martin doesn&#8217;t just name the best practices we should all be following.  He explains the reasoning behind each one and gives names to the concepts.  Just as the idea of software design patterns revolutionized the way we think and talk about software architecture, Martin&#8217;s exploration of day-to-day coding habits gives us a smarter way to think and talk about that.</p>
<p>Case in point: Clean Code kicks off with the practice of giving your objects meaningful names.  One aspect of this is that good names do not require anyone who might read your code in the future to have to perform any &#8220;mental mappings.&#8221;  Here&#8217;s an example of this that I came across just the other day.<span id="more-109"></span></p>
<pre>var ld = new LoginData();</pre>
<p>Look carefully, that&#8217;s a lower-case <span style="font-family: courier new,courier,monospaced">L</span>.  At first glance, it looks like a capital <span style="font-family: courier new,courier,monospaced">I</span>, as in &#8220;ID,&#8221; as in &#8220;identifier.&#8221;  I don&#8217;t know how long I spent confused about how a class constructor could be returning an identifier when reading through this code for first time.  Maybe ten or fifteen seconds?  Time in which I was completely distracted from understanding the rest of the code, having pushed that problem onto the stack, as it were, in order to first solve this mini-problem.</p>
<p>Even without the <span style="font-family: courier new,courier,monospaced">I</span> vs. <span style="font-family: courier new,courier,monospaced">L</span> confusion, using an abbreviated variable name meant that whenever I came across it, I had to keep reminding myself that it stood for an instance of LoginData.  That may not seem like a big deal, but we humans only have so much stack space before we run out of short-term memory.  When a program is full of one- and two-letter variable names that must be continually translated mentally, it leaves no room for thinking about the actual problem that the program is trying to solve.</p>
<p>All of this could have been avoided if the name was spelled out to begin with, so I changed it (using the automated rename refactoring tool in my IDE):</p>
<pre>var loginData = new LoginData();</pre>
<p>&#8220;One difference between a smart programmer and a professional programmer is that the professional programmer understands that clarity is king.  Professionals use their powers for good and write code that others can understand.&#8221; ~ Robert (Uncle Bob) Martin</p>
<p>Martin could have just said, &#8220;don&#8217;t use abbreviations in variables names, because you&#8217;ll make the reader translate it in his head every time he reads it,&#8221; and that would have been terrific advice alone.  But what he really gives you is a deep understanding of the key principles involved, so that you won&#8217;t need to memorize a bunch of arbitrary coding standards in order to write cleaner code.  Instead, you&#8217;ll be armed with a few simple, understandable principles to guide you, with clean code being the natural outcome.</p>
<p>Clean Code is a must-read for everyone in the software profession &#8212; from college freshmen on up to CTOs &#8212; especially anyone who finds himself out of work in this economy (or worried about the possibility).  Learning to write clean code, and thus to write more valuable code, is probably the single most effective thing you can do for yourself. Programmers are expensive resources.  The work we produce is costly.  It&#8217;s up to us to treat it with the respect it deserves, to try and make it as valuable as possible, and to maintain that value as long as possible.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/clean-code-book/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Everything&#8217;s Groovy</title>
		<link>http://www.thotspots.com/everythings-groovy/</link>
		<comments>http://www.thotspots.com/everythings-groovy/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 09:21:20 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Architecture and Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[web frameworks]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=97</guid>
		<description><![CDATA[One of the major benefits of using Grails as a web platform is how almost everything can be written in a single language &#8212; Groovy.  No more switching gears between language constructs.  Everything&#8217;s Groovy.
Groovy is most definitely the star of the Grails show.  Every decision that went into formulating Grails started with, &#8220;What&#8217;s the [...]]]></description>
			<content:encoded><![CDATA[<p>One of the major benefits of using Grails as a web platform is how almost everything can be written in a single language &#8212; Groovy.  No more switching gears between language constructs.  Everything&#8217;s Groovy.</p>
<p><span id="more-97"></span>Groovy is most definitely the star of the Grails show.  Every decision that went into formulating Grails started with, &#8220;What&#8217;s the Groovy take on this? How can we best take advantage of the innate ability of Groovy to solve this?&#8221;  This attitude makes for a framework that&#8217;s powerful, yet minimal and consistent.</p>
<p>This attitude also goes beyond the Web framework.  Groovy can be used end-to-end from inside the web server pages to the outer build scripts and even your shell scripts.  In the Java world, before Grails came along, one would have to work in seven different languages to build a web app.  Grails potentially reduces that to three:</p>
<table border="1" cellspacing="1" cellpadding="1" width="90%" align="center">
<tbody>
<tr align="left" valign="top">
<th>Aspect<br/>&nbsp;</th>
<th>Any other Java Web Framework (e.g. JSP/Struts)</th>
<th>Grails Way</th>
</tr>
<tr align="left" valign="top">
<td>Business Logic</td>
<td>Java</td>
<td>Groovy</td>
</tr>
<tr align="left" valign="top">
<td>Web Pages</td>
<td>An arbitrary expression language such as EL or OGNL</td>
<td>Groovy</td>
</tr>
<tr align="left" valign="top">
<td>Data Access</td>
<td>Hibernate HQL, SQL, or Java</td>
<td>Groovy (GORM)</td>
</tr>
<tr align="left" valign="top">
<td>Client-Side Scripting</td>
<td>JavaScript</td>
<td>JavaScript</td>
</tr>
<tr align="left" valign="top">
<td>Style Sheets</td>
<td>CSS</td>
<td>CSS</td>
</tr>
<tr align="left" valign="top">
<td>Build Scripts</td>
<td>XML (Ant)</td>
<td>Groovy (GANT)</td>
</tr>
<tr align="left" valign="top">
<td>Shell Scripts</td>
<td>Linux bash scripts or Windows batch files</td>
<td>Groovy (shebang)</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/everythings-groovy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring a Grails App for Logging</title>
		<link>http://www.thotspots.com/configuring-a-grails-app-for-logging/</link>
		<comments>http://www.thotspots.com/configuring-a-grails-app-for-logging/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 21:26:46 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/configuring-a-grails-app-for-logging/</guid>
		<description><![CDATA[For any standard Grails app, the error log is called stacktrace.log by default.  On some servers, it ends up in the config folder (rather than the logs folder) by default, so it&#8217;s hard to find.  Also, with a fixed name, all apps running on the same server would share the same log.  [...]]]></description>
			<content:encoded><![CDATA[<p>For any standard Grails app, the error log is called stacktrace.log by default.  On some servers, it ends up in the config folder (rather than the logs folder) by default, so it&#8217;s hard to find.  Also, with a fixed name, all apps running on the same server would share the same log.  So, for any new Grails app, be sure to open Config.groovy and change<span id="more-49"></span></p>
<pre>
appender.'errors.File'="stacktrace.log"</pre>
<p>to</p>
<pre>
appender.'errors.File'="../logs/${appName}-errors.log"</pre>
<p><strong>Determining What is Logged</strong><br />
Config.groovy also determines what is logged.  The default logging level is error.  For some packages, you&#8217;ll want to change the logging level to warn or info.  Your choices are, in order: FATAL, ERROR, WARN, INFO, DEBUG.</p>
<p>Grails automatically generates a log4j.properties files from what&#8217;s in Config.groovy and places it in the /WEB-INF/classes folder.  The log4j.properties file can be tweaked in place as you attempt to debug a particular problem, but just remember that it gets reset every time the app is deployed.  So, permanent changes need to go in Config.groovy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/configuring-a-grails-app-for-logging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IDE&#8217;s for Groovy/Grails</title>
		<link>http://www.thotspots.com/ides-for-groovygrails/</link>
		<comments>http://www.thotspots.com/ides-for-groovygrails/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 22:00:21 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[IntelliJ]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/ides-for-groovygrails/</guid>
		<description><![CDATA[First choice: JetBrains IDEA 7.0 (with 8.0 coming shortly).  Possibly a good second choice: NetBeans 6.5 (new).  Last resort remains: Eclipse.
I used to be a big fan of Eclipse, but the Groovy/Grails support in Eclipse is sorely lacking.  Three months ago I splurged on a copy of JetBrains IDEA 7.0 (http://www.jetbrains.com/idea/index.html) and haven&#8217;t regretted it [...]]]></description>
			<content:encoded><![CDATA[<p>First choice: JetBrains IDEA 7.0 (with 8.0 coming shortly).  Possibly a good second choice: NetBeans 6.5 (new).  Last resort remains: Eclipse.</p>
<p><span id="more-48"></span>I used to be a big fan of Eclipse, but the Groovy/Grails support in Eclipse is sorely lacking.  Three months ago I splurged on a copy of JetBrains IDEA 7.0 (<a href="http://www.jetbrains.com/idea/index.html">http://www.jetbrains.com/idea/index.html</a>) and haven&#8217;t regretted it one bit.  I&#8217;m sitting on 7.0 build 7860 (&#8221;Selena&#8221;).  Since then they&#8217;ve released 7.0.4 (build 7941) and a preview of 8.0 milestone 1, but neither seem to have anything I need, so I&#8217;m sitting tight.  I am, however, anxiously awaiting 8.0 milestone 2,  which promises more Grails refactorings and support for Grails 1.0.3. (My projects are still on 1.0.2.)</p>
<p>I just saw an announcement that NetBeans 6.5 (free open source, <a href="http://www.netbeans.org/community/releases/65/">http://www.netbeans.org/community/releases/65/</a>) is in beta test and that it includes Grails/Groovy support.  For anyone doing Grails work who can&#8217;t afford IDEA, I suggest you check it out.  If you do, I&#8217;d like to hear from you.  Let&#8217;s compare notes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/ides-for-groovygrails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

