<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Derik Whittaker : Featured</title><link>http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx</link><description>Tags: Featured</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Removing words like Convince, Convert and Persuade from our vocabulary</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/11/04/removing-words-like-convince-convert-and-persuade-from-our-vocabulary.aspx</link><pubDate>Tue, 04 Nov 2008 11:26:22 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42882</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=42882</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=42882</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/11/04/removing-words-like-convince-convert-and-persuade-from-our-vocabulary.aspx#comments</comments><description>&lt;p&gt;One of the common&amp;nbsp;themes of this years KaizenConf was how to move a towards being a lean organization.&amp;nbsp; During most of the sessions and conversations that I was part I cannot tell you how often I heard words like Convince, Convert and Persuade said.&amp;nbsp; At first I had nothing against these words, but the more I thought about I know feel that we need to remove those words from our vocabulary when talking about moving a team or organization from one thing to another (in context of these conversations it is towards being lean).&lt;/p&gt; &lt;p&gt;Using terms like Convince and Convert has the feeling that &amp;#39;I am right and you are wrong&amp;#39;.&amp;nbsp; Even if you are not using terms like Convince and Convert in your dialog with people, I am going to guess that you have that as your goal, or your end game.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I am here to suggest that we as a community need to change our focus from Convincing towards Demonstrating.&amp;nbsp; By changing our angle and our position to be more neutral and soft I feel we can archive our goal of bringing change easier and with less friction.&amp;nbsp; It is like that old saying &amp;#39;you can catch more fly&amp;#39;s with honey than vinegar.&lt;/p&gt; &lt;p&gt;Lets take a look at the subtle differences between Convincing and Demostrating.&lt;/p&gt; &lt;p&gt;When we are trying to Convince someone of something many times we give off the following vibes.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;That your way is wrong, and our is right  &lt;li&gt;That we are better and more knowledgeable  &lt;li&gt;That we are preaching&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;All of above tend to put people on the definsive and if someone is on the definsive they are less likely to be open minded and less likey to want to try to understand what it is you are trying to say.&lt;/p&gt; &lt;p&gt;When we are trying to demostrate something to someone we give off the following vibes.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Heartflet attempt to share knowledge  &lt;li&gt;Cooperation  &lt;li&gt;Alternative to, not a replacement for their way of doing something  &lt;li&gt;Sincere intrest in helping them.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;When you speak to someone with the above vibe, you are essentally telling them that I have&amp;nbsp;an idea and I think that my idea can help you out.&amp;nbsp; If you attack it from this angle&amp;nbsp;you&amp;nbsp;may be surprised by the level of reception you can receive.&lt;/p&gt; &lt;p&gt;Remember, convincing someone is never easy, but demostrating alternatives and allowing them to make their own decision can be.&lt;/p&gt; &lt;p&gt;Keep up the good fight and happy demostrating.&lt;/p&gt; &lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42882" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Methodology/default.aspx">Methodology</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>Should not be 'The Business', but should be 'Our Business'</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/07/10/should-not-be-the-business-but-should-be-our-business.aspx</link><pubDate>Thu, 10 Jul 2008 14:06:14 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41251</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=41251</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=41251</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/07/10/should-not-be-the-business-but-should-be-our-business.aspx#comments</comments><description>&lt;p&gt;Last night I was listening to a recent &lt;a href="http://www.hanselminutes.com" target="_blank"&gt;HanselMinutes&lt;/a&gt; pod casts where he was talking with &lt;a href="http://www.hanselminutes.com/default.aspx?showID=136" target="_blank"&gt;Tom &amp;amp; Mary Poppendiek&lt;/a&gt;.&amp;#160; For those of you who do not know who Tom &amp;amp; Mary are, they are the 2 behind a lot of the lean software movement (books &lt;a href="http://www.amazon.com/Lean-Software-Development-Agile-Toolkit/dp/0321150783/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1215698116&amp;amp;sr=8-2" target="_blank"&gt;here&lt;/a&gt; &amp;amp; &lt;a href="http://www.amazon.com/Implementing-Lean-Software-Development-Addison-Wesley/dp/0321437381/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1215698116&amp;amp;sr=8-1" target="_blank"&gt;here&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;There was a statement made in the episode by Tom that really stuck to me and actually caused me to have a &amp;#39;ah-ha&amp;#39; moment.&amp;#160; The statement that Tom made was that we as developers tend to refer to business owners as &amp;#39;The Business&amp;#39; in place of referring to them as &amp;#39;Our Business&amp;#39;.&lt;/p&gt;  &lt;p&gt;The difference may seem subtle, but in actually it is quite substantial.&amp;#160; By referring to business as &amp;#39;The Business&amp;#39; we are making the statement that we have no say or no influence in the decisions being made or the direction to be taken.&amp;#160; It also implies that we as developers (or IT personal in general) are in some way inferior to the people making the decisions.&amp;#160; &lt;/p&gt;  &lt;p&gt;When we refer to the business as &amp;#39;Our Business&amp;#39; we are doing multiple things.&amp;#160; First we are saying that we have ownership and knowledge in the business and have the ability to not just code, but to make decisions.&amp;#160; We are also saying that we have more ownership in the product by including ourselves in the &amp;#39;Business&amp;#39;&lt;/p&gt;  &lt;p&gt;The differences between the terms &amp;#39;The Business&amp;#39; and &amp;#39;Our Business&amp;#39; may seem small, but in reality they are huge.&amp;#160; Think about, reflect on it.&amp;#160; Let me know your thoughts.&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;strong&gt;[----- Remember to check out &lt;/strong&gt;&lt;strong&gt;&lt;a href="http://www.dimecasts.net"&gt;DimeCasts.Net&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt; -----]&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41251" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>Foundations of Programming EBook - Great Read &amp; ITS FREE</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/07/10/foundations-of-programming-ebook-great-read-amp-its-free.aspx</link><pubDate>Thu, 10 Jul 2008 13:38:36 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41250</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=41250</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=41250</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/07/10/foundations-of-programming-ebook-great-read-amp-its-free.aspx#comments</comments><description>&lt;p&gt;If you have not hear, Karl Seguin has authored a great, short eBook which he is giving away free to the world.&amp;#160; This book is based of his blog series of the same title.&lt;/p&gt;  &lt;p&gt;Do yourself a favor and go download this book, it is pretty short and is a great read.&amp;#160; There are great nuggets of information for developers at every level.&amp;#160; &lt;/p&gt;  &lt;p&gt;You can browse to Karl&amp;#39;s post &lt;a href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;strong&gt;[----- Remember to check out &lt;/strong&gt;&lt;strong&gt;&lt;a href="http://www.dimecasts.net"&gt;DimeCasts.Net&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt; -----]&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41250" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/.Net/default.aspx">.Net</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Shout-Out/default.aspx">Shout-Out</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Announcement/default.aspx">Announcement</category></item><item><title>Developer training, a real (non)success story</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/06/30/developer-training-a-real-non-success-story.aspx</link><pubDate>Mon, 30 Jun 2008 12:42:55 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41146</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=41146</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=41146</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/06/30/developer-training-a-real-non-success-story.aspx#comments</comments><description>&lt;p&gt;About a year ago I created a few posts on the topic of Developer Ramp time and how &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2007/06/20/developer-ramp-time-different-ways-a-company-can-speed-it-up.aspx" target="_blank"&gt;companies can help the process&lt;/a&gt; as well as why different &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2007/06/19/developer-ramp-up-time-reasons-some-developers-ramp-up-faster-than-others.aspx" target="_blank"&gt;developers ramp up at different speeds&lt;/a&gt;.&amp;#160; Developer ramp time and how companies can aid in speeding up this time is critical not only to a new employee&amp;#39;s success, but also that of the team they are joining.&lt;/p&gt;  &lt;p&gt;This is why I was so shocked to hear a story from a buddy of mine about his company and their philosophy on developer ramp time.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The story goes something like this:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;My buddy (we will call him Will for this post) has recently been put in charge of the maintenance team at his company.&amp;#160; Currently there are a total of 5 people on this team, 4 developers and him.&amp;#160; Because his team is rocking and getting things done the company decided to hire on 2 more developer and put them on his team.&amp;#160; Because Will is one of these guys that believes in doing things the right way and because he sees the value in trying to speed up/aid the ramp time for new developers he decided he would like to put together a plan of action for these new developers.&lt;/p&gt;  &lt;p&gt;So Will spent a little time putting together a high level list of things he thought a new developer would need in order to become a upstanding member of the team.&amp;#160; However, because he did not want to spend too much time on this with out getting buy-in from his boss (should be a walk in the park) he simply put together a outline of what he wanted to do and sent that to his boss. &lt;/p&gt;  &lt;p&gt;Along with sending the outline to his boss, he also provided a summary of his intentions and goals for his training.&amp;#160; Will was looking for his boss to give him the thumbs up on moving forward with this training and figured he would start putting together the materials in the next day or so. &lt;/p&gt;  &lt;p&gt;Will was shocked when he received the reply from his boss that simply stated the following&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#39;The new developers are both professionals and adults and should be able to learn all they need to on their own.&amp;#39;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Needless to say that when Will received this reply he was not a happy camper.&amp;#160; How is he meant to help his team succeed if he is not allowed to help them ramp up?   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The moral of the story here is that training new employees is painful, it is hard and it can be expensive.&amp;#160; However, not training them can be even more painful and more expensive because they will be less productive and potentially make more errors.&lt;/p&gt;  &lt;p&gt;Any company that does not see this or does not value this is not a place I would like to work, and keeping me &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/06/23/what-makes-me-not-want-to-leave-a-company-client-shop.aspx" target="_blank"&gt;around may&lt;/a&gt; be hard.&amp;#160; &lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;strong&gt;[----- Remember to check out &lt;/strong&gt;&lt;strong&gt;&lt;a href="http://www.dimecasts.net"&gt;DimeCasts.Net&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt; -----]&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41146" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>[ANN] Dimecasts.net is Alive and Kicking</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/27/ann-dimecasts-net-is-alive-and-kicking.aspx</link><pubDate>Tue, 27 May 2008 13:51:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40750</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>22</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40750</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40750</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/27/ann-dimecasts-net-is-alive-and-kicking.aspx#comments</comments><description>
&lt;p&gt;A few weeks ago while putting together a screencast series on how to use NUnit (and a basic intro to testing) I got the bright idea to launch a new site.&amp;nbsp; I wanted to create a site that allows myself (and others in the future) to create, host and share short (about 10 minutes -- hence the name &lt;a href="http://www.DimeCasts.Net" target="_blank"&gt;dimecasts.net&lt;/a&gt;) screencast&amp;#39;s (I call them episodes) on how to do various different things.&lt;/p&gt;
  
&lt;p&gt;I started bouncing this idea of other developers which I trust, and the feedback was awesome so I moved forward with the idea.&lt;/p&gt;
  
&lt;p&gt;So, who is my target audience with these episodes....everyone.&amp;nbsp; My thoughts are to create episodes that tackle everyday coding issues as well as show how to use various tools (NUnit, Mocking tools, IoC, etc).&amp;nbsp; I want the episodes to range from 100 level (Intro to XYZ) all the way to 400 level (mastering XYZ) and I want them to be short and to the point.&amp;nbsp; &lt;/p&gt;
  
&lt;p&gt;I am launching &lt;a href="http://www.DimeCasts.Net" target="_blank"&gt;DimeCasts.Net&lt;/a&gt; with 4 episodes, but have 10 more in post production ready to roll.&amp;nbsp; I plan on rolling 1-2 a week (depending on my and others schedules) till we run out of ideas.&lt;/p&gt;
  
&lt;p&gt;Here are the 4 initial episodes &lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://www.dimecasts.net/Casts/CastDetails/1"&gt;Overview on how to use NUnit&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;This screencast is an introduction to NUnit as well as a brief overview of testing with NUnit.&amp;nbsp; In this episode you will learn the following:&lt;/p&gt;
  
&lt;ol&gt;   
&lt;li&gt;Use the NUnit IDE &lt;/li&gt;
    
&lt;li&gt;Create simple tests with NUnit &lt;/li&gt;
    
&lt;li&gt;Debug a test via the VS IDE &lt;/li&gt;
 &lt;/ol&gt;
  
&lt;p&gt;&lt;a href="http://www.dimecasts.net/Casts/CastDetails/2"&gt;Overview on NUnit&amp;#39;s Attributes&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;In this episode we will learn how to use some of the different attributes that are built into the NUnit testing framework.    &lt;br /&gt;The attributes we will review are: &lt;/p&gt;
  
&lt;ul&gt;   
&lt;li&gt;Test &lt;/li&gt;
    
&lt;li&gt;TestFixtureSetup &lt;/li&gt;
    
&lt;li&gt;TestFixtureTeardown &lt;/li&gt;
    
&lt;li&gt;Setup &lt;/li&gt;
    
&lt;li&gt;Teardown &lt;/li&gt;
    
&lt;li&gt;Ignore &lt;/li&gt;
    
&lt;li&gt;Explicit &lt;/li&gt;
    
&lt;li&gt;ExpectedException &lt;/li&gt;
 &lt;/ul&gt;
  
&lt;p&gt;&lt;a href="http://www.dimecasts.net/Casts/CastDetails/3"&gt;Creating tests with NUnit&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;In this episode we will cover the basics on how to create various unit test using the NUnit testing framework.&amp;nbsp; We will also review the different Assert helper classes that are part of the testing framework.&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://www.dimecasts.net/Casts/CastDetails/4"&gt;Unit testing events with NUnit&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;In this episode we will cover how to test events that are raised from an object.&amp;nbsp; We will cover multiple different ways to do this.&lt;/p&gt;
  
&lt;p&gt;Please let me know what you think.&amp;nbsp; What you like, what you do not, or what you would like to see.&lt;/p&gt;
  
&lt;p&gt;Till next time,&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40750" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/DimeCasts.Net/default.aspx">DimeCasts.Net</category></item><item><title>Thoughts on writing quality test code vs writing quality application code</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/21/thoughts-on-writing-quality-test-code-vs-writing-quality-application-code.aspx</link><pubDate>Wed, 21 May 2008 12:31:21 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40678</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40678</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40678</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/21/thoughts-on-writing-quality-test-code-vs-writing-quality-application-code.aspx#comments</comments><description>&lt;p&gt;Anyone that is a practitioner of testing or specially TDD knows that the quality of your tests are a direct measure in the assumed quality of your tested code.&amp;#160; Better put, if your tests suck, you can assume very low quality from your code.&lt;/p&gt;  &lt;p&gt;So what is harder, writing quality code or writing quality tests?&amp;#160; My vote is that writing quality test code is harder then writing quality application code.&lt;/p&gt;  &lt;p&gt;When it comes to writing &amp;#39;quality application code&amp;#39; the measure of quality is really in the eye of the developer.&amp;#160; What one person calls good code may be called crap by another developer.&amp;#160; But as long as the code meets the business needs, it should be at least considered quality (if not simply functional) code.&amp;#160; &lt;/p&gt;  &lt;p&gt;However, creating quality test code is a little more measurable.&amp;#160; One possible way to measure this is by code coverage (please do not take that statement as high code coverage equals high quality as this is NOT the case).&amp;#160; Another is to simple make sure the tests exercises as many different business scenarios as practical (notice here I did not say possible because at some point you reach the point of diminishing returns and should just stop).&amp;#160; Finally, if you keep your tests compact and focused you should be able to create quality tests.&lt;/p&gt;  &lt;p&gt;To me the real measure of quality test code is how maintainable is it?&amp;#160; Is it very painful to refactor when the code under test needs to change?&amp;#160; If you can maintain your test code with very little friction or effort, they I would say chances are high you have high quality test code.&lt;/p&gt;  &lt;p&gt;Hints your test code may be poor quality.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Test code does not test the intent of the code&lt;/li&gt;    &lt;li&gt;Test code becomes to brittle to maintain going forward&lt;/li&gt;    &lt;li&gt;Test code is heavy (those testing multiple things) &lt;/li&gt;    &lt;li&gt;You dread making changes to your code base for fear of having to modify your test code.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Hints your test code may be of high (er) quality&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Causes very little friction during future code changes&lt;/li&gt;    &lt;li&gt;Test code is light weight, tests only a single concept&lt;/li&gt;    &lt;li&gt;You do not dread making changes to your code base for fear of having to modify your test code.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So, what do you think?&amp;#160; Which is harder and why?&lt;/p&gt;  &lt;p&gt;Till next time, &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40678" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/TDD/default.aspx">TDD</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>Strict Mocking Semantics Is the only way to Mock</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/19/strict-mocking-semantics-is-the-only-way-to-mock.aspx</link><pubDate>Mon, 19 May 2008 13:27:03 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40637</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40637</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40637</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/19/strict-mocking-semantics-is-the-only-way-to-mock.aspx#comments</comments><description>&lt;p&gt;Recently I was giving a Mocking presentation and I made the statement that I prefer strict mocking semantics over loose semantics.&amp;#160; At the end of presentation one of the members of the audience raised point to my liking strict over loose.&amp;#160; We had a great discussion and I thought I would regurgitate it here and give my reasons for liking strict over loose.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Definition of &lt;a href="http://ayende.com/wiki/Rhino%20Mocks%20Introduction.ashx"&gt;Strict Replay Semantics&lt;/a&gt;&lt;/strong&gt;:     &lt;br /&gt;Only the methods that were explicitly recorded are accepted as valid. This mean that any call that is not expected would cause an exception and fail the test. All the expected methods must be called if the object is to pass verification.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Definition of &lt;a href="http://ayende.com/wiki/Rhino%20Mocks%20Introduction.ashx"&gt;Loose Replay Semantics&lt;/a&gt;:       &lt;br /&gt;&lt;/strong&gt;Any method call during the replay state is accepted and if there is no special handling setup for this method a null or zero is returned. All the expected methods must be called if the object is to pass verification.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Pros of Strict Replay&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Developer creating the test must know EXACTLY what the codes does they are testing &lt;/li&gt;    &lt;li&gt;Will cause the test to fail in the future if anyone changes the underlying code &lt;/li&gt;    &lt;li&gt;Creates a &amp;#39;what you see is what you get&amp;#39; scenario in your tests.&amp;#160; Meaning that if you do not setup an expectation you will NOT have success. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Cons of Strict Replay&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;May appear to make the test brittle &lt;/li&gt;    &lt;li&gt;Requires the developer to know EXACTLY what the code does (yes this is also a pro).&amp;#160; Sadly a lot of developers are too lazy to completely understand the code they are creating, hence this being a con. &lt;/li&gt;    &lt;li&gt;May create a lot of &amp;#39;noise&amp;#39; (I.e. a lot of mock setups) if your code is not loosely coupled (this is a con, but is really a result of a code smell) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Replay of the conversation      &lt;br /&gt;&lt;/strong&gt;During my presentation I had made comment that I prefer strict semantics over loose and simply left it at that.&amp;#160; I did not really go into detail, but at the end of the session one of the audience members wanted to dive deeper into the why, so we did. &lt;/p&gt;  &lt;p&gt;He made a very good observation in regards to strict mocking and that was that my test will fail if it was originally setup to expect a call to the &amp;#39;db mock&amp;#39; 2 times, but later the method was modified to only need 1 call.&amp;#160; I agreed with his observation, but told him I actually see this as a good thing.&amp;#160; &lt;/p&gt;  &lt;p&gt;When we create a test we are testing our code base at that point in time.&amp;#160; We are also testing business rules at that point in time.&amp;#160; When ever I setup my mocks (create expectations) I am doing so with knowledge that a given dependency will ONLY be called N number of times.&amp;#160; If I need to refactor/enhance that method/logic and I change the number of times my dependency will be called, I want my test to fail.&amp;#160; This failing test should prompt me to review my test logic to ensure that I am still testing the intent of the method.&lt;/p&gt;  &lt;p&gt;By this logic, strict mocking semantics is the best way to go.&amp;#160; If I had used loose semantics my original test would still pass when it should fail potentially hiding flaws in my test logic.&amp;#160; Remember green tests does not equal good code coverage.&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;  &lt;p&gt;***** Updated *****   &lt;br /&gt;Removed a misinterpreted statement from Ayende over at Rhino    &lt;br /&gt;***** Updated *****&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40637" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>XLinq'n in the new world - Data access comparisons with Xml/XPath</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/12/xlinq-n-in-the-new-world-data-access-comparisons-with-xml-xpath.aspx</link><pubDate>Mon, 12 May 2008 10:15:22 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40471</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>13</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40471</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40471</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/12/xlinq-n-in-the-new-world-data-access-comparisons-with-xml-xpath.aspx#comments</comments><description>&lt;p&gt;Originally this series was meant to be titled &amp;#39;Any thing you can do I can do better&amp;#39;, but to be honest after writing the Xml/XPath examples I realized the XLinq is really no better per say than Xml/XPath.&amp;#160; However, what XLinq does bring to the table that Xml/XPath does not:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Does not need to use the XPath query syntax &lt;/li&gt;    &lt;li&gt;Reads like English (mostly) when creating queries &lt;/li&gt;    &lt;li&gt;Lower barrier to entry for someone new to Xml (my opinion) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In Part 1 of this little mini series we will examine some common data access scenario&amp;#39;s and how XLinq&amp;#39;s syntax compares to that of standard Xml/XPath access.&lt;/p&gt;  &lt;p&gt;Before I get started I will show you a sample of the XML document I am using.&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39;?&amp;gt;    &lt;br /&gt;&amp;lt;root&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;system&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber Type=&amp;quot;Random&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;63425813&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@comcast.net&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;RAY&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Bob&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;33232&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;418444&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum&amp;gt;0&amp;lt;/ProgNum&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;1271728821&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@yahoo.com&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;JOHN&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Foo&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;1254512&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;1033488&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/system&amp;gt;     &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Example 1 - Simple data access&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;via Xml/XPath&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();

// notice the @ is on the status -- this is how u search a element
Int32 listCount = xmlDocument.SelectNodes( &amp;quot;//list&amp;quot; ).Count;
Int32 subscribersCount = xmlDocument.SelectNodes( &amp;quot;//subscriber[@Type=&amp;#39;Random&amp;#39;]&amp;quot; ).Count;&lt;/pre&gt;

&lt;p&gt;via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

Int32 listCount = xDocument.Descendants( &amp;quot;list&amp;quot; ).Count();
Int32 subscribersCount = xDocument.Descendants( &amp;quot;subscriber&amp;quot; ).Attributes( &amp;quot;Type&amp;quot; ).Where( e =&amp;gt; e.Value == &amp;quot;Random&amp;quot; ).Count();&lt;/pre&gt;

&lt;p&gt;As you can see both examples are pretty light on the code and are pretty straight forward.&amp;#160; This is one case where the new XLinq syntax is really no better/simpler then the Xml/XPath syntax.&amp;#160; The issue with the XPath syntax is that&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2 - Get a list of nodes that match our search criteria&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;via Xml/Xpath&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;// notice the @ is missing on the status -- this is how u search a node
XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();
XmlNodeList xmlNodeList = xmlDocument.SelectNodes( &amp;quot;//subscribers/subscriber[Status=&amp;#39;InActive&amp;#39;]&amp;quot; );

foreach ( XmlElement element in xmlNodeList )
{
    var id = element.SelectSingleNode( &amp;quot;//id&amp;quot; ).InnerText;
    var type = element.Attributes[ &amp;quot;Type&amp;quot; ].Value;
}&lt;/pre&gt;

&lt;p&gt;via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

var item = from doc in xDocument.Descendants( &amp;quot;subscriber&amp;quot; )
           let status = (string)doc.Element( &amp;quot;Status&amp;quot; )
           where status == &amp;quot;InActive&amp;quot;
           select doc;

foreach ( XElement xElement in item )
{
    var id = xElement.Element( &amp;quot;id&amp;quot; ).Value;
    var type = xElement.Attribute( &amp;quot;Type&amp;quot; ).Value;
}&lt;/pre&gt;

&lt;p&gt;Now here is an example where I think the XLinq syntax is cleaner and easier to understand.&amp;#160; There is no need to know or understand the XPath syntax, which can be a pain to learn.&amp;#160; Also here you see how XLinq looks a lot like standard SQL syntax and should be familiar to most developers.&lt;/p&gt;

&lt;p&gt;Well, above I have shown you a few simple examples that compare Xml/Path to XLinq, I hope you find this useful.&amp;#160; The next post will compare how to update/add data to a document using the both Xml/XPath and XLinq.&lt;/p&gt;

&lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40471" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Linq/default.aspx">Linq</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Mini-Series/default.aspx">Mini-Series</category></item><item><title>Are you going the way of the Dinosaur???</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/24/are-you-going-the-way-of-the-dinosaur.aspx</link><pubDate>Thu, 24 Apr 2008 10:20:17 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40192</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>26</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40192</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40192</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/24/are-you-going-the-way-of-the-dinosaur.aspx#comments</comments><description>&lt;p&gt;What are you doing to keep your skills current?&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Do you learn new technologies?&amp;#160; &lt;/li&gt;    &lt;li&gt;Do you learn new tools?&amp;#160; &lt;/li&gt;    &lt;li&gt;Do you learn new languages?&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you did not answer yes to at least 1 of the 3 questions above, I have one last question to ask.&amp;#160; What are you doing to not become a Dinosaur?&lt;/p&gt;  &lt;p&gt;In my opinion developers today have more at stake then ever before.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Technology is changing at the speed of light &lt;/li&gt;    &lt;li&gt;Business demands are getting larger and more complicated &lt;/li&gt;    &lt;li&gt;Technology is getting more complicated (which is counter to its intent) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Over the past few months I have spoken to a few different developers that have become &amp;#39;complacient&amp;#39; in what they do.&amp;#160; They have no interest in learn a new language (Ruby, Java, F#, etc) or even learning to use new frameworks (RoR, MonoRail, MVC, NHibernate, etc) because they are happy with what they have.&amp;#160; This is fine and this is dandy, but the day will come that they will regret this decision.&lt;/p&gt;  &lt;p&gt;Let me tell you a little store.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Long, long ago there was a developer that was writing his applications in his language of choice, COBOL.&amp;#160; This guy was as happy as a clam, he had no worries, no issues.&amp;#160; The language did what he need and he could make it do all sorts of cool stuff.&amp;#160; And most importantly he felt comfortable with his language of choice.&amp;#160; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Then one day someone created a newer, hipper language (insert any OO based language here) and suddenly it became all the rage.&amp;#160; Now the COBOL developer thought, should I invest the time effort to learn this new language, or should I stick with COBOL.&amp;#160; In the end he decided he liked COBOL, cause he was happy and content.&amp;#160; He also did not buy into all the press surrounding that language.&amp;#160; He figured that it is just a passing fad.&amp;#160; Now he may have been right, but where he made a mistake was he did not learn.&lt;/em&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Now lets fast forward to today.&amp;#160; In the past few years there have many new languages and frameworks/toolsets have been released.&amp;#160; They all have their pros and cons and some will die off and become extent.&amp;#160; But the ones that live on may someday push your language out of the way.&amp;#160; If you don&amp;#39;t at least have a working knowledge of what they bring to the table, what makes you think will will not be like our COBOL developer from our story?&lt;/p&gt;  &lt;p&gt;So, let me ask you.... What are YOU doing to not become a Dinosaur?&lt;/p&gt;  &lt;p&gt;BTW, before you ask what I am doing, let me tell you.&amp;#160; I am currently learning Ruby, I am playing with IronRuby (I know, not much different the Ruby).&amp;#160; I plan on playing with F# to become familiar with what a Functional language can do for me.&amp;#160; I started learning the MS MVC framework and will be playing RoR (Ruby on Rails) to see where that is going.&amp;#160; I did some MOSS work a while back.&amp;#160; I am branching out and getting my hands on as many different tools/frameworks as possible (NHibernate, Linq2Sql, TypeMock, etc, etc, etc).&amp;#160; I have not intention of becoming a master of any of these, but I intend on becoming knowledgeable enough to know what they offer and what they do not.&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40192" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>ReSharper 4.0, I love you but it may be time we break up</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/22/resharper-4-0-i-love-you-but-it-may-be-time-we-break-up.aspx</link><pubDate>Tue, 22 Apr 2008 14:01:56 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40140</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>48</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40140</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40140</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/22/resharper-4-0-i-love-you-but-it-may-be-time-we-break-up.aspx#comments</comments><description>&lt;p&gt;I have been a loyal and faithful user of ReSharper for the past few years, and am generally happy with the product.&amp;#160; But this 4.0 EAP is starting to kill our relationship.&amp;#160; &lt;/p&gt;  &lt;p&gt;I know that you are still in &amp;#39;beta&amp;#39; but come one, what is taking so damn long. Visual Studio 2008 have been in full production now for 5+ months, not to mention the amount of time it was in beta. Again, what is taking so damn long.&amp;#160; &lt;/p&gt;  &lt;p&gt;I know and understand that this is not a simple application but really, does&amp;#160; every build have to hurt me more then the previous one?&amp;#160; It seems to me that every day I have more and more issues with you.&amp;#160; A tool should be painless to use, not painful.&amp;#160; I have now reverted back to build 767 as it is the most stable one for me.&lt;/p&gt;  &lt;p&gt;I love the fact that have put it all on the line with the &amp;#39;open beta&amp;#39; and I know it will make you better because of it, but I just don&amp;#39;t know how much longer I can wait.&lt;/p&gt;  &lt;p&gt;Please, please, please hurry up and go live with the real version....&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;  &lt;p&gt;**** LET THE FLAMES BEGIN ****&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40140" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>How to share configuration files between projects</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/15/how-to-share-configuration-files-between-projects.aspx</link><pubDate>Tue, 15 Apr 2008 12:47:52 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40074</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>33</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40074</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40074</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/15/how-to-share-configuration-files-between-projects.aspx#comments</comments><description>&lt;p&gt;Sharing configuration files between multiple projects in Visual Studio is a simple task, but it is not intuitive in how it is done.&amp;#160; In fact, until recently I did not know how to do it via the IDE, I would always hand edit the .sln file to enable this feature (sad I know).&amp;#160; Today I thought I would throw up a simple set of screen shots to show everyone how easy it really is.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We have a solution that has multiple projects and we would like to share our app.config along with our StructureMap.config files between each of the projects.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step One -- Adding the config files to your soultion:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Create a solution folder in your solution.&amp;#160; I like to add them here as a way of organizing my common files.&amp;#160;&amp;#160; Once you have your Solution folder created, right click and choose Add -&amp;gt; New Item (see blow) (If you already have these files, simple do an Add -&amp;gt; Existing item and reference the existing ones).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/AddNewSolutionItem_1.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="148" alt="AddNewSolutionItem" src="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/AddNewSolutionItem_thumb_1.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now for some odd reason MS decided that Application Configuration files were not a valid option for solution folders so we have to do some manual work.&amp;#160; Select the &amp;quot;Text File&amp;quot; template and rename the file to App.Config (see blow).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/TextFileTempalte.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="150" alt="TextFileTempalte" src="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/TextFileTempalte_thumb.jpg" width="211" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Finally because we did not choose the Application Configuration template we need to add the XML tags to the file by hand. Here is the XML to add.   &lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;    &lt;br /&gt;&amp;lt;configuration&amp;gt;    &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step Two - Add reference to the each project:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now that we have created our config files in our solution folders we want to add them to each project.&amp;#160; We do this by right clicking the project and choosing Add -&amp;gt; Existing Item&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/AddExistingItem.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="180" alt="AddExistingItem" src="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/AddExistingItem_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This will open up a new dialog and this is where the magic happens (the part that always eluded me).&amp;#160; Change the extension type filter to &amp;#39;All Files(*.*)&amp;quot; allowing us to see the .config files.&amp;#160; Choose the file you want to add, but don&amp;#39;t click directly on the &amp;quot;Add&amp;quot; button.&amp;#160; Click the little drop down arrow on the right hand side.&amp;#160; This will give you 2 options.&amp;#160; 1) Add 2) Add as Link.&amp;#160; Choose Add As Link.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/AddAsLink.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="185" alt="AddAsLink" src="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/AddAsLink_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After you choose the &amp;#39;Add as Link&amp;#39; option you will notice that the App.Config file will be added to your project.&amp;#160; But it will has the shortcut image on the icon, this tells you it is a link, not an actual reference.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/ShowingAppConfigFile.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="189" alt="ShowingAppConfigFile" src="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/ShowingAppConfigFile_thumb.jpg" width="211" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step Three -- Setting up the Properties on the file&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;After we have added our config file we need to ensure that it gets copied to our output (bin) directory during a compile.&amp;#160; *** NOTE *** You do NOT need to do this with an App.config or Web.config as the IDE will do it for you *** END NOTE ***&lt;/p&gt;  &lt;p&gt;Right click the linked file and choose Properties.&amp;#160; This will open up a new dialog (fly out pane) and choose &amp;#39;Copy Always&amp;#39; or &amp;#39;Copy If Newer&amp;#39; in the Copy to Output Directory action.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/CopyAlways.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="55" alt="CopyAlways" src="http://devlicio.us/blogs/derik_whittaker/WindowsLiveWriter/Howtoshareconfigurationfilesbetweenproje_6CA8/CopyAlways_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There you go, you now have a single config file for your solution that can be referenced by all the projects in your solution.&lt;/p&gt;  &lt;p&gt;Hope this helps someone.&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40074" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/.Net+IDE/default.aspx">.Net IDE</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>Simple extension methods to help with Asserting values</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/10/simple-extension-methods-to-help-with-asserting-values.aspx</link><pubDate>Thu, 10 Apr 2008 12:49:43 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40019</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40019</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40019</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/10/simple-extension-methods-to-help-with-asserting-values.aspx#comments</comments><description>&lt;p&gt;In the past I have written about the &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2007/06/08/fail-fast-principle.aspx"&gt;Fail Fast&lt;/a&gt; principle.&amp;#160; This is a principle I try to live my development life by.&amp;#160; I would rather explicitly check for possible failure points then have a runtime error crop up.&amp;#160; In the past when writing these failure check we have had to resort to a few &amp;#39;cavemanish&amp;#39; techniques.&amp;#160; But with the inception of Extension Methods (&lt;a href="http://msdn2.microsoft.com/en-us/library/bb383977.aspx"&gt;here&lt;/a&gt; or &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx"&gt;here&lt;/a&gt;) we can actually create something that is pretty simple as well as elegant.&lt;/p&gt;  &lt;p&gt;Lets take a look at a few examples where we are NOT using extension methods to accomplish our failure checking.&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;public bool SomeMethod( string key )  
{  
	// In this case the key cannot be null or empty  
	if ( key.length == 0 ) { throw new ArgumentOutOfRangeException( &amp;quot;key&amp;quot;, &amp;quot;Some Message Goes here&amp;quot; ); }
} &lt;/pre&gt;

&lt;p&gt;The code above works, it is pretty simple and will get the job done.&amp;#160; But to be honest, having this sprinkled all over your code is kinda ugly.&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;public bool SomeMethod( SomeObject obj, Int32 someInt )  
{  
	// In this case the object cannot be null  
     	Assert.IsNotNull( obj, &amp;quot;Some Object&amp;quot; );  
  
	// In this case the int must be greater then 1  
     	Assert.IsTrue( someInt &amp;gt; 1, &amp;quot;Some Int not correct&amp;quot; );  
} &lt;/pre&gt;

&lt;p&gt;This code works as well and is more concise the the previous example.&amp;#160; However, this code is still less readable then the example below.&lt;/p&gt;

&lt;p&gt;Now, lets take a look at the same thing, but using Extension Methods&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;public bool SomeMethod( SomeObject obj, strnig someString )  
{  
	// In this case the object cannot be null  
	obj.AssertNonNull(); 
  
	// In this case the cannot be null or empty
	someString.AssertNotNullOrEmpty();	
} &lt;/pre&gt;

&lt;p&gt;Here is the code for the actual extension methods assert&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;public static void AssertNonNull( this T value )
{
	// Do our null check here.
	if ( value == null ) 
	{ 
		// Could even use reflection to gather info such as calling method, method exception was
		//	found in, etc.
		throw new ArgumentNullException( &amp;quot;Some message here&amp;quot; );
	}
}&lt;/pre&gt;

&lt;p&gt;The assert above using the extension method to me is the most elegant.&amp;#160; It is easy to read (very important) and very concise.&amp;#160; &lt;/p&gt;

&lt;p&gt;Keep in mind, all the examples above do the exact same thing, but they do in varying levels of elegance.&amp;#160; I would argue that the usage of extension methods here makes the code cleaner and easier to read.&lt;/p&gt;

&lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40019" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/.Net/default.aspx">.Net</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item><item><title>Linq and Delayed execution</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/07/linq-and-delayed-execution.aspx</link><pubDate>Mon, 07 Apr 2008 18:11:57 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39988</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=39988</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=39988</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/04/07/linq-and-delayed-execution.aspx#comments</comments><description>&lt;p&gt;If you have not taken a look at Linq (either Linq to objects or Linq to sql) you need to do so.&amp;#160; I would say it is the coolest new feature that was released with .Net 3.5.&amp;#160; But there is one thing that you MUST keep in mind when using Linq.&amp;#160; It has been designed to perform lookups using delayed execution.&amp;#160; When you declare your Linq statement all you are doing is creating the memory representation of the query as an express tree.&amp;#160; The execution of this plan will NOT be executed until the first time you attempt to access the result set of the Linq query.&lt;/p&gt;  &lt;p&gt;But before we get started I want to show the demo object model I will be using for this post.&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;public class Demo
{

    public string Name { get; set;  }
    public string Text { get; set; }
    public Int32 Count { get; set;  }

    public static List BuildDemoList()
    {
        return new List&amp;lt; Demo &amp;gt;
                   {
                       new Demo {Name = &amp;quot;First&amp;quot;, Text = &amp;quot;Some&amp;quot;, Count = 123},
                       new Demo {Name = &amp;quot;Second&amp;quot;, Text = &amp;quot;Other&amp;quot;, Count = 223},
                       new Demo {Name = &amp;quot;Third&amp;quot;, Text = &amp;quot;Value&amp;quot;, Count = 443},
                       new Demo {Name = &amp;quot;Fourth&amp;quot;, Text = &amp;quot;Goes&amp;quot;, Count = 224},
                       new Demo {Name = &amp;quot;Last&amp;quot;, Text = &amp;quot;Here&amp;quot;, Count = 5534}
                   };
    }
}&lt;/pre&gt;

&lt;p&gt;Lets take a look at a few examples to help demonstrate how Linq&amp;#39;s delayed execution works&lt;/p&gt;

&lt;p&gt;This first block simply shows how you can query a collection and spit out the contents&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;List&amp;lt; Demo &amp;gt; values = Demo.BuildDemoList();
var result = from d in values
             where d.Count &amp;gt;= 224
             select d;

foreach ( var demo in result )
{
    System.Diagnostics.Debug.WriteLine( string.Format( &amp;quot;{0}, {1}, {2}&amp;quot;, demo.Name, demo.Text, demo.Count ) );
}

// output
// Third, Value, 443
// Fourth, Goes, 224
// Last, Here, 5534&lt;/pre&gt;

&lt;p&gt;This second block does the same as the ones above, but with a twist.&amp;#160; Because we are changing the value of an item in the list PRIOR to using it we are going to change the results.&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;List values = Demo.BuildDemoList();
var result = from d in values
             where d.Count &amp;gt;= 224
             select d;

values[ 2 ].Count = 100;

foreach (var demo in result)
{
    System.Diagnostics.Debug.WriteLine(string.Format(&amp;quot;{0}, {1}, {2}&amp;quot;, demo.Name, demo.Text, demo.Count));
}

// Output
// Fourth, Goes, 224
// Last, Here, 5534&lt;/pre&gt;

&lt;p&gt;This final block appears to be the exact same as the second above, but with one small change.&amp;#160; We have called the .ToList() on the Linq statement.&amp;#160; By calling the .ToList() we are forcing the execution of the query immediately. Now when we change a value in the underlying collection and then iterate over the results we will NOT get the changes.&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;List values = Demo.BuildDemoList();
var result = ( from d in values
             where d.Count &amp;gt;= 224
             select d ).ToList();

values[2].Count = 100;

foreach (var demo in result)
{
    System.Diagnostics.Debug.WriteLine(string.Format(&amp;quot;{0}, {1}, {2}&amp;quot;, demo.Name, demo.Text, demo.Count));
}

// Output
// Third, Value, 100
// Fourth, Goes, 224
// Last, Here, 5534&lt;/pre&gt;

&lt;p&gt;The thing I would like to stress here is that Linq by default will NOT execute the query prior to the first use.&amp;#160; I know this will cause issues for some, and may be very hard to spot if you do not understand this fact.&lt;/p&gt;

&lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39988" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/.Net/default.aspx">.Net</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Linq/default.aspx">Linq</category></item><item><title>Simple Linq to Object example with Casting</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/02/22/simple-linq-to-object-example-with-casting.aspx</link><pubDate>Fri, 22 Feb 2008 15:19:33 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39520</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=39520</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=39520</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/02/22/simple-linq-to-object-example-with-casting.aspx#comments</comments><description>&lt;p&gt;This is my first go at playing with Linq.&amp;nbsp; So far it is pretty cool, but I wanted to share something because I found it painful.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I wanted query a list and then cast a anonymous type to a static type.&amp;nbsp; I was not able to find anything on the net to help me with this (could be i just did not look in the right places) so i thought i would share my findings.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Below is the definition of the &amp;#39;Sport&amp;#39; object&lt;/p&gt;&lt;pre class="c-sharp" name="code"&gt;[Serializable]
public class Sport
{

        public virtual Int32 SportID { get; set; }
        public virtual string Name { get; set; }
        public virtual string Description { get; set; }

}
&lt;/pre&gt;
&lt;p&gt;Here is the code to query some data out of a list of sports List&amp;lt;Sport&amp;gt;&lt;/p&gt;&lt;pre class="c-sharp" name="code"&gt;List sports = new List();
sports.Add(new Sport { SportID = 1, Name = &amp;quot;Sport 1&amp;quot;, Description = &amp;quot;Sport Desc 1&amp;quot; });
sports.Add(new Sport { SportID = 2, Name = &amp;quot;Sport 2&amp;quot;, Description = &amp;quot;Sport Desc 2&amp;quot; });
sports.Add(new Sport { SportID = 3, Name = &amp;quot;Sport 3&amp;quot;, Description = &amp;quot;Sport Desc 3&amp;quot; });
sports.Add(new Sport { SportID = 4, Name = &amp;quot;Sport 4&amp;quot;, Description = &amp;quot;Sport Desc 4&amp;quot; });
sports.Add(new Sport { SportID = 5, Name = &amp;quot;Sport 5&amp;quot;, Description = &amp;quot;Sport Desc 5&amp;quot; });
            
var query = from s in sports
	where s.Name == &amp;quot;Sport 2&amp;quot;
        select s;
&lt;/pre&gt;
&lt;p&gt;The code below will show how to cast/convert from anonymous type to static type.&lt;/p&gt;&lt;pre class="c-sharp" name="code"&gt;Sport sport = (Sport) query.First();
&lt;/pre&gt;
&lt;p&gt;The code below will show how to cast back to a List&amp;lt;Sport&amp;gt;&lt;/p&gt;&lt;pre class="c-sharp" name="code"&gt;List newSports = query.ToList();
&lt;/pre&gt;
&lt;p&gt;Hope this helps someone else.&lt;/p&gt;
&lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39520" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Linq/default.aspx">Linq</category></item><item><title>Things to think about if you want to be a consultant</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/01/02/things-to-think-about-if-you-want-to-be-a-consultant.aspx</link><pubDate>Wed, 02 Jan 2008 21:26:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39114</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=39114</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=39114</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/01/02/things-to-think-about-if-you-want-to-be-a-consultant.aspx#comments</comments><description>&lt;p&gt;I was chatting a buddy recently and he was thinking about making the jump to the consulting world (not solo, through a consulting firm).&amp;nbsp; As he has never been a consultant I gave him my 2cents on questions to ask during the interview as well as things he has to accept before making the jump.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Questions to ask the consulting firm&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;What percent of travel is the norm?       &lt;br /&gt;&lt;/b&gt;This is very important to know up front.&amp;nbsp; Because if you don&amp;#39;t want to travel much and they tell you they are 100% travel, then move on.&amp;nbsp; &lt;br /&gt;      &lt;br /&gt;One thing you need to keep in mind, is that they can give you a number, that number is NOT in stone.&amp;nbsp; It can/will change from client to client.&amp;nbsp; In my 5 years of consulting, I never left the greater Chicago area.&amp;nbsp; And for 2+ years I worked out of our home office.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;What is your bench policy?       &lt;br /&gt;&lt;/b&gt;Ask what the policy is for being on the bench?&amp;nbsp; More importantly ask the billable % expectation is for a consultant.&amp;nbsp; This can be important because if they expect you to be billable 90% of the year then they may not be able to handle any rough patches.&amp;nbsp; However, if they expect you to be billable for only 80% then they should be better set for rough patches.      &lt;br /&gt;      &lt;br /&gt;I also found that if a company has higher expectations about billable %, they may not be willing to provide non-billable training as it eats into the bottom line.      &lt;br /&gt;      &lt;br /&gt;If you are on the bench, do they have something for you to do?&amp;nbsp; Can you go to training during that time?&amp;nbsp; Or can you simply stay home and collect a check (i wish)?      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;What is your training policy?       &lt;br /&gt;&lt;/b&gt;Ask what type of training they budget for?&amp;nbsp; Do they pay for conferences, weekly training classes?&amp;nbsp; Do they EXPECT you to take some sort of training.&amp;nbsp; &lt;br /&gt;      &lt;br /&gt;A good firm will have a defined budged that will allow for adequate training of all there consultants.&amp;nbsp; Actually, it is in their best interest to keep you trained as you become more marketable.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;What is the &amp;#39;standard&amp;#39; number of billable hours you expect?       &lt;br /&gt;&lt;/b&gt;What is the standard number of hours do they expect you to bill for in a giving year?&amp;nbsp; Is it 1800, is it 2000?&amp;nbsp; This makes a difference because if they tell you 2000+ then are telling you they EXPECT you to work over time (more on that below).      &lt;br /&gt;      &lt;br /&gt;A full year with no time off is 2080 hours (52 weeks * 40 hours).&amp;nbsp; But if you get 2 weeks vacation and 10 paid holidays you are only at 1920 (48 weeks * 40 hours).&amp;nbsp; &lt;br /&gt;      &lt;br /&gt;Again, now keep in mind that the &amp;#39;standard&amp;#39; number is just a rule of thumb, but it is good to know.&amp;nbsp; The higher the number, the less room in the budget they may have for when times get tough.&amp;nbsp; &lt;br /&gt;      &lt;br /&gt;Also, keep in mind that during my 5 years consulting, my average work week was about 45-50 hours.&amp;nbsp; So if you are looking for the 40 hours and go home, you may not want to do consulting.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;How are bonuses/raises calculated?       &lt;br /&gt;&lt;/b&gt;Do they give bonuses/raises?&amp;nbsp; Are they based on billable hours?&amp;nbsp; If they are based on billable hours, that can be good and bad.&amp;nbsp; &lt;br /&gt;      &lt;br /&gt;Example.&amp;nbsp; My old firm would give a flat bonus, but if you worked 200 extra hours a year you got a bump, if you worked 300 you got an extra bump, etc.      &lt;br /&gt;      &lt;br /&gt;This is good because i knew that the more i billed, the larger my bonus.&amp;nbsp; &lt;br /&gt;This was bad because i only got a sliver of the extra billable hours and in the long run did not pay off in the end.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;How does overtime work?       &lt;br /&gt;&lt;/b&gt;Some firms don&amp;#39;t do anything special for overtime (as is the case in most salary positions).&amp;nbsp; However, some will actually pay you extra for your overtime (these places typically don&amp;#39;t give bonuses).&amp;nbsp; Other places bank your overtime and build that into your vacation (worked out well for my buddy).      &lt;br /&gt;      &lt;br /&gt;But i would say that most common is that nothing happens with your overtime, except the companies profits increase at your expense.      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Thing you have to accept as part of the job&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;The tech/environment will change with every new client       &lt;br /&gt;&lt;/b&gt;With every new client/project your environment along with the technology will change.&amp;nbsp; For some people this is a show stopper, for others it is just another chance to learn.      &lt;br /&gt;      &lt;br /&gt;Keep in mind that if you work on site at the client you will be expected to follow ALL their rules.&amp;nbsp; So if they are business formal, you will be expected to dress in business formal.&amp;nbsp; If they say you cannot come in till 9 and must stay till 6, then that is what you must do.      &lt;br /&gt;      &lt;br /&gt;If you are not willing to accept this, then consulting may not be for you.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;You may not always be working on &amp;#39;cool/fun&amp;#39; tech       &lt;br /&gt;&lt;/b&gt;Since each project may change technology you may not always be working on &amp;#39;fun, cool&amp;#39; stuff.&amp;nbsp; You may go from doing cutting edge development on project to doing report writing on the next one.&amp;nbsp; &lt;br /&gt;      &lt;br /&gt;If you are not willing to accept this, then consulting may not be for you.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;You are the &amp;#39;***&amp;#39; of the client, at their mercy       &lt;br /&gt;&lt;/b&gt;Since you are a &amp;#39;hired gun&amp;#39; you are the mercy of the client.&amp;nbsp; Don&amp;#39;t expect to have the same treatment as full timers (a lot of places today treat their consultants as part of the family, but not all).&amp;nbsp; Don&amp;#39;t expect to get subsidized meals (if offered) or gym memberships, etc.      &lt;br /&gt;      &lt;br /&gt;Also, be ready to work in some of the worst spaces you can think of.&amp;nbsp; On place i worked the consultants all sat in a single 15-20 office.&amp;nbsp; They basically lined up desks along the wall and filled it with 6 people.&amp;nbsp; I felt bad for them :).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;The people you will meet&lt;/b&gt;&lt;br /&gt;The coolest part is the people you will meet, the connections you will make.&amp;nbsp; This is great because networking is the best way to move ahead in this business.&amp;nbsp; I have meet some great people and have made some great contacts.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This was my 2cents to him.&lt;/p&gt;  &lt;p&gt;Did I miss anything?&amp;nbsp; Am I wrong?&amp;nbsp; Let me know&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39114" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category></item></channel></rss>