<?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>Soapbox Rants and Raves</title>
	<atom:link href="http://www.beilers.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.beilers.com</link>
	<description>Crazy Thoughts on Software Development and Life in General</description>
	<lastBuildDate>Tue, 10 Jan 2012 05:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Lost Art of Balancing Your Checkbook…</title>
		<link>http://www.beilers.com/2012/01/lost-art-of-balancing-your-checkbook/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lost-art-of-balancing-your-checkbook</link>
		<comments>http://www.beilers.com/2012/01/lost-art-of-balancing-your-checkbook/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 05:02:08 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Finance]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=996</guid>
		<description><![CDATA[I started to write about my move to a new personal finance software package and ended up on a completely different topic. I think this is an important subject, as I have two teenage boys and neither one of them has any money management experience. Fortunately, my oldest son started his first job last year, at the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.beilers.com/wp-content/uploads/2012/01/checkbook.png" rel="http://banking.about.com/od/checkingaccounts/ig/Never-Write-a-Check/Balance-Checking-on-Paper.htm" target="_blank"><img class="alignright  wp-image-998" style="border-style: initial; border-color: initial; margin-left: 5px; margin-right: 5px;" title="checkbook" src="http://www.beilers.com/wp-content/uploads/2012/01/checkbook.png" alt="" width="147" height="111" /></a>I started to write about my move to a new <a href="http://moneydance.com/" target="_blank">personal finance software</a> package and ended up on a completely different topic. I think this is an important subject, as I have two teenage boys and neither one of them has any money management experience. Fortunately, my oldest son started his first job last year, at the age of 16; it has been a very valuable life experience.  His first paychecks seemed to last less than a day, burning right through his pockets! To curb his spending sprees, I made him start a savings account; this was to save for college or something unplanned. After about a year, I can see that his paycheck has a little more <em>value</em>; it actually seems to last a little longer!  Now that he is spending more of <em>his</em> own money, he is starting to see the need for a little planning: gas for the car,  Subway, Slurpees, and going to the movies.</p>
<p><img class="alignright" style="border-style: initial; border-color: initial; border-image: initial; margin-left: 5px; margin-right: 5px; border-width: 0px;" src="http://www.beilers.com/wp-content/uploads/2012/01/1326154454489.png" alt="" width="485" height="122" /></p>
<div>I did a <a href="https://www.google.com/search?aq=0&amp;oq=why+balance+a+check&amp;sourceid=chrome&amp;ie=UTF-8&amp;q=why+balance+a+checkbook#sclient=psy-ab&amp;hl=en&amp;source=hp&amp;q=reasons+to+balance+a+checkbook&amp;pbx=1&amp;oq=reasons+to+balance+a+checkbook&amp;aq=f&amp;aqi=&amp;aql=&amp;gs_sm=e&amp;gs_upl=4404l5726l0l6434l10l8l0l0l0l2l248l1302l2.4.2l8l0&amp;fp=1&amp;biw=1347&amp;bih=910&amp;bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&amp;cad=b" target="_blank">Google search on the topic</a> and it confirmed what I was thinking -<em> people just don’t reconcile their checkbooks anymore!</em> I think that ATM machines started the trend; with minimal personal effort and little training, we could easily see how much money was in our account &#8211; it was too easy.  On-line banking put the final nail in the coffin for  the “monthly reconciliation” process; the on-line systems are good at instantaneously showing us our financial situation.  I started using <a href="https://www.usaa.com/inet/pages/bank_main" target="_blank">USAA</a> this past year for just about everything, banking, credit cards, insurance, and investing; I even quit using Quicken to track my spending. Using their web interface, I could link accounts from different institutions, pay my bills, transfer funds, categorize and track my track spending habits. It is actually very well done and supports mobile devices too.  Unfortunately, on-line banks and services like <a href="https://www.mint.com/" target="_blank">Mint.com</a> never implement the concept of reconciliation. Big deal you say, what&#8217;s the problem&#8230; it is all done by computer and computers never mistakes&#8230; right?</div>
<div><img class="alignleft" style="margin-left: 5px; margin-right: 5px;" src="http://www.beilers.com/wp-content/uploads/2012/01/1326154365865.png" alt="" width="483" height="124" /></div>
<p><br/></p>
<div>I liked these little quotes that I found on some forums, they truly show how technology has changed the perspective of the younger generations. I did not actually think I was that old, but apparently, I’m very old!  I actually have a budget and balance my checkbook.  Even stranger, I always enjoyed entering all of my transactions and monitoring my spending habits. Technically, I thought it was very cool, being able to pay all of my bills on-line (long before web banking enabled it) and even connecting to my financial institutions, downloading all of the cleared transactions. I tracked my  boys’ college funds and personal retirement funds; it was so fun to see all of the money I was making…  It was even more fun to watch my Fannie Mae stock plummet from $70 a share to $0.25. Needless to say, I don’t watch the market anymore!</div>
<p><br/></p>
<div>Even with today&#8217;s technology,  you should balance your checkbook. I hope that all of the young financial planners out there, still see value in this practice. There are numerous good reasons, I just listed a few:</div>
<ul>
<li>Checkbook balancing is a method of verification</li>
<li>Both banks and merchants can make mistakes</li>
<li>Overdrawn account, bounced check fees, monthly service fees</li>
<li>On-line Banking is not always real-time</li>
<li>Help you budget your money</li>
</ul>
<p><br/><br />
I like to keep an eye on the transactions, I can easily make sure that I&#8217;m not double billed or paying for some unexpected transaction fee.  A topic for another post, is the value of <strong>budgeting</strong>. I bet even fewer people actually create monthly budgets. I have always maintained a personal budget, though not always been able to live within it!  Because I tracked my spending, I always knew where the money went and how big the problem was. I am back to using personal finance software; I manage and live within my budget and reconcile my accounts every month. It takes no time at all and I always know exactly where I stand. Unfortunately, I have not been able to get my son to balance his checkbook yet, but I do have all of his statements printed out and ready to go; we just never seem get to it. I now realize, this is even more important than I originally thought.. this is a fundamental life skill that I have to share with him, before he sets off on his own.</p>
<p>Over the past few years, a friend of mine has ranted about this problem several times; he actually wanted to teach high school kinds some basic money management skills. Amazingly, neither the public school system nor parents are teaching this fundamental skill, it should be no different from the other fundamentals: Reading, Writing, and Arithmetic. Now, you really know how old I am!  Here is good post that illustrates the point well,  <a href="http://www.buffalo.edu/UBT/UBT-archives/11_ubtw99/finalword.html" target="_blank">Why Can&#8217;t Johnny Balance A Checkbook?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2012/01/lost-art-of-balancing-your-checkbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Good Bye Code Reviews, Pair Programming is the Silver Bullet&#8230;.</title>
		<link>http://www.beilers.com/2011/12/good-bye-code-reviews-pair-programming-is-the-silver-bullet/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=good-bye-code-reviews-pair-programming-is-the-silver-bullet</link>
		<comments>http://www.beilers.com/2011/12/good-bye-code-reviews-pair-programming-is-the-silver-bullet/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 05:01:00 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=838</guid>
		<description><![CDATA[I actually wrote this post last March, but never got a chance to publish it. That pretty much sums up my year!!! I don&#8217;t think I was ever really happy with the way it flowed or the exact point I wanted to make. However, after working with some different teams this past year, I&#8217;m even [...]]]></description>
			<content:encoded><![CDATA[<table style="background-color: #ffc; border-color: black; border-width: 1px; border-style: solid;">
<tbody>
<tr>
<td>
<address>I actually wrote this post last March, but never got a chance to publish it. That pretty much sums up my year!!! I don&#8217;t think I was ever really happy with the way it flowed or the exact point I wanted to make. However, after working with some different teams this past year, I&#8217;m even more convinced that code reviews and standards should exist and be enforced. Good topic for another post!</address>
</td>
</tr>
</tbody>
</table>
<p><a href="http://www.extremeprogramming.org/rules.html"><img class="alignright size-full wp-image-891" style="border-style: initial; border-color: initial; margin-left: 5px; margin-right: 5px;" title="XPLogo" src="http://www.beilers.com/wp-content/uploads/2011/03/XPLogo.png" alt="" width="122" height="78" /></a><span id="internal-source-marker_0.674008569214493" style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I might have said this in a previous post, but I believe that many developers use Agile as an excuse to avoid following institutionalized processes. They prefer to make up their own extremely lightweight methodology, doing only the activities they enjoy or <em>believe</em> they have time for. By adopting an Agile process, many claim they can eliminate the need for analysis, design, and even code reviews! Personally, I don&#8217;t believe this was the intention of the Agile methodology. However, given the substantial number of quality gates and sign-offs that organizations </span><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">institute to ensure the elimination of mistakes, it is no wonder that Agile becomes the easiest method to subvert corporate mandates and </span><span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;">deliver software. I completely understand the theory and goal of these mandates, but it does seem that by the time they are institutionalized, the overhead of the process is more complicated than the actual business to be solved! And before anyone corrects my association of Agile and Pair-programming, I do realize that Pair-programming is a tenant of Extreme Programming, not Agile. Unfortunately, many </span><span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;">people seem to commingle the Extreme Programming principles with Agile; XP tends to generate negative connotations in some groups, while Agile is complete accepted.</span></p>
<p><a href="http://geekandpoke.typepad.com/geekandpoke/2010/01/pair-programming.html"><img class="size-full wp-image-883 alignright" style="margin-left: 5px; margin-right: 5px;" title="Pair Programming" src="http://www.beilers.com/wp-content/uploads/2011/03/pairprogramming.png" alt="" width="200" height="96" /></a></p>
<div style="background-color: transparent; font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: Arial;"><span style="font-size: 15px; white-space: pre-wrap;">Not so recently, a coworker sent me a question, wondering if I thought that </span></span><em style="font-family: Arial; font-size: 15px; white-space: pre-wrap;">Pair-programming eliminated the need for code reviews</em><span style="font-family: Arial;"><span style="font-size: 15px; white-space: pre-wrap;">. I have actually heard this claim by several Agile teams in the past, using pair programming as an approach to avoid the code review process. There are several reasons that developers are quick to forgo code reviews, I believe the two most prevalent reasons are:</span></span></div>
<div style="background-color: transparent; font-family: 'Times New Roman'; font-size: medium;">
<ol style="font-family: 'Times New Roman'; font-size: medium;">
<li style="list-style-type: decimal; font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Code reviews are done as an SDLC requirement; not because the development team actually desires to conduct them or finds value in them.</span></li>
<li style="list-style-type: decimal; font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The vast majority of code reviews are completely ineffective; there is no preparation, no structured process, and no follow through on findings.</span></li>
</ol>
<p style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><a href="http://www.beilers.com/wp-content/uploads/2011/03/documents.png"><img class="size-full wp-image-884 alignleft" style="margin-left: 5px; margin-right: 5px;" title="documents" src="http://www.beilers.com/wp-content/uploads/2011/03/documents.png" alt="" width="200" height="175" /></a>There is actually a lot of Internet discussion on this subject; I have included a few links at the bottom of this post which I found interesting. None of them changed my personal views, in that code reviews cannot (should not) be eliminated from the process. One point that I would concede, is that pair-programming could make the code review process easier, assuming that fewer issues will be discovered during the review.</span></p>
<p style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: Arial;"><span style="font-size: 15px; white-space: pre-wrap;">I believe that code reviews should be a &#8220;continuous process&#8221; during the entire development cycle; whereas most people consider the code review to be a process point. Some believe that the review is something that happens at the end of development, after the code is completed, after it has been tested; typically when it too late in the process to make corrections. </span></span><span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;">I feel that code reviews are a never ending cycle of four basic activities, all contributing to the overall quality of the code base.</span></p>
<p style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><a href="http://www.beilers.com/wp-content/uploads/2011/04/process.png"><img class="alignright size-full wp-image-895" title="process" src="http://www.beilers.com/wp-content/uploads/2011/04/process.png" alt="" width="300" height="240" /></a></span></p>
<ol>
<li style="list-style-type: decimal; font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;">The easiest and cheapest process is through automation. There are two basic solutions, the IDE and a Continuous Integration Server. Your IDE can be one of the most effective tools. Eclipse can be configured </span><span style="font-size: 11pt; white-space: pre-wrap;">to share coding standards and validations across the development team, eliminating numerous bad practices at </span><span style="font-size: 15px; white-space: pre-wrap;">their</span><span style="font-size: 11pt; white-space: pre-wrap;"> point origin</span></span><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;">. Tools such as Checkstyle, PMD, and FindBugs can easily be </span></span><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;">incorporated into your IDE. These same validations (rules) can also be utilized by your Continuous Integration server, providing the final conformance </span><span style="font-size: 15px; white-space: pre-wrap;">checks</span><span style="font-size: 11pt; white-space: pre-wrap;">. Automation eliminates almost all of the </span></span><em>soft</em> <span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;">issues from the review process and even promotes better coding practices.</span></span></span></li>
<li style="list-style-type: decimal; font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: 11pt; white-space: pre-wrap; font-family: Arial;">Pair-programming is a very valuable technique and I enjoy the collaboration and education that happens during the process. However, I&#8217;m not sure that pair-programming works on all teams, there needs to be a real sense of </span><span style="font-size: 15px; white-space: pre-wrap; font-family: Arial;">openness</span><span style="font-family: Arial;"> and cooperation for the pairing to be effective. And there lies the real issue, if the pair is very cohesive in their approach, you have the problem of &#8220;</span><em style="color: #000000; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; white-space: pre-wrap; text-decoration: none;"><span style="font-family: Arial;">group think&#8221;.</span></em><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;"> If everyone is thinking the same way, it will be much harder to discover issues outside of their common perspective. I believe that code reviews can be more effective when conducted by people who are not wed to the design and/or implementation; an external perspective is always valuable to the process. </span></span><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;">Another small problem is related to traceability, without the review, there are no review artifacts or documentation to support the process. Next you have the practicality of the schedule. Assuming that you can eliminate the code review process by requiring pair-</span><span style="font-size: 15px; white-space: pre-wrap;">programming</span><span style="font-size: 11pt; white-space: pre-wrap;">, how do you mandate or assure that it happens? Was all of the code written </span></span><em style="color: #000000; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; white-space: pre-wrap; text-decoration: none;">together</em><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;"> by the pair? I find it really hard to believe that 100% of the code will be written </span></span><em style="color: #000000; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; white-space: pre-wrap; text-decoration: none;">completely</em><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;"> by the pair. Given all of the demands placed on people, with meetings, vacations, kids, etc; it would not leave many <em>shared</em> hours for pair to </span></span><span style="font-size: 15px; white-space: pre-wrap;">write</span><span style="font-size: 11pt; white-space: pre-wrap;"> code. It does not seem practical to mandate that no code will be written outside of the paring. So do you only review the code that was not written by the pair? Sounds complicated! All that we accomplished was removing a &#8220;learning opportunity&#8221; from everyone on the team, including the developer that wrote the code!</span></span></li>
<li style="list-style-type: decimal; font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I&#8217;m not sure that &#8220;Continuous Review&#8221; is an officially documented concept, but it is a technique that I have used successfully over the years. Continuous Review is fairly simple, but is potentially time-consuming and highly prone to apathy. The process is extremely trivial; before accepting changes from your teammates, simply review the change set in your IDE. It can be quickly accomplished using the Team View found within Eclipse. You can walk through each commit and its associated files before updating your work area. By spending this small amount of time throughout the development process (each day), you can help ensure that everyone is on the same page; even ensuring that the code is in sync with the design. You get a very good sense of the overall heath and progress of the project, just by watching the commit stream. Unfortunately, not many developers seem to adopt this role, as it takes a serious commitment and can also cause tension, when the team is not as cohesive as it should be (some developers might feel like they are being monitored).</span></li>
<li style="list-style-type: decimal; font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline;"><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Arial;"><span style="font-size: 11pt; white-space: pre-wrap;">The final and most common piece of the review process is the traditional “code review”. It has been my experience that this type of review is generally the most ineffective. Even with years of published guidelines, which could actually make the process effective, they are typically tossed out due to the lack of time and management guidance</span><span style="font-size: 11pt; white-space: pre-wrap;">. I have blogged on this subject in the past. These reviews turn out to be more of a <em>code presentation</em> rather than a review. This will unfortunately be the first time that many of the participants will have actually seen the code!  No time is allocated for participant preparation. Worse yet, no time is ever allocated for the correction of discovered issues. The <em>reviews </em>are always performed late in the development cycle or during the testing cycle, simply to satisfy an SDLC deliverable. I believe many developers have been conditioned into disrespecting code reviews, simply because they become just another meeting, which produces very little value.</span></span></span></li>
</ol>
<p><span style="font-size: 11pt; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img class="size-full wp-image-885 alignright" title="inspect" src="http://www.beilers.com/wp-content/uploads/2011/03/inspect.png" alt="" width="170" height="113" /></span><span style="font-family: Arial;"><span style="font-size: 15px; white-space: pre-wrap;">I might sound like I’m against code reviews, far from it. I am against the </span></span><em style="font-family: Arial; font-size: 15px; white-space: pre-wrap;">traditional </em><span style="font-family: Arial;"><span style="font-size: 15px; white-space: pre-wrap;">code process that focuses on developer selected code, typically presented during a meeting. I recently reviewed the Crucible tool from Atlassian. The tool is far from perfect, but is ideal for managing asynchronous, distributed code reviews. Automated tools provide a variety of methods for selecting the code to be included in the review process, such as querying by user id or change ticket number.  The selected changes are then assigned to a collection of developers and the process begins. Each developer is notified via email that they have been assigned a collection of code to review.  When </span><em style="font-size: 15px; white-space: pre-wrap;">convenient</em><span style="font-size: 15px; white-space: pre-wrap;"> for the reviewer, they log into the tool and are presented the files to review. Crucible actually tracks your progress through each file, giving progress feedback to the review coordinator, indicating that progress is underway.  The developer is presented the change sets and can add comments directly into the code. Each comment can be categorized as an issue or suggestion. I think Crucible is an great tool, but provides absolutely no reporting capabilities. I have talked with Atlassian and they seem to have absolutely no interest in generating meaningful reports. Even the simplest report, which would show all of the issues found during the review is not possible to produce. I’m a huge Atlassian fan, but this lack of functionality completely boggles my brain.  In today’s evidence driven SDLC world, the documentation from the code review is actually more important the code review itself!</span></span></p>
<p><span style="font-family: Arial;"><span style="font-size: 15px; white-space: pre-wrap;">Obviously, I don&#8217;t think code reviews should </span></span><em style="font-family: Arial; font-size: 15px; white-space: pre-wrap;">ever </em><span style="font-family: Arial;"><span style="font-size: 15px; white-space: pre-wrap;">be eliminated from the process. I also believe it is possible to achieve real </span><em style="font-size: 15px; white-space: pre-wrap;">value</em><span style="font-size: 15px; white-space: pre-wrap;"> from them, with very little overhead. Hopefully someday, I will actually be able to prove it!</span></span></p>
</div>
<div><a href="http://stackoverflow.com/questions/564882/if-you-pair-program-do-you-still-need-a-peer-review" target="_blank"><img class="alignleft size-full wp-image-889" title="stackoverflow" src="http://www.beilers.com/wp-content/uploads/2011/03/stackoverflow.png" alt="" width="64" height="74" /></a></div>
<div>
<p><a href="http://www.codinghorror.com/blog/2007/11/pair-programming-vs-code-reviews.html" target="_blank"><img class="alignnone size-full wp-image-888" title="angrycode" src="http://www.beilers.com/wp-content/uploads/2011/03/angrycode.png" alt="" width="75" height="71" /></a><a href="http://www.awkwardcoder.com/index.php/2010/08/27/10-ways-to-kill-pair-programming/" target="_blank"><img class="alignnone size-medium wp-image-887" title="awkward" src="http://www.beilers.com/wp-content/uploads/2011/03/awkward-300x63.png" alt="" width="300" height="63" /></a><a href="http://www.google.com/webhp?hl=en&amp;tab=ww#hl=en&amp;sugexp=gsis&amp;xhr=t&amp;q=pair+programming+eliminate+code+reviews&amp;cp=39&amp;qe=cGFpciBwcm9ncmFtbWluZyBlbGltaW5hdGUgY29kZSByZXZpZXdz&amp;qesig=OZq0Nw5m9Gq9Um-FW0v4AQ&amp;pkc=AFgZ2tkKaP-fgq1IAz8gCo1kpcRM1vEpiNIVo0F5nCqojq4ixVx-viwfUuxjU2aw0v066wn0i5sBNeOvR4NEOm7WNH6oKrJeug&amp;pf=p&amp;sclient=psy&amp;site=webhp&amp;source=hp&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=pair+programming+eliminate+code+reviews&amp;pbx=1&amp;bav=on.2,or.r_gc.r_pw.&amp;fp=87b61fcb467d957c" target="_blank"><img class="alignnone size-full wp-image-890" title="google" src="http://www.beilers.com/wp-content/uploads/2011/03/google.png" alt="" width="177" height="74" /></a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/12/good-bye-code-reviews-pair-programming-is-the-silver-bullet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bluetooth Rocks with Home Phone Integration!</title>
		<link>http://www.beilers.com/2011/12/bluetooth-rocks-with-home-phone-integration/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bluetooth-rocks-with-home-phone-integration</link>
		<comments>http://www.beilers.com/2011/12/bluetooth-rocks-with-home-phone-integration/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 05:02:00 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[VOIP]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=938</guid>
		<description><![CDATA[I&#8217;m not sure how many normal people take advantage of Bluetooth technology, but I&#8217;m absolutely hooked. I run two and a half miles every morning using my Motorola S9 headphones. They are great for running, I can&#8217;t recommend them enough. I&#8217;m on my second pair; they unfortunately have an unreplaceable battery and would not hold a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="margin-left: 5px; margin-right: 5px;" src="http://www.beilers.com/wp-content/uploads/2011/12/Panasonic-KX-TG7622B-DECT-6.0-Link-to-Cell-via-Bluetooth-Cordless-Phone.jpg" alt="" width="250" height="201" /></p>
<p>I&#8217;m not sure how many <em>normal</em> people take advantage of Bluetooth technology, but I&#8217;m absolutely hooked. I run two and a half miles every morning using my <a href="https://www.google.com/search?aq=1&amp;oq=motorola+s9&amp;sourceid=chrome&amp;ie=UTF-8&amp;q=motorola+s9-hd#q=motorola+s9-hd&amp;hl=en&amp;prmd=imvnsr&amp;source=lnms&amp;tbm=shop&amp;ei=oCD5Ttq0OOfa0QGE7rycAg&amp;sa=X&amp;oi=mode_link&amp;ct=mode&amp;cd=6&amp;ved=0CHYQ_AUoBQ&amp;bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&amp;fp=2279860aca39e76e&amp;biw=1399&amp;bih=921" target="_blank">Motorola S9</a> headphones. They are great for running, I can&#8217;t recommend them enough. I&#8217;m on my second pair; they unfortunately have an unreplaceable battery and would not hold a charge after a year or so.  My car has hands-free Bluetooth, which I must say that is pretty cool!  And now, my cordless phones are Bluetooth enabled too!</p>
<p>After the purchase of my <a href="http://www.beilers.com/2011/12/google-voice-finally-useful/" target="_blank">OBi110</a>, I needed to buy a real phone for the house, I honestly did not have one! I had researched Bluetooth / land-line phone integration solutions several years ago, but they always seemed rather &#8220;iffy&#8221;. I could never determine how well they really worked. They were always a little pricey, so I never took the risk.  I happen to see that Panasonic  had a line of phones with what they called a &#8220;<a href="http://www2.panasonic.com/consumer-electronics/learn/Phones-Fax/Telephones/whats-hot-link-2-cell.jsp" target="_blank">Link-to-Cell</a>&#8221; feature.  The phone seemed to get good reviews and was pretty reasonably priced; I picked them up for $57 from <a href="http://www.walmart.com/ip/Panasonic-KX-TG7622B-Link-to-Cell-Bluetooth-Cellular-Convergence-Solution-with-2-Handsets/15907715?ci_sku=15907715&amp;ci_src=14110944&amp;sourceid=1500000000000003142050" target="_blank">Walmart</a>!  I have purchased Panasonic phones in the past and was always happy with them. These phone seem to be well made and comfortable to hold. I have not used the answering machine feature, since Google Voice provides that function for me; but did notice the &#8220;Voice Mail&#8221; indicator works on the phone! Think about that Integration &#8211; Google Voice services tell the OBiTalk network that I have voice mail, and then OBiTalk sends the message to my OBi adapter, which ultimately lights up the indicator on my cordless phone&#8230; Pretty crazy!</p>
<p><img class="alignleft" style="margin-left: 5px; margin-right: 5px;" src="http://www.beilers.com/wp-content/uploads/2011/12/PanasonicDisplay.jpg" alt="" width="200" height="187" /></p>
<p>The Bluetooth integration is pretty slick. You can pair two different cell phones with the unit and assign different rings to each cell phone. You can also download your cell phone&#8217;s phone-book to the handsets. The phones even include &#8220;talking caller-id&#8221;, announcing the phone number or name of the person that called. My cell phone seems to pair instantly with the base unit when I walk into the house, no fuss at all.  The call quality seems no better or worse than using my old <em>Jawbone</em> Bluetooth headset. I think the sound quality is actually very good and have had no problems carrying on a conversation. You can easily make outbound phone calls with your cell phone, just dial the phone number and press the <em>cell</em> button.</p>
<p>I have only had the phones for a couple of weeks, but have been very happy with them. The convenience of being able to pickup a <em>real</em> phone is kind of nice, plus I don&#8217;t have to worry about where laid my cell phone down!</p>
<p>OK, back to the more traditional blogs starting tomorrow!  I just really wanted to share how well this inexpensive combination of technology really worked, linking together your cellular service, VOIP (Google Voice), and a traditional home phone into an unbelievably simple and convenient package!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/12/bluetooth-rocks-with-home-phone-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Voice Finally Useful&#8230;</title>
		<link>http://www.beilers.com/2011/12/google-voice-finally-useful/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-voice-finally-useful</link>
		<comments>http://www.beilers.com/2011/12/google-voice-finally-useful/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 05:01:00 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[VOIP]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=921</guid>
		<description><![CDATA[Not my typical post, but I have been so impressed with my new toy(s), that I just had to blog about them! Over the years, I have tried every way possible to avoid paying Verizon for my phone service, there is nothing worse than paying for a home line, plus multiple cell phone lines! Yes, I have [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.obitalk.com/" target="_blank"><img class="alignright" style="margin-left: 10px; margin-right: 10px; border-image: initial; border-width: 1px; border-color: black; border-style: solid;" src="http://www.beilers.com/wp-content/uploads/2011/12/1324918022165.png" alt="" width="178" height="69" /></a>Not my typical post, but I have been so impressed with my new toy(s), that I just had to blog about them! Over the years, I have tried every way possible to avoid paying Verizon for my phone service, there is nothing worse than paying for a home line, plus multiple cell phone lines! Yes, I have tried VOIP services in the past with limited success. I used <a href="http://www.viatalk.com/" target="_blank">ViaTalk</a> for a couple of years and really liked their service; I unfortunately did not have access to real broadband, so their service was not really that great. VOIP services can definitely be cheaper than traditional copper land-lines, but still seem expensive for what you get; even Vonage is about $30 a month. Apparently, I don&#8217;t put a reasonable <em>value </em>on having home phone service!</p>
<p><img class="alignleft" style="border-image: initial; margin-top: 0px; margin-bottom: 0px; margin-left: 10px; margin-right: 10px; border-width: 1px; border-color: black; border-style: solid;" src="http://www.beilers.com/wp-content/uploads/2011/12/1324934654187.png" alt="" width="177" height="62" />Enter Google Voice. I have been a Google Voice user for a long time, even before Google purchased and rebranded it as Voice. I never achieved any great value from their service, but the integration with my Android phones was extremely nice. I mainly use it for the transcription of my voice mails. For the last year, I have used GV as my primary <em>home</em> phone, making most of my calls from the computer, using the Google Voice/Talk combination and a USB headset. This works pretty well, but sometime I miss talking on a real phone!</p>
<p>A couple of months ago, I happened to read about a free VOIP service, using an inexpensive hardware device from a company called <a href="http://obihai.com" target="_blank">Obihai</a>. Their <a href="http://www.obitalk.com" target="_blank">ObiTalk</a> service provides both SIP-based VoIP and Google Voice integration.  ObiTalk provides a great amount of flexibility, including a Softphone solution, as well as applications for both iOS and Android based mobile devices.  To be honest, I really did not care about any of their advanced features, I just wanted the Google Voice integration.  I would have purchased the OBI100, but it was out of stock; so I ordered the OBI110.  Somehow, I happen to catch a deal, and picked it up for $45 from <a href="http://www.amazon.com/OBi110-Service-Bridge-Telephone-Adapter/dp/B0045RMEPI/" target="_blank">Amazon</a>.</p>
<p><img class="alignright size-medium wp-image-931" title="obiconfig" src="http://www.beilers.com/wp-content/uploads/2011/12/obiconfig-300x126.png" alt="" width="300" height="126" /></p>
<p>As you would hope, the OBi device takes no time at all to get working after you unbox it.  The first step is to create a ObiTalk account and register your device. The process is trivial, you just need to connect the device to your router and plug-in your phone. Next, click the add device button and follow the on-screen directions.  Simply dial the magic number provided by the site and your device will be connected to your account. I only encountered one surprise, the device unexpectedly rebooted a couple of times.  This behavior was actually expected, as the device has the ability to update itself from the central server. After a couple of auto-reboots, the device as been rock solid.</p>
<p>I have been using the service for about a month now and it has worked amazingly well. I&#8217;m not currently a fan of Google Voice&#8217;s call quality using my cell phone; I always blamed it on my Verizon service! Most of my calls seem to have a lot of strange echoes and delays, which you would assumed to be a GV server problem, not a Verizon issue.   However, the Google Voice call quality using the ObiTalk device is exceptional; I don&#8217;t think you would have any clue that the call was using a VOIP service.  The phone works as you would expect; you just pick it up and listen to that traditional dial tone, just like it always has been! I was also able to keep my Verizon phone number; the process to port  a land-line to Google is a little painful, but easily accomplished.  Because Google cannot port a land line, I had to first convert it to a wireless number, setting up a month-to-month contract. Once it was converted, Google quickly ported it over to their service, for a small $20 fee.</p>
<p>So, what is the downside? Today, nothing. Tomorrow, who knows! The future is the biggest concern; we have all seen numerous technologies quickly come and go over the years.  Google has not actually been very attentive to their GV user base, as enhancements to their service have been non-existent for years. Fortunately, the service continues to roll along and fundamentally works well enough for what it costs. The bigger question is how will Obihai survive?  Where do they get their funding to keep the ObiTalk service running? I&#8217;m sure they make a little money on their devices, but it hardly seems enough to fund the company in the long-term.  They provide exceptional service and a quality integration with Google, surely they will have to start charging for their service at some point. I could justify a nominal monthly fee, but if it is too steep, it would be easier to just give the money back to Verizon and user their VOIP package. Ideally, if Google has any long-term vision for Voice, they should seriously consider buying Obihai. It would give Google another open platform that would allow other SIP provides to integrate into their GV network.  It would also create a more economical and conventional solution for the typical, non-technical consumer to take advantage of VOIP technology and further expand the adoption and usage of the Voice product. I just hope that Voice does not end up like other recent Google technology victims&#8230;</p>
<p>One last point, Obihai does not seem to be slowing down. They are planning to release a new version of their hardware, the <a href="http://voxilla.com/2011/12/18/a-peak-at-upcoming-obi-residential-and-business-voip-adaptor-hints-at-powerful-features-2959" target="_blank">OBi 202</a>. You can actually find quite a bit of information on that site related to Google Voice and the OBi services. You will have to read my next blog to find out what my other toy is!</p>
<p><img src="http://www.beilers.com/wp-content/uploads/2011/12/obismaller.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/12/google-voice-finally-useful/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PingTags and LinkedIn&#8230;</title>
		<link>http://www.beilers.com/2011/04/pingtags-and-linkedin-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pingtags-and-linkedin-2</link>
		<comments>http://www.beilers.com/2011/04/pingtags-and-linkedin-2/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 11:00:54 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=900</guid>
		<description><![CDATA[I recently attended  a couple of webinars that focused on the relationship between social media and recruiting. It was very interesting how much emphasis was put on your Internet Presence.  LinkedIn was the obviously leader in professional networking. The speaker actually said your LinkedIn profile is 10 times more important than your resume. I&#8217;m not sure I completely believe that point,  at [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.linkedin.com/in/philbeiler" target="_blank"><img class="alignright size-full wp-image-904" title="linkedin" src="http://www.beilers.com/wp-content/uploads/2011/04/linkedin.jpg" alt="" width="299" height="105" /></a>I recently attended  a couple of webinars that focused on the relationship between social media and recruiting. It was very interesting how much emphasis was put on your <em>Internet Presence</em>.  LinkedIn was the obviously leader in professional networking. The speaker actually said your LinkedIn profile is 10 times more important than your resume. I&#8217;m not sure I completely believe that point,  at least not until I can apply for a job opportunity with my LinkedIn profile URL!!! However, there must be some truth to the statement; they also said less than 10% of jobs are filled by randomly submitted resumes, via job websites. Most jobs are obtained via your professional network, almost eliminating the need for an actual paper resume. With so much information available about you on the Internet, it is just easier to <em>Google</em> someone. If a perspective hiring manager <em>Googles</em> your name, what exactly will they find? An interesting question&#8230;. Are you completely anonymous, with no Internet presence at all? You have a LinkedIn profile, but it is essentially empty and your profile picture is of Rover, your favorite pet. What exactly does that say about you, professionally?  Internet Presence, that was exact reason I started this blog. In the back of my mind, I thought that blogging would be a great, personal communication tool. How better could I share my thoughts, ideas, and lessons learned? It hopefully communicates what I believe is important, from a typically professional perspective.</p>
<p><a href="http://www.linkedin.com/in/philbeiler" target="_blank"><img class="alignleft" style="margin-left: 10px; margin-right: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/04/philbeilerQR.png" alt="" width="64" height="64" /></a>On to <a href="http://pingtags.com/" target="_blank">PingTags</a>; a new service, which I believe started earlier this year. It is a pretty simple, generate a QR code and link it with your LinkedIn profile. Give it a try, scan the code to the left! After spending way too much time on my resume and LinkedIn profile, I was rather intrigued by this idea.  I have seen QR codes in magazines, but was never excited by them. They obviously are bound to a <em>paper</em> world and I&#8217;m not really much of a <em>paper </em>person. At least 95% of my reading is done through my phone or Kindle, which essentially eliminates the need for scanning QR codes, I just click the link!  So, what is the point of PingTags? What about your business card? That was another interesting suggestion from the webinar; they recommended that everyone have a <em>personal</em> business card, something you can easily share with the people you meet. I honestly have not had a business card in over 15 years. A personal business card is something that I really never thought about, but it does seem like a good idea; and that is exactly what PingTags wants you do to&#8230; put the QR code on the back of your business card. I actually thought was kind of cool, in a geeky way! Flip over the card, scan it, and navigate to a nicely formatted mobile version of your profile. Not sure where I will go with this, just good information to know!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/04/pingtags-and-linkedin-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tired of reading blogs? Try Listening to some podcasts&#8230;</title>
		<link>http://www.beilers.com/2011/03/tired-of-reading-blogs-try-listening-to-some-podcasts/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tired-of-reading-blogs-try-listening-to-some-podcasts</link>
		<comments>http://www.beilers.com/2011/03/tired-of-reading-blogs-try-listening-to-some-podcasts/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 04:01:33 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=862</guid>
		<description><![CDATA[During my time off, I decided to start listening to some technical podcasts. I assume this makes me a complete geek, but since I increased my running distance to three miles per day, it turned out to be a very good use of my time. I believe podcasts can be an excellent source of information [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float: right;" src="http://www.beilers.com/wp-content/uploads/2011/03/listen_logo.png" alt="" width="48" height="48" />During my time off, I decided to start listening to some technical podcasts. I assume this makes me a complete geek, but since I increased my running distance to three miles per day, it turned out to be a very good use of my time. I believe podcasts can be an excellent source of information and even entertainment. The best strategy is to listen to different topics, topics that you don&#8217;t encounter everyday. A person can only read so many blogs! If you are like me, you probably only read blogs which are related to your personal interests. Seems completely normal, but how do you ever get exposed to different technologies or techniques? Unless you change companies or completely refresh your team every 6 to 12 months, your learning environment can become very stale. Listening to different topics is an great way to re-energize your brain and kick start your creative thought processing; at least it does for me!</p>
<p>Several months ago, I discovered <a href="http://www.hanselman.com/blog/AboutMe.aspx" target="_blank">Scott Hanselman</a>. He happens to work for Microsoft, but don&#8217;t hold that against him. He records several podcasts each week or so; I subscribe to two of them and they are both excellent. Scott focuses on a variety of software development issues and technologies. <a href="http://www.hanselminutes.com/archives.aspx" target="_blank">Hanselminutes </a> is more technology oriented, while <a href="http://thisdeveloperslife.com/" target="_blank">This Developers Life</a> covers a variety of personal issue, from motivation, drive, to the Egyptian Revolution. I highly recommend going back and listening to all of the old <em>This Developer&#8217;s Life</em> episodes; I can&#8217;t tell you how insightful and reflective they are. As an added bonus, you get to hear some rather interesting musical choices! The people that he interviews are so interesting and have some really funny commentary. You will hear stories from different types of developers, both famous and infamous. You will learn how they navigated through their careers, sometimes successfully and other times, not so well. All I can say, is they are definitely worth the time! I hope you enjoy them as much as I did.</p>
<p><a href="http://www.hanselminutes.com/archives.aspx " target="_blank"><img src="http://www.beilers.com/wp-content/uploads/2011/03/handelminutes.png" alt="" width="361" height="110" /></a></p>
<div style="background-color: transparent; font-family: 'Times New Roman'; font-size: medium;"><a href="http://thisdeveloperslife.com/" target="_blank"><img src="http://www.beilers.com/wp-content/uploads/2011/03/developerslife.png" alt="" width="473" height="86" /></a></div>
<div>
<p>Interesting Podcast Topics from Hanselminutes&#8230;</p>
</div>
<div style="background-color: transparent; font-family: 'Times New Roman'; font-size: medium;">
<p><span style="font-size: 11pt; font-family: Arial; color: #000099; background-color: transparent; font-weight: normal; font-style: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"><a href="http://www.hanselminutes.com/default.aspx?showID=275" target="_blank"></a><a href="http://www.hanselminutes.com/default.aspx?showID=263" target="_blank"><img style="margin-left: 5px; margin-right: 5px;" src="http://www.beilers.com/wp-content/uploads/2011/03/kayak.png" alt="" width="75" height="70" /></a><a href="http://www.hanselminutes.com/default.aspx?showID=275" target="_blank"><img src="http://www.beilers.com/wp-content/uploads/2011/03/jquery.jpg" alt="" width="73" height="73" /></a><a href="http://www.hanselminutes.com/default.aspx?showID=276" target="_blank"></a><a href="http://www.hanselminutes.com/default.aspx?showID=276" target="_blank"><img src="http://www.beilers.com/wp-content/uploads/2011/03/SElogo.png" alt="" width="75" height="70" /></a><a href="http://www.hanselminutes.com/default.aspx?showID=274" target="_blank"><img src="http://www.beilers.com/wp-content/uploads/2011/03/appharbor.png" alt="" width="73" height="73" /></a><a href="http://www.hanselminutes.com/default.aspx?showID=278" target="_blank"><img class="size-full wp-image-867 alignnone" title="VSTS" src="http://www.beilers.com/wp-content/uploads/2011/03/VSTS.jpg" alt="" width="121" height="75" /></a></span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/03/tired-of-reading-blogs-try-listening-to-some-podcasts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Continuous Testing Plug-ins verses Continuous Integration</title>
		<link>http://www.beilers.com/2011/03/continuous-testing-plug-ins-verses-continuous-integration/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=continuous-testing-plug-ins-verses-continuous-integration</link>
		<comments>http://www.beilers.com/2011/03/continuous-testing-plug-ins-verses-continuous-integration/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 04:01:00 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=845</guid>
		<description><![CDATA[This is an extremely interesting concept, but I really wonder how it works in the real world. Toy projects are one thing, but real production size applications are a different story! The principle is very simple; just modify a piece of code in your project and the IDE automatically executes all of the unit tests. Pretty cool [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://www.beilers.com/wp-content/uploads/2011/03/continuous-improvement.gif"><img class="alignleft size-full wp-image-850" title="continuous-improvement" src="http://www.beilers.com/wp-content/uploads/2011/03/continuous-improvement.gif" alt="" width="153" height="159" /></a>This is an extremely interesting concept, but I really wonder how it works in the real world. Toy projects are one thing, but real production size applications are a different story! The principle is very simple; just modify a piece of code in your project and the IDE automatically executes all of the unit tests. Pretty cool concept. But, what if your unit test suite runs for several hours? I believe this is an all too common problem. I have seen many projects dedicate time to building their unit tests, and over time, end up with test suites that can run for multiple hours. There is a very negative side effect associated with this scenario, it can change a developer&#8217;s attitude towards checking in code, it actually discourages it. If the developer knows their commits will not be validated for several hours, they tend to check in very infrequently and only when they feel it will not impact other developers. Many factors can contribute to this scenario. The primary factor is that many of these tests are not really <em>unit </em>tests; they typically do not provide the proper isolation (via mocking) and take too long to execute. I&#8217;m not going to address those issues directly, but the concept does support and encourage the idea of <em>quick test execution</em>.</p>
<p><a href="http://www.beilers.com/wp-content/uploads/2011/03/infinitetestlogo.jpg"><img class="alignright size-full wp-image-851" title="infinitetestlogo" src="http://www.beilers.com/wp-content/uploads/2011/03/infinitetestlogo.jpg" alt="" width="240" height="92" /></a>Wouldn&#8217;t it be cool to run all of the unit tests, in your IDE before checking in the your changes? Obviously, this action is expected by the developer and is completely possible without any special tools. However, it is not automatic and requires <em>extra </em>effort by the developer. Usually, it is easier to let the Continuous Integration server run the tests and fix the fallout later. It seems like a simple problem to solve; create a plug-in that automatically executes all of the unit tests saving a file, requiring no additional <em>effort </em>or interaction from the developer. If you are an Eclipse user, you have two good options, <a href="http://www.threeriversinstitute.org/junitmax/" target="_blank">JUnit Max</a> and <a href="http://infinitest.github.com/user_guide.html" target="_blank">Infinitest</a>. I would really like to try Kent Beck&#8217;s JUnit Max, but you need to purchase a subscription to use (and even try)  the plug-in. That is a show stopper for me, as there are free alternatives such as Infinitest. I evaluated the Infinitest plug-in last year, after it was open-sourced. I did encounter some problems with the plug-in, my Spring-based projects did not work; I was quickly discouraged and abandoned the tool. Months later, I was still <span>intrigued</span> by the idea, so I gave it a try last week on a different project and achieved success!</p>
<p><img class="alignleft" style="margin-left: 5px; margin-right: 5px;" src="http://www.beilers.com/wp-content/uploads/2011/03/Infinitest4.png" alt="" width="429" height="107" /></p>
<p>Unfortunately, Infinitest is not currently installable from the <span>Eclipse</span> Marketplace. It can be quickly installed the old <span>fashioned</span> way from the Eclipse <a href="http://infinitest.github.com/" target="_blank">update site</a>.  There is only one setting you may want to tweak, the <em>Slow Test Warning</em> threshold. If  you have unit tests that execute for longer than half a second, Infinitest will add a warning to your <em>Problems View </em>for each one; this could be problematic if you have a large number of long running unit tests. You should also notice a <em>huge </em>new &#8220;Continuous Test&#8221; status bar in your Eclipse footer. It will update automatically based on your coding activity. JUnit Max is a little more <span>subtle</span>, but provides the same type of feedback mechanism. That&#8217;s it, you are now ready to write code and auto test!</p>
<p><img class="alignright" src="http://www.beilers.com/wp-content/uploads/2011/03/Infinitest0.png" alt="" width="429" height="142" />I&#8217;m not exactly sure how <em><span>intelligent</span> </em>these plug-ins are, related to determining which unit tests to execute based on what code was changed. Hopefully that is the next level of continuous testing evolution. However, if you modify a single unit test, Infinitest will only run that single test; beyond that, I don&#8217;t believe there is much <span>intelligence</span>. If your code modification causes any unit tests to fail, the status bar will turn red. <span>Unfortunately</span>, it does not tell you how many test failed, it only provides the number of tests which it executed. If you mouse over the status bar, it will display the names of the tests which failed, but you can not click on them, they are just there for feedback. You will <span>need</span> to look in the <em>Problems View </em>to discover which test broke, the <span>view</span> will now contain markers for each failed test.</p>
<p>The only issue I have with the plugin, is around user interaction. It does not provide its own <em>View </em>for test results, it simply adds the failures to the existing items in the <em>Problems </em>View. I assumed that the <em>Unit Test View </em>would be updated with the test results, similar to manually running a unit test; however, this was not the case.  It appears that both <span>Infinitest</span> and <span>JUnit</span> Max use the same strategy, providing minimal feedback to the developer. Maybe this a good approach, but I was expecting more visual feedback and confirmation. I associate <em>static </em>problems with the <em>Problems View</em>, such as compiler and code quality errors, not dynamic problems such as test failures. The developer should be able to click on a marker (problem) and be navigated to the exact line of code indicated by that marker, giving them the opportunity to resolve the issue .  Here is my problem with this approach, if the developer clicks on the failed JU<span><span>nit marker</span></span>, where will they be navigated? The only possible location is the unit test which failed. G<span>enerally speaking</span>, this is not where the problem would be found, it would lie in the code that was just changed. Given this issue, I would rather use a different <em>View</em> for continuously executed tests;   maybe even better, find a way to reuse the <span>existing</span> <em>Unit Test View</em>.</p>
<p>This does bring up an <span>interesting</span> question, do these plug-ins minimize or eliminate the need for <span>Continuous</span> Integration? I don&#8217;t believe this is the case, but would seem to eliminate the need for some of the more advanced features the vendors are implementing. One such example is <span>TeamCity&#8217;s</span> <a href="http://www.jetbrains.com/teamcity/features/index.html" target="_blank">remote build, pre-commit test feature</a>. There are many factors to consider, but if unit tests execute quickly, I do not see the need for this functionality to be provided by the CI server. If the tests execute for multiple hours, we could be adding more risk into the process, by <em>not </em>committing changes when they are ready to integrate. Remote build, pre-commit testing sounds valuable on paper, but I am struggling to see the real benefits. I tend to think this functionality over complicates the Continuous Integration process. One of the main benefits of Continuous Integration is that it is seamless and automatic. Nothing is required by the development team to reap the CI benefits, simply check in your code early and often.  As more education and process overhead are required by the CI process, it is no longer <em>simple</em> nor <em>free</em>.  The focus should be on doing what makes sense, at the right time, in the right place. These IDE plug-ins seem to have correct perspective, pre-check-in on the developers desk, simple, automatic, and efficient.</p>
<p>I hope that you will try to <span>integrate one of</span> these plug-ins into your personal development process. I <span>believe</span> they will help create a more robust development process, creating fewer Continuous Integration failures and ultimately, a more efficient, faster executing test suite. If you have real world experience with one of these tools, please provide some comments. I am still curious, does this approach work on real projects?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/03/continuous-testing-plug-ins-verses-continuous-integration/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Upgraded Web Browsing&#8230;. Firefox 4 and Chrome 10&#8230;</title>
		<link>http://www.beilers.com/2011/03/upgraded-web-browsing-firefox-4-and-chrome-10/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=upgraded-web-browsing-firefox-4-and-chrome-10</link>
		<comments>http://www.beilers.com/2011/03/upgraded-web-browsing-firefox-4-and-chrome-10/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 15:49:18 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=825</guid>
		<description><![CDATA[This might seem a little off topic, but the web browser could be considered one of your primary development tools. Just think how much time you actually spend in a browser:  researching, reading, testing, debugging, or simply wasting time! After playing with a few Chrome Extensions, I realized just how much more efficient I could be.  I [...]]]></description>
			<content:encoded><![CDATA[<p>This might seem a little off topic, but the web browser could be considered one of your primary development tools. Just think how much time you actually spend in a browser:  researching, reading, testing, debugging, or simply wasting time! After playing with a few Chrome Extensions, I realized just how much more efficient I could be.  I liked the way Chrome integrates information and makes it useful, which is essentially <a href="http://www.google.com/corporate/" target="_blank">Google&#8217;s Mission</a>.</p>
<p>I had been a loyal Firefox user for many years. Firefox provided a nice <em>cross-platform</em> experience between Windows and Linux, and was highly extensible. This extensibility was one of the early benefits of Firefox, the ability to add new behavior to the browser through &#8220;Add-ons&#8221;. Amazingly, I was never a big &#8220;Add-on&#8221; user, I used a few of them, but did not take advantage or even explore what they could do for me. I used the <a href="https://addons.mozilla.org/en-US/firefox/addon/delicious-bookmarks/" target="_blank">Delicious Add-on</a> for my bookmarking needs, but recently moved to the <a href="https://addons.mozilla.org/en-US/firefox/addon/diigo-web-highlighter-and-stic/" target="_blank">Diigo Add-on</a>. I also use <a href="https://addons.mozilla.org/en-US/firefox/addon/firefox-sync/" target="_blank">Firefox Sync</a> for browser synchronization, including my tabs, bookmarks, history, etc. For posting to my blog, I&#8217;m a huge fan of the <a href="https://addons.mozilla.org/en-US/firefox/addon/scribefire-blog-editor/" target="_blank">ScribeFire Add-on</a>.  If you happen to do web page development, you have to try the <a href="https://addons.mozilla.org/en-US/firefox/addon/firebug/" target="_blank">Firebug Add-on</a>. That is basically the extent of my Add-on usage, I did not ask too much from my browser!</p>
<p><img style="border: 5px solid white; float: left;" src="http://www.beilers.com/wp-content/uploads/2011/03/firefox1.png" alt="" width="700" height="178" /></p>
<p>Before jumping ship, I upgraded all of my machines to the Firefox 4 Beta. There were numerous technical improvements, but I was primarily focused on pure usability and how the browser could help me be more efficient. Start-up time was one of my biggest Firefox complaints; the browser seemed to have a tendency to bog down over time. The new version seems to have gone through a pretty dramatic user interface overhaul and addressed multiple performance issues, including start-up.</p>
<p><img style="float: right; border: 5px solid white;" src="http://www.beilers.com/wp-content/uploads/2011/03/BrowserShare.png" alt="" width="300" height="300" /></p>
<p>I was pretty happy with the UI changes, preferring the new, but controversial new tab location. The tabs are now located over-top of the navigation tool-bar; there was apparently quite a bit of debate on this little change! I prefer having two control rows at the top of the browser window, one row for tabs and the another row for navigation, apps, and widgets. I have seen a lot of content about these &#8220;web apps&#8221;, but it seems a little like pure marketing to me! The Firefox implementation, <a href="http://techdows.com/2010/07/how-to-turn-websites-into-app-tabs-in-firefox.html" target="_blank">App Tabs</a>, appear to be little more than a <em>space </em>saving short-cut; however, I can see them providing value for highly used web sites.</p>
<p>I had installed Chrome a couple of years ago, but was not too excited by it; I saw no compelling reason to change browsers. Wikipedia has an interesting graph of web browser <a href="http://en.wikipedia.org/wiki/Google_Chrome" target="_blank">usage</a>; I was really amazed to see how the Chrome market share has taken off in the last twelve months. Even on my own blog, Chrome accounts for almost 25% of the traffic. I installed the newest version of Chrome last week and was <em>immediately</em> hooked. Unfortunately, I have become a true Google convert. It started with the purchase of my Android phone and there was no looking back. I am not saying that the following activities can or cannot be done in Firefox, I&#8217;m simply saying that I like everything better in Chrome!</p>
<p><img style="float: left; border: 5px solid white;" src="http://www.beilers.com/wp-content/uploads/2011/03/webapp.png" alt="" width="600" height="239" />A simple, but extremely cool feature is the &#8220;New Tab&#8221; behavior. It obviously opens a new tab, but its contents are quite different than you would expect. It is basically divided into three sections, Apps, Most visited, and Recently closed. Under the Apps section, you will see the Web Store icon; does everyone need to have their own app store these days? Anyway, the Web Store is a very well done site, that makes searching and installing new <em>behavior</em> extremely easy, using either applications or extensions.</p>
<p>Applications seem like fancy bookmarks, but from my reading, they can be (are) a lot more sophisticated. I looked at the <a href="https://chrome.google.com/webstore/detail/omeengfjefdmhnkojnfmncpfdbhnecea" target="_blank">SlideRocket</a> app, it was genuinely cool&#8230; however, you can also run the <em>app </em>in Firefox! The <em>app</em> concept seems analogous to a <em>rich user interface </em>experience, one that performs like a real desktop application, rather than a collection of old-fashioned HTML pages.</p>
<p><img style="border: 5px solid white; float: right;" src="http://www.beilers.com/wp-content/uploads/2011/03/ChromeExtensions.png" alt="" width="414" height="77" />My favorite feature of Chrome has to be the Extensions. Extensions add additional behavior to the browser itself. You can see from the picture to the right, I have added quite a few of them! They integrate into the Navigation Bar and look very nice, consuming minimal space while providing significant functionality. They look similar to the icons found in cell phones; many of the extensions have little indicators that track the number of items you need to address. You can find extensions for all of the standard Google tools: Gmail, Reader, Calendar, and even eBay. The Calendar extension is extremely helpful; it will tell you how long until your next appointment and when you mouse over it, it shows you the event details. The WP Stats is another personal favorite; it tells me how many people have looked at my site! Clicking on some icons will navigate you into the corresponding website, much like a short cut. Other icons have specific behavior, such as showing you detailed web site access statistics or an enhanced view of your search history. My favorite blogging tool, ScribeFire is also available in Chrome, but the spell checker is not working! I like the placement and interaction of the Chrome extensions much better than the traditional Firefox &#8220;Add-on&#8221; view, which is typically at the bottom of the browser window; Chrome make the extensions feel more integrated with the browser and part of the actual user experience.</p>
<p>My final Chrome praise is the synchronization with my Google account. It is pretty cool to watch an extension get automatically installed on my Windows machine, simply by installing it on my Linux machine. No restart or refresh required, it just automatically shows up!  I did notice one small oddity, I still had to <em>configure </em>the extension on the Windows machine. This seems rather strange, maybe it is a bug&#8230;. I assumed that Chrome would save each of the extension&#8217;s settings and synchronize them too. Even with this little shortcoming, there is no going back to Firefox for me, I hope you give it a try too!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/03/upgraded-web-browsing-firefox-4-and-chrome-10/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TDD is too hard&#8230;</title>
		<link>http://www.beilers.com/2011/03/tdd-is-too-hard/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tdd-is-too-hard</link>
		<comments>http://www.beilers.com/2011/03/tdd-is-too-hard/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 19:11:44 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=814</guid>
		<description><![CDATA[Earlier this year, I participated in a meeting to recommend testing best practices. Being fairly passionate about TDD, and working in an environment where unit testing is fundamentally an afterthought, I assumed the group would certainly recommended TDD as a best practice. Amazingly, TDD failed to get the official endorsement. Many of the committee members [...]]]></description>
			<content:encoded><![CDATA[<div>
<div><a href="http://thinkfirst.org/" target="_blank"><img style="float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/03/moz-screenshot.png" alt="" /></a>Earlier this year, I participated in a meeting to recommend testing best practices. Being fairly passionate about TDD, and working in an environment where unit testing is fundamentally an afterthought, I assumed the group would certainly recommended TDD as a best practice. Amazingly, TDD failed to get the official endorsement. Many of the committee members stated that TDD was too hard and required too much up front work. Too hard? Really? I was very surprised by their rational, especially since many of them were seasoned developers. The image to the right has nothing to do with software development, but I love the message! I thought there was a rather subtle correlation to TDD: Thinking first can prevent problems. <em>Think First</em> is probably a little misleading, surely, everyone claims to <em>think</em> before embarking on a task. For me, the <em>real</em> value behind TDD is the <em>thought</em> process; I like to connect <em>thinking</em> with the design process, not the coding process</div>
<div>I had the opportunity to participate in a SD Times webinar on Wednesday called &#8220;<a href="http://www.sdtimes.com/content/resources.aspx?ShowOnlyResourceID=418" target="_blank">Leaders of Agile: Practical Agile with Test-Driven Development</a>&#8221; by <a href="http://www.threeriversinstitute.org/blog/" target="_blank">Kent Beck</a> and <span class="description"><a href="http://blog.ploeh.dk/" target="_blank">Mark Seemann</a>.  I took some notes on points I thought were relevant to truly adopting TDD.</span></div>
<p><span class="description"> </span></p>
</div>
<table style="border-collapse: collapse;" border="1" width="90%" align="center">
<tbody>
<tr align="center" bgcolor="lightgrey">
<td>Concept</td>
<td>Observation</td>
</tr>
<tr align="left">
<td valign="top">Write a little test, write a little code, iterate.<br />
- Don&#8217;t spend hours writing code<br />
- TDD tells you where you stand</td>
<td valign="top">I have worked with a lot of developers that literally spent hours writing code without ever executing it. Once they <em>feel</em> like they are done coding, they start to think about testing. Many times, this testing is done in the same manner as their development, which I will describe as &#8220;without a plan&#8221;.  Some even avoid structured, assertion-based testing frameworks, they simply spin up the container and execute the code. This approach will certainly work, but would you really say this is the most effective approach? You end up with a huge pile of un-validated, un-executed code.  Unless you are perfect and never make mistakes, you have no clue how many bugs are buried in the code. Even worse, if you discover a design problem or a more elegant approach, how much code will you have to change or toss away? This is not to say that refactoring or eliminating code is bad. The point is, this effort could have been minimized or even prevented by <em>thinking first</em>. Another benefit of starting from the test perspective, is you always know where you stand in the process; the test works or it does not. If the test does not work, you are probably <em>not</em> done.</td>
</tr>
<tr align="left">
<td valign="top">TDD allows you to defer design decisions<br />
- Refactoring and Retrofitting<br />
- Working test first, Design as you go</td>
<td valign="top">If you think about TDD from an iterative perspective, you are basically working from the outside in. You can almost compare it to the Object Oriented principle of encapsulation, hiding or postponing design decisions.  Unit test should be focused on the <em>behavior</em> of the class, not the actual <em>implementation</em>. Because the unit test is focused on behavior, you have the opportunity to defer some of the design/implementation decisions to a later iteration. This later iteration might only be a couple of hours later, but, by <em>thinking first</em> about the desired behavior and interaction, you are not required to commit to an actual design or implementation.  Obviously refactoring can be a big part of TDD and is hopefully not considered a deterrent. Refactoring does have a cost; I believe this cost is justified and minimized by the confidence provided by a good unit test suite and the long term supportability of a elegant design.</td>
</tr>
<tr align="left">
<td valign="top">TDD = API Design</td>
<td valign="top">For me, TDD is more about the design process than the actual unit test. TDD forces me to concentrate on how the class will be utilized, enabling me to focus on the requirements of the class, implementing no more functionality than is actually necessary. Implementing the class first, you are basically guessing at the API, only imagining how the class could be used. Adding and subtracting methods as you go, based on how you feel the class might be invoked. I have to believe that this approach will generally not result in the cleanest API. Focusing on the external interaction and dependencies provides a simpler and more exact view of the actual implementation requirements.</td>
</tr>
<tr align="left">
<td valign="top">Tests are First Class Citizens.</td>
<td>This one is very near and dear to my heart. I can&#8217;t tell you how many times developers have pushed back on the enforcement of coding standards and quality as it pertains to the unit test suite. Why would anyone want to allow or encourage bad coding practices in the unit test code, that are not allowed in the <em>real</em> code? Do developers have a quality switch that can be turned on and off? Writing good, clean code over here, and sloppy code over there? It should be all about consistency and supportability. Unit tests need to be as understandable and maintainable as the mainline code; they will be maintained as long as the mainline code and over time, could provide more value (comprehension) than the mainline code.</td>
</tr>
<tr align="left">
<td valign="top">Testable = Loosely Coupled</td>
<td valign="top">Testability is another topic I find very interesting. I just love the <a href="http://code.google.com/p/testability-explorer/" target="_blank">Testability Explorer</a> tool, but was never able to get others excited about this concept. If not designed effectively, unit tests have the potential to become a roadblock of change. Unfortunately, the same point can be made about the actual code; there are certain designs and implementation that can impede future change. The goal is to use patterns and tools that support change, such as dependency injection. Some people think that TDD can encourage coding without thinking; I have the complete opposite view, thinking first, to establish the design. It is my opinion that TDD is just one small tool that helps flush out designs; doing so without significant overhead and simultaneously building a safety net.</td>
</tr>
</tbody>
</table>
<p> </p>
<div>
<div>I was not sure how these &#8220;virtual conferences&#8221; actually worked, but this one was very well organized and seemed to go off perfectly. I was very impressed with both of the speakers and recommend subscribing to their blogs. They each made numerous points, but I wanted to share a point from each of them that I found encouraging.  I will probably paraphrase them poorly, but hopefully you get the point!</div>
</div>
<p> </p>
<table style="border-collapse: collapse;" border="1" width="90%" align="center">
<tbody>
<tr align="center" bgcolor="lightgrey">
<td>Speaker</td>
<td valign="top">Thoughts&#8230;</td>
</tr>
<tr align="left">
<td valign="top">Kent Beck &#8211; &#8220;Everything is hard. You need to be eager and willing to learn.&#8221;</td>
<td valign="top">I thought it was refreshing to hear the words, &#8220;eager and willing&#8221;.  Unfortunately, we are not always eager and willing! You can&#8217;t force anyone to learn or change. There has to be a willingness; we need to be open-minded to absorb and process new thoughts. The benefits are not always immediate and may cause some pain, but in the end, learning is what makes us better.</td>
</tr>
<tr align="left">
<td valign="top">Mark Seemann &#8211; &#8220;I tend to do a lot of thinking.&#8221;</td>
<td valign="top">I thought this was great! I never hear people say they <em>do a lot of thinking</em>. Many of us tend to jump into the fire, probably because we are not given sufficient time to evaluate at the situation. My challenge to you, demand the time, take the time. Think First!</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/03/tdd-is-too-hard/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Build Evolution: Ant to Maven &#8211; A simple exercise&#8230;</title>
		<link>http://www.beilers.com/2011/03/build-evolution-ant-to-maven-a-simple-exercise/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=build-evolution-ant-to-maven-a-simple-exercise</link>
		<comments>http://www.beilers.com/2011/03/build-evolution-ant-to-maven-a-simple-exercise/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 11:08:39 +0000</pubDate>
		<dc:creator>Phil</dc:creator>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.beilers.com/?p=801</guid>
		<description><![CDATA[I typically end up taking the role of &#8220;build guy&#8221; and I have no idea why! It is probably a control thing; I like to be able to fix problems and make improvements. I have been an Ant-man for many years, and was proficient in the &#8220;Art of Make&#8221; before that. I never gave Maven [...]]]></description>
			<content:encoded><![CDATA[<div><a href="http://maven.apache.org/" target="_blank"><img style="float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot.png" alt="" /></a>I typically end up taking the role of &#8220;build guy&#8221; and I have no idea why! It is probably a control thing; I like to be able to fix problems and make improvements. I have been an Ant-man for many years, and was proficient in the &#8220;Art of Make&#8221; before that. I never gave Maven a chance, as it always <em>seemed</em> like it was too complicated for adoption by corporate projects. Ant <em>can</em> be very simple and quick; some might even throw the word <em>dirty</em> in there! <a href="http://ant.apache.org/" target="_blank"><img style="float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-1.png" alt="" /></a>Unfortunately, I have seen (hopefully not created!) some of the most horrific Ant build systems imaginable. Many times, it is a developer&#8217;s &#8220;first time effort&#8221; that becomes the project&#8217;s permanent build system. Because I had the opportunity to work on many different Ant-based projects, I gained experience by using and evaluating many different approaches. I believe that real problem with Ant, is not necessarily Ant itself, but the lack of standards and structure it provides. Ant allows each developer (or project) to invent its own Ant Philosophy. Once you are familiar with the Ant &#8220;programming style&#8221;, you can script just about anything, any way you want, manipulating files located in any direct structure, located anywhere on the network. Ant is a very powerful and flexible tool. Unfortunately, the more <em>inventive</em> the Ant Philosophy is, the more brittle and complicated the scripts <em>can</em> become. Ant XML also seems to be an excellent &#8220;cut and paste&#8221; candidate. New team members, with little time or understanding of Ant or the specific philosophy implemented, find duplicating targets the safest method to implement change. Another shortcoming of <a href="http://ant.apache.org/ivy/" target="_blank"><img style="float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-3.png" alt="" /></a>Ant is dependency management. This problem is easily solved and have blogged about it numerous times in the past. I believe that the use of a dependency management tool, such as Ivy, is an evolutionary step taken by &#8220;build guys&#8221;. Sadly, many developers don&#8217;t seem to be interested in dependency management. They don&#8217;t like the dependency on the dependency management tool and would rather just manage them within the project. For me, the value of the central repository and structurally documented, versioned dependencies cannot be undervalued.</div>
<p>I have probably described many of the same experiences you have encountered with Ant-based projects; they can be even more exaggerated when you start managing multiple projects. One possible evolution path is to define a &#8220;standard&#8221; directory structure and develop a collection of &#8220;shared&#8221; Ant scripts that work with the standard directory structure. This allows each individual project&#8217;s build XML to be little more than a set of properties. This is exactly where we ended up, utilizing an Ivy-like externalized repository for build scriptlets and Ant&#8217;s URL import capability. Hold on, a standard directory structure with reusable build components? Almost sounds like some other tool&#8230;</p>
<table style="border-collapse: collapse;" border="1" width="90%" align="center">
<tbody>
<tr align="center" bgcolor="lightgrey">
<td>The Experiment&#8230;</td>
</tr>
<tr align="left">
<td>Being an Eclipse guy, I was curious how to combine an Eclipse Web Tools Platform (WTP) project with a Maven project. My ultimate goal was to setup a Jenkins Continuous Integration Server, that monitored a Maven-based project on GitHub, and develop the code within Eclipse and utilizing a Dynamic Web Project facet. Historically, my projects were managed by Hudson using Free-style jobs; they were always Ant-based and extracted from a Subversion repository. I had worked on quite a few web applications using this pattern, so it seemed like a pretty good starting point! I had started a toy project to manage encrypted data a couple of years ago and never put it under version control, it was a perfect candidate for this experiment.</td>
</tr>
</tbody>
</table>
<p>Changing a project&#8217;s build tool has a rather large impact and needs be considered from multiple perspectives. I have approached the problem by breaking it down into five (5) different spaces. This might not be the optimal or preferred approach, but does show the high-level differences and addresses the major build challenges. Surely, my next project will be done completely differently, but you have to start learning somewhere!</p>
<table style="border-collapse: collapse;" border="1" width="90%" align="center">
<tbody>
<tr bgcolor="lightgrey">
<td><strong>Perspective</strong></td>
<td><strong>Changes</strong></td>
</tr>
<tr>
<td valign="top">Dependencies</td>
<td>To end up with an application that compiles in Eclipse, this change and the next have to be done in parallel. The easiest approach is to create a POM and focus on the dependencies section. If you are already using Ivy to manage your dependencies, this will not be that big of a change. Using a public Maven repository like <a href="http://mvnrepository.com/" target="_blank">MVN Repository</a> to locate dependencies is very simple and saves a ton of time. The easiest way to create a POM is to let Eclipse make it for you; you will need to install the <a href="http://maven.apache.org/eclipse-plugin.html" target="_blank">Maven plug-in</a> first.  Once you have your project loaded into Eclipse, simply &#8220;Enable Dependency Management&#8221; in your project&#8217;s properties. You can also add dependencies directly from the  plug-in; I&#8217;m a little old school and prefer to edit the POM manually, but either approach works fine.</td>
</tr>
<tr>
<td valign="top">Local Development</td>
<td><img style="float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-10.png" alt="" />I never liked the required Maven directory structure; I must have subconsciously adopted the <em>Eclipse</em> project structure as my personal standard. Converting the project&#8217;s directory structure was trivial and soon realized it was not that big deal after all; I aways separate my source and test files anyway. The main difference is everything lives under the source root, including the WebContent directory. I&#8217;m not sure what the &#8220;preferred&#8221; process is for loading a Maven project into Eclipse, probably using the Maven <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/" target="_blank">Eclipse Plug-in</a>, which will create the appropriate Eclipse property files. Since I was doing a conversion, I don&#8217;t think this plug-in would be too helpful. Because I&#8217;m fairly Eclipse savvy, I simply wired everything up myself. Having the Eclipse <a href="http://maven.apache.org/eclipse-plugin.html" target="_blank">Maven Plug-in</a> will enable your dependencies  to be automatically added to the build path. <img style="float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-14.png" alt="" width="558" height="186" />With the addition of the Eclipse &#8220;Deployment Assembly&#8221; options dialog, it is extremely easy manually configure your project. You need to have a Faceted Dynamic Web Module for the &#8220;Deployment Assembly&#8221; option to be visible, but that should be a fairly simple property change as well. At this point, you should have a fully functional, locally deployable web application.</td>
</tr>
<tr>
<td valign="top">The Build</td>
<td><img style="float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-16.png" alt="" />Now we can ignore Eclipse, and focus on building our WAR file using Maven. Even with the minimalist POM shown to the left (plus your dependencies section), it is possible to compile the code and create a basic WAR file. Use <em>mvn compile</em> to ensure that your code compiles. Using the Maven<em> package</em> goal, the source code is compiled, the unit tests are compiled and executed, and the WAR file is built. All of this functionality, without writing one line of XML! <img style="float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-18.png" alt="" /> One of the more time consuming parts of an Ant-based build is integrating all of the &#8220;extras&#8221; typically associated with a project, making them available to the continuous integration server. The extras include: unit test execution, code coverage metrics, and quality verification tools such as Checkstyle, PMD, and FindBugs. This tools are all typically easy to setup, but every project implements them slightly different and never put the results into a standard place! The general process for adding new behavior (tools) to a build appears to be the same for most tools. You simply add the plug-in to the POM and configure it to fire the appropriate goals at the appropriate time in the Maven lifecycle. Ant does not have this lifecycle concept, but it seems like a very elegant way to add behavior into the build. From the following example, I added the Checkstyle tool to the POM. The &lt;executions&gt; section controls what and when the plug-in will be executed. In this example, the <em>check</em> goal will be executed during the <em>compile</em> phase of the build process. Simply executing the <em>compile</em> goal, will cause Checkstyle to be invoked as well. This seems like a very clean integration technique, one that does not cause refactoring ripples.</p>
<p>The Cobertura integration is another very good example. I have been a fan of the Clover code coverage for many years. Since losing access to Clover, I needed to look for an open-source alternative,  and had never tried EMMA or Cobertura. They both seemed like capable tools, but I had more success integrating Cobertura with Jenkins. I&#8217;m highlighting this point, as doing code coverage with Ant and Clover can sometimes be a little tricky and usually messy. The Cobertura plug-in takes compete responsibility for instrumenting the code, executing the unit test, and generating the report; completely non-intrusive.</td>
</tr>
<tr>
<td valign="top">Continuous Integration</td>
<td><img class="alignleft" style="margin-top: 10px; margin-bottom: 10px; margin-right: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-20.png" alt="" width="552" height="111" />Most development teams also want their project monitored by a Continuous Integration (CI) process. Modern CI tools such as Hudson/Jenkins provide excellent dashboards for reporting a variety of quality metrics. As I previously stated, it is rather time consuming to develop and test the Ant XML required to generate and publish these metrics; combine that with configuring each CI server job to capture these metrics and you have added a fair amount of overhead. <img class="alignright" style="margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" src="http://www.beilers.com/wp-content/uploads/2011/02/moz-screenshot-19.png" alt="" width="492" height="218" />I knew there was support for Maven-based projects within Hudson/Jenkins, but never took the time to understand why it would be beneficial. The main benefit is right there in the description, had I bothered to read it! Configuring a Maven-based job is little more than clicking a few check boxes. No need configure them in Jenkins, using the information provided by Maven, it is basically automatic. This is one interesting aspect of the Hudson-Jenkins fork. Sonatype, the creator of the Nexus Maven Repository manager and the Eclipse Maven plug-in, have chosen the Hudson side of the battle. I wonder what this means for Maven support on the Jenkins side. Obviously, it will not go away, but that might end up being a Hudson advantage in the long run. I still believe that the Jenkins community will quickly out pace the Hudson community.</td>
</tr>
<tr>
<td valign="top">Deployment</td>
<td>I&#8217;m not going into much detail on this point, other than to say that I would like to see the deployment process completely separated from the build process, maybe even done by two different people or organizations. I have seen too many projects combine building and deploying into one system, creating artificial dependencies, time consuming, unreliable, and unmaintainable deployment processes. I have also experienced complete deployment overkill, causing simple deployments to take over thirty (30) minutes, with no real guarantee that it would be successful. Hopefully teams (developer and operations) will strive for a minimal deployment overhead/process, one that provides just enough security and control to enable continuous, rapid deployments.</td>
</tr>
</tbody>
</table>
<p>I have barely touched upon the real power of Maven and know that some people are going to say my requirements are too simple to be valid. I&#8217;m sure there are projects far more complicated than mine, but I do feel that this project is highly representative of the 80-20 rule. If developer&#8217;s can have a little self control, conform, and do what is required verses what would be really cool, simple Maven POMs should satisfy a large number of corporate projects <em>with very little overhead</em>. That is the goal, correct?  I can even see using Maven for my toy projects; why do I want to waste time writing and maintaining a bunch of useless build scripts? I never realized that you could <em>ease</em> into Maven; I think that is the real point of the post! And, it is not actually a huge investment.</p>
<p>When I was Googling for this topic, I found many interesting articles. I truly believe the biggest reason preventing teams from evolving and adopting new approaches is simply fear, fear of change and the unknown. I still think Maven is a rather large &#8220;pill to swallow&#8221;, but have now experienced enough value to continue investing time into this technology. I took the <em>typical developer </em>approach and dove into Maven with little preparation or understanding&#8230; I would not suggest this approach, unless you to have lots of time to waste! If you are unfamiliar with Maven, I hope the following collection of articles will provide a quick overview of the basic concepts. I realize that some of them are a little old, but you should start with the Maven basics, and those really have not changed.</p>
<p><a href="http://www.javaworld.com/javaworld/jw-12-2005/jw-1205-maven.html" target="_blank">An Introduction to Maven2</a><br />
<a href="http://www.build-doctor.com/2010/06/22/when-to-use-maven/" target="_blank">Should you move to Maven2</a><br />
<a href="http://javamoods.blogspot.com/2010/02/maven-vs-ant-stop-battle.html" target="_blank">Maven vs Ant: Stop the Battle</a><br />
<a href="http://www.sonatype.com/people/2010/08/how-to-migrate-from-ant-to-maven-project-structure/" target="_blank">How to Migrate from Ant to Maven: Project Structure</a><br />
<a href="http://www.sonatype.com/people/2011/02/top-ten-reasons-to-move-to-maven-3/" target="_blank">Top Ten Reasons to Move to Maven 3</a><br />
<a href="http://www.sonatype.com/people/2010/01/maven-over-ant-ivy-a-team-perspective-by-les-hazlewood/" target="_blank">Maven over Ant + Ivy</a><br />
<a href="http://www.slideshare.net/wakaleo/automated-deployment-with-maven-going-the-whole-nine-yards" target="_blank">Automated Deployment with Maven &#8211; Going the whole nine yards</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.beilers.com/2011/03/build-evolution-ant-to-maven-a-simple-exercise/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.362 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-05 09:45:55 -->

