<?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>SEP Engineering Blog</title>
	<atom:link href="http://www.sep.com/engineeringblog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sep.com/engineeringblog</link>
	<description>Just another Software Engineering Professionals weblog</description>
	<lastBuildDate>Mon, 30 Apr 2012 15:28:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Walking the Talk – Part 2</title>
		<link>http://www.sep.com/jsg/2012/04/09/walking-the-talk-part-2/</link>
		<comments>http://www.sep.com/jsg/2012/04/09/walking-the-talk-part-2/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 14:10:43 +0000</pubDate>
		<dc:creator>jsg</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jsg/?p=87</guid>
		<description><![CDATA[Back on the “trend” of applying Agile/Lean practices SEP learned from software development to “management” I submit another example. SEP is working on significant updates to its risk management, project management and status reporting. These areas deal a lot with communication and like everything else&#8230;people. It really impressed me to find out our managers were [...]]]></description>
			<content:encoded><![CDATA[<p>Back on the “trend” of applying Agile/Lean practices SEP learned from software development to “management” I submit another example. SEP is working on significant updates to its risk management, project management and status reporting. These areas deal a lot with communication and like everything else&#8230;people.<a href="http://www.sep.com/jsg/files/2012/04/cam-persona.png"><img class="alignright size-medium wp-image-88" style="margin: 2px" src="http://www.sep.com/jsg/files/2012/04/cam-persona-238x300.png" alt="" width="143" height="180" /></a></p>
<p>It really impressed me to find out our managers were applying SEP’s Envision discovery practice techniques to help understand what we needed to do. They worked with personas (see pictures for examples). One represented the client (Cam) and the other an SEP project manager (Pete).</p>
<p>The team is running through the Envision process doing measurable product goals, personas, story-boarding – whatever makes sense.</p>
<p><a href="http://www.sep.com/jsg/files/2012/04/pete-pm.png"><img class="alignleft size-medium wp-image-91" style="margin: 2px 3px" src="http://www.sep.com/jsg/files/2012/04/pete-pm-288x300.png" alt="" width="183" height="190" /></a>It is interesting to me that processes we have come to trust for software product development to ‘build the RIGHT product’ should and could be used to help us build better practices, tools, etc. It is a validation of the principles behind the approaches:</p>
<p>- Engage as many different types of stakeholders in the process as you can<br />
- Concentrate on the end user and the end result<br />
- Follow the value<br />
- Be prepared to increment/learn<br />
- Build it in paper first<br />
- Stay visual</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jsg/2012/04/09/walking-the-talk-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to be more confident in your changes – Test First…</title>
		<link>http://www.sep.com/mcterry/2012/04/07/how-to-be-more-confident-in-your-changes-test-first/</link>
		<comments>http://www.sep.com/mcterry/2012/04/07/how-to-be-more-confident-in-your-changes-test-first/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 18:40:07 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=532</guid>
		<description><![CDATA[I was tag-teaming a change with one of my teammates, Brian, and I didn&#8217;t even know where to begin.  I wasn&#8217;t nearly as confident with the scheduling logic as Brian was, which is why I was really excited to partner up with him in order to make the changes we needed. First, write tests that [...]]]></description>
			<content:encoded><![CDATA[<p>I was tag-teaming a change with one of my teammates, <a title="Brian Ball Twitter - @myotherpants" href="https://twitter.com/#!/myotherpants" >Brian</a>, and I didn&#8217;t even know where to begin.  I wasn&#8217;t nearly as confident with the scheduling logic as Brian was, which is why I was really excited to partner up with him in order to make the changes we needed.</p>
<p><strong>First, write tests that fail&#8230;wait, what!?!</strong><br />
Brian took an interesting approach to the problem.  No, he didn&#8217;t open up the code and try to walk me through the method calls&#8230;instead, he opened up our test project and showed me the tests we already had written for the scheduler.</p>
<p><span id="more-532"></span></p>
<p>Next, we wrote a couple of unit-tests to cover the new behavior.  As you can expect, our tests failed.  To be honest, I didn&#8217;t really understand what Brian was trying to do&#8230;I <em>_knew_</em> the tests would fail.  In reality, though, now we both understood exactly what the problem was, and we both knew exactly what the new behavior should do.</p>
<p>By writing our tests first, we both had a shared understanding of what the new behavior should be.  I still didn&#8217;t know everything about the scheduler, but I knew everything about the change we were about to make!</p>
<p><strong>Next, isolate the issue&#8230;</strong><br />
Now that we had tests that were failing, Brian and I added a couple of methods to our scheduler that we thought would achieve our desired behavior.  We wrote enough code to satisfy our unit tests.  And then we ran those tests again.</p>
<p>As you&#8217;d imagine, now our tests are passing.  And honestly, I don&#8217;t think we saved any time by doing things in this order.  However, what we did do, was isolate the issue.  Our changes were minimal, and we simply added some methods to exercise the new behaviors we wanted.  Pretty simple.  But unit tests don&#8217;t tell the whole story, right?</p>
<p><strong>Then, wire up your changes&#8230;</strong><br />
The last thing we did was wire up our new methods in the appropriate places.  For example, we simply added the new checks to our scheduler before we  actually displayed a notification to our users.</p>
<p><strong>Finally, relax&#8230;</strong><br />
Not only is my confidence extremely high that our changes are working, I&#8217;m also confident we didn&#8217;t change any of the existing behaviors (because we already had tests for those behaviors).</p>
<p>Ultimately, if you want to be confident in your changes, write your tests first&#8230;go ahead, I dare you <img src='http://www.sep.com/mcterry/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/04/07/how-to-be-more-confident-in-your-changes-test-first/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Walking the Talk – Lean/Agile as a Way of Business</title>
		<link>http://www.sep.com/jsg/2012/04/03/walking-the-talk-leanagile-as-a-way-of-business/</link>
		<comments>http://www.sep.com/jsg/2012/04/03/walking-the-talk-leanagile-as-a-way-of-business/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 16:31:31 +0000</pubDate>
		<dc:creator>jsg</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jsg/?p=78</guid>
		<description><![CDATA[My management team implements a lot of really cool practices, techniques, etc. (“stuff”) here. There appears to be a trend developing that is really exciting. It guess it has to be connected to appointing Chris Shinkle to the Director of Innovation role at SEP. The trend? Our managers are applying some of the awesome agile/lean [...]]]></description>
			<content:encoded><![CDATA[<p>My management team implements a lot of really cool practices, techniques, etc. (“stuff”) here. There appears to be a trend developing that is really exciting. It guess it has to be connected to appointing <a href="http://www.linkedin.com/profile/view?id=39005253&amp;locale=en_US&amp;trk=tyah">Chris Shinkle</a> to the Director of Innovation role at <a href="http://www.sep.com">S</a><a href="http://www.sep.com/jsg/files/2012/04/wall-graphic.png"><img class="size-medium wp-image-79 alignright" style="margin: 1px;border: 0pt none" src="http://www.sep.com/jsg/files/2012/04/wall-graphic-200x300.png" alt="" width="150" height="250" /></a><a href="http://www.sep.com">EP</a>.</p>
<p>The trend? Our managers are applying some of the awesome agile/lean principles we use in software development to management areas. I have several examples to write about. The first is the most noticeable to us and perhaps the simplest.</p>
<p>Recently a large diagram appeared on a hallway on our fourth floor. It is hard to see its size in the picture. It is VERY large &#8211; 6’ x 19’. SEP is in the process of re-looking at its practices for proposal development, client relations, high-level project tracking and business development. These areas interact with software development and project management. It all has to integrate and it all has to add value.</p>
<p>The task was daunting considering the breadth we needed to consider and our desire to get input from a lot of people. So this wall shows up. At first it just hung there and it was pretty overwhelming with a lot of empty space. We haven’t had any stand-ups around it yet and so far there hasn’t been a lot of talk about it.</p>
<p>Slowly people with an interest in these areas began to post notes on the board in pencil. Recently pictures were added that represented topics that need to be considered: networking, conferences, business development and marketing.  It was interesting to me that the addition of these pictures really made the board more engaging.I mentioned that this was a simple example of Agile/Lean principles – ‘make the work visible’.</p>
<p><a href="http://www.sep.com/jsg/files/2012/04/picture-jsg.png"><img class="alignleft size-medium wp-image-80" style="margin: 2px;border: 0pt none" src="http://www.sep.com/jsg/files/2012/04/picture-jsg-300x274.png" alt="" width="189" height="174" /></a> As time goes on this simple visual tool will become the central focus of a team of people working to make these areas better. If we just let this map alone, unaided and supported I suspect that a team would self-organize around it. That is the way it works.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jsg/2012/04/03/walking-the-talk-leanagile-as-a-way-of-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is Envision? Understanding SEP’s Discovery Process</title>
		<link>http://www.sep.com/jsg/2012/03/21/what-is-envision-understanding-seps-discovery-process/</link>
		<comments>http://www.sep.com/jsg/2012/03/21/what-is-envision-understanding-seps-discovery-process/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 20:21:02 +0000</pubDate>
		<dc:creator>jsg</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jsg/?p=75</guid>
		<description><![CDATA[Envision is SEP’s unique collection of practices collected from different industries and approaches integrated powerfully together, designed to integrate with SEP’s collaborative development processes. The main goal of Envision is to develop a shared vision for a product. The process is very visual so it is easy to include both technical and non-technical representatives and [...]]]></description>
			<content:encoded><![CDATA[<p>Envision is SEP’s unique collection of practices collected from different industries and approaches integrated powerfully together, designed to integrate with SEP’s collaborative development processes.</p>
<p>The main goal of Envision is to develop a shared vision for a product. The process is very visual so it is easy to include both technical and non-technical representatives and stakeholders.</p>
<p>Envision also helps prioritize product features. This yields much leaner product footprints tightly matched to the targeted markets and users. The result is a shorter and less expensive path to market.</p>
<p>Envision also supports a multiple release strategy for product deployment that is so key in developing products for the new, developing markets we are seeing. For example, look at mobile device applications. Users expect frequent updates with new content. We have seen that it often take several releases to the market to get to a successful offering.</p>
<p>Envision begins by first getting everyone together. SEP provides the discovery team including the facilitator. We like to get a broad representation of people to participate, really anyone who can bring value and input.</p>
<p>The SEP facilitator leads the group through a series of exercises that result in a strong common vision for the product. We use visual models that anyone can be taught to understand. As the sessions continue we move from high-level product goals, to user personas and storyboards.</p>
<p>Seeing the visual model of the system and its potential features the discussion moves to &#8220;right scoping&#8221; and release planning. This is where the group takes a hard look at the potential product features, deferring, removing and prioritizing them.</p>
<p>At a high level, we are planning feature-dense releases of the product designed to fit the marketing approach and product goals. Between each release to the market we assess market response and this input is used in planning the next feature-dense release of the product.</p>
<p>The goal is early and often releases to the market with quick response to market/user input.</p>
<p>This is really the future of software product deployment and it is the direction SEP is committed to taking.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jsg/2012/03/21/what-is-envision-understanding-seps-discovery-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android UI/X – don’t go overboard with your list views</title>
		<link>http://www.sep.com/mcterry/2012/03/17/android-uix-dont-go-overboard-with-your-list-views/</link>
		<comments>http://www.sep.com/mcterry/2012/03/17/android-uix-dont-go-overboard-with-your-list-views/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 05:41:08 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=450</guid>
		<description><![CDATA[The Android ListView is one of the simplest UI widgets to implement.  There are plenty of ListView tutorials and examples, so I&#8217;m not going to talk about how to implement a list. Instead, I&#8217;m going to focus on the User Experience and ways to improve your lists. To see a really well implemented ListView, take [...]]]></description>
			<content:encoded><![CDATA[<p>The <a title="Android ListView class" href="http://developer.android.com/reference/android/widget/ListView.html" >Android ListView</a> is one of the simplest UI widgets to implement.  There are plenty of <a title="Android ListView tutorial" href="http://developer.android.com/resources/tutorials/views/hello-listview.html" >ListView tutorials and examples</a>, so I&#8217;m not going to talk about how to implement a list.</p>
<p>Instead, I&#8217;m going to focus on the User Experience and ways to improve your lists.</p>
<p>To see a really well implemented ListView, take a look at the contact list on your phone.  It is consistent, generic, and responsive.  You can fling the list, and it glides smoothly.  You can easily follow down the left side until you see the name you&#8217;re looking for.  And you aren&#8217;t distracted by any rows that stand out like a sore thumb.</p>
<p>In this post, I want to talk about ways that you can make your ListView as good as  the contact list.<span id="more-450"></span></p>
<p><strong>Patterns for responsiveness:</strong></p>
<p>First, let&#8217;s talk about some of the &#8220;crunchy stuff&#8221; &#8211; the code.  There is a lot you can do to make your Java more efficient, but that&#8217;s not where the bang-for-the-buck is at.  You really need to take advantage of some of the tools that Android has put in place.  Namely, the convert view and the tags.  Below are 2 patterns that you can use to improve the responsiveness of your list.</p>
<p><em>Recycling pattern:</em></p>
<p>The recycling pattern makes use of the convert view.  Inside your <a title="Android ListAdapter class" href="http://developer.android.com/reference/android/widget/ListAdapter.html" >ListAdapter</a>, there is a method called &#8220;getView()&#8221;.  You may have noticed that one of the parameters in that method is called &#8220;convertView&#8221;.  Making use of the convertView can significantly reduce the number of calls that are made to the <a title="Android LayoutInflater class" href="http://developer.android.com/reference/android/view/LayoutInflater.html" >LayoutInflater</a>.  The way that Android wants you to use the convertView, is to recycle the views contained in each row.</p>
<p>This is important because as the user scrolls, many rows are coming in and out of the screen.  Because this is a list, the views should largely be the same components, just with different data.</p>
<p>Going back to our reference from above, the contact list simply has an image, name, and description.  That translates to one ImageView component, and 2 TextView components.  Each row is identical in structure.</p>
<p>Below is an example of how to use the convertView in your ListAdapter.</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:view+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">View</span></a> getView<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> position, <a href="http://www.google.com/search?hl=en&amp;q=allinurl:view+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">View</span></a> convertView, ViewGroup parent<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// When convertView is not null, we can reuse it directly, there is no need</span><br />
<span style="color: #666666; font-style: italic;">// to reinflate it. We only inflate a new View when the convertView supplied</span><br />
<span style="color: #666666; font-style: italic;">// by ListView is null.</span><br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>convertView <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
convertView <span style="color: #339933;">=</span> mInflater.<span style="color: #006633;">inflate</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">layout</span>.<span style="color: #006633;">list_item_icon_text</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
convertView.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>In this example, we only inflate the view if convertView is null.  Otherwise, we simply set the text to &#8220;foo&#8221; without inflating.</p>
<p>Biggest bang for your buck, right there.  A simple null check before inflating, and that&#8217;s it.</p>
<p><em>Holder pattern:</em></p>
<p>The holder pattern uses a class to hold references to your view.  Just as inflating a view is expensive, so is calling &#8220;findViewById()&#8221; each time you want to access a widget in your view.  This pattern is a solution to a common problem in most UI Toolkits&#8230;getting references to a widget.</p>
<p>The normal way that you would get/set data in a widget is by finding the view by ID, and then calling the appropriate method on that object &#8211; e.g. when we called setText(&#8220;foo&#8221;) in the above example.  As you can imagine, in a list this gets very expensive.</p>
<p>Below is an example of the Holder pattern.</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> ViewHolder <span style="color: #009900;">&#123;</span><br />
TextView text<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:view+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">View</span></a> getView<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> position, <a href="http://www.google.com/search?hl=en&amp;q=allinurl:view+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">View</span></a> convertView, ViewGroup parent<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// A ViewHolder keeps references to children views to avoid unneccessary calls</span><br />
<span style="color: #666666; font-style: italic;">// to findViewById() on each row.</span><br />
ViewHolder holder<span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>convertView <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
convertView <span style="color: #339933;">=</span> mInflater.<span style="color: #006633;">inflate</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">layout</span>.<span style="color: #006633;">list_item_icon_text</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
holder <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ViewHolder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
holder.<span style="color: #006633;">text</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>TextView<span style="color: #009900;">&#41;</span> convertView.<span style="color: #006633;">findViewById</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
convertView.<span style="color: #006633;">setTag</span><span style="color: #009900;">&#40;</span>holder<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// Get the ViewHolder back to get fast access to the TextView</span><br />
<span style="color: #666666; font-style: italic;">// and the ImageView.</span><br />
holder <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ViewHolder<span style="color: #009900;">&#41;</span> convertView.<span style="color: #006633;">getTag</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Bind the data efficiently with the holder.</span><br />
holder.<span style="color: #006633;">text</span>.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span> <span style="color: #339933;">+</span> position<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">return</span> convertView<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>So, in this pattern we are using tags, instead of IDs.  The holder is responsible for holding the tag so that you only ever have to make 1 call to findViewById().  We still use the convertView as we were previously.  And finally, you bind your data through the holder, instead of directly to a specific view object.</p>
<p><strong>There&#8217;s always an exception&#8230;</strong></p>
<p>Now, these patterns are great&#8230;but these patterns don&#8217;t fix everything.  They only help address the responsive aspect to your list.  In fact, they lose a lot of their impact if your view is not generic.  If different rows of your list have different items in the view, then both of these patterns will only have minimal impacts because you won&#8217;t be able to recycle views (convertView will be null each time the view changes) and the holders will get updated regularly.</p>
<p><strong>Simplicity wins</strong></p>
<p>The biggest improvement you can do is to actually make your list generic and consistent.  Below are some less crunchy ways to improve your design.</p>
<p><em>Generic views &#8211; defer secondary content</em></p>
<p>Use the fewest pieces of information to identify the item, and use a dialog to display more information if the user is interested.  <a title="Nielsen - defer secondary content" href="http://www.useit.com/alertbox/mobile-content.html" >Defer all of the secondary content</a> and additional actions to another screen or dialog.  The more content you put in a view, the more work you are doing with binding and updating data.</p>
<p>Again, the contact list simply has an image, name, and description&#8230;that&#8217;s it.</p>
<p><em>Consistent &#8211; don&#8217;t conditionally modify the view</em></p>
<p>Unless you absolutely need to uniquely identify a row&#8230;don&#8217;t!  Don&#8217;t worry about modifying the views in each row.  It actually causes more problems for the user if items are not consistent in a list.</p>
<p>Adding small tweaks here and there add up quickly and become noisy distractions (e.g. color-coding backgrounds, re-arranging items, or adding/hiding items).  The more inconsistent your views are, the more conditional display logic you&#8217;ll have to write.  And the more conditional display logic you write, the slower your scroll speeds&#8230;not to mention the more confused your users will be.</p>
<p><strong>In Summary</strong></p>
<p>The biggest increases you can get are actually in making your view hierarchy as simple as possible.  It increases usability, and decreases complexity of your code.  The next time you&#8217;re implementing a list, give it the &#8220;fling&#8221; test, and see if it is smooth and consistent as it scrolls by.</p>
<p>Remember, your aim should be to create a product that is both <a title="Nielsen User Experience - simple and elegant" href="http://www.nngroup.com/about/userexperience.html" >simple and elegant</a>, as well as, a product that is <a title="Product Engineering is like road construction…" href="http://www.sep.com/mcterry/2011/12/08/product-engineering-is-like-road-construction/" >desirable to use</a>.</p>
<p>&nbsp;</p>
<p>The above patterns and snippets are based off of the <a title="Android ListView List14.java patterns" href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html" >sample List14.java</a> from the SDK samples.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/03/17/android-uix-dont-go-overboard-with-your-list-views/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android AsyncTasks, for updating your UI</title>
		<link>http://www.sep.com/mcterry/2012/03/11/android-asynctasks-for-updating-your-ui/</link>
		<comments>http://www.sep.com/mcterry/2012/03/11/android-asynctasks-for-updating-your-ui/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 18:21:06 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=247</guid>
		<description><![CDATA[Last time, I talked about how to use Android Handlers for handling a blocking task in the background.  While Handlers are very powerful, they can easily get too complicated for larger tasks. This time, let&#8217;s take a look at the Android AsyncTasks. AsyncTask enables proper and easy use of the UI thread. This class allows to [...]]]></description>
			<content:encoded><![CDATA[<p>Last time, I talked about how to use <a title="Android Handler, in a nutshell…" href="http://www.sep.com/mcterry/2011/08/05/android-handler-in-a-nutshell/" >Android Handlers</a> for handling a blocking task in the background.  While Handlers are very powerful, they can easily get too complicated for larger tasks.</p>
<p>This time, let&#8217;s take a look at the <a href="http://developer.android.com/reference/android/os/AsyncTask.html" >Android AsyncTasks</a>.</p>
<blockquote><p>AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.</p></blockquote>
<p>The AsyncTask class takes care of all of the hard work for us!  Because the AsyncTask runs in a &#8220;worker thread&#8221; as part of the UI Thread, you are not guaranteed that it is running in a multi-threaded model.  Instead, it is executed in an asynchronous way.</p>
<p>Knowing how your application lifecycle impacts your user interface plays a big role here.  Typically, using an AsyncTask is appropriate because your application is likely the only foreground Activity.</p>
<p>While the details of this post rely on using an asynchronous model, I&#8217;m not going to cover the details of process/thread models.  Instead, I recommend taking at look at this <a href="http://krondo.com/wp-content/uploads/2009/08/twisted-intro.html" >introduction to asynchronous programming</a>.  The author, Dave Peticolas, has some great graphics to illustrate the differences between those models &#8211; single-threaded, multi-threaded, and asynchronous. (Thanks <a href="https://twitter.com/#!/_swanson" >@_swanson</a> for sharing this!)</p>
<p><strong><span id="more-247"></span>So, what does it look like?</strong></p>
<p>An AsyncTask is actually really easy to implement.  The AsyncTask goes through 4 steps</p>
<ul>
<li>onPreExecute() &#8211; called immediately after the task is executed, used for setup</li>
<li>doInBackground(Params&#8230;) &#8211;  used for long-running tasks</li>
<li>onProgressUpdate(Progress&#8230;) &#8211; used to display progress to the user, for example &#8220;On step X out of Y&#8221;</li>
<li>onPostExecute(Result) &#8211; called immediately after the task is finished</li>
</ul>
<p>The interesting steps are &#8220;doInBackground&#8221; and &#8220;onPostExecute&#8221;.  Below is an example that covers both of these.</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">class</span> MyAsyncTask <span style="color: #000000; font-weight: bold;">extends</span> AsyncTask<span style="color: #339933;">&lt;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl:void+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">Void</span></a>, String<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span><br />
@Override<br />
<span style="color: #000000; font-weight: bold;">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> doInBackground<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a>... <span style="color: #006633;">params</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// this is where you implement your long-running task</span><br />
<span style="color: #000000; font-weight: bold;">return</span> doSomeLongOperation<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
@Override<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onPostExecute<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> result<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// here, you can update, and manipulate, your views</span><br />
updateUiWithResult<span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>That&#8217;s all it takes to implement your AsyncTask.  Simple, right?</p>
<p>The beautiful part about AsyncTasks is, the &#8220;onPostExecute()&#8221; method is able to update your view.  This is powerful because you don&#8217;t have to worry about some of the issues we talked about with Handlers, where the view elements might return a Null Pointer Exception.</p>
<p>The 3 generic types that are used by the AsyncTask make it very flexible, as well.</p>
<p><strong>So, how do I use it?</strong></p>
<p>Using the AsyncTask, is even easier than implementing one.  All you do is call &#8220;execute()&#8221; on your task.</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">MyAsyncTask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>You don&#8217;t have to make any calls to the 4 steps mentioned above&#8230;calling &#8220;execute()&#8221; will do all of that for you.</p>
<p>I recommend waiting to execute your task until your view has been loaded.  That means, normally you can execute that task as early as in your &#8220;onResume()&#8221; callback.</p>
<p>However, you may have other dependencies, like a database connection or a service connection, that require you to wait until that connection is established.  In those cases, I recommend using a <a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html" >BroadcastReceiver </a>and executing your task once that receiver is called.</p>
<p>If you find yourself struggling with finding the right time to execute your task, or perhaps you have multiple tasks getting chained together, or maybe you have implemented some handlers to execute tasks (or vice versa), you should consider looking at one of the many <a href="http://developer.android.com/guide/topics/fundamentals/services.html" >Android Service</a> types.  I will cover services in the next post.</p>
<p>Android Thread Series:</p>
<ol>
<li><a title="Too many options for Android threads?  Let me help!" href="http://www.sep.com/mcterry/2011/07/28/too-many-options-for-android-threads-let-me-help/">Overview</a></li>
<li><a title="Android Handler, in a nutshell..." href="http://www.sep.com/mcterry/2011/08/05/android-handler-in-a-nutshell/" >Handlers</a></li>
<li><a title="Android AsyncTasks, for updating your UI" href="http://www.sep.com/mcterry/2012/03/11/android-asynctasks-for-updating-your-ui/" >AsyncTasks</a></li>
<li>Services and Messengers</li>
<li>Conclusion</li>
</ol>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/03/11/android-asynctasks-for-updating-your-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Which Is Worth More, Education or Skills?</title>
		<link>http://www.sep.com/mcterry/2012/03/10/which-is-worth-more-education-or-skills/</link>
		<comments>http://www.sep.com/mcterry/2012/03/10/which-is-worth-more-education-or-skills/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 04:53:34 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=434</guid>
		<description><![CDATA[In a previous post, I talked about what skills I look for in our new hires at Software Engineering Professionals. But what happens if you have all of those skills, but don&#8217;t have a formal education? When the question comes down to which matters most — skills or education — we have to break it [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous post, I talked about <a title="Skills that I Look for in a Software Engineer" href="http://www.sep.com/mcterry/2012/02/15/skills-that-i-look-for-in-a-software-engineer/" >what skills I look for</a> in our new hires at Software Engineering Professionals. But what happens if you have all of those skills, but don&#8217;t have a formal education?</p>
<p>When the question comes down to which matters most — skills or education — we have to break it down a bit more. It&#8217;s hard to downplay one or the other; obviously a balance is good.</p>
<p>We don&#8217;t specialize in one technology or one product here at <a title="My Company" href="http://www.sep.com/mcterry/my-company/" >Software Engineering Professionals</a>. In fact, I have already mentioned that <a title="Variety is not an option…" href="http://www.sep.com/mcterry/2011/03/11/variety-is-not-an-option/" >variety is not an option; it&#8217;s a requirement</a>. If you don&#8217;t have a good foundation for learning new things, it would be difficult to keep up with the variety at SEP.</p>
<p>In the book <a title="My Recommendations" href="http://www.sep.com/mcterry/my-recommendations/">Apprenticeship Patterns</a>, the author focuses a lot on how to &#8220;empty your cup&#8221; and learn new things.  This is where education plays a role.  Education is a great foundation for you to fall back on.  Most colleges/universities require you to take many classes that are not related to your core focus &#8211; software development.  I studied <a title="About Me" href="http://www.sep.com/mcterry/about/">Computer Engineering</a> in college, and I really only knew one programming-language before I started working here. But if I hadn&#8217;t pursued the education I did, it would have been harder for me to learn new things and understand the new technologies I&#8217;ve learned since joining SEP.</p>
<p><span id="more-434"></span></p>
<p>Formal education won&#8217;t get you everywhere, but it&#8217;s certainly a good basis for learning new things. There is a lot of professional maturing that happens once you enter into the workforce, but being in school to build that foundation and learning how to learn is the most important first step.</p>
<p>So in the matter of skills versus education, I say that both are important&#8230;but education comes in first.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/03/10/which-is-worth-more-education-or-skills/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to improve your entire team – Practice Positive…</title>
		<link>http://www.sep.com/mcterry/2012/03/07/how-to-improve-your-entire-team-practice-positive/</link>
		<comments>http://www.sep.com/mcterry/2012/03/07/how-to-improve-your-entire-team-practice-positive/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 03:25:55 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=385</guid>
		<description><![CDATA[I recently watched a video from TED Talks about happiness and productivity.  If you haven&#8217;t seen the video &#8220;The Happy Secret to Better Work&#8221;, by Shawn Achor, then take 13 minutes to watch it&#8230;I&#8217;ll wait. Okay, I hope you enjoyed the video.  That video inspired me to write this post.  For those of you that [...]]]></description>
			<content:encoded><![CDATA[<p>I recently watched a video from <a href="http://www.ted.com/" >TED Talks</a> about happiness and productivity.  If you haven&#8217;t seen the video <a href="http://www.ted.com/talks/shawn_achor_the_happy_secret_to_better_work.html" >&#8220;The Happy Secret to Better Work&#8221;, by Shawn Achor</a>, then take 13 minutes to watch it&#8230;I&#8217;ll wait.</p>
<p>Okay, I hope you enjoyed the video.  That video inspired me to write this post.  For those of you that know me, I&#8217;m an eternal optimist &#8211; I try to find the positive in everything.  For me, to learn that there is research that supports focusing on the positive is great.</p>
<p><strong>Re-live Positive Experiences<br />
</strong>Shawn recommends journaling about at least 1 positive experience each day, so that your brain can re-live those experiences.  According to Shawn&#8217;s research, your brain performs significantly better when you are being positive &#8211; you are 31% more productive.</p>
<p>Imagine if an entire team was sharing positive experiences, and the entire team was re-living each of those experiences.  This could drastically change the productivity of the entire team.  And by doing so, we can create ripples of positivity and productivity.</p>
<p><span id="more-385"></span></p>
<p><strong>Finding Positive<br />
</strong>If you have a lesson-learned that you would like to share, talk about it as if it is a fact (it is history, after all), and try to avoid stirring up unnecessary emotions from the past.  Instead, talk about what you learned, or how you overcame the issue.  It&#8217;s easier to find the positive when you focus on what you learned, instead of the problem.</p>
<p>Another approach is to try and &#8220;right-size&#8221; the problems.  <a href="http://www.huffingtonpost.com/mark-nepo/book-of-awakening_b_1127755.html" >Mark Nepo has a neat story</a> about right-sizing your problems - a handful of salt in a glass of water, the water tastes salty; whereas, a handful of salt in a lake, the water tastes fresh. When you right-size the problem, you realize that it isn&#8217;t the end of the world, and it is easier to find the positive.</p>
<p><strong>How to Practice Positive</strong><br />
Let&#8217;s take baby steps.  Start by talking about something positive that happened earlier that day, or the previous day, so that the entire team can re-live that positive experience.</p>
<p>If your team meets on a regular basis, <a href="http://www.sep.com/mcterry/2010/03/10/stand-up-meetings-are-more-popular-than-i-thought/" >like a stand-up meeting</a>, perhaps you can recommend that each person shares a positive experience.</p>
<p>I am going to channel &#8220;Amy-the-unicorn&#8221;, and start practicing positive&#8230;what about you?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/03/07/how-to-improve-your-entire-team-practice-positive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are Certifications Old News?</title>
		<link>http://www.sep.com/mcterry/2012/03/03/are-certifications-old-news/</link>
		<comments>http://www.sep.com/mcterry/2012/03/03/are-certifications-old-news/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 06:23:07 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=383</guid>
		<description><![CDATA[As people try to get recognized, certified, and prove their skills&#8230;it can still be difficult to convince your peers, potential employers, and fellow industry people that you can walk-the-walk. One way to show that you are capable in a certain skill-set is to get a certification.  Of course, there are plenty of discussions already about [...]]]></description>
			<content:encoded><![CDATA[<p>As people try to get recognized, certified, and prove their skills&#8230;it can still be difficult to convince your peers, potential employers, and fellow industry people that you can walk-the-walk.</p>
<p>One way to show that you are capable in a certain skill-set is to get a certification.  Of course, there are plenty of discussions already about the value of these certifications.  And besides, how do you <em>_really_ </em>prove that you have this certification?</p>
<p>Well, <a href="https://wiki.mozilla.org/Badges" >Mozilla&#8217;s solution</a> to this problem is similar to merit badges, but with a secure infrastructure around it.</p>
<blockquote><p>Learning today happens everywhere. But it&#8217;s often difficult to get recognition for skills and achievements that happen online or out of school.  Mozilla Open Badges helps solve that problem, making it easy for any organization to issue, manage and display digital badges across the web.</p></blockquote>
<p>However, will this catch on?  Can these badges be standardized?</p>
<p><span id="more-383"></span></p>
<p><strong>It’s already happening</strong><br />
Of course they can, especially in an industry with a long history of standardizing certifications. We already see this in the knowledge industry&#8230;we have had certifications as long as I can remember.</p>
<p>So the idea of a standardized approach for recognition isn&#8217;t new.  However, what <em>_is_ </em>new is that this type of infrastructure makes use of gamification to recognize, motivate, and award people.  Instead of simply rewarding you with a piece of paper, and sometimes adding some cool acronyms after your name, you can now display your badges wherever you want!</p>
<p>&lt;tangent&gt;<br />
For the record&#8230;gamification isn’t new either.  <a href="http://joeystrawn.com/category/gamification-3/" >Joey Strawn</a> has been talking about gamification for a while (and has lots of good articles about it, too).</p>
<p>Companies have been successfully using <a href="http://mygamification.com/2012/gamification-of-beer-friday/" >simple gamification techniques</a> in order to motivate customers to return to their shop/restaurant.  Just think of all those loyalty cards, stamps, and contests that your favorite restaurants have!</p>
<p>Also, you may recognize a website where <a href="http://www.codinghorror.com/blog/2011/10/the-gamification.html" >Joel and Jeff (from codinghoror) used gamification</a> to innovate the industry back in 2008 as well. *cough* Stack Overflow *cough*<br />
But let’s save gamification for a different blog post, at a different time, I have enough to talk about already here!<br />
&lt;/tangent&gt;</p>
<p><strong>Certificates are already a big deal</strong><br />
You can get CompTIA A+ certified for PC support. <a href="http://www.brainbench.com/" >IEEE offers Brainbench exams</a> for its members to earn certificates in a number of areas, from design and media to databases and programming languages. Microsoft Certification is another huge one&#8230;I&#8217;m lucky to be sitting right next to a <a href="http://myotherpants.com/" >Microsoft Certified Professional Developer</a> at work every day.</p>
<p>My point is&#8230;there are already plenty of examples of companies and organizations offering proof of knowledge, or a level of experience&#8230;and some of those certifications are pretty elite! (For the record, there aren&#8217;t many developers with the<a href="http://www.linkedin.com/groups?groupDashboard=&amp;gid=698427&amp;trk=anet_ug_anlytx" > MCPD certification</a>.)</p>
<p><strong>So why Merit Badges?</strong><br />
Merit badges are a likely next step for standardization. Instead of having a formalized certificate that most people file away and never show (except for a line on a résumé), you&#8217;d have an iconic, graphical merit badge that&#8217;s simple to display and also better visually communicates what you&#8217;ve accomplished. Show them on a visual résumé, or display them on a personal website. Maybe even LinkedIn could let users start including badges on their personal profiles (similar to the group icons already).  And heck, maybe even motivate people to keep learning!</p>
<p>How cool would that be?</p>
<p>Admittedly, standardization will take work.  Especially as the knowledge industry grows and changes. New certifications are already added rapidly as technology changes, so creating and certifying badges can probably be part of the same process. The important thing is that the association responsible for administering the certifications/badges also offers some kind of guarantee that if someone uses it, they actually do have that badge.</p>
<p>We will just have to see how Mozilla handles the &#8220;guaranteed&#8221; part of it.</p>
<p><strong>Differentiation is important</strong><br />
These badges could also help differentiate yourself from others.  Let&#8217;s face it, doesn&#8217;t everyone have Microsoft Office listed on their résumé?  Couldn&#8217;t we all join the same LinkedIn groups/associations?  These badges would be a way to differentiate.</p>
<p>I really like what Mozilla is doing with the badges.  I hope it catches on, and I really hope the badges can become the new standard.<br />
I hope it goes above a standard, and encourages all of us to continue learning!</p>
<p>What are you waiting for?  Head over to <a href="http://openbadges.org" >Open Badges</a> now, and earn some badges!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/03/03/are-certifications-old-news/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Recognizing Good People</title>
		<link>http://www.sep.com/crtippett/2012/03/02/on-recognizing-goodpeople/</link>
		<comments>http://www.sep.com/crtippett/2012/03/02/on-recognizing-goodpeople/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 22:09:00 +0000</pubDate>
		<dc:creator>crtippett</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/crtippett/?p=18</guid>
		<description><![CDATA[As a leader, recognizing good people for their work and effort is both the most important and most difficult things that you can do. I learned this during my time in the Army and have carried it through my life for the past ~16 years. As a leader you must earn the trust of those [...]]]></description>
			<content:encoded><![CDATA[<p>As a leader, recognizing good people for their work and effort is both the most important and most difficult things that you can do. I learned this during my time in the Army and have carried it through my life for the past ~16 years.</p>
<p>As a leader you must earn the trust of those who you entrust to do the day to day work. Trust must first be given before you can expect to receive trust in return. Gaining trust has a fairly simple formula:</p>
<ul>
<li>Let your actions speak      for themselves</li>
<li>Hold yourself to a      higher standard than you hold those who work for you to</li>
<li>Never ask them to do      anything that you wouldn&#8217;t do yourself</li>
<li>Nurture them</li>
<li>Give honest feedback</li>
<li>Reward them</li>
</ul>
<p>Rewarding your people starts with honest feedback. Congratulate them for a job well done. Words of praise go quite a long way. Rewarding your people, however, is an interesting double edged sword. Reward too much and you make it commonplace. Reward too little and they feel unappreciated.</p>
<p>I have struggled with rewards over the years. I expect a lot out of people who work for me. I hold them to high standards. Each and every person who works for me has met or exceeded my standards. They are some of the best people that I have ever had the honor of working with / for. With holding people to high standards, rewarding them becomes difficult. Even the amazing becomes commonplace and an expectation after a while.</p>
<p>When I returned from my hiatus in January I realized that I had a problem. It took me a while to see the root cause of the problem but the symptom was as plain as day:<em> I did not have a way to reward the people who worked for me</em>.  The problem, as I realized after a few weeks of working on the symptom, was that I now had a significant number of people working directly for me ~24.</p>
<p>As I worked to figure out the root cause of the problem I decided that I would address the symptom as a stopgap measure. The stopgap measure, which turned out to be the right answer, was to create a simple currency: Pieces of Charles™. (Not my choice on the name) They have a humorous design (see below) and aren’t really worth much other than the fact that they are a symbol of recognition. Recognition of greatness is a powerful thing.</p>
<p>I realized that I couldn’t reward people anymore because I could not see what they were doing to the same degree that I could before. I did not have that insight due to the sheer number of people that I was working with. So, I print-minted 70 of the Pieces of Charles™ and handed them out to the only people who really could see the day to day MOGs: the team leads. Pieces of Charles™ were to be given out as on-the-spot rewards for moments of greatness (MOGs).  I empowered the team leads to reward the extraordinary, and they have. I have also empowered the teams to let me know if there is someone going above and beyond so that I can recognize them as well. It has worked out surprisingly well.</p>
<p>Now, I know when people are doing great. I know the people who are exhibiting the behaviors we want to encourage. I know that my team leads are able to reward those who need it.</p>
<p>You may be curious as to what would warrant a Pieces of Charles™ and I will provide several instances where people have shined below but this is not an exhaustive list:</p>
<ul>
<li>Trevon Sutton – He has worked tirelessly on making the client better and raising the bar for testing in general at the client site. He has put in a significant number of extra hours as well as his own free time to this effort. He is one of the clients main go-to guys now for testing.</li>
<li>Trevon Sutton &amp; Chris Pierce – These gentlemen have created a testing framework which will help the client to handle internationalization issues for a product which already has several thousand tests written against it. The majority of this work was done on their own time.</li>
<li>Chris Pierce &amp; Allen Cummings – These gentlemen have worked incredibly long hours with the client to fix a broken network over the past two months. They have done this in addition to their regular work, resulting in long hours and difficult product deliveries for the team.</li>
<li>Jen Dillon – She has helped the client to improve their traceability from requirements to test. In this effort she presented her findings, defended her results, and provided a good path forward to members of management at the client which were several levels above where we normally step. I was in the meetings and the questions directed to her were extremely direct and at times callous. She acquitted herself well as both an engineer and as a SEP employee.</li>
</ul>
<p>Throughout all of this the teams have continued to do great and in fact may be doing a little bit better than before. The weather ahead looks good.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/crtippett/2012/03/02/on-recognizing-goodpeople/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skills that I Look for in a Software Engineer</title>
		<link>http://www.sep.com/mcterry/2012/02/15/skills-that-i-look-for-in-a-software-engineer/</link>
		<comments>http://www.sep.com/mcterry/2012/02/15/skills-that-i-look-for-in-a-software-engineer/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 05:02:49 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=378</guid>
		<description><![CDATA[I&#8217;ve been with Software Engineering Professionals for the past five years, starting right after I graduated from college. A few years ago I joined the recruiting team for SEP, and I&#8217;ve been focused mainly on recruiting for our engineering positions.  Recruiting has been busy again recently &#8211; career fairs, interviews, interns, etc.  In spirit of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been with<a href="http://www.sep.com" > Software Engineering Professionals</a> for the past five years, starting right after I graduated from college. A few years ago I joined the recruiting team for SEP, and I&#8217;ve been focused mainly on recruiting for our engineering positions.  Recruiting has been busy again recently &#8211; career fairs, interviews, interns, etc.  In spirit of the recent recruiting events, I wanted to write about what skills we look for in an engineer.</p>
<p>Like any recruiter, I focus my search first on people who have worked to earn their degrees in engineering, computer science, mathematics and other related fields. But holding the perfect degree isn&#8217;t a hard and fast rule. We also look for a good GPA and strong involvement in campus organizations, extracurricular activities and other things that make candidates more well-rounded.</p>
<p><strong>What is better than just a degree?</strong><br />
Better than just a degree, we look for passion. I know that sounds a little clichéd, but we don&#8217;t just say it to wear out the phrase!</p>
<p>What we look for above all things is someone who&#8217;s a <em>hobbyist</em>. I want to hire someone who loves the work they do and has pursued their passion outside their normal coursework. I want to see someone who&#8217;s contributed to an OpenSource project, created their own mobile app, turned out some product that they&#8217;re proud of and ready to spend a few minutes presenting to us to show us they&#8217;ve gone above and beyond.</p>
<p><strong>Bonus points – community involvement.</strong><br />
I want to see a candidate who&#8217;s spent time browsing topics and questions on Stack Exchange/Stack Overflow, provided good answers to other users&#8217; questions and earned a good reputation among members of those communities.</p>
<p>Simply doing well in classes isn&#8217;t enough anymore. Textbook-learning alone can be outdated, and technology progresses much more quickly than textbooks can be updated and printed.  You can get bonus points by being active in the software community.</p>
<p>I&#8217;m looking for people who are applying what they&#8217;ve learned in school and gone beyond their traditional education, people who would be programming and working with computers even if they didn&#8217;t make a career of it. We are hiring for passion!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/02/15/skills-that-i-look-for-in-a-software-engineer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>git – It’s Not So Scary After All — BrownBag</title>
		<link>http://www.sep.com/mcterry/2012/02/08/git-its-not-so-scary-after-all-brownbag/</link>
		<comments>http://www.sep.com/mcterry/2012/02/08/git-its-not-so-scary-after-all-brownbag/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 00:56:21 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=330</guid>
		<description><![CDATA[Well, better late than never, right? This is my slide-deck from a BrownBag @_swanson and I gave late last year. &#160; Recap of presentation: Lead with some common language, to get everyone on the same page Tried to draw analogies between git and TFS covered many of the features and actions that our team uses [...]]]></description>
			<content:encoded><![CDATA[<p>Well, better late than never, right? <img src='http://www.sep.com/mcterry/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>This is my slide-deck from a BrownBag <a href="https://twitter.com/_swanson" >@_swanson</a> and I gave late last year.</p>
<iframe src="https://docs.google.com/present/embed?id=dfwjwp28_27dhtt2sc4&autoStart=true&loop=true" frameborder="0" width="410" height="342"></iframe>
<p>&nbsp;</p>
<p><strong>Recap of presentation:</strong></p>
<ul>
<li>Lead with some common language, to get everyone on the same page</li>
<li>Tried to draw analogies between <a href="http://git-scm.com/" >git</a> and TFS
<ul>
<li>covered many of the features and actions that our team uses in git</li>
</ul>
</li>
<li>Talked about our team process
<ul>
<li>both local process and remote process</li>
</ul>
</li>
<li>Talked about how <a href="https://twitter.com/#!/Myotherpants/status/121981389720657922" >git saved our bacon</a></li>
<li>And of course, our great finale was a demo
<ul>
<li>demo of both CLI and <a href="http://www.sep.com/mcterry/2011/12/02/git-extensions-has-some-sweet-new-toys/" >GUI</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2012/02/08/git-its-not-so-scary-after-all-brownbag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 Benefits of Outsourcing Software Development</title>
		<link>http://www.sep.com/jsg/2012/01/17/5-benefits-of-outsourcing-software-development/</link>
		<comments>http://www.sep.com/jsg/2012/01/17/5-benefits-of-outsourcing-software-development/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 18:00:53 +0000</pubDate>
		<dc:creator>jsg</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jsg/?p=71</guid>
		<description><![CDATA[Outsourcing is the business practice where a company uses outside firms to do select projects and special work that might normally be performed within that company. Some examples of what might be outsourced (besides software development) include payroll processing, shipping and distribution, and accounting. You are essentially sending your work to be done by an [...]]]></description>
			<content:encoded><![CDATA[<p>Outsourcing is the business practice where a company uses outside firms to do select projects and special work that might normally be performed within that company. Some examples of what might be outsourced (besides software development) include payroll processing, shipping and distribution, and accounting. You are essentially sending your work to be done by an outside, third party entity. Here are five reasons to consider outsourcing for software product development.</p>
<h3>Finding the Right Resources</h3>
<p>This is all about bringing in the right combination of talent with the right type of skills when you need them. Many times, companies use outsourcing because it can fill in gaps where they are trying to get something done and they do not have the right resources or the right amount of resources (or the time and money to track them all down). Resources can be people or equipment.</p>
<h3>Energy/Leadership Conservation</h3>
<p>One reason outsourcing is superior to hiring contract employees is it conserves energy and leadership. When you are outsourcing with a good partner, being a leader should be one less thing that you are worried about. You can devote your energy to other needs. You should not have to manage it – the outsourcing partner provides most of the leadership and energy in managing a project. Not all of it, mind you, but a large chunk. Outsourcing takes the headache of insuring a project gets done and off of a manager’s plate.</p>
<h3>Protection of Focus</h3>
<p>It is very difficult to be top-of-class in more than one area, and very few can maintain two core competencies. When you are outsourcing, you can outsource to a partner whose core competency is software development. Those companies that try to do too many things really well don’t do anything well. A lot of larger companies can understand this from experience and often startups have to consider outsourcing. Startups can free up their focus by outsourcing non-essential functions. So many companies whose background is not software development are finding themselves deploying software products. It can be much more effective to work with an outsourcing partner than to add another core competency.</p>
<h3>Get Unstuck</h3>
<p>For many companies, there are a number of projects that are on the books, waiting to be finished or something they want to put in place; however, it seems as though it never gets done. When managers take time to actually sit down and look at the project, it is usually a combination of things that are blocking it from being completed.</p>
<p>Maybe the company does not have the leadership. Perhaps the company does not have the right resources. Or it may be that the project just is not the company’s primary focus. One of the primary benefits of outsourcing is that you can get things done that have been stuck in the queue for a while. </p>
<h3>Get Fast</h3>
<p>Many companies are used to churning out a project slowly – maybe once a year. This approach doesn’t cut it for the new fast-paced consumer markets developing. </p>
<p>We have found that even when a large organization has a software development capabilty, their teams were not designed to move fast and adapt quickly to change. Bringing in a specialty partner can cut cost and time to market significantly. </p>
<p>We like to encourage companies to consider the complexity, volatility and domain knowledge of a project when deciding whether to do it internally or not. Fast moving, complex and changing projects are often best done with an outsourcing partner. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jsg/2012/01/17/5-benefits-of-outsourcing-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Difficult conversation?  No worries, just remember – S.O.S.</title>
		<link>http://www.sep.com/mcterry/2011/12/15/difficult-conversation-no-worries-just-remember-s-o-s/</link>
		<comments>http://www.sep.com/mcterry/2011/12/15/difficult-conversation-no-worries-just-remember-s-o-s/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 03:14:31 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=334</guid>
		<description><![CDATA[Have you ever been in a situation where you had to have a difficult conversation with someone?  I imagine we all have.  It&#8217;s tough &#8211; you get deflated, you dread having any kind of interaction with the other person, and you can barely focus on anything else. Part of the reason why I used to [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever been in a situation where you had to have a difficult conversation with someone?  I imagine we all have.  It&#8217;s tough &#8211; you get deflated, you dread having any kind of interaction with the other person, and you can barely focus on anything else.</p>
<p>Part of the reason why I used to struggle so much was because I would basically wing it when I finally sat down with the other person.  And let me tell you, winging it was not the best approach.</p>
<p>Inspired by <a href="https://twitter.com/#!/ramanohri" >Raman Ohri</a> and <a href="http://www.sep.com/mcterry/2011/06/28/3q-book-review-persuasive-business-proposals/" >Tom Sant</a>, I wanted to share how I approach difficult conversations, now.</p>
<p>Having a difficult conversation can be hard.  (Duh.)  In order to organize your thoughts, it helps to have some structure. Without a structure to lean on, it is more difficult to have a healthy and constructive conversation.  Your intentions may get missed, or people may get hurt.  Ultimately, you may do more harm than good.</p>
<p>So when you’re in the difficult position of having a difficult conversation, remember this familiar little acronym &#8211; S.O.S. (Symptoms, Outcomes, Solutions).</p>
<h2>Symptoms</h2>
<p>Take a snapshot of today, and describe (from your point of view) what you see.  Keep it about you, and your point of view, though.  And try not to project a perceived behavior or motive onto the other person.</p>
<p>An example of projecting would be &#8220;You aren&#8217;t doing X&#8221;.  When the symptom is actually &#8220;I don&#8217;t know what the status of X is.&#8221;</p>
<h2>Outcomes</h2>
<p>Forecast a little.  Describe how you see things turning out if we don&#8217;t address the symptoms.<br />
Outcomes are helpful to paint a picture of what is not acceptable to you. They’re also helpful in exposing differences in context and perspective – maybe the bad outcome you fear isn’t actually a big deal or isn’t something anyone thought about. You won’t know until you have that conversation.</p>
<h2>Solutions</h2>
<p>No, you shouldn&#8217;t expect to come up with the solution on your own.  But you should think about <em>possible</em> solutions and offer them in an emotionally detached manner – “here are some things that might work, but I don’t know if they are the right solution”.  At the very least, try to get some of your <a href="http://www.sep.com/mcterry/2011/11/05/weapon-of-choice-assumptions/" >assumptions </a>validated.</p>
<p>Another &#8220;trick&#8221; is to write each of the Symptoms, Outcomes, and Solutions out in complete sentences.  By writing them down, you&#8217;re forcing yourself to put enough thought into it to have a discussion.  It has the added benefit to keep you on track during your discussion, should you get side-tracked.</p>
<p>So, when you are about to have a difficult conversation, just remember S.O.S.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/12/15/difficult-conversation-no-worries-just-remember-s-o-s/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Product Engineering is like road construction…</title>
		<link>http://www.sep.com/mcterry/2011/12/08/product-engineering-is-like-road-construction/</link>
		<comments>http://www.sep.com/mcterry/2011/12/08/product-engineering-is-like-road-construction/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 04:18:58 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=275</guid>
		<description><![CDATA[Product Engineering is like road construction.  You have to satisfy the utility.  The utility of a road is pretty straight forward &#8211; I have to be able to drive my car from point A, to point B, without causing significant damage to my vehicle. Utility is your table stake. Without utility, you don&#8217;t have a product worth [...]]]></description>
			<content:encoded><![CDATA[<p>Product Engineering is like road construction.  You have to satisfy the utility.  The utility of a road is pretty straight forward &#8211; I have to be able to drive my car from point A, to point B, without causing significant damage to my vehicle.</p>
<h2>Utility is your table stake.</h2>
<p>Without utility, you don&#8217;t have a product worth using.  In addition to utility, there are things like usability and aesthetics.  I&#8217;m not going to cover those in detail in this post.  However, both usability and aesthetics can be summed up into one word &#8211; desirable.</p>
<p>Imagine driving on a road with the below sign&#8230;<br />
<a href="http://www.sep.com/mcterry/files/2011/12/confusing_road.jpg"><img class="aligncenter size-medium wp-image-306" src="http://www.sep.com/mcterry/files/2011/12/confusing_road-300x224.jpg" alt="" width="300" height="224" /></a></p>
<p>&#8230;probably not your favorite interchange, right?  What if it was someone&#8217;s first time driving in this area?  Or worse, what if the driver was a teenager who recently got their driver&#8217;s license?  This would be a nightmare.</p>
<p>Imagine driving on a road like this&#8230;</p>
<p><a href="http://www.sep.com/mcterry/files/2011/12/potholes.jpg"><img class="aligncenter size-medium wp-image-307" src="http://www.sep.com/mcterry/files/2011/12/potholes-300x231.jpg" alt="" width="300" height="231" /></a></p>
<p>&#8230;this road _barely_ has utility, if you ask me.  While you could drive on this road, you would have to slow way down and dodge this rough patch.</p>
<p>While both of these roads have utility (they are both passable), neither road is desirable for most drivers.</p>
<p>This picture of potholes is a good reminder that you can&#8217;t construct a road and then forget about it either, you have to maintain it.  Quick-dry patches over a long period of time result in a less-desirable road.  Ultimately, your users will find a different route.</p>
<h2>Product engineering is no different.</h2>
<p>Ultimately, you have to build a road that people want to drive on.  It has to be desirable!  Meaning, you have to build a product that people _want_ to use.</p>
<p>For example, this is the recently renovated Keystone Ave. here in Carmel, IN&#8230;</p>
<p><a href="http://www.sep.com/mcterry/files/2011/12/keystone.jpg"><img class="aligncenter size-medium wp-image-310" src="http://www.sep.com/mcterry/files/2011/12/keystone-300x197.jpg" alt="" width="300" height="197" /></a></p>
<p>&#8230;this is my preferred road for many reasons.</p>
<p>Just as drivers choose roads for their daily commutes, users choose products for their daily uses.  Make sure you&#8217;re building a product that people would find desirable, in addition to your table stakes.</p>
<p>Ask yourself &#8211; Is your product desirable?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/12/08/product-engineering-is-like-road-construction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git Extensions has some sweet new toys…</title>
		<link>http://www.sep.com/mcterry/2011/12/02/git-extensions-has-some-sweet-new-toys/</link>
		<comments>http://www.sep.com/mcterry/2011/12/02/git-extensions-has-some-sweet-new-toys/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 03:52:43 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=294</guid>
		<description><![CDATA[I use Git Extensions on a daily basis.  It is a great git interface for a mouse-lover like myself. Well, it looks like Git Extensions grew some sweet new toys that take advantage of Windows 7. If you haven&#8217;t played around with some of the advanced features in Windows 7, I highly recommend it.  The JumpLists [...]]]></description>
			<content:encoded><![CDATA[<p>I use <a href="http://code.google.com/p/gitextensions/">Git Extensions</a> on a daily basis.  It is a great <a href="http://git-scm.com/" >git</a> interface for a mouse-lover like myself.</p>
<p>Well, it looks like Git Extensions grew some sweet new toys that take advantage of Windows 7.</p>
<p>If you haven&#8217;t played around with some of the advanced <a href="http://en.wikipedia.org/wiki/Features_new_to_Windows_7" >features in Windows 7</a>, I highly recommend it.  The <a href="http://windows.microsoft.com/en-US/windows7/products/features/jump-lists" >JumpLists</a> are probably my favorite new feature.  There are 2 different JumpLists that I use on a regular basis &#8211; in the Start Menu, and on the Taskbar.  They reduce context switching, and allow me to do activities quickly.</p>
<p>Here is a snapshot of using the JumpList in the Start Menu&#8230;</p>
<p><a href="http://www.sep.com/mcterry/files/2011/12/jumplist_startmenu.png"><img class="aligncenter size-medium wp-image-298" src="http://www.sep.com/mcterry/files/2011/12/jumplist_startmenu-246x300.png" alt="" width="246" height="300" /></a>&#8230;it allows you to jump directly to a recently used repository.  Very handy!</p>
<p>&nbsp;</p>
<p>Here is a snapshot of using the JumpList in the taskbar&#8230;</p>
<p><a href="http://www.sep.com/mcterry/files/2011/12/jumplist_taskbar.png"><img class="aligncenter size-full wp-image-299" src="http://www.sep.com/mcterry/files/2011/12/jumplist_taskbar.png" alt="" width="239" height="238" /></a>&#8230;it allows me to commit, pull, and push from the taskbar.  This is extra awesome because now I don&#8217;t actually have to pull up Git Extensions.  Instead, I just keep it minimized now, and even _more_ out of the way.</p>
<p>Do any tools you use regularly have some cool/awesome/fun features that integrate with your OS?  If so, what feature and how does it impact how you use the tool?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/12/02/git-extensions-has-some-sweet-new-toys/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“Overcoming Momentum” – laws of physics applied to software development…</title>
		<link>http://www.sep.com/mcterry/2011/11/20/overcoming-momentum-laws-of-physics-applied-to-software-development/</link>
		<comments>http://www.sep.com/mcterry/2011/11/20/overcoming-momentum-laws-of-physics-applied-to-software-development/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 01:56:10 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=256</guid>
		<description><![CDATA[Week #5 of the SEP Blog Battle. Read about it here. Follow us on twitter. Ever find yourself in a rut?  You just can&#8217;t crank anything notable out this week.  It&#8217;s so obvious that even your teammates start placing bets on the over/under of you meeting an estimate.  (No seriously, it&#8217;s _that_ obvious, and it is happening [...]]]></description>
			<content:encoded><![CDATA[<p>Week #5 of the SEP Blog Battle.</p>
<p>Read about it <a href="http://swanson.github.com/blog/2011/10/13/sep-blog-off.html" >here</a>.</p>
<p>Follow us on <a href="http://twitter.com/#!/search?q=%23sepblogbattle" >twitter</a>.</p>
<p>Ever find yourself in a rut?  You just can&#8217;t crank anything notable out this week.  It&#8217;s so obvious that even your teammates start placing bets on the over/under of you meeting an estimate.  (No seriously, it&#8217;s _that_ obvious, and it is happening right now, for me.)</p>
<p>Okay, maybe your team handles it differently than my team.  We&#8217;ve all been there, though &#8211; more refactoring than normal (sometimes all on the same blocks of code); less functional changes; and ultimately, less value added.</p>
<p>It sucks.  It&#8217;s a tough place to be, and you feel like you aren&#8217;t pulling your own weight on the team.</p>
<p>The longer you stay in your rut, the harder it is to get out.  These ruts are a dangerous place.  A rut can drain your energy and hinder your performance.  If you don&#8217;t find a way out of your rut in a timely manner, you can dig yourself so deep that it seems impossible to get out.  We&#8217;ve all heard it &#8211; &#8220;I&#8217;m stuck doing [blank], even though I&#8217;m not interested in [blank].&#8221;</p>
<p>So, to get out of your rut, you need to build up momentum.  Let&#8217;s look at what momentum is&#8230;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">p = m * v</div></div>
<p>Well, mass is negligible, right?  It&#8217;s the knowledge you&#8217;re dumping into your IDE, or the weight of the paper you&#8217;re doing some discovery on, or conversations/emails you&#8217;re having with other people.  Effectively, we are left with&#8230;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">p = 1 * v</div></div>
<p>With that, we know that velocity isn&#8217;t just your speed, or how fast you&#8217;re typing.  It is a vector&#8230;it has to have a direction.  If you aren&#8217;t moving in a direction towards the end goal, then you&#8217;re not moving forward.</p>
<p>This means that momentum, in our world, is essentially how well you can move towards your goal &#8211; whether your goal is developing a feature, fixing a bug, writing an email, or something else.</p>
<p>And according to the law of <a href="http://en.wikipedia.org/wiki/Momentum#Conservation_of_linear_momentum" >conservation of momentum</a>, once an object has momentum it will continue to have momentum.  Or in more laymen&#8217;s terms &#8211; once you get the ball rollin&#8217;, it&#8217;ll keep rollin&#8217;.  So to get the ball rolling, you have to continue making strides towards your end goal.  If you run into a road block, <a href="https://twitter.com/#!/_swanson/status/137600215388651520" >pivot</a> on what you&#8217;re doing, and try not to let that wall stop your momentum.</p>
<p>If you take into account<a href="http://en.wikipedia.org/wiki/Newton's_laws_of_motion" > Newton&#8217;s Third Law</a> of motion, each action has an equal and opposite reaction.  So if you find yourself running into road blocks, you have to change directions.  If you don&#8217;t constantly change directions with each road block, you&#8217;ll stop having velocity, and effectively stop having momentum.</p>
<p>So the key to overcoming challenges with momentum is to remember your laws of physics &#8211; pivot when you are presented with road blocks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/11/20/overcoming-momentum-laws-of-physics-applied-to-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“Weapon of Choice” – assumptions</title>
		<link>http://www.sep.com/mcterry/2011/11/05/weapon-of-choice-assumptions/</link>
		<comments>http://www.sep.com/mcterry/2011/11/05/weapon-of-choice-assumptions/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 03:03:32 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=250</guid>
		<description><![CDATA[Week #4 of the SEP Blog Battle. Read about it here. Follow us on twitter. My weapon of choice is an assumption. It&#8217;s so much more efficient for me to just assume I know what&#8217;s going on around me, and to move forward working with the assumptions I&#8217;ve made. Wait&#8230;are you still with me? Obviously that couldn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Week #4 of the SEP Blog Battle.</p>
<p>Read about it <a href="http://swanson.github.com/blog/2011/10/13/sep-blog-off.html" >here</a>.</p>
<p>Follow us on <a href="http://twitter.com/#!/search?q=%23sepblogbattle" >twitter</a>.</p>
<p>My weapon of choice is an assumption.  It&#8217;s so much more efficient for me to just assume I know what&#8217;s going on around me, and to move forward working with the assumptions I&#8217;ve made.</p>
<p>Wait&#8230;are you still with me?  Obviously that couldn&#8217;t be any farther from the truth.</p>
<p>Unfortunately, a common weapon I see people using is an assumption &#8211; and that&#8217;s a weapon that has the tendency to backfire.  It&#8217;s like playing roulette with a 6-shot that has 1 blank, and 5 live rounds.</p>
<p>Just the other day, my wife and I were out shopping. Normally I open the door for her, but this time there was something that made it awkward for me to open the door, so I just went around to my door.  As I unlocked the car, I noticed her make a face &#8211; and quickly I assumed she was upset about me not opening her door.  There was no reason for the false assumption.  In fact, after asking about the reaction, I found out that it was about a strange old man in a vehicle next to ours.  Someone looked like a donkey, and it wasn&#8217;t the strange old man.</p>
<p>Making assumptions can create turbulence, hurt feelings, and create unnecessary delays.  An unfortunate reality for us engineers is that we dive deep into our assumptions as well &#8211; which makes it even more of a problem.  Even as I&#8217;m writing this, I&#8217;m making assumptions about what the other <a href="http://swanson.github.com/" >SEP</a> <a href="http://jonfuller.posterous.com/" >Blog</a> <a href="http://myotherpants.com/" >Battle</a> <a href="http://snibble.github.com/" >bloggers</a> are going to write about.</p>
<p>Let me be clear, forward thinking is not a problem.  The problem is when you make an assumption and it becomes a live round in your game of roulette.  Here are 5 approaches that I use to turn those live rounds into blanks&#8230;</p>
<p>*do some homework and validate your assumptions before investing in those assumptions<br />
*force yourself to believe that people generally want the best for everyone<br />
*take a walk in their shoes, and ask yourself what you would do<br />
*ask questions and be curious &#8211; not doing so can put someone on the defensive<br />
*prepare for both extreme scenarios &#8211; best case, and worse case</p>
<p>And never forget that old assumptions adage&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/11/05/weapon-of-choice-assumptions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“Engineering – Over/Under” – evolution…</title>
		<link>http://www.sep.com/mcterry/2011/10/31/engineering-overunder-evolution/</link>
		<comments>http://www.sep.com/mcterry/2011/10/31/engineering-overunder-evolution/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 01:38:39 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=239</guid>
		<description><![CDATA[Week #3 of the SEP Blog Battle. Read about it here. Follow us on twitter. Many times, I&#8217;ve heard the cliche &#8211; perfect is the enemy of good enough.  I agree with this, for some definitions of the phrase &#8220;good enough&#8221;.  But that definition changes for me. How do _you_ define good enough?  My guess [...]]]></description>
			<content:encoded><![CDATA[<p>Week #3 of the SEP Blog Battle.</p>
<p>Read about it <a href="http://swanson.github.com/blog/2011/10/13/sep-blog-off.html" >here</a>.</p>
<p>Follow us on <a href="http://twitter.com/#!/search?q=%23sepblogbattle" >twitter</a>.</p>
<p>Many times, I&#8217;ve heard the cliche &#8211; perfect is the enemy of good enough.  I agree with this, for some definitions of the phrase &#8220;good enough&#8221;.  But that definition changes for me.</p>
<p>How do _you_ define good enough?  My guess is that it depends.  It likely depends on your current problem, project, client, or more.</p>
<p>While I agree that aiming for perfection isn&#8217;t ideal &#8211; it&#8217;s likely not efficient, it likely is over engineered for the current problem, and it is likely going to take more time than it needs to.  However, I don&#8217;t believe that we can define what &#8220;good enough&#8221; for the full product looks like on day 1.  The reality is, we aren&#8217;t going to build out 28 web services because we need to write 1 service to return a data set.  You can&#8217;t even plan what the perfect web services would look like.</p>
<p>This doesn&#8217;t mean that you can simply hack something together and effectively under-engineer a solution.  Instead, converge on what is &#8220;good enough&#8221; for your current, self-contained, problem.  While implementing your &#8220;good enough&#8221; solution, use good practices, be <a href="http://swanson.github.com/talks/heedful-programming/#4" >heedful</a>, and use <a href="http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)" >design principles</a>.</p>
<p>As you build this product, you will (hopefully) iterate often.  Each time you iterate, your definition of &#8220;good enough&#8221; will change.  Your design will evolve as you iterate.</p>
<p>Instead of taking bets on what is &#8220;good enough&#8221;, plan on evolving your design.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/10/31/engineering-overunder-evolution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“Get Better” – make it uncomfortable…</title>
		<link>http://www.sep.com/mcterry/2011/10/21/get-better-make-it-uncomfortable/</link>
		<comments>http://www.sep.com/mcterry/2011/10/21/get-better-make-it-uncomfortable/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 03:30:25 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=217</guid>
		<description><![CDATA[The SEP Blogoff challenge this week was to write about getting better.   I had to think a little about this.   I mean, there are some good reasons that come to mind immediately &#8211; career growth, introspective challenges, helping others.  While these are great reasons for me to get better, I&#8217;m still limited by my personal [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.sep.com/mcterry/2011/10/16/sep-blog-off/" >SEP Blogoff</a> challenge this week was to write about getting better.   I had to think a little about this.   I mean, there are some good reasons that come to mind immediately &#8211; career growth, introspective challenges, helping others.  While these are great reasons for me to get better, I&#8217;m still limited by my personal comfort zone.</p>
<p>As someone who was working solo for over a year, one of the biggest problems I ran into was the lack of external influence to get better.  Even with the reasons above to get better, I was comfortable with my own pace, and being comfortable means you aren&#8217;t growing.</p>
<p>Today, I&#8217;m fortunate to be on a great team!  Sure, sometimes being on a team is uncomfortable for me, especially when I feel like I&#8217;m light years behind.  It&#8217;s a big change from being on my own pace, to keeping up with an entire team.</p>
<p>I&#8217;ve learned that in order to get better, you have to get outside of your norm, and make it uncomfortable.  Pick up a new SCM tool and pound through it.  Go through some new <a href="http://swanson.github.com/blog/2011/10/17/webdev-katas.html" >Katas</a> for a development environment or language that you don&#8217;t know very well.  Practice <a href="http://codebetter.com/jefferypalermo/2008/02/11/pain-driven-development-uncovering-the-motivation/" >Pain-Driven-Development</a> to reduce pain points in your daily routine.  And spend some extra time helping solve problems that the team is having.</p>
<p>By practicing any of these and pushing my comfort zone, I continue to get better.  I make it uncomfortable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/10/21/get-better-make-it-uncomfortable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEP Blog Off…</title>
		<link>http://www.sep.com/mcterry/2011/10/16/sep-blog-off/</link>
		<comments>http://www.sep.com/mcterry/2011/10/16/sep-blog-off/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 04:05:45 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=221</guid>
		<description><![CDATA[So, a few of us here at SEP are having a friendly (yet competitive) blog off with the intention of getting in the habit of blogging. The prize is simple &#8211; bragging rights.  The competition is even more simple, because I&#8217;m going to win. You can read about it over here on @_swanson&#8217;s blog. During some [...]]]></description>
			<content:encoded><![CDATA[<p>So, a few of us here at SEP are having a friendly (yet competitive) blog off with the intention of getting in the habit of blogging. The prize is simple &#8211; bragging rights.  The competition is even more simple, because I&#8217;m going to win.</p>
<p>You can read about it over here on <a href="http://swanson.github.com/blog/2011/10/13/sep-blog-off.html" >@_swanson&#8217;s</a> blog.</p>
<p>During some discussions, the idea of adding in a weekly challenge came up as well.  So you&#8217;ll see all of us with the same title show up in a blog post, but the content will vary based on the blogger.</p>
<p>Blogs to follow during this competition:</p>
<ul>
<li><a href="http://swanson.github.com/" >swanson</a></li>
<li><a href="http://jonfuller.posterous.com/" >fuller</a></li>
<li><a href="http://www.sep.com/mcterry/2011/10/16/sep-blog-off/http//www.sep.com/mcterry/" >terry</a></li>
<li><a href="http://myotherpants.com/" >ball</a></li>
<li><a href="http://snibble.github.com/" >trimble</a></li>
<li>moseng (??)</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/10/16/sep-blog-off/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“The Applebee’s of software development” – we aren’t your neighborhood waiters</title>
		<link>http://www.sep.com/mcterry/2011/10/14/the-applebees-of-software-development-we-arent-your-neighborhood-waiters/</link>
		<comments>http://www.sep.com/mcterry/2011/10/14/the-applebees-of-software-development-we-arent-your-neighborhood-waiters/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 02:12:59 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=199</guid>
		<description><![CDATA[This phrase, &#8220;The Applebee&#8217;s of software development&#8221;, really rings home with me.  We are not waiters!  We are extremely bright and helpful problem solvers (who happen to be passionate about software).  With that being said though, we do know how to follow instructions.  But that&#8217;s not how you get the biggest bang for your buck with [...]]]></description>
			<content:encoded><![CDATA[<p>This phrase, &#8220;The Applebee&#8217;s of software development&#8221;, really rings home with me.  We are not waiters!  We are extremely bright and helpful problem solvers (who happen to be passionate about software).  With that being said though, we do know how to follow instructions.  But that&#8217;s not how you get the biggest bang for your buck with our crew.</p>
<p>The biggest challenge here is to recognize when you&#8217;re being asked to be a waiter.  The second challenge is how to not be a waiter.</p>
<p>If you find yourself only implementing what someone tells you to implement, you might be a waiter.  There is definitely a time where this is the right thing to do.  However, if you want to be more than a waiter, just remember that you are trying to help.  Find out what the goal is that is trying to be met, and help brainstorm ideas of how to achieve that goal.  As you diverge, keep as engaged as possible, and never judge the ideas that are being brought up.  As you converge on an idea, make compromises and remember to keep an open mind as you critique ideas as a team.</p>
<p>What you&#8217;ll find out is, as you earn respect and trust, you&#8217;ll be given more creative privileges, and you&#8217;ll be less of a waiter and more of  a doctor.</p>
<p>Just for the record, <a href="http://twitter.com/#!/jeffpatton/statuses/10178711763" >Jeff Patton agrees</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/10/14/the-applebees-of-software-development-we-arent-your-neighborhood-waiters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patterns for Getting Your Ideas Heard – BrownBag</title>
		<link>http://www.sep.com/mcterry/2011/10/13/patterns-for-getting-your-ideas-heard-brownbag/</link>
		<comments>http://www.sep.com/mcterry/2011/10/13/patterns-for-getting-your-ideas-heard-brownbag/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 03:58:03 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=143</guid>
		<description><![CDATA[Here at SEP, we have some pretty awesome engineer-led sessions&#8230;book clubs, academy courses, and brown bags (just to name a few).  Recently, I gave a brown bag on a topic that I am excited about &#8211; getting your ideas heard.  I wanted to give this brown bag for a few reasons I heard a common theme [...]]]></description>
			<content:encoded><![CDATA[<div>Here at SEP, we have some pretty awesome engineer-led sessions&#8230;book clubs, academy courses, and <a href="http://en.wikipedia.org/wiki/Brown_bag_seminar" >brown bags</a> (just to name a few).  Recently, I gave a brown bag on a topic that I am excited about &#8211; getting your ideas heard.  I wanted to give this brown bag for a few reasons</div>
<div>
<ul>
<li>I heard a common theme when talking with others around the company &#8211; &#8220;I wish they would have listened to me earlier&#8221;</li>
<li>And for some semi-selfish reasons &#8211; I felt like it was time to start contributing, I wanted to help create change, and I really wanted to help people learn</li>
</ul>
</div>
<div>Here is my slide-deck.  Note that it&#8217;s not nearly as useful without being at the brown bag, but I have a recap below and hopefully we can talk in more detail about it.  I&#8217;m not going to list the examples that I gave during the brown bag to support these patterns, so if you have questions post them and I will be happy to give more details or specific examples.</div>
<p><a href="http://www.slideshare.net/macterry/patterns-for-getting-your-ideas-heard">http://www.slideshare.net/macterry/patterns-for-getting-your-ideas-heard</a></p>
<p>&nbsp;</p>
<p><strong>What went well in the brown bag:</strong></p>
<p>The information, discussions following, and using my phone as a <a href="http://www.pptremotecontrol.com/" >PowerPoint remote</a> all went well.  I would definitely do this type of brown bag again!  I also really enjoyed being able to share something that I&#8217;m excited about.</p>
<p>&nbsp;</p>
<p><strong>What didn&#8217;t go so well:</strong></p>
<p>I didn&#8217;t engage everyone in the beginning, and I blitzed through the presentation.  In the future, I could definitely do a better job of asking questions up front, instead of waiting until the end.  And I need to practice leaving a small gap between my transitions to allow for others to have questions.  A 30 second gap might feel like an eternity, but the 5 second gaps I was leaving weren&#8217;t conducive to discussions.</p>
<p>&nbsp;</p>
<p><strong>Recap of presentation:</strong></p>
<p>I started off by listing 2 rules that make these patterns work &#8211; &#8220;be curious&#8221;, and something I like to sum up as &#8220;Happy Spouse = Happy House&#8221;.</p>
<p>Being curious means that you will  try to do the following things at all times when working with others:</p>
<ul>
<li>ask questions and/or restate the problem</li>
<li>don&#8217;t make any assumptions without confirming them</li>
<li>make sure you understand where the other person is coming from</li>
</ul>
<p>&#8220;Happy Spouse = Happy House&#8221; basically comes from the fact that human interactions are relationships, and in relationships you get what you give.  Consider the following when working with your &#8220;spouse&#8221; (peer, manager, client, etc.):</p>
<ul>
<li>pick your battles &#8211; don&#8217;t stand up against every &#8220;bad&#8221; idea, make sure it&#8217;s worth fighting for in the grand scheme</li>
<li>don&#8217;t become a downer that only points out flaws, you should also practice supporting good ideas as well</li>
<li>practice the principle of reciprocity &#8211; you get what you give</li>
<li>being a control freak isn&#8217;t automatically bad&#8230;it&#8217;s the out-of-control freaks that are bad</li>
</ul>
<p>After talking about the rules, I talked about 6 patterns that make up a recipe for success&#8230;for me.  These are patterns that I&#8217;ve leaned from seeing others in action, read about, or just developed from my own experiences.  I like to refer to these patterns as Jedi Mind Tricks&#8230;because they are that powerful in my daily life.</p>
<p><strong>It&#8217;s all about <del>me</del> users</strong></p>
<ul>
<li>Shift the focus off of MY ideas, and onto YOU, or the USERS, or the CUSTOMERS</li>
<li>By shifting the focus, arguments against the idea I&#8217;m bringing to the table have to be much stronger</li>
<li>Because you are talking about an idea, and not about roles/responsibilities of implementing an idea, it is not weasel-speak to remove the first person speech</li>
</ul>
<p><strong>Authority</strong></p>
<ul>
<li>If you are bringing ideas to the table, establish yourself as the figure of authority on that matter (even if you aren&#8217;t the &#8220;boss&#8221;)</li>
<li>Be confident, you want to be perceived as an expert of this matter</li>
<li>Remove the emotion &#8211; there is a fine line between having ownership and being emotionally attached</li>
<li>Be honest &#8211; it&#8217;s okay to say you don&#8217;t know, but let them know when you will know and follow through</li>
</ul>
<p><strong>Social Validation</strong></p>
<ul>
<li>It&#8217;s easy to adopt something that is already being used, or that people like</li>
<li>Use open source projects to confirm architectures, or designs</li>
<li>Refer to other projects (current or past) where something did or didn&#8217;t work</li>
<li>Reference professional studies and/or research that are applicable (I find myself referencing <a href="http://www.useit.com/" >Nielsen&#8217;s group</a> a lot)</li>
</ul>
<p><strong>Power of Because</strong></p>
<ul>
<li>The word &#8220;because&#8221; is the most powerful word in the English language, use it to your advantage</li>
<li>Our brains are wired to think in terms of cause and effect</li>
<li>Reduces fluff &#8211; adds concrete substance to an otherwise empty claim or opinion</li>
<li>Use this to accent goals or constraints</li>
</ul>
<p><strong>Lead the Blind</strong></p>
<ul>
<li>Ask questions you already know the answer to in order to guide them to come up with the idea themselves (and therefore makes it easier for them to buy into)</li>
<li>Ask questions that allow you to dig deeper and find out the root problem, higher goal, or something else entirely&#8230;which means we ultimately solve the correct problem.</li>
</ul>
<p><strong>Restate the Problem</strong></p>
<ul>
<li>If the other person knows that you understand their problem, then they are more likely to hear you and your ideas, instead of always trying to tell you their problem.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/10/13/patterns-for-getting-your-ideas-heard-brownbag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get a list of Months by Locale in Android…</title>
		<link>http://www.sep.com/mcterry/2011/10/05/get-a-list-of-months-by-locale-in-android/</link>
		<comments>http://www.sep.com/mcterry/2011/10/05/get-a-list-of-months-by-locale-in-android/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 19:43:10 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=183</guid>
		<description><![CDATA[I was working with a client trying to decide on long and short DateFormats for an international mobile application.  (Yes, that&#8217;s a mouthful.) &#160; I wasn&#8217;t able to quickly find any documentation on the Java SimpleDateFormat strings by locale&#8230;so I did what any Passionate Programmer would do, and I wrote a method to do it [...]]]></description>
			<content:encoded><![CDATA[<p>I was working with a client trying to decide on long and short DateFormats for an international mobile application.  (Yes, that&#8217;s a mouthful.)</p>
<p>&nbsp;</p>
<p>I wasn&#8217;t able to quickly find any documentation on the Java SimpleDateFormat strings by locale&#8230;so I did what any <a href="http://pragprog.com/book/cfcar2/the-passionate-programmer">Passionate Programmer</a> would do, and I wrote a method to do it for me.</p>
<p>&nbsp;</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://www.google.com/search?hl=en&amp;q=allinurl:outputstreamwriter+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">OutputStreamWriter</span></a> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:outputstreamwriter+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">OutputStreamWriter</span></a><span style="color: #009900;">&#40;</span>openFileOutput<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">&quot;months-by-locale.txt&quot;</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl:locale+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">Locale</span></a> l <span style="color: #339933;">:</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:locale+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">Locale</span></a>.<span style="color: #006633;">getAvailableLocales</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Locale = &quot;</span> <span style="color: #339933;">+</span> l.<span style="color: #006633;">getDisplayLanguage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;, &quot;</span> <span style="color: #339933;">+</span> l.<span style="color: #006633;">getDisplayCountry</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &nbsp; &nbsp;Long Months...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> months <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:dateformatsymbols+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">DateFormatSymbols</span></a><span style="color: #009900;">&#40;</span>l<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getMonths</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> m <span style="color: #339933;">:</span> months<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span> <span style="color: #339933;">+</span> m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &nbsp; &nbsp;Short Months...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> smonths <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:dateformatsymbols+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">DateFormatSymbols</span></a><span style="color: #009900;">&#40;</span>l<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getShortMonths</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl:string+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> m <span style="color: #339933;">:</span> smonths<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &nbsp; &nbsp; &nbsp; &nbsp;&quot;</span> <span style="color: #339933;">+</span> m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
out.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Then, I needed to get this file off of my emulator.  To do that, I opened the DDMS perspective, selected my emulator in the Devices tab (emulator-5554), and navigated to data\data\(applicaton name)\files\(file name).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/10/05/get-a-list-of-months-by-locale-in-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is your IT project portfolio feeling Bloated?</title>
		<link>http://www.sep.com/jsg/2011/08/29/is-your-it-project-portfolio-feeling-bloated/</link>
		<comments>http://www.sep.com/jsg/2011/08/29/is-your-it-project-portfolio-feeling-bloated/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 12:37:30 +0000</pubDate>
		<dc:creator>jsg</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jsg/?p=64</guid>
		<description><![CDATA[We all live in a world of scarce and limited development resources. (If you don&#8217;t call me.) At the same time the pressure to deliver more, and faster is increasing. We jam ideas into the pipeline looking for resources to perform and often the items all look the same. There is uncertainty. Everything gets back [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sep.com/jsg/files/2011/08/laxative-types.jpg"><img class="size-medium wp-image-65 alignright" src="http://www.sep.com/jsg/files/2011/08/laxative-types-234x300.jpg" alt="" width="187" height="240" /></a></p>
<p>We all live in a world of scarce and limited development resources. (If you don&#8217;t call me.) At the same time the pressure to deliver more, and faster is increasing.</p>
<p>We jam ideas into the pipeline looking for resources to perform and often the items all look the same. There is uncertainty. Everything gets back up. The portfolio is &#8220;bloated&#8221; and that&#8217;s exactly how it feels.</p>
<p>There is a lot we can do in the upfront planning and discovery phases to better use our resources.</p>
<p>We need something to digest smaller pieces and not have so much in the pipeline. We also like to have a little slack in the system so it&#8217;s not running at full capacity all the time.</p>
<p>SEP has a product envisioning practice that can help in these situations. It serves to break up and soften projects into more digestable pieces while also identifying items that shouldn&#8217;t be pursued in the first place. This creates value flow and slack.</p>
<p>How&#8217;s this for a marketing slogan:</p>
<blockquote>
<p style="text-align: center"><strong><em>SEP Envisioning &#8211; the laxative for Project Portfolios</em></strong>?</p>
</blockquote>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jsg/2011/08/29/is-your-it-project-portfolio-feeling-bloated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android Handler, in a nutshell…</title>
		<link>http://www.sep.com/mcterry/2011/08/05/android-handler-in-a-nutshell/</link>
		<comments>http://www.sep.com/mcterry/2011/08/05/android-handler-in-a-nutshell/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 14:36:10 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=137</guid>
		<description><![CDATA[The most basic way to handle multiple threads is to use the standard Java threads.  I won&#8217;t cover those in detail in this series; however, there are some good docs and examples online to help with those. By default, Android apps run solely in a single thread &#8211; the UI Thread.  For most applications, this [...]]]></description>
			<content:encoded><![CDATA[<p>The most basic way to handle multiple threads is to use the standard Java threads.  I won&#8217;t cover those in detail in this series; however, there are some good <a href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html" >docs</a> and <a href="http://www.vogella.de/articles/JavaConcurrency/article.html#threads" >examples</a> online to help with those.</p>
<p>By default, Android apps run solely in a single thread &#8211; the UI Thread.  For most applications, this is perfectly fine.  There are, however, some good reasons that your application needs to be multithreaded.  For example -</p>
<ul>
<li>lots of data access &#8211; reading/writing to a database is slow</li>
<li>download information from the internet &#8211; mobile networks can be spotty, or slow</li>
<li>sync with other components &#8211; for example, performing Bluetooth pairing or communicating with a service</li>
</ul>
<p>If you want your thread to be able to interact with the UI and still perform operations in the background, then you&#8217;ll need to use some Android specific classes.  The simplest form in Android is the <a href="http://developer.android.com/reference/android/os/Handler.html" >Handler</a>.  A Handler allows you to send/queue messages, execute <a href="http://developer.android.com/reference/java/lang/Runnable.html" >Runnable objects</a>, and even perform some fine grained scheduling.</p>
<p>One of the best uses for a Handler is for displaying progress.  When communicating progress via a dialog, or progress bar, or whatever, it is good to use a Handler because the user can still interact with your UI.  For example, if the user decides they don&#8217;t want to wait, they could press the back button.  Or, perhaps the operation you&#8217;re doing doesn&#8217;t require the user to wait, they can continue to use your app while information gets updated asynchronously.</p>
<p>Thinking of the G+, FB, or TweetDeck apps that try to backfill your stream&#8230;if those apps blocked your UI, and made you wait, you&#8217;d most likely never use those apps again.  Or worse, you might go as far as leaving negative feedback in the app store!</p>
<p style="padding-left: 30px"><strong>So, MaTT, how do we do this?</strong></p>
<p>The example below uses a Handler to set the progress on the UI.  So while the Thread is doing some lengthy operation (mProgressStatus = doWork();), the Handler is able to update the UI by calling the Post method, and setting the progress.</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">&lt;</span>pre<span style="color: #339933;">&gt;</span>         <span style="color: #666666; font-style: italic;">// Start lengthy operation in a background thread</span><br />
         <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:thread+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">Thread</span></a><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:runnable+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">Runnable</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
             <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
                 <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>mProgressStatus <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
                     mProgressStatus <span style="color: #339933;">=</span> doWork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
                     <span style="color: #666666; font-style: italic;">// Update the progress bar</span><br />
                     mHandler.<span style="color: #006633;">post</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl:runnable+java.sun.com&amp;btnI=I'm%20Feeling%20Lucky"><span style="color: #003399;">Runnable</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
                         <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
                             mProgress.<span style="color: #006633;">setProgress</span><span style="color: #009900;">&#40;</span>mProgressStatus<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
                         <span style="color: #009900;">&#125;</span><br />
                     <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
                 <span style="color: #009900;">&#125;</span><br />
             <span style="color: #009900;">&#125;</span><br />
         <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;/</span>pre<span style="color: #339933;">&gt;</span></div></div>
<p>The reason you NEED a Handler here, is because you can&#8217;t access the UI from the Thread object.  The Android UI toolkit is not threadsafe by default.  If you try to access the View to update it, there is a good chance you&#8217;ll get some amazing Null Reference exceptions.</p>
<p>Each Activity only needs one handler, so you can use that Handler for different tasks or for updating multiple UI components.</p>
<p style="padding-left: 30px"><strong>So, MaTT, when do we use this?</strong></p>
<p>This approach is great for simple, yet long, operations.  You are still able to show progress to your user and you don&#8217;t block the UI while it happens.  Using Handlers won&#8217;t give you 5 stars in the market, but it can help keep you from getting 1 star.  Handlers are ideal for one-off situations where you need to do something, but don&#8217;t want to interrupt the user.  The other beautiful part about using a Handler is, you don&#8217;t have to worry about creating some complex messaging architecture that takes a week to develop and test.</p>
<p>If you find yourself putting Handlers all over the place, consider using a more robust solution like AsyncTasks which I will cover in more detail in my next post.</p>
<p>&nbsp;</p>
<p>Android Thread Series:</p>
<ol>
<li><a title="Too many options for Android threads?  Let me help!" href="http://www.sep.com/mcterry/2011/07/28/too-many-options-for-android-threads-let-me-help/">Overview</a></li>
<li><a title="Android Handler, in a nutshell..." href="http://www.sep.com/mcterry/2011/08/05/android-handler-in-a-nutshell/" >Handlers</a></li>
<li>AsyncTasks</li>
<li>Services and Messengers</li>
<li>Conclusion</li>
</ol>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/08/05/android-handler-in-a-nutshell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Your Application Is Already Mobile</title>
		<link>http://www.sep.com/ohri/2011/05/25/your-application-is-already-mobile/</link>
		<comments>http://www.sep.com/ohri/2011/05/25/your-application-is-already-mobile/#comments</comments>
		<pubDate>Wed, 25 May 2011 15:19:31 +0000</pubDate>
		<dc:creator>Raman Ohri</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/ohri/2011/05/25/your-application-is-already-mobile/</guid>
		<description><![CDATA[We’ve been planning some mobile app dev with one of our clients for several months. This is basically extending two web-based systems we’ve developed for them to mobile devices. We discussed what functionality is useful to people in the mobile setting, security, what device and network to use, etc. Exciting stuff, and a scenario many [...]]]></description>
			<content:encoded><![CDATA[<p>We’ve been planning some mobile app dev with one of our clients for several months. This is basically extending two web-based systems we’ve developed for them to mobile devices. We discussed what functionality is useful to people in the mobile setting, security, what device and network to use, etc. Exciting stuff, and a scenario many people are involved in right now.</p>
<p>Along the way, we had a critical and (in hindsight, obvious) revelation: <em>these apps are already out there</em>. The applications you have in production are already available to mobile device users. Tablet web browsers are nearly on par with desktop browsers. VPN from a device is easy. 3G and WiFi coverage are excellent. You can put digital certificates on a device, so two factor authentication is no barrier. Even desktop apps can be accessed by a plethora of remote desktop technologies.</p>
<p>This turns the whole topic on its ear. Your app is already out there. Does it look the way you want? Is it accessible in physical locations that are security hazards? Is it frustrating users in new and terrible ways when they access it on their iPad or Galaxy Tab?</p>
<p>The news isn’t all bad – this is opportunity. In some cases, we may not need mobile apps at all, just some refinement of existing systems. Most importantly, <strong>we don’t have to build mobile apps to start learning what we can do with mobile</strong>. It’s time to re-evaluate your portfolio of unintentionally mobile applications!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/ohri/2011/05/25/your-application-is-already-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oh yeah … I had a blog</title>
		<link>http://www.sep.com/ohri/2011/05/25/oh-yeah-i-had-a-blog/</link>
		<comments>http://www.sep.com/ohri/2011/05/25/oh-yeah-i-had-a-blog/#comments</comments>
		<pubDate>Wed, 25 May 2011 15:15:58 +0000</pubDate>
		<dc:creator>Raman Ohri</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/ohri/2011/05/25/oh-yeah-i-had-a-blog/</guid>
		<description><![CDATA[For all (both) of you who actually read this thing, sorry. I found myself posting nothing but book reviews, and there much better sources for that kind of information than me. I’ve got a few articles queued up and will attempt to get back on the horse.
]]></description>
			<content:encoded><![CDATA[<p>For all (both) of you who actually read this thing, sorry. I found myself posting nothing but book reviews, and there much better sources for that kind of information than me. I’ve got a few articles queued up and will attempt to get back on the horse.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/ohri/2011/05/25/oh-yeah-i-had-a-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lean or Kanban Will Not Save Us From Ourselves</title>
		<link>http://www.sep.com/cmshinkle/2011/05/23/lean-or-kanban-will-not-save-us-from-ourselves/</link>
		<comments>http://www.sep.com/cmshinkle/2011/05/23/lean-or-kanban-will-not-save-us-from-ourselves/#comments</comments>
		<pubDate>Mon, 23 May 2011 09:20:20 +0000</pubDate>
		<dc:creator>cmshinkle</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/cmshinkle/?p=72</guid>
		<description><![CDATA[Lean or Kanban will not save us from ourselves.  By themselves, they will not prevent us from producing software that does not deliver value to the end customer. SEP has spent the better part of 20 years getting good at software development.  Throughout those 20 years, SEP has sought to improve or methods and processes. [...]]]></description>
			<content:encoded><![CDATA[<p>Lean or Kanban will not save us from ourselves.  By themselves, they will not prevent us from producing software that does not deliver value to the end customer.</p>
<p>SEP has spent the better part of 20 years getting good at software development.  Throughout those 20 years, SEP has sought to improve or methods and processes.  In 2004, we began using Agile practices.  In 2007, I introduced Kanban and eventually lean.  These practices helped us to become more predictable, more reliable, and produce higher quality software for less money.  Our customers will tell you that we are very good at what we do.  Even so, I feel there is more we can do to help our customers build great products.</p>
<p>All of these newly introduced practices did very little to ensure we were building the right product.  And, like the pizza delivery guy, on-time and predictable is great, but it&#8217;s what inside the box you care about.</p>
<p>So, over the last year and a half, SEP has spent considerable time considering this idea.  We feel that it&#8217;s imperative to not only build great software, but to help our clients ensure they are building the &#8220;right&#8221; product.</p>
<p>Over the next several blog posts, I am going to talk about the why, how, and what SEP is doing in this area of product design to specifically help our customers achieve greater success.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/cmshinkle/2011/05/23/lean-or-kanban-will-not-save-us-from-ourselves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Today Mt. Hood Was Stolen!</title>
		<link>http://www.sep.com/mcterry/2011/05/03/today-mt-hood-was-stolen/</link>
		<comments>http://www.sep.com/mcterry/2011/05/03/today-mt-hood-was-stolen/#comments</comments>
		<pubDate>Wed, 04 May 2011 03:56:06 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=106</guid>
		<description><![CDATA[Today is the day that I stopped thinking about doing something new, and started actually doing it.  I&#8217;m talking about Ruby on Rails. I wanted to learn something outside of my comfort zone (not too difficult for an embedded guy to get out of his ...]]></description>
			<content:encoded><![CDATA[Today is the day that I stopped thinking about doing something new, and started actually doing it.  I&#8217;m talking about Ruby on Rails. I wanted to learn something outside of my comfort zone (not too difficult for an embedded guy to get out of his comfort zone).  I tried to learn Ruby once before, but [...]]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/05/03/today-mt-hood-was-stolen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Variety is not an option…</title>
		<link>http://www.sep.com/mcterry/2011/03/11/variety-is-not-an-option/</link>
		<comments>http://www.sep.com/mcterry/2011/03/11/variety-is-not-an-option/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 14:11:47 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=88</guid>
		<description><![CDATA[Many times I hear that people want a variety, and that variety is a good thing.  With everything &#8211; food, work, exercise, hobbies, etc. It dawned on me this morning that in the past year at work, I&#8217;ve worked on an embedded C project, dabble...]]></description>
			<content:encoded><![CDATA[Many times I hear that people want a variety, and that variety is a good thing.  With everything &#8211; food, work, exercise, hobbies, etc. It dawned on me this morning that in the past year at work, I&#8217;ve worked on an embedded C project, dabbled in C# and .NET, done some LabView work, evaluated a [...]]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/03/11/variety-is-not-an-option/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How do you decide!?!</title>
		<link>http://www.sep.com/mcterry/2011/03/07/how-do-you-decide/</link>
		<comments>http://www.sep.com/mcterry/2011/03/07/how-do-you-decide/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 18:29:56 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=93</guid>
		<description><![CDATA[Lately I've found myself digging deeper into Heuristics. This is FASCINATING to me! I've been reading more and more about different ways that humans make decisions, and it continues to amaze me. ...]]></description>
			<content:encoded><![CDATA[Lately I've found myself digging deeper into Heuristics. This is FASCINATING to me! I've been reading more and more about different ways that humans make decisions, and it continues to amaze me. ...]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2011/03/07/how-do-you-decide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>writing user help – Madcap Flare</title>
		<link>http://www.sep.com/julie/2011/01/27/writing-user-help-madcap-flare/</link>
		<comments>http://www.sep.com/julie/2011/01/27/writing-user-help-madcap-flare/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 12:00:41 +0000</pubDate>
		<dc:creator>Julie Ohri</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/julie/?p=105</guid>
		<description><![CDATA[Flare is a single-source content authoring and publishing application.  I have used it quite a bit in the last two years to create the help documentation and online support for my current assignment. What Flare seems to do best is allow you to publish different views of the same document for various users.  For example, [...]]]></description>
			<content:encoded><![CDATA[<p>Flare is a single-source content authoring and publishing application.  I have used it quite a bit in the last two years to create the help documentation and online support for my current assignment.</p>
<p>What Flare seems to do best is allow you to publish different views of the same document for various users.  For example, my current application has three user levels; basic, intermediate and admin.  I can write the help for a particular web-page and annotate it with &#8216;admin only&#8217; tags to hide specific sections from the other user types.</p>
<p>It&#8217;s mostly simple to use.  The authoring interface is a lot like Microsoft Word.  It talks directly to Team System&#8217;s configuration management, so keeping the help up-to-date in source control is trivial, once set up.  I have used it to publish my help files to the web, to MS Word and to PDF format.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/julie/2011/01/27/writing-user-help-madcap-flare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>a shift in thinking?</title>
		<link>http://www.sep.com/julie/2011/01/18/a-shift-in-thinking/</link>
		<comments>http://www.sep.com/julie/2011/01/18/a-shift-in-thinking/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 22:36:02 +0000</pubDate>
		<dc:creator>Julie Ohri</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/julie/?p=102</guid>
		<description><![CDATA[Is it just me, or is there a lot more emphasis on usability lately?  Not just software, everything. My time is valuable, I don&#8217;t want to waste it with mouse-clicks.  I don&#8217;t want to waste it by pulling on a push-door.  I don&#8217;t want to waste it by spending 10 minutes figuring out which of [...]]]></description>
			<content:encoded><![CDATA[<p>Is it just me, or is there a lot more emphasis on usability lately?  Not just software, everything.</p>
<p>My time is valuable, I don&#8217;t want to waste it with mouse-clicks.  I don&#8217;t want to waste it by pulling on a push-door.  I don&#8217;t want to waste it by spending 10 minutes figuring out which of the 15 buttons on the stereo console in the car displays the odometer.  I think everybody is becoming more impatient with poorly thought-out designs.  This &#8211; I find thrilling.</p>
<p>Looking forward to a usable 2011.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/julie/2011/01/18/a-shift-in-thinking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Waste in the Development Process</title>
		<link>http://www.sep.com/jsg/2010/10/25/waste-in-the-development-process/</link>
		<comments>http://www.sep.com/jsg/2010/10/25/waste-in-the-development-process/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 14:42:24 +0000</pubDate>
		<dc:creator>jsg</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jsg/2010/10/25/waste-in-the-development-process/</guid>
		<description><![CDATA[To sum up everything posted previously. Doing these &#8220;discovery&#8221; or project planning properly we are really just applying Lean on a larger workflow. The people deciding what should do into a product development process are assisting in planning it is releases to the user base. The batch sizes are smaller and only what we know [...]]]></description>
			<content:encoded><![CDATA[<p>To sum up everything posted previously. Doing these &#8220;discovery&#8221; or project planning properly we are really just applying Lean on a larger workflow. </p>
<p>The people deciding what should do into a product development process are assisting in planning it is releases to the user base. The batch sizes are smaller and only what we know we need at that time. We work in input from the users and increment with a next version. </p>
<p>Incremental product development at a higher level.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jsg/2010/10/25/waste-in-the-development-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Run, Turkeys!</title>
		<link>http://www.sep.com/jonfuller/2010/09/20/run-turkeys/</link>
		<comments>http://www.sep.com/jonfuller/2010/09/20/run-turkeys/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 15:06:37 +0000</pubDate>
		<dc:creator>Jon Fuller</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/jonfuller/2010/09/20/run-turkeys/</guid>
		<description><![CDATA[A handful of SEP’s engineers and husbands, wives, children headed out last weekend for the treacherous trails of Turkey Run State Park. The first fork in the road… how many engineers does it take to stay on the right path? While we didn’t see any turkeys, we did meet a large-ish (to me) rat snake.&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>A handful of SEP’s engineers and husbands, wives, children headed out last weekend for the treacherous trails of <a href="http://www.turkeyrunstatepark.com/">Turkey Run State Park</a>.</p>
<p>The first fork in the road… how many engineers does it take to stay on the right path?</p>
<p><a href="http://www.sep.com/jonfuller/files/2010/09/IMAG0063.jpg"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="How many engineer&#39;s does it take?" src="http://www.sep.com/jonfuller/files/2010/09/IMAG0063_thumb.jpg" width="484" height="292" /></a></p>
<p>While we didn’t see any turkeys, we did meet a large-ish (to me) rat snake.&#160; He was probably 3 or 4 feet long.</p>
<p><a href="http://www.sep.com/jonfuller/files/2010/09/IMAG0068.jpg"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="IMAG0068" src="http://www.sep.com/jonfuller/files/2010/09/IMAG0068_thumb.jpg" width="244" height="165" /></a> </p>
<p>I had <a href="http://runkeeper.com">runkeeper</a> running while we were out there to track our hike (would we be a real group of nerds in the woods without at least one person tracking ourselves via GPS?)… here’s the results:    <br /><a href="http://runkeeper.com/user/jonfuller/activity/16692844">http://runkeeper.com/user/jonfuller/activity/16692844</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jonfuller/2010/09/20/run-turkeys/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuration settings for .NET class libraries (DLLs)</title>
		<link>http://www.sep.com/jyotsna/2010/09/05/configuration-settings-for-net-class-libraries-dlls/</link>
		<comments>http://www.sep.com/jyotsna/2010/09/05/configuration-settings-for-net-class-libraries-dlls/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 19:13:56 +0000</pubDate>
		<dc:creator>jyotsna</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jyotsna/2010/09/05/configuration-settings-for-net-class-libraries-dlls/</guid>
		<description><![CDATA[It is fairly easy to specify configuration settings for .NET executables, by adding an app.config file to the project, that is built into a .exe.config file in the executable folder.&#160; However, since libraries or DLLs do not run on their own, and rely on clients to execute, how does one specify different settings in different [...]]]></description>
			<content:encoded><![CDATA[<p>It is fairly easy to specify configuration settings for .NET executables, by adding an app.config file to the project, that is built into a .exe.config file in the executable folder.&#160; However, since libraries or DLLs do not run on their own, and rely on clients to execute, how does one specify different settings in different calling environments, especially if the library files are placed in a single location on the computer such as the global assembly cache? </p>
<p>Recently this question arose so many times in the projects that I have been working on that I decided to investigate the options more closely.&#160; I found that some subtleties of the approaches have not been explained anywhere, so decided to summarize the available options here.&#160; There appear to be four different ways to specify library settings, each with its own benefits and failings.</p>
<p><strong>1.</strong> The settings can be created in the class library by adding them to the ‘appSettings’ element of the app.config added to the library project (see figure).</p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image_thumb.png" width="644" height="147" /></a> </p>
</p>
<p>This is a very simple way of specifying settings, and can be accessed in the library code as shown below:</p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image1.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image_thumb1.png" width="644" height="66" /></a> </p>
</p>
<p>The drawback of this method is that every calling assembly has to duplicate this setting in its own app.config (compiled into a .exe.config or .dll.config), since that is the only place searched by the code above.&#160; The situation becomes cumbersome when the number of settings required by the library increases.</p>
<p><strong>2.</strong> The settings can be created in the class library as custom settings, by adding a settings file to the project (<a title="http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx" href="http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx">http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx</a>), and specifying the settings to be used in the Settings designer of Visual Studio (see below), </p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image20.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image20_thumb.png" width="644" height="250" /></a> </p>
<p>or by manually entering them in the custom section of app.config as shown below:</p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image3.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image_thumb3.png" width="644" height="262" /></a></p>
<p>Visual Studio conveniently generates a class to access the settings (see below):</p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image8.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image_thumb8.png" width="644" height="341" /></a> </p>
<p>The settings can be accessed in the library code as follows:</p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image5.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image_thumb5.png" width="644" height="59" /></a> </p>
<p>Once again, if the setting is to be provided by the calling assembly, it has to be included as a custom setting in the exact same format in the calling assembly’s .exe.config.&#160; This is fairly cumbersome as the number of settings increases.&#160; However, an advantage (or disadvantage) of this method is that the default value of the setting is compiled into the library code via the ‘DefaultSettingValueAttribute’ in the Visual Studio generated code (see above).&#160; Hence, if the calling assembly does not provide the setting, the default value is used.&#160; This appears desirable only in a test context, as in production code, the user has no way of knowing the default setting that was applied in the library unless explicitly specified in a document or config file supplied with the library files.</p>
<p><strong>3.</strong> A third way to provide the configuration settings for a library, is again via the ‘appSettings’ section of app.config, compiled into the library .dll.config.&#160; The difference here is that the library code used to retrieve the settings is as follows:</p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image6.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image_thumb6.png" width="644" height="125" /></a> </p>
</p>
<p>This code looks for the settings in the library .dll.config placed in the same folder as the library .dll.&#160; The advantage of this method is that the configuration settings need not be copied into the calling assembly’s app.config.&#160; It is sufficient to place the library’s .dll.config file provided with the library, in the same location as the library .dll file.&#160; The disadvantage is that the library files cannot be placed in a central location (if different settings are to be applied) or in the global assembly cache (GAC) to be used by several calling assemblies.</p>
<p><strong>4.</strong> A fourth way to provide the settings is to define them in a custom configuration file of any name, and retrieve them using the code shown below:</p>
<p><a href="http://www.sep.com/jyotsna/files/2010/09/image7.png"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="image" src="http://www.sep.com/jyotsna/files/2010/09/image_thumb7.png" width="644" height="148" /></a> </p>
<p>This code looks for the settings in the ‘appSettings’ element of the file called ‘custom.config’ in the calling assembly’s executable folder.&#160; The advantage here is that the library .dll can be placed in a central location or the GAC, and still use different settings based on the values specified in ‘custom.config’ placed in each calling assembly’s executable folder.&#160; Further, the settings do not need to be duplicated in the calling assembly’s own .exe.config or .dll.config.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jyotsna/2010/09/05/configuration-settings-for-net-class-libraries-dlls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversations in Outlook…</title>
		<link>http://www.sep.com/mcterry/2010/09/02/conversations-in-outlook/</link>
		<comments>http://www.sep.com/mcterry/2010/09/02/conversations-in-outlook/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 15:58:55 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/mcterry/2010/09/02/conversations-in-outlook/</guid>
		<description><![CDATA[If you&#8217;re anything like me, you probably get a TON of email each and every day. In addition, you probably get emails that span a conversation over multiple days. Well, Outlook 2010 has this amazing feature called, Conversations. This will transfo...]]></description>
			<content:encoded><![CDATA[If you&#8217;re anything like me, you probably get a TON of email each and every day. In addition, you probably get emails that span a conversation over multiple days. Well, Outlook 2010 has this amazing feature called, Conversations. This will transform your inbox to look/feel more like a threaded forum (or, more like your gmail [...]]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2010/09/02/conversations-in-outlook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Never implement INotifyPropertyChanged again</title>
		<link>http://www.sep.com/jonfuller/2010/08/27/never-implement-inotifypropertychanged-again-2/</link>
		<comments>http://www.sep.com/jonfuller/2010/08/27/never-implement-inotifypropertychanged-again-2/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 17:09:22 +0000</pubDate>
		<dc:creator>Jon Fuller</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/jonfuller/2010/08/27/never-implement-inotifypropertychanged-again-2/</guid>
		<description><![CDATA[I hate every time I am working on something and I have to implement INotifyPropertyChanged.&#160; My DRY-dey sense tingles.&#160; Not only am I forced to not use auto-properties (1st DRY violation), I’m forced to fire the event in each setter (2nd DRY violation), and specify the name of the property that is getting set, inside [...]]]></description>
			<content:encoded><![CDATA[<p>I hate every time I am working on something and I have to implement <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx">INotifyPropertyChanged</a>.&#160; My <em><a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a>-dey sense</em> tingles<em>.</em>&#160; Not only am I forced to not use auto-properties (1st DRY violation), I’m forced to fire the event in each setter (2nd DRY violation), and specify the name of the property that is getting set, inside of that property’s setter (3rd DRY violation).&#160; That much WET (read: not-DRY), for something so simple leaves me a little grumpy.</p>
<p>I’ve been on this <a href="http://jonfuller.codingtomusic.com/2008/12/08/static-reflection-inotifypropertychanged/">quest before</a>, to simplify this a bit, but it was still a little hackety, and limiting.</p>
<p>This time, I set out to do it right.</p>
<p>I’ll spare you most of the technical details, but it’s backed by <a href="http://castleproject.org/dynamicproxy/index.html">Castle’s DynamicProxy</a> project, and there’s some integration with <a href="http://structuremap.github.com/structuremap/index.html">StructureMap</a> to make it super easy, though you don’t really have to use <a href="http://structuremap.github.com/structuremap/index.html">StructureMap</a> if you don’t want to.&#160; [note:&#160; I’ll probably add more container support as I find time.&#160; If you have a specific need, let me know, or submit a patch.]</p>
<p>Here are the codez to show it in action:</p>
<h4></h4>
<h4>Basics</h4>
<h5>Using it for a class with an interface</h5>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #80ff00">// </span><span style="color: #00008b;font-weight: bold">note the attribute goes on the interface, not the class</span></p>
<p style="margin: 0px">[<span style="color: #64b1ff">AutoNotify</span>]</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">interface</span> <span style="color: #ff6fb7">IFoo</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">string</span> Value { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">Foo</span> : <span style="color: #ff6fb7">IFoo</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">string</span> Value { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<h5>Using it for a class</h5>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px">[<span style="color: #64b1ff">AutoNotify</span>(Fire <span style="color: silver">=</span> <span style="color: #d6adad">FireOptions</span><span style="color: silver">.</span>OnlyOnChange)]</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">Foo</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #80ff00">// </span><span style="color: #00008b;font-weight: bold">note for autonotify to work, the property must be virtual</span></p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span> Value { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<p>The previous example shows how to get the event to fire only when the value is different also.&#160; It defaults to always firing, whether the value changes or not.&#160; It’s also important to note that your properties need to be virtual so the calls to the setter can be intercepted.</p>
<h4>Dependent Properties</h4>
<p>Sometimes (usually) you’ve got calculated properties that need to fire the notified event too, these usually turn into WET mess as well.&#160; We’ve got the problem solved, and you’ve got a few different options, hopefully one of them suits you.</p>
<h5>Dependency Map – DependsOn</h5>
<p>You specify the type that defines the DependencyMap on the attribute, and then set up your dependencies in that type’s constructor.&#160; This style is somewhat influenced by the <a href="http://fluentnhibernate.org/">FluentNHibernate</a> API.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px">[<span style="color: #64b1ff">AutoNotify</span>(DependencyMap <span style="color: silver">=</span> <span style="color: #8ac5ff">typeof</span>(<span style="color: #64b1ff">ProjectDependency</span>))]</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">Project</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span> Name { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span>[] Files { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">int</span> FileCount { <span style="color: #8ac5ff">get</span> { <span style="color: #8ac5ff">return</span> Files<span style="color: silver">.</span>Length; } }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">ProjectDependency</span> : <span style="color: #64b1ff">DependencyMap</span><span style="color: silver">&lt;</span><span style="color: #64b1ff">Project</span><span style="color: silver">&gt;</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> ProjectDependency()</p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; Property(x <span style="color: silver">=&gt;</span> x<span style="color: silver">.</span>FileCount)<span style="color: silver">.</span>DependsOn(x <span style="color: silver">=&gt;</span> x<span style="color: silver">.</span>Files);</p>
<p style="margin: 0px">&#160;&#160;&#160; }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<h5>Dependency Map – Updates</h5>
<p>If you’d rather express your dependency the other way around, that’s fine too.&#160; The two are equivalent.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px">[<span style="color: #64b1ff">AutoNotify</span>(DependencyMap <span style="color: silver">=</span> <span style="color: #8ac5ff">typeof</span>(<span style="color: #64b1ff">ProjectDependency</span>))]</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">Project</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span> Name { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span>[] Files { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">int</span> FileCount { <span style="color: #8ac5ff">get</span> { <span style="color: #8ac5ff">return</span> Files<span style="color: silver">.</span>Length; } }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">ProjectDependency</span> : <span style="color: #64b1ff">DependencyMap</span><span style="color: silver">&lt;</span><span style="color: #64b1ff">Project</span><span style="color: silver">&gt;</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> ProjectDependency()</p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; Property(x <span style="color: silver">=&gt;</span> x<span style="color: silver">.</span>Files)<span style="color: silver">.</span>Updates(x <span style="color: silver">=&gt;</span> x<span style="color: silver">.</span>FileCount);</p>
<p style="margin: 0px">&#160;&#160;&#160; }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<h5>Dependency Map – UpdatesWith</h5>
<p>If you want to stick with an auto-property, and leave the calculated property logic somewhere else, you can hook it in via your dependency map too.&#160; This example, again, is equivalent to the previous two.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px">[<span style="color: #64b1ff">AutoNotify</span>(DependencyMap <span style="color: silver">=</span> <span style="color: #8ac5ff">typeof</span>(<span style="color: #64b1ff">ProjectDependency</span>))]</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">Project</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span> Name { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span>[] Files { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">int</span> FileCount { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">ProjectDependency</span> : <span style="color: #64b1ff">DependencyMap</span><span style="color: silver">&lt;</span><span style="color: #64b1ff">Project</span><span style="color: silver">&gt;</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> ProjectDependency()</p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; Property(x <span style="color: silver">=&gt;</span> x<span style="color: silver">.</span>Files)<span style="color: silver">.</span>Updates(x <span style="color: silver">=&gt;</span> x<span style="color: silver">.</span>FileCount)<span style="color: silver">.</span>With(p <span style="color: silver">=&gt;</span> p<span style="color: silver">.</span>Files<span style="color: silver">.</span>Length);</p>
<p style="margin: 0px">&#160;&#160;&#160; }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<h5>DependsOn Attribute</h5>
<p>If you don’t like any of those options and are looking for something a little more simple, maybe you’ll like this one.&#160; Just specify which things your property depends on in an attribute.&#160; You lose your 100% static typing help, but it’s more concise.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px">[<span style="color: #64b1ff">AutoNotify</span>]</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">Project</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span> Name { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">string</span>[] Files { <span style="color: #8ac5ff">get</span>; <span style="color: #8ac5ff">set</span>; }</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160; [<span style="color: #64b1ff">DependsOn</span>(<span style="color: #ff8040">&quot;Files&quot;</span>)]</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">virtual</span> <span style="color: #8ac5ff">int</span> FileCount { <span style="color: #8ac5ff">get</span> { <span style="color: #8ac5ff">return</span> Files<span style="color: silver">.</span>Length; } }</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<h4></h4>
<h4>Containers and otherwise</h4>
<h5>Hooking it into StructureMap</h5>
<p>There are a couple conventions you can use to hook into <a href="http://structuremap.github.com/structuremap/index.html">StructureMap</a>.&#160; There is the attribute convention (which is what you’re seeing above), and there is a generic predicate convention that you can use any predicate logic.&#160; Below you can see the attribute one getting hooked in.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> container <span style="color: silver">=</span> <span style="color: #8ac5ff">new</span> <span style="color: #64b1ff">Container</span>(config <span style="color: silver">=&gt;</span> config<span style="color: silver">.</span>Scan(scanConfig <span style="color: silver">=&gt;</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; scanConfig<span style="color: silver">.</span>With(<span style="color: #8ac5ff">new</span> <span style="color: #64b1ff">AutoNotifyAttrConvention</span>());</p>
<p style="margin: 0px">&#160;&#160;&#160; scanConfig<span style="color: silver">.</span>TheCallingAssembly();</p>
<p style="margin: 0px">&#160;&#160;&#160; scanConfig<span style="color: silver">.</span>WithDefaultConventions();</p>
<p style="margin: 0px">}));</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> project <span style="color: silver">=</span> container<span style="color: silver">.</span>GetInstance<span style="color: silver">&lt;</span><span style="color: #64b1ff">Project</span><span style="color: silver">&gt;</span>();</p>
</p></div>
<h5>Using it without StructureMap</h5>
<p>If you’re using another container, or no container at all, but want to use some other factory or something, you can do that too.&#160; This example is for something with an interface.&#160; It’s very similar to do the same for a concrete class… you just don’t instantiate the object first.&#160; You also have an opportunity to hook into the dependent property structure here as well with the DependencyMap parameter.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> foo <span style="color: silver">=</span> <span style="color: #8ac5ff">new</span> <span style="color: #64b1ff">Foo</span>();</p>
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> notifiableFoo <span style="color: silver">=</span> <span style="color: #64b1ff">Notifiable</span><span style="color: silver">.</span>MakeForInterface(</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">typeof</span>(<span style="color: #ff6fb7">IFoo</span>),</p>
<p style="margin: 0px">&#160;&#160;&#160; foo,</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #d6adad">FireOptions</span><span style="color: silver">.</span>Always,</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">new</span> <span style="color: #64b1ff">ProxyGenerator</span>(),</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #64b1ff">DependencyMap</span><span style="color: silver">.</span>Empty);</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #64b1ff">Assert</span><span style="color: silver">.</span>That(notifiableFoo <span style="color: #8ac5ff">is</span> <span style="color: #ff6fb7">INotifyPropertyChanged</span>);</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<h4>Whew, done</h4>
<p>So… that’s a lot of ‘how to’, but hopefully it’ll be somewhat complete introduction to get you working with it.&#160; I really don’t see much of any reason to ever implement INotifyPropertyChanged ever again (unless you are in an environment where you can’t use <a href="http://castleproject.org/dynamicproxy/index.html">DynamicProxy</a>).&#160; It can automatically be done for you from now on.</p>
<p>The code is up on <a href="http://github.com/jonfuller/structuremap-autonotify">github</a>, and there is a gem up on <a href="http://rubygems.org/gems/structuremap.autonotify">rubygems</a> if you’re using <a href="http://nu.wikispot.org/">nu</a> or <a href="http://mattonrails.wordpress.com/2010/08/11/noodle-0-1-0/">noodle+bundler</a>.&#160; Fork it, send me a patch, use it, send feedback, etc.&#160; I hope you love it!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jonfuller/2010/08/27/never-implement-inotifypropertychanged-again-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Story first, then design…</title>
		<link>http://www.sep.com/mcterry/2010/07/13/story-first-then-design/</link>
		<comments>http://www.sep.com/mcterry/2010/07/13/story-first-then-design/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 14:37:55 +0000</pubDate>
		<dc:creator>Matt Terry</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/mcterry/?p=84</guid>
		<description><![CDATA[I had my first opportunity to apply some of my recent training on discovery and usability.   I had a very short stint on an internal project, where I got the chance to perform some design work on a new calendar integration feature that was going to ...]]></description>
			<content:encoded><![CDATA[I had my first opportunity to apply some of my recent training on discovery and usability.   I had a very short stint on an internal project, where I got the chance to perform some design work on a new calendar integration feature that was going to be implemented.  The feature was so new, and so undefined, [...]]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/mcterry/2010/07/13/story-first-then-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Syntax highlighting for technical presentations</title>
		<link>http://www.sep.com/jonfuller/2010/06/29/syntax-highlighting-for-technical-presentations/</link>
		<comments>http://www.sep.com/jonfuller/2010/06/29/syntax-highlighting-for-technical-presentations/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 19:06:00 +0000</pubDate>
		<dc:creator>Jon Fuller</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/jonfuller/2010/06/29/syntax-highlighting-for-technical-presentations/</guid>
		<description><![CDATA[Ever wanted a quick/easy/automated way to get syntax highlighted code from your editor of choice into PowerPoint? EVERY time I do a technical presentation I need this.&#160; Usually I resort to taking a screenshot, or finding an “export to html” type plugin for the editor I’m using at the time (Visual Studio, Vim, IntelliJ IDEA, [...]]]></description>
			<content:encoded><![CDATA[<p>Ever wanted a quick/easy/automated way to get syntax highlighted code from your editor of choice into PowerPoint?</p>
<p>EVERY time I do a technical presentation I need this.&#160; Usually I resort to taking a screenshot, or finding an “export to html” type plugin for the editor I’m using at the time (Visual Studio, Vim, IntelliJ IDEA, etc.) and then try to get that somehow into my slides.</p>
<p>The problem I usually run into, is that while I like coding on a dark background with a 14pt font, that’s not usually that great for presentations.&#160; So I switch to my “presentation settings” that has a light background and bigger font size, and then switch back once I’m done taking screenshots or outputting to html. [ugh, what a pain… terribly manual].</p>
<p>Then what happens when I spot a bug in code that’s in PowerPoint, or I want to add a comment, or I need to change the syntax highlighting theme of the entire presentation because it doesn’t go well with the lighting in the room.&#160; UGH!&#160; What a disaster.</p>
<p>Basically, it’s always an uphill struggle, and it really bothered me… so I decided to fix it once and for all.</p>
<h3>Solution</h3>
<p>I’m going to solely discuss PowerPoint (for Windows or Mac) here.&#160; I don’t have a copy of iWork, and I’m too cheap to buy one.&#160; The reason I have Office for the Mac, is because I got it for free… KeyNote/Mac zealots: feel free to be zealous, but don’t hate on me because I’m frugal… unless you want to buy me a copy of iWork.</p>
<p>First, download: <a title="http://www.andre-simon.de/doku/highlight/en/highlight.html" href="http://www.andre-simon.de/doku/highlight/en/highlight.html">http://www.andre-simon.de/doku/highlight/en/highlight.html</a></p>
<h4>Windows Solution</h4>
<p>The highlight tool can output many formats, but the important one for Windows is RTF.</p>
<p>So something like:</p>
<p><font face="Lucida Console">highlight &lt; infile &gt; outfile –-rtf &#8211;syntax=rb&#160; &#8211;style=vim &#8211;font=”Lucida Console” &#8211;font-size=18</font></p>
<p>This will&#160; take the source code file ‘infile’ and syntax color it as Ruby to an RTF file and output it to ‘outfile’.&#160; The text will be 18pt Lucida Console and syntax highlighted with the “vim” color scheme.</p>
<p>There are lots of themes included, you can ask highlight for help (highlight &#8211;help), and it’ll tell you all the options available, as well as all the options available for output, and for languages that it supports.</p>
<p>Next, in PowerPoint, do “Insert Object” on your target slide, and choose “Create from file”.&#160; Make sure you check the “Link” checkbox before pressing OK.</p>
<p>Now, whenever your source changes, re-run your command line, then you can choose “Update Link” on your embedded object in PowerPoint, or if you close and then re-open PowerPoint, it’ll give you the option to update all your links.</p>
<h4>Mac Solution</h4>
<p>My version of PowerPoint for Mac doesn’t like being able to link to RTF files, but it does allow linking to images.</p>
<p>Highlight can output to SVG, but my PowerPoint doesn’t like that either.</p>
<p>Now download <a href="http://www.inkscape.org/">inkscape</a>, if you haven’t already.&#160; It will allow you to rasterize the SVG into a PNG, which PowerPoint does like.&#160; You can export your PNG from inkscape from the command line like this:</p>
<p><font face="Lucida Console">&lt;path to inkscape&gt; –export-png=&lt;png file&gt; &lt;svg file&gt;</font></p>
<p>The path to my inkscape command line runner is at:</p>
<p><font face="Lucida Console">/Applications/Inkscape.app/Contents/Resources/bin/inkscape</font></p>
<p>It turns out that inkscape doesn’t like external CSS files, which is what highlight gives you with your SVG, so you can merge your CSS file into your SVG file with a little script.&#160; The other cool bit about SVG, is you can tweak it, if you want, since it’s just XML.</p>
<p>Now, in PowerPoint, choose “Insert Picture” and browse to your newly generated PNG.&#160; Make sure the “Link to File” checkbox is checked.</p>
<p>I wrote a script to do this for the latest presentation I did on dependency injection.&#160; You can take a look at the script here [<a href="http://github.com/jonfuller/presentations/blob/master/dependencies/source.rb">source.rb</a>].&#160;&#160; It’s Ruby, and you can see where I merge the CSS and SVG files together, and where I mess with the line spacing as well (I wasn’t happy with the default line spacing, so I tweaked it to my preference).&#160; All the source/images/PowerPoint for that presentation are available here [<a href="http://github.com/jonfuller/presentations/tree/master/dependencies">dependencies presentation</a>] if you want to check them out to see how the whole process works.</p>
<p>Now, when I need to change the font and syntax theme throughout my entire presentation because it doesn’t match the lighting in the room, it’s super-simple: I change the configuration, re-run my script, update PowerPoint, and chill.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jonfuller/2010/06/29/syntax-highlighting-for-technical-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rocket Surgery really is easy</title>
		<link>http://www.sep.com/jonfuller/2010/06/24/rocket-surgery-really-is-easy/</link>
		<comments>http://www.sep.com/jonfuller/2010/06/24/rocket-surgery-really-is-easy/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 16:37:18 +0000</pubDate>
		<dc:creator>Jon Fuller</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/jonfuller/2010/06/24/rocket-surgery-really-is-easy/</guid>
		<description><![CDATA[I just finished reading Rocket Surgery Made Easy by Steve Krug (perhaps you know him from his other book Don’t Make Me Think).&#160; Here’s what I thought. What’s the point? Learn how to do usability testing yourself to gain most of the benefits of hiring someone to do it, and losing most of the negatives [...]]]></description>
			<content:encoded><![CDATA[<p>I just finished reading <a href="http://www.amazon.com/Rocket-Surgery-Made-Easy-Yourself/dp/0321657292/ref=pd_sim_b_1">Rocket Surgery Made Easy</a> by <a href="http://www.sensible.com/">Steve Krug</a> (perhaps you know him from his other book <a href="http://www.amazon.com/Think-Common-Sense-Approach-Usability/dp/0789723107">Don’t Make Me Think</a>).&#160; Here’s what I thought.</p>
<p><strong>What’s the point? </strong>Learn how to do usability testing yourself to gain most of the benefits of hiring someone to do it, and losing most of the negatives (e.g. Big Honkin’ Report, $$$).&#160; The book’s other motive is to make sure you start doing some kind of usability testing.&#160; ALL of our sites/applications have usability problems.&#160; We could eliminate the big ones just by spending a little time on it.</p>
<p><strong>How was it? </strong>A pretty quick read.&#160; I’m a slow reader, and I made it through it in a couple hours a night for 3 nights.&#160; This thing is a prescriptive manual for conducting usability tests on a product you have (or on your competitors products, if you’d like to do that).&#160; It covers recruiting participants all the way to fixing the problems they discover.&#160; Usability testing doesn’t need to be a big production, hard to do, or scary.&#160; He lays it out step by step and give you (as the guy running the tests) guidance each step along the way, complete with checklists and scripts (I know, that sounds hokey, but I think it’ll actually work).</p>
<p><strong>Who should read it? </strong>If you’re reading this, you probably ought to read the book.&#160; Realistically, anyone remotely interested in having a usable application and is actually partly responsible for said application (PM, Tech Lead, Dev, Designer, Marketing, Tech Writing, Tester, etc.).&#160; Even if you aren’t going to be the one running/moderating the tests, it’s good to know what the participant’s are going through, what the moderator is doing behind the scenes, and what your role is as an observer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jonfuller/2010/06/24/rocket-surgery-really-is-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review – The Toyota Way – Jeffrey Liker</title>
		<link>http://www.sep.com/crtippett/2010/06/14/book-review-the-toyota-way-jeffrey-liker/</link>
		<comments>http://www.sep.com/crtippett/2010/06/14/book-review-the-toyota-way-jeffrey-liker/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 13:49:38 +0000</pubDate>
		<dc:creator>crtippett</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/crtippett/2010/06/14/book-review-the-toyota-way-jeffrey-liker/</guid>
		<description><![CDATA[What’s the point? This book focuses on Toyota’s manufacturing process and the Lean attributes. The book takes you through the philosophy and the bare bones implementation of the production models and practices that make the Toyota Way sustainable in other companies. The interesting point of the book was that there were many companies claiming to [...]]]></description>
			<content:encoded><![CDATA[<p><b>What’s the point?</b> This book focuses on Toyota’s manufacturing process and the Lean attributes. The book takes you through the philosophy and the bare bones implementation of the production models and practices that make the Toyota Way sustainable in other companies. The interesting point of the book was that there were many companies claiming to have adopted the Toyota Way, seeing short term improvements but many of the adopters would “betray” the principles of the Toyota Way and would see a regression within 8-12 months.</p>
<p><b>How was it?</b> Originally I was hoping to find parallels that could be used during our software processes. The concepts presented in the book made sense for software at a nebulous level but the actual implementation proved to be very elusive. The book is a nice side note to be taken as a historical fact alongside software Lean processes but should not be used as a comparative basis in my opinion.</p>
<p><b></b></p>
<p><b>Who should read it?</b> People who want an idea where Lean came from and see how it can be applied to other industries. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/crtippett/2010/06/14/book-review-the-toyota-way-jeffrey-liker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review – Coaching for improved work performance – Ferdinand Fournies</title>
		<link>http://www.sep.com/crtippett/2010/06/14/book-review-coaching-for-improved-work-performance-ferdinand-fournies/</link>
		<comments>http://www.sep.com/crtippett/2010/06/14/book-review-coaching-for-improved-work-performance-ferdinand-fournies/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 13:39:49 +0000</pubDate>
		<dc:creator>crtippett</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/crtippett/2010/06/14/book-review-coaching-for-improved-work-performance-ferdinand-fournies/</guid>
		<description><![CDATA[What’s the point? This book focuses on the idea that you can get better performance out of employees through positive coaching. Rarely do negative actions result in anything other than fear and poor performance. The book gives techniques and tips for improving performance and tackling potential problems. Strategies are presented for dealing with employees that [...]]]></description>
			<content:encoded><![CDATA[<p><b>What’s the point?</b> This book focuses on the idea that you can get better performance out of employees through positive coaching. Rarely do negative actions result in anything other than fear and poor performance. The book gives techniques and tips for improving performance and tackling potential problems. Strategies are presented for dealing with employees that are not quite up to par. </p>
<p><b>How was it?</b> I thoroughly enjoyed the book. I thought that the insights presented and the strategies detailed in the book could be easily applied to my current position. The book provided several good ideas on how to approach the same problem, tailored to the individual.</p>
<p><b></b></p>
<p><b>Who should read it?</b> People who manage others, from LSE to EMs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/crtippett/2010/06/14/book-review-coaching-for-improved-work-performance-ferdinand-fournies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review – User Stories Applied For Agile Software Development – Mike Cohn</title>
		<link>http://www.sep.com/crtippett/2010/06/14/book-review-user-stories-applied-for-agile-software-development-mike-cohn/</link>
		<comments>http://www.sep.com/crtippett/2010/06/14/book-review-user-stories-applied-for-agile-software-development-mike-cohn/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 12:33:26 +0000</pubDate>
		<dc:creator>crtippett</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/crtippett/2010/06/14/book-review-user-stories-applied-for-agile-software-development-mike-cohn/</guid>
		<description><![CDATA[What’s the point? This book takes you through the formulation of user stories, from perspectives that should be considered (user, tester, manager, etc&#8230;) to some guidelines that should be applied (Is it testable, is it estimateable, etc&#8230;). The book shows how a team can use estimated user stories to determine releases and iterations. How was [...]]]></description>
			<content:encoded><![CDATA[<p><strong>What’s the point?</strong> This book takes you through the formulation of user stories, from perspectives that should be considered (user, tester, manager, etc&#8230;) to some guidelines that should be applied (Is it testable, is it estimateable, etc&#8230;). The book shows how a team can use estimated user stories to determine releases and iterations.</p>
<p><strong>How was it?</strong> I thought that the first quarter of the book was recap of things that I have picked up or used over the years but it would be a useful basis for someone unfamiliar with user stories and how to use them. What I found very useful was the explanation of how to use the user stories in iteration planning. I found that the book read faster and faster as I approached the three quarters mark and I read on until the conclusion.     <br /><strong></strong></p>
<p><strong>Who should read it?</strong> Anyone that would be writing user stories should read the first half. Anyone planning iterations and releases should read the entire thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/crtippett/2010/06/14/book-review-user-stories-applied-for-agile-software-development-mike-cohn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teaching StructureMap About C# 4.0 Optional Parameters and Default Values</title>
		<link>http://www.sep.com/jonfuller/2010/06/04/teaching-structuremap-about-c-4-0-optional-parameters-and-default-values/</link>
		<comments>http://www.sep.com/jonfuller/2010/06/04/teaching-structuremap-about-c-4-0-optional-parameters-and-default-values/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 14:35:00 +0000</pubDate>
		<dc:creator>Jon Fuller</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[SEP Engineering]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.sep.com/jonfuller/2010/06/04/teaching-structuremap-about-c-4-0-optional-parameters-and-default-values/</guid>
		<description><![CDATA[This week I ran into wanting to use C# 4.0 optional parameters, but wanted StructureMap (my IoC tool of choice) to respect the default value specified for those optional parameters. The Problem In this example, we’ll be pulling a command out of the container.&#160; The important part is the optional constructor parameter (level), and it’s [...]]]></description>
			<content:encoded><![CDATA[<p>This week I ran into wanting to use C# 4.0 optional parameters, but wanted <a href="http://structuremap.github.com/structuremap/index.html">StructureMap</a> (my IoC tool of choice) to respect the default value specified for those optional parameters.</p>
<h3>The Problem</h3>
<p>In this example, we’ll be pulling a command out of the container.&#160; The important part is the optional constructor parameter (<em>level</em>), and it’s default value (<em>Level.Info</em>).</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">LogCommand</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #ff6fb7">IDestination</span> _destination;</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #d6adad">Level</span> _level;</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> LogCommand(<span style="color: #ff6fb7">IDestination</span> destination, <span style="color: #d6adad">Level</span> level <span style="color: silver">=</span> <span style="color: #d6adad">Level</span><span style="color: silver">.</span>Info)</p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; _destination <span style="color: silver">=</span> destination;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; _level <span style="color: silver">=</span> level;</p>
<p style="margin: 0px">&#160;&#160;&#160; }</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #80ff00">/* logging code here */</span></p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<p>Here is your basic usage, but doesn’t work since StructureMap doesn’t know how to take advantage of the optional parameters with default values.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> container <span style="color: silver">=</span> <span style="color: #8ac5ff">new</span> <span style="color: #64b1ff">Container</span>(config <span style="color: silver">=&gt;</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; config<span style="color: silver">.</span>Scan(scanner <span style="color: silver">=&gt;</span></p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; scanner<span style="color: silver">.</span>TheCallingAssembly();</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; scanner<span style="color: silver">.</span>AddAllTypesOf<span style="color: silver">&lt;</span><span style="color: #ff6fb7">IDestination</span><span style="color: silver">&gt;</span>();</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; scanner<span style="color: silver">.</span>WithDefaultConventions();</p>
<p style="margin: 0px">&#160;&#160;&#160; });</p>
<p style="margin: 0px">});</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> logCommand <span style="color: silver">=</span> container<span style="color: silver">.</span>GetInstance<span style="color: silver">&lt;</span><span style="color: #64b1ff">LogCommand</span><span style="color: silver">&gt;</span>();</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<p>The last line results in an exception because StructureMap doesn’t know how to fill in the <em>level </em>parameter.</p>
<h3>The Solution</h3>
<p>We can solve this by adding a new convention.&#160; One that adds information about default constructor arguments.&#160; Here is the implementation of the convention:</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">class</span> <span style="color: #64b1ff">DefaultCtorParameterConvention</span> : <span style="color: #ff6fb7">IRegistrationConvention</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">void</span> Process(<span style="color: #64b1ff">Type</span> type, <span style="color: #64b1ff">Registry</span> registry)</p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">if</span>(type<span style="color: silver">.</span>IsAbstract <span style="color: silver">||</span> type<span style="color: silver">.</span>IsEnum)</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">return</span>;</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">var</span> ctor <span style="color: silver">=</span> type<span style="color: silver">.</span>GetGreediestCtor();</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">if</span>(<span style="color: silver">!</span>ctor<span style="color: silver">.</span>HasOptionalParameters())</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">return</span>;</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">var</span> inst <span style="color: silver">=</span> registry<span style="color: silver">.</span>For(type)<span style="color: silver">.</span>Use(type);</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">foreach</span>(<span style="color: #8ac5ff">var</span> param <span style="color: #8ac5ff">in</span> ctor<span style="color: silver">.</span>GetOptionalParameters())</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; inst<span style="color: silver">.</span>Child(param<span style="color: silver">.</span>Name)<span style="color: silver">.</span>Is(param<span style="color: silver">.</span>DefaultValue);</p>
<p style="margin: 0px">&#160;&#160;&#160; }</p>
<p style="margin: 0px">}</p>
</p></div>
<p>Note: <em>GetGreediestCtor</em>, <em>HasOptionalParameters</em>, and <em>GetOptionalParameters </em>are extension methods.&#160; We’ll see their implementation shortly.</p>
<p>The convention inherits from the <em>IRegistrationConvention</em>, which is how you implement new conventions in StructureMap.&#160; It has only one method: <em>Process</em>.&#160; We filter out types that are abstract, are enums, or have constructors that don’t have optional parameters.&#160; Once we realize we have a constructor we want to deal with, we use the <em>Child </em>method, that sets either a property or a constructor argument (for our case, it’ll always be a constructor argument), and then we set it’s value to the parameter’s default value, as provided by the <em>ParameterInfo </em>object, for each optional parameter.</p>
<h4></h4>
<h4>Minor Details</h4>
<p>Curious about the implementation of <em>GetGreediestCtor </em>or the <em>*OptionalParameters </em>methods?&#160; If not, skip this section.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">static</span> <span style="color: #8ac5ff">bool</span> HasOptionalParameters(<span style="color: #8ac5ff">this</span> <span style="color: #64b1ff">ConstructorInfo</span> ctor)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">return</span> ctor<span style="color: silver">.</span>GetOptionalParameters()<span style="color: silver">.</span>Any();</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">static</span> <span style="color: #ff6fb7">IEnumerable</span><span style="color: silver">&lt;</span><span style="color: #64b1ff">ParameterInfo</span><span style="color: silver">&gt;</span> GetOptionalParameters(</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">this</span> <span style="color: #64b1ff">ConstructorInfo</span> ctor)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">return</span> ctor<span style="color: silver">.</span>GetParameters()<span style="color: silver">.</span>Where(</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; param <span style="color: silver">=&gt;</span> param<span style="color: silver">.</span>Attributes<span style="color: silver">.</span>HasFlag(<span style="color: #d6adad">ParameterAttributes</span><span style="color: silver">.</span>Optional));</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">static</span> <span style="color: #64b1ff">ConstructorInfo</span> GetGreediestCtor(<span style="color: #8ac5ff">this</span> <span style="color: #64b1ff">Type</span> target)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">return</span> target<span style="color: silver">.</span>GetConstructors()</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: silver">.</span>WithMax(ctor <span style="color: silver">=&gt;</span> ctor<span style="color: silver">.</span>GetParameters()<span style="color: silver">.</span>Length);</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">public</span> <span style="color: #8ac5ff">static</span> T WithMax<span style="color: silver">&lt;</span>T<span style="color: silver">&gt;</span>(<span style="color: #8ac5ff">this</span> <span style="color: #ff6fb7">IEnumerable</span><span style="color: silver">&lt;</span>T<span style="color: silver">&gt;</span> target, <span style="color: #ffaeff">Func</span><span style="color: silver">&lt;</span>T, <span style="color: #8ac5ff">int</span><span style="color: silver">&gt;</span> selector)</p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">int</span> max <span style="color: silver">=</span> <span style="color: silver">-</span><span style="color: #ffff80">1</span>;</p>
<p style="margin: 0px">&#160;&#160;&#160; T currentMax <span style="color: silver">=</span> <span style="color: #8ac5ff">default</span>(T);</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">foreach</span>(<span style="color: #8ac5ff">var</span> item <span style="color: #8ac5ff">in</span> target)</p>
<p style="margin: 0px">&#160;&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">var</span> current <span style="color: silver">=</span> selector(item);</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">if</span>(current <span style="color: silver">&lt;=</span> max)</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #8ac5ff">continue</span>;</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; max <span style="color: silver">=</span> current;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentMax <span style="color: silver">=</span> item;</p>
<p style="margin: 0px">&#160;&#160;&#160; }</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: #8ac5ff">return</span> currentMax;</p>
<p style="margin: 0px">}</p>
<p style="margin: 0px">&#160; </p>
</p></div>
<h3>The Usage</h3>
<p>Here’s how to use your new convention.</p>
<div style="font-family: consolas;background: #101010;color: white;font-size: 10pt">
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> container <span style="color: silver">=</span> <span style="color: #8ac5ff">new</span> <span style="color: #64b1ff">Container</span>(config <span style="color: silver">=&gt;</span></p>
<p style="margin: 0px">{</p>
<p style="margin: 0px">&#160;&#160; config<span style="color: silver">.</span>Scan(scanner <span style="color: silver">=&gt;</span></p>
<p style="margin: 0px">&#160;&#160; {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160; scanner<span style="color: silver">.</span>TheCallingAssembly();</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160; scanner<span style="color: silver">.</span>AddAllTypesOf<span style="color: silver">&lt;</span><span style="color: #ff6fb7">IDestination</span><span style="color: silver">&gt;</span>();</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160; scanner<span style="color: silver">.</span>WithDefaultConventions();</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160; scanner<span style="color: silver">.</span>Convention<span style="color: silver">&lt;</span><span style="color: #64b1ff">DefaultCtorParameterConvention</span><span style="color: silver">&gt;</span>();</p>
<p style="margin: 0px">&#160;&#160; });</p>
<p style="margin: 0px">});</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: #8ac5ff">var</span> logCommand <span style="color: silver">=</span> container<span style="color: silver">.</span>GetInstance<span style="color: silver">&lt;</span><span style="color: #64b1ff">LogCommand</span><span style="color: silver">&gt;</span>();</p>
<p style="margin: 0px">&#160;</p>
</p></div>
<p>Now, when we pull the <em>LogCommand </em>out of the container, the <em>level </em>parameter gets defaulted to <em>Level.Info</em>, just like we specified in the constructor.&#160; Sweet!</p>
<h3></h3>
<h3>Conclusion</h3>
<p>This implementation is somewhat limiting, but the version I have in my <a href="http://github.com/jonfuller/StructureMapOptionalParams">github repo</a> is a little more open and configurable.&#160; It allows you to customize the instance key/name you use when registering your type, and also allows you to do additional, non-standard registrations if you need to.</p>
<p>Also, this doesn’t work if you’ve selected a constructor using the <em>SelectConstructor </em>config API from StructureMap, I’m not sure how to tap into that facility to look for that constructor rather than the greediest.</p>
<p>Am I missing something?&#160; Did something not make sense?&#160; Leave me a note!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jonfuller/2010/06/04/teaching-structuremap-about-c-4-0-optional-parameters-and-default-values/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Club: ProGit</title>
		<link>http://www.sep.com/jonfuller/2010/05/28/book-club-progit/</link>
		<comments>http://www.sep.com/jonfuller/2010/05/28/book-club-progit/#comments</comments>
		<pubDate>Fri, 28 May 2010 14:41:30 +0000</pubDate>
		<dc:creator>Jon Fuller</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/jonfuller/2010/05/28/book-club-progit/</guid>
		<description><![CDATA[Book Club Foreword A couple years ago I brought up the idea of doing a book club here at SEP because I had participated in a couple before coming to SEP, but we called them SEDG (coined by Steve McConnell in Professional Software Development).&#160; I don’t really like that term, so we called it book [...]]]></description>
			<content:encoded><![CDATA[<h4>Book Club Foreword</h4>
<p>A couple years ago I brought up the idea of doing a book club here at SEP because I had participated in a couple <a href="http://jonfuller.codingtomusic.com/2008/05/16/why-i-quit-my-job/">before coming to SEP</a>, but we called them SEDG (coined by Steve McConnell in <a href="http://www.amazon.com/Professional-Software-Development-Schedules-Successful/dp/0321193679/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275054384&amp;sr=1-1">Professional Software Development</a>).&#160; I don’t really like that term, so we called it book club instead.</p>
<p>We start up a new round a couple times a year, and small groups (3-8) break off and read different books (normally technical) that are interesting to them.&#160; We normally get together for an hour once a week to discuss/debate the chapter(s) we read for that week.&#160; I’ve participated in several including <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275055151&amp;sr=1-1">DDD (Evans)</a>, <a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275055177&amp;sr=1-1">Code Complete 2 (McConnell)</a>, <a href="http://www.amazon.com/Programming-Clojure-Pragmatic-Programmers-Halloway/dp/1934356336/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275055194&amp;sr=1-1">Programming Clojure (Halloway)</a>, and now <a href="http://www.amazon.com/Pro-Git-Scott-Chacon/dp/1430218339/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1275055217&amp;sr=1-1">Pro Git (Chacon)</a>.&#160; It’s a lot of fun, and I always learn a lot about the content of the book, and about the people I participate with.</p>
<p>I’d highly recommend starting one at your company, or in your community, it’s a great way to connect with people and learn new things at the same time.</p>
<h4>The Book</h4>
<p>First off, the book is available for free, online at <a href="http://progit.org/">progit.org</a>.&#160; It’s also hosted in a repository on <a href="http://github.com/progit">github</a>, and there is an easy script to get it onto your kindle (with a little hacking of the script), so that was a win for me: <em>free </em>AND <em>kindle-ized</em>.</p>
<p>I participated with Matt (<a href="http://twitter.com/spraints">@spraints</a>) and Todd (<a href="http://twitter.com/snibble">@snibble</a>) (both of which know more about git than I do… Matt wrote <a href="http://github.com/spraints/git-tfs">git-tfs</a>, and Todd is working with git on a REAL project).</p>
<p>I’ll follow <a href="http://www.sep.com/ohri/2010/04/09/3q-book-review-linchpin/">Raman’s Recipe</a> to keep this short and simple.&#160; I’ll also mix-in the book club aspect to each section.</p>
<p><strong>What’s the point?&#160; </strong>Become a git ninja (or at least be able to play one <strike>on TV</strike> at work).&#160; Learn how to use git effectively, and give you the tools (ideas, knowledge, know-how) to give you a framework on how to effectively use it in your context.&#160; The cool thing about git, is that it gets out of your way and lets you work the way you and your team want to… not the other way around like SVN, TFS, P4, etc.&#160; It was also a great way to leech off of Matt and Todd’s knowledge.</p>
<p><strong>How was it?&#160; </strong>Great.&#160; Scott (author) certainly knows how to git down (I’ll be here all week <img src='http://www.sep.com/jonfuller/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).&#160; I feel comfortable participating on a project that uses git (hey look, I am already!), and also feel comfortable making recommendations about using git (e.g. “You should use git!”), though, I do still get lost in hairy situations every once in awhile (thanks Matt for always saving me!).&#160; We had some good discussions on how it relates to us as company, and how we might use it.&#160; We also had some good discussions on schoolin’ me, so that was always good.&#160; The book contains lots of examples, with corresponding diagrams to help n00bs like myself understand what’s going on.</p>
<p><strong>Who should read it?&#160; </strong>Any developer planning on staying a developer for the next few years.&#160; DVCS seems to be on an up-tick, and I don’t really see it going away anytime soon (but hey, what do I know?).&#160; I don’t think you’ll be able to get by effectively in a DVCS world unless you’ve done at least some reading on the subject.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jonfuller/2010/05/28/book-club-progit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IndyTechFest Recap</title>
		<link>http://www.sep.com/jonfuller/2010/05/26/indytechfest-recap/</link>
		<comments>http://www.sep.com/jonfuller/2010/05/26/indytechfest-recap/#comments</comments>
		<pubDate>Wed, 26 May 2010 13:50:15 +0000</pubDate>
		<dc:creator>Jon Fuller</dc:creator>
				<category><![CDATA[SEP Engineering]]></category>

		<guid isPermaLink="false">http://www.sep.com/jonfuller/2010/05/26/indytechfest-recap/</guid>
		<description><![CDATA[IndyTechFest is teh awesome! I was privileged enough to be a speaker alongside some other ridiculously awesome regional speakers (and even had a few of them IN my presentation!)… star struck having @dburton, @timwingfield, @skimedic, and other community leaders like @myotherpants and @maggielongshore in the audience.&#160; I am truly humbled.&#160; Thanks to the organizers for [...]]]></description>
			<content:encoded><![CDATA[<p>IndyTechFest is teh awesome!</p>
<p>I was privileged enough to be a speaker alongside some other ridiculously awesome regional speakers (and even had a few of them IN my presentation!)… star struck having <a href="http://www.twitter.com/dburton">@dburton</a>, <a href="http://www.twitter.com/timwingfield">@timwingfield</a>, <a href="http://www.twitter.com/skimedic">@skimedic</a>, and other community leaders like <a href="http://www.twitter.com/myotherpants">@myotherpants</a> and <a href="http://www.twitter.com/maggielongshore">@maggielongshore</a> in the audience.&#160; I am truly humbled.&#160; Thanks to the organizers for allowing me to practice my teaching, and thanks to those that sat through my talk for supporting me (and also, thanks for the positive feedback from those I talked to afterwards!).&#160; [Side note: If you want to see my slides:&#160; <a title="http://github.com/jonfuller/presentations/tree/master/mongo/" href="http://github.com/jonfuller/presentations/tree/master/mongo/">http://github.com/jonfuller/presentations/tree/master/mongo/</a>]</p>
<p>The best part, however, had nothing do with any presentation at the event.&#160; It had to do with the amazing conversations we had in the <a href="http://en.wikipedia.org/wiki/Open_Space_Technology">Open Spaces</a> area hosted by <a href="http://www.twitter.com/alanstevens">@alanstevens</a>.&#160; I hung out there ALL day (except for when I was presenting), and got more out of any one open space topic than I have at entire conferences before.</p>
<p>We talked about Ruby on Rails, IronRuby, Public Speaking, Technical Speaking, Running a User Group, Linchpins, Alt.Net, Software Craftsmanship, DVCS (hg and git specifically)…    </p>
<p>I’ll pause and let that list of topics sink in.&#160; For me, that list is like a holy grail of a developer conference.</p>
<p>Most of this was deep discussion about the topic at hand by some great minds/leaders in the area.&#160; All of the aforementioned folks plus <a href="http://www.twitter.com/jayharris">@jayharris</a>, <a href="http://www.twitter.com/alanbarber">@alanbarber</a>, <a href="http://www.twitter.com/jademason">@jademason</a>, <a href="http://www.twitter.com/garrinmf">@garrinmf</a><a href="http://www.twitter.com/arktronic">,@arktronic</a>, <a href="http://www.twitter.com/browniepoints">@browniepoints</a> were together having these conversations, and it was really exciting (at least for me) hanging out with these guys and learning so much from them.</p>
<p>For me, this year, IndyTechFest was about the people and the interactions I had with them.&#160; What was it for you?</p>
<p>I can’t wait for next year.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jonfuller/2010/05/26/indytechfest-recap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cool Resource for Software Engineers</title>
		<link>http://www.sep.com/ohri/2010/05/26/cool-resource-for-software-engineers/</link>
		<comments>http://www.sep.com/ohri/2010/05/26/cool-resource-for-software-engineers/#comments</comments>
		<pubDate>Wed, 26 May 2010 13:27:04 +0000</pubDate>
		<dc:creator>Raman Ohri</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/ohri/2010/05/26/cool-resource-for-software-engineers/</guid>
		<description><![CDATA[Last year we got rid of our traditional annual review system and replaced it with sensible component parts (career guidance, skill assessments, etc.) It would take several posts to explain the reasoning and mechanics, so just trust me when I say it was a Good Thing &#8482;. One of the replacement systems is “one-on-ones”, a [...]]]></description>
			<content:encoded><![CDATA[<p>Last year we got rid of our traditional annual review system and replaced it with sensible component parts (career guidance, skill assessments, etc.) It would take several posts to explain the reasoning and mechanics, so just trust me when I say it was a Good Thing &#8482;. </p>
<p>One of the replacement systems is “one-on-ones”, a peer feedback mechanism. Periodically, everyone in the company is expected to reach out to a peer who has good visibility to their work and (hopefully) more experience to get some candid feedback. No form, no manager (unless that’s who you ask), no reporting other than the fact that it happened.</p>
<p>We published some good topics for one-on-one discussion on our internal HR sharepoint site, but they are largely focused on the softer stuff, not much on actual engineering. Then we ran across this <a href="http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm">Programmer Competency Matrix</a>. If you’re a software engineer, take a look … it’s a fantastic resource for self-evaluation and guidance. We haven’t formally incorporated it into our systems, but we’re exploring it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/ohri/2010/05/26/cool-resource-for-software-engineers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Community: 2 Conferences Compared</title>
		<link>http://www.sep.com/jsg/2010/05/14/community-2-conferences-compared/</link>
		<comments>http://www.sep.com/jsg/2010/05/14/community-2-conferences-compared/#comments</comments>
		<pubDate>Fri, 14 May 2010 14:09:00 +0000</pubDate>
		<dc:creator>jsg</dc:creator>
		
		<guid isPermaLink="false">http://www.sep.com/jsg/2010/05/14/community-2-conferences-compared/</guid>
		<description><![CDATA[It’s surprising how fast things are changing especially, in the development of electronic and online communities. What first looked like some teenage fad with Facebook and Myspace social media sites has definitely changed the way companies do business. The power of communities was strongly evident in the feel of two conferences I attended within a [...]]]></description>
			<content:encoded><![CDATA[<p>It’s surprising how fast things are changing especially, in the development of electronic and online communities. What first looked like some teenage fad with Facebook and Myspace social media sites has definitely changed the way companies do business.</p>
<p>The power of communities was strongly evident in the feel of two conferences I attended within a three-week period. The first was the <a href="http://atlanta2010.leanssc.org/" >Lean Software and Systems Conference</a> and the other <a href="http://www.bio.org/" >BIO</a> Chicago. </p>
<p>LSSC is a newer conference formed in the middle of this community trend. I told <a href="http://www.agilemanagement.net/" >David Anderson</a> the conference chair that LSSC is a response to an existing community almost like people said, “Hey, let’s get together.” It’s a big open forum to some extent. Many of the attendees already knew each others’ work from blogs, articles and presentations. LSSC even has its rock stars. You put people together and they talk content. It’s organic.</p>
<p>I’m hoping LSSC can continue this way. As it grows it seems like growing the conference through the community and strongly encouraging attendees to participate will help keep the feel.</p>
<p>BIO is older and there really isn’t anything wrong with it. It’s like most conferences, trying to quickly catch up with this “social media trend”. They provide tools and forums to attendees encouraging people to connect. The conference feel was much more scripted. People were there to “do business”, not exchange ideas. </p>
<p>These conferences, very clearly represent the Old and New Ways. In social media it is not ok to Push. It’s instead about supporting the community and helping it advance – a many to many relationship. When people come to LSSC pushing their products and services too much it’s like having bad breath. The old way was all about pushing – one to many, and has little room for community. </p>
<p>Like businesses, professional and trade groups are struggling to change. The truth is though it’s difficult to build communities intentionally and when you want to. They defy control. To some extent they just develop around common cause and interest. Communities are living organisms that grow organically. All we can do is connect and encourage.</p>
<p>SEP has been all about “building a place” since we started in 1988. We use the word <strong>Culture</strong> a lot and our vision uses <strong>Environment</strong>. Lately, it feels like we should replace all these words with <strong>Community</strong>. That feels like a much better word. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sep.com/jsg/2010/05/14/community-2-conferences-compared/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

