<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4618332207373836281</id><updated>2012-02-16T05:56:47.713-05:00</updated><title type='text'>On Getting Better</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4618332207373836281.post-486276779760987428</id><published>2012-01-23T18:45:00.002-05:00</published><updated>2012-01-23T18:45:51.084-05:00</updated><title type='text'>Big Visible Charts</title><content type='html'>&lt;br /&gt;&lt;div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;Nor do people light a lamp and put it under a basket, but&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;on a stand, and it gives light to all the house. - Mathew 5:15&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;I've been trying to lose weight for years and carefully monitored my weight every morning.  In 2000 I was 180 pounds and I hit a peak of 215 this year.  I've tried nearly everything I could think of other than what works in my professional life.  So I decided to add hard work and big visible charts to my weight loss regimen.  Hard work came in the shape of a dog.  Big visible charts came in the shape of recording, analyzing, and changing behavior and seeing the results of that change.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Some wise guy once said, "If you can't measure it, you can't fix it," or something like that.  Measurement alone cannot change a situation (outside quantum mechanics); action affects a situation.  Measuring, tracking, and analyzing data can provide insight into cause and effect relationships.  Making that data visible to the problem solvers and stakeholders can provide motivation to taking action necessary to affect change.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;There are many measurements available to software development teams.  At the developer level there are lines of code, commits per sprint, and unit tests.  The team can look at static code analysis, automated test coverage, broken build counts, and build times.  The business side can gather data on defect rates, customer contentment, lost sales due to feature gaps, and profitability.  This list is by no means comprehensive, but gives some ideas of common measurements.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;After the data is collected it must also be analyzed.  Analysis is non-trivial as some things appear to have obvious relationships and analysis show them to be unrelated.  Other times relationships are subtle and require looking for non-obvious connections.  The goal of analysis is to point to practices or product which will provide improvement.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Making the analysis available, indeed presenting the analysis to the team, will encourage change by generating the force required to create action.  Even though measurement and analysis appeared to be action they are only tools to ensure the force generating the action is applied in the correct direction.  Visibility is the key to driving change.  When measurement of work is easily available and visible each part of the organization can be held accountable for providing their value.  Behavior which benefits the organization can be rewarded by reviewing those same big visible charts for results of action.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DPV3bSsOoJc/Tx3wg_tij7I/AAAAAAAAAKM/vC7_HCaOJU4/s1600/weight.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="188" src="http://4.bp.blogspot.com/-DPV3bSsOoJc/Tx3wg_tij7I/AAAAAAAAAKM/vC7_HCaOJU4/s320/weight.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Only performing measurements on my weight had no effect on my weight gain.  In fact, I could plainly see that it was going in the wrong direction without taking concrete action.  I knew why my weight was going in the wrong direction, I kept eating and didn't exercise enough.  What finally made it possible to make headway in addressing the issue was keeping track, analyzing the data, and making a nice visible chart of my weight over time.  It became much easier to hold myself accountable for my actions when it came to eating.  The visible charts help me avoid dessert and make me willing to put in the occasional extra mile.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4618332207373836281-486276779760987428?l=ongettingbetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/486276779760987428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ongettingbetter.blogspot.com/2012/01/big-visible-charts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/486276779760987428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/486276779760987428'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/2012/01/big-visible-charts.html' title='Big Visible Charts'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-DPV3bSsOoJc/Tx3wg_tij7I/AAAAAAAAAKM/vC7_HCaOJU4/s72-c/weight.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4618332207373836281.post-1295958452142387355</id><published>2011-12-09T18:17:00.001-05:00</published><updated>2011-12-09T19:01:29.117-05:00</updated><title type='text'>Google Maps API on Android</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;At the GR Mobile Dev group this month there was discussion on the topic of using mapping capabilities on the Android and iOS platforms.  This document describes the steps necessary to setup an Android application, acquire a API key to access map tiles, and implement a simple mapping application.  Below is the basic boilerplate to getting started with the Google Maps API.  This doesn't look at any geo-location or overlays, but will get you to the point of being able to start exploring these topics.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Requirements&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;SDK&lt;/i&gt;&lt;br /&gt;The Google Maps API is not part of the core Android SDK, however access to it is available through the Android tool chain.  Running the “Android SDK Manager” and verify that the “SDK Platform” and “Google APIs by Google Inc” for the API version you are interested in developing an application are installed (recommend API version 7 [2.1] based on current usage statistics).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;AVD (Emulator)&lt;/i&gt;&lt;br /&gt;Once the SDK Platform and Google APIs are installed we will need to create an AVD which will support the Google Maps API.  The target will need to be set to “Google APIs (Google Inc.) - API Level #” instead of “Android #.# - API Level #” for the Google APIs support.  This will create an AVD which includes the normal Android and Google APIs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Basic Application&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Create a basic Android application, except on the step where you select the “Build Target” choose the “Google APIs” for the target API level instead of “Android #.#.”  Otherwise the application creation process is the same as the any other project.  In the instance where you are working on an already existing project, you can update the project by going to the properties for the project “Android” options and select “Google APIs” for the existing target API level.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Include Map&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Manifest&lt;/i&gt;&lt;br /&gt;The manifest has two updates required to enable using the Google Maps API.  The application will need to know that it should use the Google Maps library.  In addition the INTERNET permission is required to load the map tiles.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;AndroidManifest.xml&lt;/div&gt;&lt;pre style="background-color: #cfe2f3;"&gt;    &amp;lt;manifest ...&amp;gt;&lt;br /&gt;        ...&lt;br /&gt;        &amp;lt;uses-sdk ...&amp;gt;&lt;br /&gt;        &amp;lt;uses-permission android:name="android.permission.INTERNET"&amp;gt;&lt;br /&gt;        &amp;lt;application ...&amp;gt;&lt;br /&gt;            &amp;lt;uses-library android:name="com.google.android.maps"&amp;gt;&lt;br /&gt;            &amp;lt;activity ...&amp;gt;&lt;br /&gt;        &amp;lt;/application&amp;gt;&lt;br /&gt;    &amp;lt;/manifest&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;i&gt;Map API Key&lt;/i&gt;&lt;br /&gt;Google requires that an application has a map API key to load the map tiles from their servers.  This map key is based on the signing key used to sign the application.  Under development conditions there is a debug key used to sign the application by the development environment which can be found in ~/.android/debug.keystore, though you will also want to use the release signing key when submitting to the Android Market.&lt;br /&gt;&lt;br /&gt;To generate the map API key you will need to use the keytool application which ships with your Java installation.  On windows you will find it in the bin directory of your java installation, on Mac OS X or Linux it will probably already be in your path.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Terminal&lt;/div&gt;&lt;pre style="background-color: #f3f3f3;"&gt;    % keytool -list -keystore ~/.android/debug.keystore&lt;br /&gt;    ... &lt;br /&gt;    Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98&lt;/pre&gt;&lt;br /&gt;Browse to the Map API Key Signup page.  Copy the MD5 into the form and submit the form.  This will generate the map key for your the debug.keystore.  Follow the same steps after you generate a release key for submitting to the Android Market.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Browser&lt;/span&gt; - &lt;a href="http://code.google.com/android/maps-api-signup.html"&gt;http://code.google.com/android/maps-api-signup.html&lt;/a&gt;&lt;br /&gt;&lt;pre style="background-color: #fff2cc;"&gt;    Your key is:&lt;br /&gt;        0UUnupTxbpdGofOV-UQi2jQHV0z6xwGh_kDu3NA&lt;/pre&gt;&lt;br /&gt;It is good to store the map API key as a value in a strings file to make it easy to change out in case you need to generate a new debug map key for multiple developers working on the project.  This file can then be set within the version control system as ignored.  Also, a release key can be added and easily be switched between release and production by updating the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;map_key&lt;/span&gt; between &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;@string/map_key_debug&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;@string/map_key_release&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;res/values/map_keys.xml&lt;/div&gt;&lt;pre style="background-color: #cfe2f3;"&gt;    &amp;lt;resources&amp;gt;&lt;br /&gt;        &amp;lt;string name="map_key_debug"&amp;gt;0UUnupTxbpdGofOV-UQi2jQHV0z6xwGh_kDu3NA&amp;lt;/string&amp;gt;&lt;br /&gt;        &amp;lt;string name="map_key_release"&amp;gt;0UUnupTxbpdHBqSgZFLLqTmFGezrtAJBEUCUWgw&amp;lt;/string&amp;gt;&lt;br /&gt;        &amp;lt;string name="map_key"&amp;gt;@string/map_key_debug&amp;lt;/string&amp;gt;&lt;br /&gt;    &amp;lt;/resources&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Application&lt;/b&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Layout&lt;/i&gt;&lt;br /&gt;The layout can now have the map view included.  In this example we are using the full screen to display the map view.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;res/layout/main.xml&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: #cfe2f3;"&gt;    &amp;lt;linearlayout&lt;br /&gt;        xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;        android:layout_height="fill_parent"&lt;br /&gt;        android:layout_width="fill_parent"&lt;br /&gt;        android:orientation="vertical"&amp;gt;&lt;br /&gt;        &amp;lt;com.google.android.maps.mapview&lt;br /&gt;            android:id="@+id/map"&lt;br /&gt;            android:apikey="@string/map_key"&lt;br /&gt;            android:layout_height="fill_parent"&lt;br /&gt;            android:layout_width="fill_parent"&amp;gt;&lt;br /&gt;        &amp;lt;/com.google.android.maps.mapview&amp;gt;&lt;br /&gt;    &amp;lt;/linearlayout&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;i&gt;Activity&lt;/i&gt;&lt;br /&gt;Maps require that you use a MapActivity.  The MapActivity is an abstract class that requires the implementation of the isRouteDisplayed method, though with a simple example this method can be left as a stub returning false.  The setupMapView method is setting the map to be clickable and enabling the built in zoom controls.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;src/...package.../MainActivity.java&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: #cfe2f3;"&gt;    package ...package...;&lt;br /&gt;&lt;br /&gt;    import android.os.Bundle;&lt;br /&gt;    import com.google.android.maps.MapActivity;&lt;br /&gt;    import com.google.android.maps.MapView;&lt;br /&gt;&lt;br /&gt;    public class MainActivity&lt;br /&gt;        extends MapActivity {&lt;br /&gt;        @Override&lt;br /&gt;        public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;            super.onCreate(savedInstanceState);&lt;br /&gt;            setContentView(R.layout.main);&lt;br /&gt;            setupMapView();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void setupMapView() {&lt;br /&gt;            MapView map = (MapView) findViewById(R.id.map);&lt;br /&gt;            map.setBuiltInZoomControls(true);&lt;br /&gt;            map.setClickable(true);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        protected boolean isRouteDisplayed() {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Resources&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.android.com/resources/dashboard/platform-versions.html"&gt;http://developer.android.com/resources/dashboard/platform-versions.html&lt;/a&gt; – Usage Statistics&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/publishing/app-signing.html"&gt;http://developer.android.com/guide/publishing/app-signing.html&lt;/a&gt; – Application Signing&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/android/maps-api-signup.html"&gt;http://code.google.com/android/maps-api-signup.html&lt;/a&gt; – Map API Key Signup&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/crazydays/AndroidGoogleMap"&gt;https://github.com/crazydays/AndroidGoogleMap&lt;/a&gt; - GitHub Project&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4618332207373836281-1295958452142387355?l=ongettingbetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/1295958452142387355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ongettingbetter.blogspot.com/2011/12/google-maps-api-on-android.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/1295958452142387355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/1295958452142387355'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/2011/12/google-maps-api-on-android.html' title='Google Maps API on Android'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4618332207373836281.post-8839025173125439270</id><published>2011-09-13T21:36:00.002-04:00</published><updated>2011-09-13T21:36:50.949-04:00</updated><title type='text'>Android, Ant, Emma, Robotium</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;We started a new android project at work today.&amp;nbsp; Since there isn't any legacy development we wanted to get it started right, with a continuous integration environment so we wanted to automate the build and testing as an ant task.&amp;nbsp; I was unable to find anything on the android developer site outlining the process to set this up, so I turned to the internet.&amp;nbsp; Nothing on the first couple pages of google results had a complete recipe so I figured I ought to share the solution we used.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Requirements&lt;/b&gt;&lt;/div&gt;&lt;ul style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;li&gt;Eclipse&lt;/li&gt;&lt;li&gt;Android SDK&lt;/li&gt;&lt;li&gt;ADT&lt;/li&gt;&lt;li&gt;Ant&lt;/li&gt;&lt;li&gt;Robotium jar&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Create Android Application&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;li&gt;File -&amp;gt; New -&amp;gt; Other...&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Open &lt;/span&gt;Android -&amp;gt; &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Select&lt;/span&gt; Android Project -&amp;gt; &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Click&lt;/span&gt; Next&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Set&lt;/span&gt; Project name, Android &amp;lt;Version&amp;gt;, Package name &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;(The rest should be filled out with reasonable defaults)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Click&lt;/span&gt; Finish&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Add Ant Script&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Open terminal to project directory&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background-color: #eeeeee;"&gt;% $ANDROID_HOME/tools/android update project --path .&lt;br /&gt;Updated local.properties&lt;br /&gt;Added file ./build.xml&lt;br /&gt;Updated file ./proguard.cfg&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Create Android Test Application&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;li&gt;File -&amp;gt; New -&amp;gt; Other...&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Open&lt;/span&gt; Android -&amp;gt; &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Select&lt;/span&gt; Android Test Project -&amp;gt; &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Click&lt;/span&gt; Next&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Set&lt;/span&gt; An existing Android project &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;(The rest should be filled in with reasonable defaults)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Add Ant Script&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Open terminal to test project directory&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background-color: #eeeeee;"&gt;% $ANDROID_HOME/android update test-project -m ../BigMeanRobot --path .&lt;br /&gt;Resolved location of main project to: /Users/daya/src/BigMeanRobot/BigMeanRobot&lt;br /&gt;Updated default.properties&lt;br /&gt;Updated local.properties&lt;br /&gt;Added file ./build.xml&lt;br /&gt;Updated file ./proguard.cfg&lt;br /&gt;Updated build.properties&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Test Coverage Report&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Open terminal to test project directory&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background-color: #eeeeee;"&gt;% ant coverage&lt;br /&gt;...compile/install project...&lt;br /&gt;...compile/install test project...&lt;br /&gt;coverage:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Running tests...&lt;br /&gt;...cleanup...&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Open &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;test project root&amp;gt;/coverage/coverage.html&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Add Robotium&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Download&lt;/span&gt; robotium-solo-&amp;lt;version&amp;gt;.jar &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;to&lt;/span&gt; &amp;lt;test project root&amp;gt;/libs&lt;/li&gt;&lt;li style="font-family: Arial,Helvetica,sans-serif;"&gt;Add to test project&lt;/li&gt;&lt;li&gt;File -&amp;gt; Properties&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Select&lt;/span&gt; Java Build Path -&amp;gt; Libraries -&amp;gt; &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Click&lt;/span&gt; Add Jar... &lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Open&lt;/span&gt; Big Mean Robot -&amp;gt; libs&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Select&lt;/span&gt; robotium-solo-&amp;lt;version&amp;gt;.jar -&amp;gt; &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Click&lt;/span&gt; OK&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Click&lt;/span&gt; OK&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Create Robotium Test&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1215649.js?file=gistfile1.java"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4618332207373836281-8839025173125439270?l=ongettingbetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/8839025173125439270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ongettingbetter.blogspot.com/2011/09/android-ant-emma-robotium.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/8839025173125439270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/8839025173125439270'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/2011/09/android-ant-emma-robotium.html' title='Android, Ant, Emma, Robotium'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4618332207373836281.post-4726148321892093945</id><published>2011-09-07T21:28:00.000-04:00</published><updated>2011-09-07T21:28:18.960-04:00</updated><title type='text'>Fail Fast to Restart Quicker</title><content type='html'>&lt;span style="font-family: Arial,sans-serif; font-size: small;"&gt;Theterm fail fast in software has its origins in fault tolerance.  Theidea is that something has gone awry and the safest way to handle thecondition is to shut down the whole system to prevent further damage. It is an acceptable trade off since the damage which could be doneis worse than the loss of the service the program is providing.  Theidea is also commonly found in entrepreneur circles where the damagecaused is the waste of capital.  I am sure there are a number ofother areas where fail fast can be applied beneficially, but sinceI'm a software developer I'd like to show some benefits of fail fastin software development.&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-family: Arial,sans-serif; font-size: small;"&gt;	Oneof the applications I have been working on recently has a littleannoying UI bug.  The top element of a spinner component is nothighlighted properly to indicate it is the prompt rather than aselectable option.  I decided I would spend a few minutes trying totackle the bug.  I started by verifying that I had an up to datesource tree without any uncommitted changes.  The cause of the UI bugwas determined to be how the adapter was being built giving all ofthe options an offset of “+1.”  Figuring that was silly I justremoved the first element, removed all of the “-1,” and set thefirst item as the prompt.  The component was visually correct afterthis and I was about to commit the changes.  However, one last runthrough application showed another bug.  I came to the realizationthat the UI bug I was fixing was a work around to another bugexhibited at another level.  At that point I decided I simply did nothave time to run down that rabbit hole for such a trivial bug.  Arevert command to the source control and I was back onto anothertask.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-family: Arial,sans-serif; font-size: small;"&gt;	Onthe same project I was adding two features to the application. Feature one went in really smoothly, so much so I had forgotten tocommit my changes prior to moving on to the next story.  The secondstory was a little bit hairy.  I had a bad false start and was aboutto revert the changes when I found my problem of not committing theprior story's changes.  Instead of being able to revert I had to workthrough my bad false start to complete the feature.  I had tocarefully evaluate all the code to make sure I wasn't leaving badbits in and make sure that the feature was successfully implemented. By not being able to fail fast I probably doubled the time requiredto implement the second feature.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-family: Arial,sans-serif; font-size: small;"&gt;	Theability to fail fast allows a developer to quickly try out ideas forviability before committing to them.  Some solutions appear to be agood idea at the start, but over the course of implementationfailings can be revealed.  Following the course laid out by a badstart can cause design flaws or overly complex code to handleoriginally unforeseen issues.  The complex code can be refactored,but it is often easier and cleaner to start from scratch with abetter understanding than to modify the existing bad start.  Failingfast is another tool in a developer's skill set which will allowcleaner and better code.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-family: Arial,sans-serif; font-size: small;"&gt;&lt;i&gt;&lt;u&gt;Resources&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://c2.com/cgi/wiki?FailFast"&gt;&lt;span style="font-family: Arial,sans-serif;"&gt;http://c2.com/cgi/wiki?FailFast&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4618332207373836281-4726148321892093945?l=ongettingbetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/4726148321892093945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ongettingbetter.blogspot.com/2011/09/fail-fast-to-restart-quicker.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/4726148321892093945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/4726148321892093945'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/2011/09/fail-fast-to-restart-quicker.html' title='Fail Fast to Restart Quicker'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4618332207373836281.post-1815825972172682698</id><published>2011-07-28T20:56:00.000-04:00</published><updated>2011-07-28T20:56:57.836-04:00</updated><title type='text'>Gracious Judgments</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;              &lt;style type="text/css"&gt; &lt;!--  @page { margin: 0.79in }  P { margin-bottom: 0.08in }  A:link { so-language: zxx } --&gt; &lt;/style&gt;  &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;Within Temptation has a song called Destroyed (&lt;a href="http://www.youtube.com/watch?v=KA_KdRhG9OI"&gt;http://www.youtube.com/watch?v=KA_KdRhG9OI&lt;/a&gt;) with the refrain, “It is so easy to destroy and condemn the ones you do not understand.”   Who knew that a symphonic metal band knew so much about working with legacy code?  Okey, they are probably not singing about doing maintenance work on a software system without test cases, documentation, design patterns, and looks like a mess of spaghetti.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;Anyone who has worked on a legacy system knows how easy it is to condemn someone else's work.  When in that position myself I have often found it is easier to destroy and condemn by rewriting the legacy code rather than spend the time to understand to code.  Rewriting leads to obliterating the original implementation which may have special cases littered throughout and on the next release customers depending on those special cases will start calling support.  And that doesn't make anyone happy.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;Working on a code base written by another developer is an intimidating task.  Every developer is going to work out solutions in a different fashion, applying a different pattern or algorithm to the problem.  Wrapping your mind around the original developer's thought pattern is challenging and often frustrating, especially when the original developer's background is very different from your own.  Failing to understand the intent of the original developer can lead to belittling the code or writer, especially if they are not around to defend their work.  Most bosses or customers are not interested in who created a mess, they want to have product shipped.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;Destroying or condemning is not productive or conducive to shipping product and having happy customers.  It is a developer's job to write the software and ship.  The original developer already has a leg up on you since he has shipped something.  So he is obviously not completely incompetent.  Granted you are performing some sort of maintenance (bug fixing or feature enhancement), but that doesn't take away from his accomplishment.  Judging or condemning the prior work does not add business value.  Perhaps it is you or your point of view which needs adjusting, not the existing code or its developer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;There are many reasons why the original code is difficult to understand completely unrelated to the original developer's competence.  The original developer had a different set of circumstances under which they were writing.  Their personal style could be completely different or the styles they have picked up over time could be foreign to you.  Many languages and toolkits have styles and patterns which are unique to them and you may unfamiliar with them.  A hardware engineer may be excellent at their job of circuit board design, but unfamiliar with software engineering practices.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;A better outlet is to work towards understanding the existing code using various techniques.  Searching out the original developer and pairing with them if they are still available is a great way to become familiar with difficult code.  Reviewing the original artifacts created during the development will give a high level understanding of the product, as it actually using the product itself.  Writing unit test to stimulate particularly difficult segments of code can quickly reveal their purpose and leave an executable documentation of features.  As you learn the purpose of particular portions of the code make sure to update identifiers to reveal their purpose for the next developer who will be working in this area.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-style: normal; font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;Let me challenge you to be gracious in your judgment of existing code bases.  There is value in the code otherwise you would not be maintaining it.  The original developer was neither malicious nor out to make your life difficult.  Assuming the worst intention or capability of the original developer does not improve the situation.  Your boss and customer do not want to hear excuses, they want a time frame and the best possible value.  Working with unfamiliar or difficult code is an opportunity to be explore new patterns, expand your repertoire, and become a better developer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-style: normal; font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-style: normal; font-weight: normal; margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;u&gt;References&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;a href="" name="__DdeLink__914_1877818156"&gt;&lt;/a&gt;  &lt;a href="http://www.youtube.com/watch?v=KA_KdRhG9OI"&gt;&lt;span style="font-family: Liberation Sans,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;http://www.youtube.com/watch?v=KA_KdRhG9OI&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4618332207373836281-1815825972172682698?l=ongettingbetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/1815825972172682698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ongettingbetter.blogspot.com/2011/07/gracious-judgments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/1815825972172682698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/1815825972172682698'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/2011/07/gracious-judgments.html' title='Gracious Judgments'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4618332207373836281.post-3614075317958424581</id><published>2011-07-18T06:22:00.001-04:00</published><updated>2011-07-18T06:23:24.081-04:00</updated><title type='text'>Learning Agile</title><content type='html'>&lt;i&gt;&lt;span style="font-family: DejaVu Sans Condensed,sans-serif;"&gt;During my search for a new job over the last couple months I wrote this essay for one of the positions I submitted an application.&amp;nbsp; The position did not pan out due to some classic interview blunders, however, it seems like a waste to let this essay go otherwise unread.&amp;nbsp; It covers some of the highlights of a team I participated on for several years transformation to several agile practices.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-family: DejaVu Sans Condensed,sans-serif;"&gt;My manager had a great interest in various development theories.  He would spend hours mapping out ideas while trying to wrap his head around the latest methodology he had read about.  When he began to introduce agile practices to our team I was skeptical.  I tended towards a conservative approach to my development, preferring tools and methods which have a proven track record or at least the status quo until value can be shown.  A poor tool or method could yield many times the initial effort to replace or even discontinue.  Introducing what amounted to overhead in our near constant fire fighting stance seemed like it would only slow down the team.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=4618332207373836281&amp;amp;postID=3614075317958424581" name="__DdeLink__1_1045987876"&gt;&lt;/a&gt;&lt;span style="font-family: DejaVu Sans Condensed,sans-serif;"&gt;Stand up meetings were our first foray into agile practices.  The manager sent us a couple articles to review on stand up meetings and told us a story about pigs and chickens.  What was supposed to be a quick ten minute daily meeting quickly ballooned to thirty minutes or more.  Minutiae of each team member's work would be discussed at length and it was rarely pertinent to more than a single member.  For quite a while our stand ups amounted micro management voyeurism.  Improvement occurred as the team started feeling empowered (through additional agile practices) and holding each other accountable to follow standard stand up procedures.  Stand ups became a useful tool to increase transparency throughout the team and allowed members to assist each other on blocking issues.  Despite our early problems we were able to bring value to the team by persisting.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-family: DejaVu Sans Condensed,sans-serif;"&gt;As a team we had some false starts with test driven development.  Our initial attempts still haunt us today.  Large, fragile, and poorly conceived tests which were written after the production code usually testing only success paths and took minutes to fire up and execute.  The code which was covered by these tests became rigid and the supposed benefits were not realized.  Unit testing waxed and waned at the developer's whim since there was little accountability.  Occasionally one of the team members would add a new tool to our belt which would get everyone excited.  Database fixtures allowed us stop depending on a fragile example database when testing.  The first GLSEC the team attended together was when we really turned the corner and made TDD useful for us.  A handful of us attended a session on mock frameworks which opened our eyes to isolating our tests.  Another session on clean code helped us practically apply TDD  by showing how writing the test first was supposed to guide development.  With these lessons the team was able to truly begin TDD and reap the benefits.  We added a code coverage report which we then began reviewing excitedly during our sprint review meetings.  In addition when a new team member begins we spent a large portion of our time teaching this skill.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-family: DejaVu Sans Condensed,sans-serif;"&gt;At the time of the same GLSEC we were working with month long iterations.  Our planning meetings took several days time to complete between writing stories, planning poker, and finally assembling stories into the iteration plan.  The overhead seemed too large to even entertain the idea of shorter iterations and developing a complete feature took about that long anyways.  At GLSEC a couple of presenters from Menlo sat with our team during lunch.  The whole meal we discussed some of the topics we had heard that day and the progressions of our agile transformation.  One of the Menlo women continually challenged us during the meal to consider week long iterations and see if things changed for the better.  Uncertain there would be any improvement we decided to give it a try.  Just as promised improvements in estimation, transparency, and flow occurred.  Our epic stories were forced to be broken down into much smaller stories to fit within a week's time and we wound up with more spike oriented stories.  We were able to more accurately judge the rate we would deliver features, produce usable features earlier, and trim feature sets in accordance to delivery time.  At the next year's GLSEC I was delighted to find the same woman from Menlo and thank her for her suggestion and told her of our success with single week iterations.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-family: DejaVu Sans Condensed,sans-serif;"&gt;In retrospect our manager did a great job in leading the team to pick up a number agile practices.  Rather than forcefully push immediate compliance with the defined agile practices he sought team buy in and to empowered team members to direct our implementation.  Despite my concerns I earnestly attempted to do my part to follow through in the implementation of various agile practices.  I was pleasantly surprised when the practices my manager introduced helped improve our team.  After the manager left the company the team continued the agile practices which he had started and we have extended our toolbox to include other practices.  Seeing the success of many of the agile practices I am more willing to seek out new ideas which will help deliver better software quickly to the customer.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4618332207373836281-3614075317958424581?l=ongettingbetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/3614075317958424581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ongettingbetter.blogspot.com/2011/07/learning-agile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/3614075317958424581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/3614075317958424581'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/2011/07/learning-agile.html' title='Learning Agile'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4618332207373836281.post-5011795171461784262</id><published>2011-06-22T14:53:00.000-04:00</published><updated>2011-06-22T14:53:53.553-04:00</updated><title type='text'>Agile and Bus Number</title><content type='html'>&lt;style type="text/css"&gt; &lt;!--  @page { margin: 0.79in }  P { margin-bottom: 0.08in }  A:link { so-language: zxx } --&gt; &lt;/style&gt;   &lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;I announced to my boss that I would be hit by a bus in two weeks.  After my tragic encounter only two development team members will remain with more than a year of experience with the products we have developed, a developer and QA guy.  With 9 years of experience at the company I have accumulated a great deal of knowledge of the product.  The inevitable question, “What does he know and how can we get him to share that knowledge in two weeks,” was posed.  In formulating an answer to this question I quickly realized the areas which I would spend the most amount of time documenting and training would be things done prior to adoption of a number of agile practices.&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;b&gt;What Hurt&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;i&gt;Silos&lt;/i&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt; As a fairly small development team we had some small silos of expertise.  Projects were often tackled by a single developer from start to finish.  The developer would set the design, implement, and release with little review.  And when defects or change requests would come in it would be passed back the original developer.  Occasionally a second developer might try to provide some insight into one of the steps, but most of the time the development process would be worked on by a single developer.&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;i&gt;Code Review&lt;/i&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-style: normal;"&gt; Effective code reviews are hard to actually implement.  And we were no exception.  On the rare occasion that we would perform a code review it would be over a small percentage of the code.  Suggested changes were rarely implemented because the feature was working and there was little to no incentive to actually change the code.  The design had been settled and changing it would introduce additional cost in development and risk.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;b&gt;What Helped&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in; text-decoration: none;"&gt; &lt;i&gt;Collective Code Ownership&lt;/i&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt; Breaking down the silos was not a major hurdle in our agile transformation by applying the concept of collective code ownership.  Our story writing and planning process quickly brought the entire team in to advise on the design of features.  We tried to keep implementation details out of the stories, but by having the entire team available ideas would be tossed around.  Members would suggest code from their silos to encourage component reuse, permission given implicitly to modify to their own needs.  Rather than waiting for another developer to implement a required component or reinventing the wheel a developer felt free to modify any piece of code.&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;i&gt;Pair Programming&lt;/i&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;span style="font-style: normal;"&gt; Beyond just granting permission to modify the code, pair programming allowed developers to actually work together in developing a feature.  Short of a Vulcan mind meld, pair programming is the best way to ensure multiple team members fully understand the design and implementation.  While the code is being developed the code is under constant review, so improvements actually happen instead of being noted as suggestions and ignored.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;u&gt;References&lt;/u&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;a href="http://c2.com/cgi/wiki?BusNumber"&gt;http://c2.com/cgi/wiki?BusNumber&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;a href="http://www.extremeprogramming.org/rules/collective.html"&gt;http://www.extremeprogramming.org/rules/collective.html&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;a href="http://c2.com/cgi/wiki?CollectiveCodeOwnership"&gt;http://c2.com/cgi/wiki?CollectiveCodeOwnership&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;a href="http://www.extremeprogramming.org/rules/pair.html"&gt;http://www.extremeprogramming.org/rules/pair.html&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-weight: normal; margin-bottom: 0in;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Vulcan_%28Star_Trek%29#Mind_melds"&gt;http://en.wikipedia.org/wiki/Vulcan_(Star_Trek)#Mind_melds&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4618332207373836281-5011795171461784262?l=ongettingbetter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ongettingbetter.blogspot.com/feeds/5011795171461784262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ongettingbetter.blogspot.com/2011/06/agile-and-bus-number.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/5011795171461784262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4618332207373836281/posts/default/5011795171461784262'/><link rel='alternate' type='text/html' href='http://ongettingbetter.blogspot.com/2011/06/agile-and-bus-number.html' title='Agile and Bus Number'/><author><name>Aaron Day</name><uri>https://profiles.google.com/110922576274049880517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-1q-SaQUu42g/AAAAAAAAAAI/AAAAAAAAADU/UOqxRbtkTjw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
