tag:blogger.com,1999:blog-74145127595804662024-03-10T18:59:16.336-04:00Software on the SideMike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.comBlogger60125tag:blogger.com,1999:blog-7414512759580466.post-12491350586207001442018-04-17T20:24:00.000-04:002018-04-17T20:24:17.367-04:00Podcasts!!!So about 3 years ago I moved to Atlanta and have had a daily one-way commute between 45 and 80 minutes long. In order to more effectively use that time, I have joined the podcast community. With almost 3 years of experience, I wanted to share some of the podcasts that I regularly listen to. I'm sure that I'll add and subtract from the list as time and tastes change. Understanding that everyone is a unique individual, your mileage may vary but I hope that you find something that you haven't previously discovered and expands your learning!<br />
<br />
<div style="text-align: center;">
<a href="http://blog.softwareontheside.com/p/podcasts.html">My recommended podcasts</a></div>
<br />Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-77875992049650687572014-03-18T00:10:00.001-04:002014-03-18T00:10:49.907-04:00“Thinking in F#” and “Software Craftsmanship and Agile Code Games” Slides<p>I’ve posted the slides from my recent presentations at Utah Code Camp 2014.  If you missed it, I’ll be presenting “Thinking in F#” at <a href="http://boisecodecamp.com/" target="_blank">Boise Code Camp 2014</a> on April 5th and “Software Craftsmanship and Agile Code Games” at <a href="http://milehighagile2014.agiledenver.org/" target="_blank">Mile High Agile 2014</a> on April 18th.</p> <p>Check out these and previous sessions on my <a href="http://blog.softwareontheside.com/p/sessions.html" target="_blank">Sessions</a> page.</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com9tag:blogger.com,1999:blog-7414512759580466.post-11296655100670875142014-03-07T02:35:00.002-05:002021-09-23T10:57:39.772-04:00StrengthsFinder Team Activities<p>While I was at Ancestry.com, we used the <a href="http://www.strengthsfinder.com/home.aspx">StrengthsFinder</a> assessment to give us insights into ourselves. If you haven’t taken it, I highly recommend it. You can <a href="https://www.gallupstrengthscenter.com/Purchase/Product?Path=Clifton%20StrengthsFinder" target="_blank">purchase a code</a>, or you can get one with a copy of <a href="http://www.amazon.com/gp/product/B001CDZZI6/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001CDZZI6&linkCode=as2&tag=clemhome-20" target="_blank">StrengthsFinder 2.0</a> or <a href="http://www.amazon.com/gp/product/B001RIYUOG/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001RIYUOG&linkCode=as2&tag=clemhome-20" target="_blank">Strengths Based Leadership</a>.<br />
</p>
<p>
While it’s interesting to know about yourself, when in a team setting it’s equally important to know about your teammates in order to work effectively with them. To help my team with that, I designed some activities for us to do as a team. Here are my notes to facilitate the activities.<br />
</p>
<p>
<a href="https://drive.google.com/file/d/0BzOdARUv2YoSamYxaXpVRFlfdEU/view?usp=sharing&resourcekey=0-3pfpgUWdn_zvLsNXw4RQ6g" target="_blank">StrengthsFinder Team Activities</a><br />
</p>
<p>
<a href="https://drive.google.com/file/d/0BzOdARUv2YoSQ0lmeW9vdGQ5dTA/view?usp=sharing&resourcekey=0-z4eTg7P5FsgTqWpLeZ1LyA" target="_blank">Team Top 5 Grid</a><br />
</p><p><a href="https://docs.google.com/spreadsheets/d/11qpjF4kcYTI79gC89zIfWl4QCdWJu322GJrkIMK0Qsk/edit?usp=sharing">Team Top 5 Grid - Google Sheets version</a></p>
<p>
A few months later, we did an activity with multiple teams in order for those other teams to get to know each other better and the teams to know and understand each other better. This includes many of the same individual team activities while adding some activities that have the teams interacting.<br />
</p>
<p>
<a href="https://drive.google.com/file/d/0BzOdARUv2YoSMWJFSjhKODljN3M/view?usp=sharing&resourcekey=0-Gs9gHPLGzuTLCJlGGRLYmA" target="_blank">StrengthsFinder Multi-team Activities</a><br />
</p>
<p>
Again, many of these are to help team members understand and appreciate each other. Also as you do these activities, keep in mind that the debrief (the questions and conversation after the activities) are where the real action is. The point of the activities isn’t to teach but to facilitate learning. You’ll want to give clear explanations (possibly have slides to show instructions) and then walk around, listen to what’s going on, answer questions and offer gentle suggestions.<br />
</p>
<p>
Hope these are helpful to someone! Feel free to use all of these, cherry pick and/or remix with your own ideas.<br />
</p>
<p>
<a href="http://creativecommons.org/licenses/by/4.0/" rel="license"><img alt="Creative Commons License" src="http://i.creativecommons.org/l/by/4.0/88x31.png" style="border-width: 0px;" /></a> <br />
This work is licensed under a <a href="http://creativecommons.org/licenses/by/4.0/" rel="license">Creative Commons Attribution 4.0 International License</a>.
</p>Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com2tag:blogger.com,1999:blog-7414512759580466.post-43183728561926798202013-04-04T00:21:00.001-04:002016-12-23T11:35:15.344-05:00After the Offer Come the QuestionsThere are some questions that are appropriate to ask in an interview and some that should be reserved until there is an offer. Somehow I became “famous” for the questions that I ask after I’ve been extended an offer. For me, these are important to give me a more complete view of the working environment and attitude of the company and team that I might join. It also gives insight into specific policies and practices. I like to have as much information as possible when considering an offer. I also want to reduce the number of surprises after an offer has been accepted.<br />
I’ve been asked several times for the “list of questions” that I ask and I’ve promised a blog post for a while, so here it is! Here are the categories that I am interested in with questions that I’ve used in the past for each. These, of course, need to be suited to the particular situation and some you may not care about. And some I will ask in an interview depending on how well I know the interviewer. Enjoy!<br />
<ol>
<li>Hardware</li>
<ol>
<li>What is the hardware setup for developers? Desktop/laptop, monitors?</li>
<li>Would I be able to choose anything about my systems or is there standard hardware across the company?</li>
<li>How often is hardware replaced?</li>
<li>With hardware, would I be able to choose my own mouse and keyboard? </li>
<li>Is it okay to bring in personal hardware?</li>
</ol>
<li>Software tools</li>
<ol>
<li>What software tools does the company provide? (Resharper, NCrunch, profiler, etc) </li>
<li>Does IT have heartache over what's installed on a developer's box (other than file sharing software or other things that would eat bandwidth)?</li>
<li>What source control repository do you use?</li>
<li>What sort of testing environments are there?</li>
<li>What test testing frameworks do you use? nUnit, xUnit, mbUnit, mSpec? Acceptance tests? Fitnesse or something similar?</li>
<li>What sort of tools do you have/build/maintain around the health of your systems (to monitor, alert, etc)? Is this something the dev team works on or is there an Ops team?</li>
</ol>
<li>Physical environment (usually you get to see this as part of a tour at your interview, but if not for some reason)</li>
<ol>
<li>What type of desk and chair are provided?</li>
<li>Would travel ever be a part of this position?</li>
</ol>
<li>Learning</li>
<ol>
<li>What sort of policy does the company have around budget for learning? For example book purchases, conference fees/travel, online courses.</li>
</ol>
<li>Company Policies</li>
<ol>
<li>What does the performance review process look like? What criteria are used? Are employees evaluated on an absolute scale or on a curve (with respect to their peers)?</li>
<li>What does a "typical" annual raise look like? What does an extraordinary annual raise look like? What criteria determine this?</li>
<li>What does the title/level system look like?</li>
<li>Is there a Moonlighting Policy? For example if I write a project at home (on my own time, on my own hardware with my own tools) am I able to retain rights to that software?</li>
<li>Is there a policy on contributions to open source projects, either out of something at work or on my own time? What about use of Open Source Projects?</li>
<li>Dress code - is there one and if so, what is it? (and is it strictly enforced if there is one)</li>
<li>Is there a policy on bereavement leave?</li>
</ol>
<li>Team Culture/Process</li>
<ol>
<li>Iteration/release cadence - What does an iteration look like (planning, retrospectives, review)? Do you have a daily standup? Who attends?</li>
<li>Requirements - how are requirements expressed in the team? User Stories? Use Cases?</li>
<li>How are they tracked? Is there a big visible board somewhere or is it tracked electronically (and if so, what software is used).</li>
<li>Where do these requirements come from? How is the backlog generated? Are stories decomposed into tasks or is a story the unit of work?</li>
<li>Estimation - Do you generate estimates and, if so, what method/process is used?</li>
<li>Are you currently doing continuous integration? If so, what platform are you using to do that?</li>
<li>What about continuous delivery?</li>
<li>How much code is the team responsible for?</li>
<li>What is the test coverage like? Is TDD used on the team?</li>
<li>What percentage of the time is the team pairing? What activities does the team pair on and which do they not?</li>
<li>How does this team interact with other teams in the company (if there are other teams)?</li>
<li>What is the team culture around lunch? Do most people work through lunch, eat at their desk, go out alone, go out as a team, go out with other people in the company or outside the company? (I'm guessing that all of these happen occasionally, looking more for what the norm is)</li>
<li>Are there any snacks/food provided by the company? Any pot luck events?</li>
</ol>
<li>Career Path</li>
<ol>
<li>Are there continued growth opportunities available without moving into management?</li>
<li>Are there opportunities to move into management?</li>
<li>I'm interested in knowing what you feel I would bring to the team (how I could contribute immediately and longer term), how you see me fitting on the team, what the main attributes that you see that led you to extending an offer and what things you see that I would need to work on.</li>
</ol>
</ol>
There are also questions about benefits and such, but those are very specific based on the information provided.<br />
There is another list that I’m starting for the team that I’d be working with. Here is what I’ve started with:<br />
<ol>
<li>What do you enjoy about your job? What are some of your favorite things?</li>
<li>What are some of your least favorite things?</li>
<li>What changes would cause you to leave? (as a fill in the blank: If ______ changed, I would leave.)</li>
<li>What would another job offer that would cause you to go somewhere else (excluding money)? (as a fill in the blank: If another company had _______, I would go there.)</li>
<li>What, if anything, do you miss from a previous job?</li>
</ol>
So there it is. I hope these are useful but you’re probably thinking “duh, of course I ask those things.” In that case, the curtain has been pulled back.<br />
Is there anything that I should add to these lists?Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com2tag:blogger.com,1999:blog-7414512759580466.post-22289099813600744052013-03-22T13:02:00.001-04:002013-03-22T13:02:04.219-04:00Published on Ancestry.com Roots Tech blog<p>Posted a blog entry on the new <a href="http://blogs.ancestry.com/techroots/">Ancestry.com Roots Tech blog</a> called <a href="http://blogs.ancestry.com/techroots/games-at-work/">“Games at Work?”</a></p> <p>Here’s the opener…</p> <blockquote> <p>Agile Games are a way for teams to learn and apply agile concepts in a fun, playful, safe environment. <a href="http://www.slideshare.net/michael.sahota/agile-games-2012-keynote-games-landscape-and-importance-of-play">Play is important</a> as it brings aliveness to our work environment that allows for creativity and our best work to flow.  Games provide a <a href="http://agilecoach.typepad.com/agile-coaching/2006/05/conditions-for-embrace-change.html">safe environment where people are more open and willing to take risks and embrace change</a>.  The safety of games also allows us to talk about work… without necessarily talking about work.</p> </blockquote> <p><a href="http://blogs.ancestry.com/techroots/games-at-work/">Go check it out!</a></p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-23456056458158387182013-02-07T12:09:00.001-05:002013-02-07T12:09:59.088-05:00Employer Investment in Employees<p><a href="https://twitter.com/unclebobmartin">Uncle Bob</a> has a pretty clear opinion on who has the responsibility for a programmer’s practice/learning:</p> <blockquote> <p>Professional programmers practice on their own time. It is not your employer’s job to help you keep your skills sharp for you.</p> <p align="right">Uncle Bob in <a href="http://www.amazon.com/gp/product/0137081073/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=0137081073&linkCode=as2&tag=clemhome-20">The Clean Coder</a> Chapter 6</p> </blockquote> <p>Here Uncle Bob is talking to programmers, to employees.  What I hear is “don’t expect your employer to help you out.  If they’re not, that’s not an excuse.”</p> <p>So, my question is, does that mean that employers should not provide any learning opportunities for it’s employees?</p> <p>Sure, programmers are responsible for their own learning opportunities but could part of that be making sure to find an employer that provides those opportunities?  I personally take some time outside of work to sharpen my saw, but I also look for an employer that cares enough about me to invest in me. </p> <p>Here is my reasoning why an employer would want to provide learning:</p> <ul> <li><strong>Hiring is hard and expensive.</strong> If you have people that are a good fit, it’s usually easier to improve their skills than to hire someone new.</li> <li><strong>Learning opportunities at work can inspire people to pursue outside work opportunities.</strong>  I have has several people that I work with start attending <a href="http://utahsc.org">Utah Software Craftsmanship</a>, <a href="http://utahcodecamp.com/">Utah Code Camp</a> and <a href="http://coderetreat.org/">Coderetreats</a> because of things that we’ve done during working hours.</li> </ul> <p>What do you think?  Should employers provide opportunities for practice and learning?</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com162tag:blogger.com,1999:blog-7414512759580466.post-21331027143117284962012-11-28T15:30:00.001-05:002012-11-28T15:30:26.446-05:00If you happen to be a psychic: Quote of the Week<p>Just started reading <a href="http://www.amazon.com/gp/product/0321213351/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=0321213351&linkCode=as2&tag=clemhome-20">Refactoring to Patterns</a>.  Starts off with a good reminder that <a href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt">YAGNI</a>.</p> <blockquote> <p>When you make your code more flexible or sophisticated than it needs to be, you over-engineer it.  Some programmers do this because they believe they know their system’s future requirements.  They reason that it’s best to make a design more flexible or sophisticated today, so it can accommodate the needs of tomorrow.  That sounds reasonable – if you happen to be psychic.</p> <p align="right">Joshua Kerievsky, <a href="http://www.amazon.com/gp/product/0321213351/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=0321213351&linkCode=as2&tag=clemhome-20">Refactoring to Patterns</a> p.1</p> </blockquote> <p>Look at the code you’ve written recently.  Were you pretending you’re a psychic?</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com13tag:blogger.com,1999:blog-7414512759580466.post-11372132277275236322012-11-28T11:43:00.001-05:002012-11-28T11:43:34.306-05:00Retrospectives and Local Maxima<p> </p> <p>Sometimes we feel like this:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMOy-4wwX4jKG-8vwPcQ3SDWqWl_e6hzyxGcsih95375TZ5XfOEseXlD7woj_rArY8p3lrZTPeNd0bIpOu46-nlZDjXafG-fTcdwxrt8FwU6VPfIlsbziOUyrB0yp1yyoiiNysCTFGtCs/s1600-h/image%25255B11%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCBwP4DlNlXBFXUgP9FFkMV2e9bETQvEu7N0df0GPkaAIGWCgBFPb9yfVXqn8ptuYsq4dOdPTQYUtSZaK1vq_xdmiSsb9uMsqcC_eFcQsA0jfZ2JAhmA-aYj-lkqY2LmD8amX_N_BeT-w//?imgmax=800" width="238" height="244" /></a></p> <p>We are at the top of the mountain!  We’ve climbed, we’ve improved and we’ve made local, incremental changes such that we’re not quite sure where to go from here.  We don’t know where else we could possibly go to move higher.</p> <p>What we’re missing is this:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm9TRUrxPnYTp4MsZh-gqN5NwvHHffFYWBgBLUjEkMZeuWSGfZc3-s9tHA_-2L2n-zhwNsmvXID53qk4Kd3Dc_LBUEOQGSd3bmpLKUKbKME8xMGigpQfeN9hQ3ltjwbBwwBM6oeRTVoQg/s1600-h/image%25255B19%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE3uMWfgbj5y_2kWvpXwF3kzJW-ZJkIIFUycmT1pNK4dN4MjmEne2KHooWSRjaF5CqEDQgMkzAufnjkHtIRWgrcD18m5tRUkbjp34poDhy7LPLPaFPO3wWII6di-eS3Ir2zkcFK56RSSI//?imgmax=800" width="461" height="370" /></a></p> <p>Yeah, there’s a higher point behind us that we can’t quite see.  In math this is a “local maximum” where we’ve found the “highest point” but only if we constrain the graph we are looking at.</p> <p>So can we find a global maximum?  Or at least a higher local maximum?  Why can’t we see it?  And how do we get there?</p> <p>Most retrospective practices (Stop/Start/Keep style activities) will generally get us incremental improvement and will usually lead us to these local maxima.  I’m a big fan of retrospectives and incremental improvement so I’m not bashing these in the general case.  We need to do this once we find a hill to climb, but sometimes we need to find a new hill.</p> <p>So what can we do to find a new hill?  We need to shake up our team and give them a <a href="http://www.thiagi.com/pfp/IE4H/november2011.html#Toolkit">Jolt</a>.  While I have several ideas how to do that, today I’m going to focus on one: Defining and Focusing on Team Values.</p> <h4>Team Values?</h4> <p>Whether you’ve defined them or not, your team has unspoken values. The value in defining them and talking about them is ensuring that there is common understanding in the team and giving a common language for the team to use.  The values give you a framework for decision making, especially around <strong>how </strong>you will execute.  </p> <p>For example, if your team values “time to market” they might take shortcuts and hack something together but a different team that values “maintainability” may take more time to deliver, but will be more maintainable in the future.  (We can debate the relative merits of each of these and if they are really in conflict but this is just an example.)</p> <h4>Team Values Round 1</h4> <p>On my team, earlier this year we came up with eight team values.  When asked what our team values were, we struggled to remember all eight.  We didn’t really know how to focus on all eight or even did a good job of picking one to focus on.</p> <h4></h4> <h4>Lencioni’s Value Model</h4> <p>In <a href="http://www.amazon.com/gp/product/0470941529/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=0470941529&linkCode=as2&tag=clemhome-20">The Advantage</a> by Patrick Lencioni he describes four different types of values.</p> <ul> <li>Permission to Play – These are values like “integrity” that if you don’t have them, you’re not going to be around long anyway so they are really just a required baseline.</li> <li>Core – These are the values that you currently believe in and embody as a team.  They are also central to what the team is and how they do things.</li> <li>Aspirational – These are values that you want to have as an organization but you’re working on.</li> <li>Accidental – These are values that the organization has developed but you’re not quite sure if you like them or not.</li> </ul> <p>This, in some ways, is a Start/Stop/Keep (Aspirational/Accidental/Core) activity, but at a value level that makes you step back and take a wider view.  In our original list, we didn’t differentiate between different types of team values which didn’t give us a place to focus.</p> <h4>Team Values Round 2</h4> <p>So in a recent retrospective, I explained Lencioni’s model of value types and then challenged the team to refine the list to 5 values and classify them as either Core or Aspirational.</p> <p>The concept of “Permission to Play” gave us a term to talk about certain values that were proposed and exclude them.  Using Lencioni’s model helped us to clarify why we wanted to certain values listed.</p> <p>We started with the eight that we had originally come up with and I threw out several additional ideas including the <a href="http://www.extremeprogramming.org/values.html">XP values</a>, the values from the <a href="http://agilemanifesto.org/">Agile Manifesto</a> and <a href="http://manifesto.softwarecraftsmanship.org/">Software Craftsmanship Manifesto</a> and other sources.</p> <p>As a framework for voting and subsequent discussion, we used <a href="http://freechild.org/Firestarter/Fist2Five.htm">Fist-to-Five</a> voting (we nick named it “Fist voting”) to decide if values were in or out and if they were Core or Aspirational.  While it might seem silly to quibble over such things, I often go back to this quote:</p> <blockquote> <p>Often the true value of a thing isn’t the thing itself, but instead the activity that created it.</p> <p align="right">-Dave Thomas</p> </blockquote> <p align="left">I found the discussion and the clarification of thoughts and terms to be one of the most valuable aspects of this exercise.  We came to a better common understanding by forcing each other to clarify what we meant with different values.</p> <p align="left">One example of this was one of the original eight values was “teamwork”.  As we talked about it, it seemed like this might be “permission to play” or at least too broad and poorly defined.  So we debated about words.  What word or phrase would better embody what we really felt we had or needed as a team.</p> <p align="left">Eventually “Team Ownership” was proposed.  The team liked it but the team was split on whether or not it was Core or Aspirational.  This might seem trivial, but the divide produced a valuable discussion around what that really meant.  Half thought “well, we help each other out and pitch in when needed already, seems like it’s Core” while the others thought “we often have our own areas we’re working in and not really collectively owning all the code or even all the tests”.  Clarifying how we wanted to define Team Ownership drove us to decide it was Aspirational.</p> <h4 align="left">Now we have them… so what?</h4> <p align="left">Once we defined what our values were, we used a variation on the <a href="http://tastycupcakes.org/2011/12/values-driven-retrospective-game/">Values-driven Retrospective</a>.  Specifically we used the Believe Statement format (which is <strong>We Believe in <em>[insert value], </em>therefore we will <em>[insert what we do]</em></strong>) to generate ideas of what actionable items to work on.  From there we used <a href="http://martinfowler.com/bliki/DotVoting.html">dot voting</a> to narrow the field and decide.</p> <p align="left">The other value that our values has given us is the framework to talk about what and how we are going to do our work in a more focused way.  </p> <p align="left">I hope that this method can help you and your team to jump off your local maxima and find a taller hill to climb as a team.</p> <h4>Addendum</h4> <p>For those interested, our team values are currently (in no particular order):</p> <ul> <li>Core</li> <ul> <li>Learning</li> <li>Testability</li> <li>Sustainable Pace</li> </ul> <li>Aspirational</li> <ul> <li>Ease</li> <li>Team Ownership</li> </ul> </ul> <p>They actually ended up very similar to our first eight, but more focused.  As a side note, I fully expect to reexamine these again in the future.  As our team changes and grows, our values will likely need some tweaking.</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-25638629322017827652012-09-12T10:42:00.001-04:002012-09-12T10:42:34.023-04:00Global Day of Coderetreat 2012: Utah Style<p>Global Day of Coderetreat (GDCR) is coming up on December 8th this year.</p> <p>Don't know what Coderetreat is? Check out <a href="http://coderetreat.org/about">http://coderetreat.org/about</a></p> <p>Don't know what GDCR is? Check out <a href="http://www.facebook.com/l.php?u=http%3A%2F%2Fglobalday.coderetreat.org%2F&h=kAQHAoJDfAQGdDFS2hLnZO9-GElL8FrDAvsVu55cudGMg-w&s=1">http://globalday.coderetreat.org/</a></p> <p>Pluralsight (<a href="https://twitter.com/pluralsight">@pluralsight</a>) and Ancestry.com (<a href="https://twitter.com/Ancestrydotcom">@Ancestrydotcom</a>) are sponsoring two Coderetreats in Utah. David Adsit (<a href="https://twitter.com/davidadsit">@davidadsit</a>) is organizing both (I personally think he's a little crazy for doing that, but David is a little crazy). They will be at the two Pluralsight offices (Layton and Lehi).</p> <p>You can register for one of the two events below on Eventbrite.</p> <p>If you’re in Utah County or South Salt Lake County… <br />Facilitated by Kay Johansen (<a href="https://twitter.com/utahkay">@utahkay</a>) <br /><a href="http://lehi-ut-coderetreat.eventbrite.com/">http://lehi-ut-coderetreat.eventbrite.com/</a> <br /><a href="http://coderetreat.org/events/global-day-of-coderetreat-2012-lehi-utah-us">http://coderetreat.org/events/global-day-of-coderetreat-2012-lehi-utah-us</a></p> <p>If you live further north… <br />Facilitated by Jim Cooper (<a href="https://twitter.com/jimthecoop">@jimthecoop</a>) <br /><a href="http://layton-ut-coderetreat.eventbrite.com/">http://layton-ut-coderetreat.eventbrite.com/</a> <br /><a href="http://coderetreat.org/events/global-day-of-coderetreat-2012-layton-utah-us">http://coderetreat.org/events/global-day-of-coderetreat-2012-layton-utah-us</a></p> <p>If you have any questions, please feel free to contact David or me directly or check out <a href="http://www.facebook.com/l.php?u=http%3A%2F%2Futahsc.org%2F&h=JAQE35J0TAQEzPIn4AO-2imXmiA2VtrmPfiHY1IKShSd3aw&s=1">http://utahsc.org/</a> for more updates.</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-67818005326205121882012-09-08T10:25:00.001-04:002012-09-08T10:25:02.454-04:00Agile and the Chasm<p>In the book <a href="http://www.amazon.com/gp/product/B000FC119W/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B000FC119W&linkCode=as2&tag=clemhome-20">Crossing the Chasm: Marketing and Selling Technology Project</a>, Geoffrey Moore discusses the idea that technologies start with early adopters and at some point must “cross the chasm” to majority.</p> <p><img src="http://www.smcubedconsulting.com/wp-content/uploads/2011/07/crossing_the_chasm2.png" /></p> <p>At the recent <a href="http://tech.groups.yahoo.com/group/sl-agile/">Salt Lake Agile Roundtable meeting</a>, there was a brief exchange on if Agile had crossed the chasm.</p> <p>My thought (which is <a href="http://blog.softwareontheside.com/2012/09/does-manifesto-matter.html">informed by recent experiences with the majority</a>) is that the term “Agile” and some of the practices (Scrum/Scrum-like practices) have crossed the chasm but the values expressed in <a href="http://agilemanifesto.org/">the manifesto</a> have not.</p> <p>What do you think?  What has your experience been?</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-56829881124434816702012-09-07T00:54:00.001-04:002012-09-07T00:54:40.757-04:00Does the Manifesto matter?<p>I recently had the chance to interview candidates for a position on my team.  I put together a list of questions that I believed would be a unique and effective way of phone screening candidates.  Without giving away the whole list (I may disclose it later), here are the first two questions:</p> <ol> <li>Tell me something about yourself that isn’t on your resume.</li> <li>Are you familiar with the Agile Manifesto?</li> </ol> <p>I had two out of seven candidates that I phone screen answer in the affirmative to question 2.  Now not being familiar with the Agile Manifesto isn’t necessarily uncommon, I guess.  But the inconsistency came from the answer to the next question:</p> <p>“What Agile practices are you familiar with and/or have used?”</p> <p>I figured the answers would be “I haven’t used any”.  Because if you have done “Agile practices” you’d certainly know what the Agile Manifesto is, right… right?</p> <p>BUT…</p> <p>the answers were mostly in the “like, Scrum? Stand ups? Yeah, we do that stuff on my team.”</p> <p>So… these candidates had presumably been introduced to the term Agile, to some Agile practices but hadn’t taken the time to investigate further, to understand the roots of the Agile movement, to do a quick Google search!  Granted none of them had incredible answers to the Agile practices question, but they did have answers.</p> <p>I guess I just don’t get it.  I mean, I do.  But I don’t.</p> <p>Would this matter to you?</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com6tag:blogger.com,1999:blog-7414512759580466.post-74988204658345262482012-06-15T12:40:00.001-04:002012-06-15T12:40:58.240-04:00CodeRandori.com and AgileCodeGames.com<p>I recently purchased these domains and while I have plans for them, I haven’t done anything yet.  So I decided to just have them forward here to my blog for the time being.</p> <p>The plan for CodeRandori.com is to have a “one stop” resource for what a Code Randori is, how to facilitate and some example problems to use.</p> <p>I’m not entirely sure about AgileCodeGames.com  I was thinking maybe to have a “<a href="http://tastycupcakes.org/">Tasty Cupcakes</a>”-like site but for coding games (like katas and randori and pairing games) but I’m not sure.</p> <p>So what do you think?  Any ideas on what to build at these domains beyond what I’ve planned?</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-31015708857040030252012-05-08T00:41:00.001-04:002012-05-08T00:41:04.616-04:00On Speaking… and not speaking<p>So as I mentioned <a href="http://blog.softwareontheside.com/2012/02/expanding-my-speaking-footprint-in-2012.html">in a previous post, I’m working to expand my speaking footprint this year beyond Utah</a>.  This started out pretty well with a three session gig at <a href="http://boisecodecamp.com/">Boise Code Camp</a> which was a blast.  There is a great dev community up in Boise and I plan on going back next year.  I was able to attend <a href="http://www.agilegames2012.com/">Agile Games 2012</a> in Boston which was amazing.  Need to do a write up on that soon before everything leaks out of my brain :)   Again, more great people and I felt super enriched after the three days.</p> <p>Unfortunately, around that time, my sessions were turned down for <a href="http://madexpo.us/">MADExpo</a> and <a href="http://chicagocodecamp.com/">Chicago Code Camp</a>.  I was pretty bummed about it, more than I thought I would be.  I plan to try again next year and market my sessions better.  Need to figure out how to get more buzz words into my titles :)</p> <p>Happily I have been accepted to <a href="http://www.agileroots.com/">Agile Roots</a>.  I’ll be running “Hands-on Group TDD with Randori” (title pending).</p> <p>Additionally, I’ll be presenting at the <a href="http://utahdnug.org/">Utah .Net User Group</a> this Thursday (May 10, 2012) on “<a href="http://www.slideshare.net/mdclement/linq-from-the-inside">Linq (from the inside)</a>”. </p> <p>I’m still waiting on <a href="http://portlandcodecamp.com/">Portland Code Camp</a> and <a href="https://seattle.codecamp.us/">Seattle Code Camp</a> which I hope to still speak at.  I’ll likely go to Portland Code Camp either way as we’ll be in Portland to visit family.</p> <p>I am hoping to attend <a href="http://scna.softwarecraftsmanship.org/">SCNA in Chicago</a> in November.  And that should round out the year.  Should be exciting!</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com1tag:blogger.com,1999:blog-7414512759580466.post-74497379104547673342012-03-13T00:40:00.001-04:002012-03-16T17:15:39.382-04:00Utah Code Camp Spring 2012 Slide Decks<p>I had the opportunity to speak at Utah Code Camp again (my fourth code camp presenting <a href="http://blog.softwareontheside.com/2011/09/utah-code-camp-fall-2011-slide-decks.html">Fall 2011</a> <a href="http://blog.softwareontheside.com/2011/04/utah-code-camp-spring-2011-slide-decks.html">Spring 2011</a> <a href="http://blog.softwareontheside.com/2010/08/msbuild-presentation-may-2010-udnug.html">Fall 2010</a>) which was a lot of fun. Not sure if I would do three presentations again, but it was a lot of fun and I met a lot of great people.</p> <p>If you attended one of my sessions, please take a minute to rate the session at SpeakerRate (not official eval… please do that too):</p> <ul> <li><a href="http://speakerrate.com/talks/9313-code-katas-practicing-your-craft">Rate Code Katas: Practicing Your Craft</a> </li> <li><a href="http://speakerrate.com/talks/9430-randori-group-practice">Rate Randori: Group Practice</a>  </li> <li><a href="http://speakerrate.com/talks/9312-linq-from-the-inside">Rate Linq (from the inside)</a> </li> </ul> <p>Here are the slide decks. Contact me with any questions!</p> <div style="width: 425px" id="__ss_11981826"><strong style="margin: 12px 0px 4px; display: block"><a title="Randori: Group Practice" href="http://www.slideshare.net/mdclement/randori" target="_blank">Randori: Group Practice</a></strong> <object id="__sse11981826" width="425" height="355"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=randori-120312223307-phpapp01&rel=0&stripped_title=randori&userName=mdclement" /> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always" /> <param name="wmode" value="transparent" /> <embed name="__sse11981826" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=randori-120312223307-phpapp01&rel=0&stripped_title=randori&userName=mdclement" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"></embed> </object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mdclement" target="_blank">Mike Clement</a> </div> </div> <p>The Randori starter project is available at <a href="https://github.com/mdclement/NumbersToLcdRandoriBase">https://github.com/mdclement/NumbersToLcdRandoriBase</a></p> <p>The Code Katas session was presented as two slide decks.  One with the introductory material and the other with the guided FizzBuzz kata.</p> <div style="width: 425px" id="__ss_11981789"><strong style="margin: 12px 0px 4px; display: block"><a title="Code Katas Spring 2012" href="http://www.slideshare.net/mdclement/code-katas-spring-2012" target="_blank">Code Katas Spring 2012</a></strong> <object id="__sse11981789" width="425" height="355"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=codekatas2012-120312222753-phpapp01&rel=0&stripped_title=code-katas-spring-2012&userName=mdclement" /> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always" /> <param name="wmode" value="transparent" /> <embed name="__sse11981789" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=codekatas2012-120312222753-phpapp01&rel=0&stripped_title=code-katas-spring-2012&userName=mdclement" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"></embed> </object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mdclement" target="_blank">Mike Clement</a> </div> </div> <div style="width: 425px" id="__ss_11981736"><strong style="margin: 12px 0px 4px; display: block"><a title="FizzBuzz Guided Kata" href="http://www.slideshare.net/mdclement/fizzbuzz-guided-kata" target="_blank">FizzBuzz Guided Kata</a></strong> <object id="__sse11981736" width="425" height="355"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=fizzbuzzguidedkata-120312222055-phpapp01&rel=0&stripped_title=fizzbuzz-guided-kata&userName=mdclement" /> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always" /> <param name="wmode" value="transparent" /> <embed name="__sse11981736" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=fizzbuzzguidedkata-120312222055-phpapp01&rel=0&stripped_title=fizzbuzz-guided-kata&userName=mdclement" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"></embed> </object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mdclement" target="_blank">Mike Clement</a> </div> </div> <div style="width: 425px" id="__ss_11981535"><strong style="margin: 12px 0px 4px; display: block"><a title="Linq (from the inside)" href="http://www.slideshare.net/mdclement/linq-from-the-inside" target="_blank">Linq (from the inside)</a></strong> <object id="__sse11981535" width="425" height="355"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=linqfromtheinside-120312215840-phpapp02&rel=0&stripped_title=linq-from-the-inside&userName=mdclement" /> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always" /> <param name="wmode" value="transparent" /> <embed name="__sse11981535" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=linqfromtheinside-120312215840-phpapp02&rel=0&stripped_title=linq-from-the-inside&userName=mdclement" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"></embed> </object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mdclement" target="_blank">Mike Clement</a> </div> </div> <p>The code base that I started from (tests and methods without implementation) is available at <a href="https://github.com/mdclement/Linq--from-the-inside--Presentation-Base">https://github.com/mdclement/Linq--from-the-inside--Presentation-Base</a></p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-1694764322529285632012-02-24T02:36:00.001-05:002012-03-13T00:41:41.072-04:00Expanding my Speaking Footprint in 2012<p>So one of the things that I plan to do more of this year is presenting at Code Camps and the like.  I’ve presented several times at <a href="http://www.linkedin.com/in/dbaduck">Utah Code Camp</a> (<a href="http://blog.softwareontheside.com/2011/04/utah-code-camp-spring-2011-slide-decks.html">Spring 2011</a>, <a href="http://blog.softwareontheside.com/2011/09/utah-code-camp-fall-2011-slide-decks.html">Fall 2011</a>), but want to expand my footprint.  So, I’m currently submitted to <a href="http://boisecodecamp.com/">Boise Code Camp</a>, <a href="http://chicagocodecamp.com/">Chicago Code Camp</a> and <a href="http://madexpo.us/">MADExpo</a>.  Over the next few weeks/months I’ll see how well my session topics are received outside of the Utah community.  I also plan to submit to <a href="http://portlandcodecamp.com/">Portland Code Camp</a> and <a href="http://www.agileroots.com/">Agile Roots</a> this year once their calls for speakers are open. </p> <p>If you’ve attended (and hopefully enjoyed) previous sessions that I’ve presented, please rate me at <a href="http://speakerrate.com/mdclement">http://speakerrate.com/mdclement</a></p> <p>The topics that I’ve been submitting (and that I’ll be presenting at Utah Code Camp Spring 2012) are listed below along with the abstract.  I’m looking forward to an exciting year of meeting with developer communities both inside and outside of Utah!</p> <h4>Linq (From the Inside)</h4> <p>Knowing how to use Linq is useful if you're doing any coding using .NET 3.5 or newer.  But have you ever thought about what is going on "under the hood"?</p> <p>Join us as we dive into the guts of Linq and implement Linq extension methods such as Where, Select, Any, All and Sum.  Not only is it interesting to see what's going on, it'll help you to build better code using Linq.</p> <h4>Code Katas: Practicing your Craft</h4> <p>One of the key values as part of the Software Craftsmanship movement is to be "skill-centric" and as part of that, practicing our skills as software developers is key! The Code Kata format is a coding exercise that is repeated and perfected. It provides one of many ways to practice the craft of software development. We'll discuss the Code Kata format, introduce a few katas and discuss some other practice formats.</p> <p>I will be guiding the Kata in C# (no previous knowledge necessary though). As this is hands on, to take full advantage of the session have Visual Studio or SharpDevelop installed, NUnit installed (or via NuGet) and an integrated unit test runner (recommend Resharper or NCrunch for VS).</p> <h4>Randori: Group Practice</h4> <p>Looking for a new way to practice your craft? Randori provides a complementary way type of training when compared with katas. </p> <p>Elements of Randori are: Pair Programming, Pair changes with mechanism (Time box, Ping Pong), Start from scratch, Use TDD, Everyone should be following, Pair should be explaining, Audience gives suggestions only with when Green</p> <p>An example is at <a href="http://vimeo.com/2499540">http://vimeo.com/2499540</a> . This is a hands on session!</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-27178268048128730572012-01-31T16:28:00.001-05:002012-01-31T16:28:07.399-05:00But I really learned from writing: Quote of the Week<p><em>Note</em>: Might be silly to call this a “quote of the week” given that it’s been years since I posted one but… oh well.</p> <p>Heard this this morning on NPR from an interview with the composer Philip Glass:</p> <blockquote> <p>What this amount of music has done for me is taught me how to write music. Oh, I had great teachers. Boulanger was one. Another was Ravi Shankar. And I went through the Juilliard process, and that was good, too. <strong>But I really learned from writing</strong>, which is how painters learn to paint, and writers learn to write, and how even dancers learn to dance. In a way, that's true. But what was the value of being so prolific? It's how I learned my trade.</p> <p align="right">Philip Glass from <a href="http://www.npr.org/2012/01/31/146095212/philip-glass-at-75-listening-with-heart-not-intellect">Philip Glass At 75: Listening With Heart, Not Intellect</a></p> </blockquote> <p>What I heard in there is "But I really learned from writing, which is how painters learn to paint, and writers learn to write, and how even <strong><em>coders </em>learn to <em>code</em></strong>."</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com1tag:blogger.com,1999:blog-7414512759580466.post-87085571283557015822011-09-13T02:44:00.001-04:002011-12-22T15:10:02.066-05:00Utah Code Camp Fall 2011 Slide DecksI had the opportunity to present at the <a href="http://utahcodecamp.com/">Fall 2011 Utah Code Camp</a> on September 10, 2001. I have uploaded my slides to Slideshare. <br />
If you attended one or both of my sessions, please take a few minutes to evaluate the sessions at SpeakerRate. <br />
<ul>
<li><a href="http://speakerrate.com/talks/8298-code-katas-learning-your-craft">Rate "Code Katas: Practicing Your Craft"</a> </li>
<li><a href="http://speakerrate.com/talks/8297-power-of-patterns-or-more-than-programming-with-objects">Rate "Power of Patterns OR More than Programming with Objects"</a> </li>
</ul>
On both of these presentations, you’ll be able to glean things more from the speaker notes than from the slides. I plan on posting more on each of these subjects later.<br />
<div id="__ss_9234635" style="width: 425px;">
<strong style="display: block; margin: 12px 0px 4px;"><a href="http://www.slideshare.net/mdclement/power-of-patterns-or-more-than-programming-with-objects" target="_blank" title="Power of Patterns OR More Than Programming with Objects">Power of Patterns OR More Than Programming with Objects</a></strong> <iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9234635" width="425"></iframe> <br />
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px;">
View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mdclement" target="_blank">Mike Clement</a> </div>
</div>
The Code Katas session is divided into two slide decks; one for the session specific slides and another for the slides for the Bowling Game Kata in C#. <br />
<div id="__ss_9234580" style="width: 425px;">
<strong style="display: block; margin: 12px 0px 4px;"><a href="http://www.slideshare.net/mdclement/code-katas-practicing-your-craft" target="_blank" title="Code Katas: Practicing Your Craft">Code Katas: Practicing Your Craft</a></strong> <iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9234580" width="425"></iframe> <br />
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px;">
View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mdclement" target="_blank">Mike Clement</a> </div>
</div>
<div id="__ss_9235104" style="width: 425px;">
<strong style="display: block; margin: 12px 0px 4px;"><a href="http://www.slideshare.net/mdclement/bowling-game-kata-in-c-adapted" title="Bowling Game Kata in C# Adapted">Bowling Game Kata in C# Adapted</a></strong><object height="355" id="__sse9235104" width="425"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bowlinggamekatacadapted-110913013206-phpapp02&stripped_title=bowling-game-kata-in-c-adapted&userName=mdclement" />
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<embed name="__sse9235104" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bowlinggamekatacadapted-110913013206-phpapp02&stripped_title=bowling-game-kata-in-c-adapted&userName=mdclement" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <br />
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px;">
View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mdclement">Mike Clement</a>.</div>
</div>Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-15676556621860298072011-04-12T01:38:00.001-04:002011-04-12T01:38:09.757-04:00Utah Code Camp Spring 2011 Slide Decks<p>As I’m sure at some point they will not be available on the <a href="http://utahcodecamp.com/Downloads">Utah Code Camp downloads page</a>, I’ve gone ahead and posted my slide decks from my sessions on SlideShare.  They are not entirely comprehensible, especially the Rhino Mocks one since the majority of the time was spent in code.  I’ll get that posted soon as well.</p> <div style="width: 425px" id="__ss_7595887"><strong style="margin: 12px 0px 4px; display: block"><a title="Using Rhino Mocks for Effective Unit Testing" href="http://www.slideshare.net/mdclement/using-rhino-mocks-for-effective-unit-testing">Using Rhino Mocks for Effective Unit Testing</a></strong> <object id="__sse7595887" width="425" height="355"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=usingrhinomocksforeffectiveunittesting-110412002507-phpapp01&stripped_title=using-rhino-mocks-for-effective-unit-testing&userName=mdclement" /> <param name="allowFullScreen" value="true" /> <param name="allowScriptAccess" value="always" /> <embed name="__sse7595887" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=usingrhinomocksforeffectiveunittesting-110412002507-phpapp01&stripped_title=using-rhino-mocks-for-effective-unit-testing&userName=mdclement" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed> </object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mdclement">mdclement</a> </div> </div> <div style="width: 425px" id="__ss_7595928"><strong style="margin: 12px 0px 4px; display: block"><a title="Software Craftsmanship" href="http://www.slideshare.net/mdclement/software-craftsmanship">Software Craftsmanship</a></strong><object id="__sse7595928" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwarecraftsmanship-110412003345-phpapp01&stripped_title=software-craftsmanship&userName=mdclement" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed name="__sse7595928" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwarecraftsmanship-110412003345-phpapp01&stripped_title=software-craftsmanship&userName=mdclement" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mdclement">mdclement</a>.</div> </div> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-23747445955180239242011-03-19T00:24:00.001-04:002011-03-19T00:24:57.710-04:00Lessons from Laser Tag: Metrics and Feedback Loops<p><em>Recently the Utah Development Center at Microsoft (where I work) had a “morale event” (I still think it’s funny that they explicitly call them that) where we visited a local laser tag place.  We played three times and each time I ended up in the middle of the pack (yeah, I’m not that good).  But I did see some interesting lessons that could be taken from the experience.  Here is one of those lessons.</em></p> <p><img style="display: inline; float: right" align="right" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU_sks3G5jVQROIZqdIeouOb0C7GEZjGQWeKKIsoIQvBPsUM2pZWYVnZhSEv14-e_txExPsBScv1Phq5PCpzkitWzGxSnRov_11FiCszUnQdBrD5xcy7bRq8-Oo84IAgkKZp0WtA_86RI/s1600/laser+tag.jpg" width="345" height="230" />After the first round, an interesting thing happened.  We each got a printed “score card” to tell us how we had done.  It had how many kills, how many timed you were killed, breakdown by opposition player (friendly fire was off), number of shots fired, accuracy percentage and some overall team stats.  The one additional number on the sheet was “rank”.  Being good little programmers/engineers, most of us started to try to reverse engineer the ranking algorithm.  It appeared to be surprisingly simple.  We were ranked by number of kills. (I don’t think this was confirmed, but we suspected that number of timed you were killed was used as a tie breaker.)</p> <p>It was like the game totally changed.  <em>Because it did.</em></p> <p>Suddenly the feedback loop from the metrics used gave us this: Don’t worry about accuracy percentage, don’t worry about the number of times you get killed.  Kill the most people and you win. The only thing that matters to your rank is number of kills.  The next game the overall kill count went up significantly (about 20% increase).</p> <p>Metrics have the tendency to focus us like this, which is super powerful.  But remember, with that great power comes great responsibility.  While many still played for “team pride”, for some people the individual ranking became the most important personal metric of success.  If you no longer care about the success of your team, the number of kills that you sustain no longer matters.  It is not a metric that you care about. <strong>All that matters is getting the most individual kills.</strong></p> <p><strong>Choose the metrics that you use with care.</strong></p> <p>A recent real life example that I heard went something like this: The manager of a development group doing SINO (Scrum in name only) set a goal for the group that “this year, we’re going to get everything done that we commit to for a sprint done in that sprint.”  This is a well intentioned goal.  Basically do what you say you’re going to do.  BUT, if that is the metric used, what happens to the amount of work committed to in a given sprint?  In order to do well against the metric, the amount of work committed to drops (or estimates are WAY high).  Suddenly half way through a sprint (or less) the developers have completed the work that had been committed to.  <strong>All that matters is getting the work committed to done.</strong></p> <p>Some managers reaction would be to think, “Well, that didn’t work, lets add some more metrics to get what I want.  Let’s continue to try to control the system.”</p> <p>That may or may not be the best approach.  Eventually you may end up with a system that is so bogged down with itself that no work actually gets done.</p> <p>I’m not saying that metrics are bad.  They can be very, very good and are very, very powerful.  Just be sure that you’re using the right tool for the right job.  Don’t use a nail gun where the gentle tap of a hammer is the right thing.</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-57371034964914486532011-03-03T03:09:00.001-05:002011-03-03T03:09:13.861-05:00Prime Factors Kata in C#<p>I recently led a practice of the Prime Factors Kata in C# at the <a href="https://groups.google.com/forum/#!forum/ut-software-craftsmanship">Utah Software Craftsmanship Group</a>.  I couldn’t find a C# version, so I adapted the <a href="http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata">Java version that Uncle Bob posted</a> back in 2005.  I’ve done a recording of me practicing the kata so that others can practice it.  I recorded it at a fairly high resolution (approximately 1920x1080) which means you’ll need to watch it on a screen around that size in order to make out the text in most cases… sorry, this is my first attempt at screen capture of a coding exercise… I’m sure I’ll get better with practice!</p> <p>Enjoy!</p> <iframe height="281" src="http://player.vimeo.com/video/20591562" frameborder="0" width="500"></iframe> <p><a href="http://vimeo.com/20591562">Prime Factors Kata in C#</a> from <a href="http://vimeo.com/user6193249">Mike Clement</a> on <a href="http://vimeo.com">Vimeo</a>.</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com1tag:blogger.com,1999:blog-7414512759580466.post-23209416124005070162011-01-12T03:28:00.001-05:002011-01-12T03:28:56.869-05:00But We Can Get ‘em Cheap!<p>What’s wrong with that phrase?  A better question would be is there anything right with it…</p> <p>“But we can get ‘em cheap” is the ultimate lie, especially in hiring.  Now, that’s not to say that you can’t get quality team members for “cheap”.  BUT, when you preface that with “but” it means that you don’t really want to hire that candidate.  It means that you are attempting to justify a bad hire with a claim of “cost savings”.</p> <p>But the lie is that you’re not really saving money.</p> <p>Let’s say that this “get ‘em cheap” candidate (A) would somehow accept an offer of $45K.  But you have doubts.  You wonder why somebody would take such a low salary with the experience that they claim on their resume, but you go ahead, extend the offer.  Surprisingly they except your low offer and so you get ready for your new employee.</p> <p align="right">In a parallel universe, you passed on candidate A because they weren’t good enough, even if you could “get ‘em cheap”.  So you keep looking, and maybe looking some more.  So you’re going to incur additional costs in the recruiting/hiring process.  But you’re confident that you’ll find a quality candidate if you keep looking.</p> <p align="right">So you keep looking.</p> <p align="right">And looking.</p> <p align="right">And looking.</p> <p align="right">And then you find candidate B.</p> <p align="right">But you’re pretty sure that they’re going to want at least $80K if not more.  And sure enough, after some negotiation, you settle on $90K.  Plus you definitely spent more time and money looking than you wanted to.  You’re pretty sure it’ll be worth it though.</p> <p>Back in candidate A land, you start doing training.  You’re explaining a concept and you can tell your new hire isn’t quite getting it.  They are nodding away, but you’re pretty sure they just aren’t asking questions because they don’t want to appear incompetent.  You get the feeling that they are following the old motto “better to keep your mouth closed and be thought a fool than to open it and remove all doubt” might be your new hire’s strategy, but you can’t tell so you write it off as you just not being able to read them.  But you get the same feeling as you go through your other training sessions.  He also comes and asks some questions that are a little weird… and repetitive.  </p> <p>But he was cheap right?  Well you’re now not only paying A’s salary but now wasting one of your productive developer’s time.  A’s not really getting much done, but you figure it’ll just take a little longer for him to ramp up.  But he keeps bugging your devs… and soon you realize that the new hire has been rotating around who he asks questions in order to make it less noticeable that he doesn’t know what he’s doing… so instead of repeating a question twice, it’s really that he’s asked it five times… and in code review it comes out that he still doesn’t get it.</p> <p>So two months later you’ve tried and tried and things aren’t working out.  You have encouraged, warned and helped as much as you feel you can, but it’s just not working out.  Not only has A been minimally productive himself, he’s constantly needed help from others which means that your team hasn’t been as productive.  So you end up firing A and start looking again, until you find someone that you can “get cheap”…</p> <p align="right">Meanwhile in the parallel universe, candidate B is asking all the right questions… once.  You see the light turn on in his head as you explain your system architecture.  And the questions that he asks help you understand that maybe there are some improvements that could be made to your framework code to help ease development.  B is productive within two weeks and at the end of their second four week sprint has gotten as much done as most “ramped up” devs.</p> <p align="center"><strong>So which is the better deal?  Which really is cheaper?</strong></p> <p><strong>“But we can get ‘em cheap” to me is the ultimate red flag.</strong>  It means that more than likely you’re getting a low quality candidate for a low salary but at a cost that is really higher than anybody should be willing to pay.</p> <p>Are there ways to get good devs less expensively?  Sure!  Interns and new college hires can be a great way to get bright devs that can be trained easily relatively inexpensively.  But even that is not an endless pool as you still need more senior devs to mentor and train them.</p> <p>There is another hidden cost/benefit that comes with a new hire, and this is probably one of the most costly: What do your other devs think when that new hire walks in the door for the first day?  Do they think “what a great addition to the team!” or “oh boy, I can’t believe I work here where they hire these people”.  <strong>Building a great team means that every hire counts. There is no room for “meh” team members on a great team.</strong>  Should they all be great in the same way? No! But they all should be great at something the team needs.</p> <p>Even if your A turned out “okay” (half as productive as B, but decently productive) and you could hire two of them for the same salary as (or even less than) B, <strong>B would still be a better deal </strong>because 1) fixed per employee costs (like hardware, software, health insurance, benefits) and 2) your communication graph is smaller.  Your team will be tighter and more productive with a single solid performer that is able to raise the performance of the whole team than two blah performers.  Smart people want to work with smart people!</p> <p>Just remember, if you hear “but we got ‘em cheap” when frustrated with a new hire, you’ll probably be hearing the same thing in 6 months when you’re training his replacement.</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com2tag:blogger.com,1999:blog-7414512759580466.post-84553281725097778892011-01-10T03:02:00.001-05:002011-01-10T03:02:11.296-05:00Promotion != Management<p>Are you familiar with the <a href="http://en.wikipedia.org/wiki/Peter_Principle">Peter Principle</a>?  In a sentence, it states that employees are promoted to their level of incompetence.  Think about that for a second.</p> <p>Sure it’s kinda cute and makes you chuckle, but what does that really mean for your organization?  It means you have a certain percentage of your employees/co-workers that are incompetent at their current positions.  The scary thing is that most of these people are in management positions… they are running your company.  </p> <p>The sad thing is that these same people were most likely competent <strong>if not exceptional </strong>in another non-management position in your company.  How else did they get promoted to that management position if not by demonstrating competence in another role?  But that also means that <strong>there are people in your organization that are getting paid to fail instead of being put in a position to succeed</strong>.</p> <p>So the question is why?  Why waste all this talent and ability?  Why not put them in a position to succeed?  Because to put them in their old positions would often result in a “demotion” and this is culturally difficult to do.</p> <p>The trick is not to tie promotions to role.  Otherwise you artificially limit promotions/salaries for those in individual contributor positions because they aren’t “moving up” the org chart.  You contribute to a culture that the only way to progress your career is to “get into management”.  This is a mistake.</p> <p>The flawed fundamental assumption is that if you are good at something, you’ll be good at managing people that are doing that something.  Managing people requires a unique skill that is often not found in your top individual performers.  <strong>People management needs to be its own role within your company.</strong>  Those that recognize their limitations and feel that they are best in an individual contributor position may feel less valued in the organization, causing them to leave.</p> <p>On wikipedia it is says that a result of the Peter Principle is that “work is accomplished by those employees who have not yet reached their level of incompetence”.  Make sure that your organization keeps people below their level of incompetence or else who’s going to do the work?</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-52478793474690586742010-10-11T10:15:00.000-04:002010-10-11T10:15:00.122-04:00Culture beats process<p>Last week I tweeted <a href="http://twitter.com/mdclement/statuses/26781690548">“culture leads to behavior; process leads to resentment”</a>.  I thought I’d follow that up…</p> <p>One of the things that I’ve noted in my career is that the natural reaction of many people is to “add process".  We’re introducing bugs late in the release cycle.  Let’s add a check in process.  We’re not sharing code “correctly”.  Let’s add a code sharing process.  Bug information isn’t getting communicated correctly.  Let’s add a bug entry process.</p> <p>A coworker said (though I’m sure he got it from somewhere else): </p> <blockquote> <p>Process is like violence.  If you’re not getting the results you want with it, you’re not using enough.</p> </blockquote> <p>True, if you put enough process around something, you might eventually get your desired result.  Might.  Engineering systems is hard.  Engineering systems that involve people is really hard.  One of the first business books I read was <a href="http://www.amazon.com/gp/product/0887307280?ie=UTF8&tag=mikeonsoftware-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0887307280">The E-Myth Revisited: Why Most Small Businesses Don't Work and What to Do About It</a>.  It was an eye opener.  It described how a business really is a set of processes.  To have “The Manual” that helps things be repeatable.</p> <p>I loved it.  I ate it up.  I need to reread it now and see how much my current view of the world jives with it though.  </p> <p>Because for some things this works.  For example, Ray Kroc and the hamburger.  McDonald’s does not have the best hamburger in the world, but people go back because it’s predictable.  It’s repeatable.  You get the same hamburger, chicken McNuggets, salad, or apple pie pretty much anywhere.  The process, the system makes it happen.  <a href="http://despair.com/motivation.html">But then maybe that job can be done by robots.</a></p> <p>Now where does that break down?  Is the service consistent at each McDonald’s?  No.  As much as the process attempts to enforce this, at each store are different people, with different personalities, different backgrounds and different whatever going on that particular day.</p> <p>This is why culture is more powerful than process.  If you can instill a culture of cheerfully helping customers, your employees will do just that, regardless of “The Manual”.  If you instill a culture of quality code, employees are going to think twice before checking in crappy code.  Maybe they’ll get somebody to review it or give it another pass.  Processes or systems can be a starting point, but without culture they have no meaning.</p> <p>Culture helps people do the right thing.  They might not always do the right thing, but that’s okay.  It’s an opportunity to teach about the culture, not add a process.  Culture is “the why” of a business.  And when you know why, it’s a lot easier to get a great result.  Put too much process around it and you’ll get a robot.</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-6487789197672585452010-10-09T00:51:00.001-04:002010-10-09T00:51:20.050-04:00Can’t Succeed? Redefine Success<p>We set goals.  We set exit criteria.  We define requirements.</p> <p>Unfortunately we don’t always reach our goals, complete our exit criteria, complete all our requirements.</p> <p>So what do we do about that?</p> <p>Now Failure sometimes happens.  Sometimes we completely miss the mark.  But often we simply need to redefine what we see as success.  That might mean adjusting your goals mid-flight.  Maybe fudging the exit criteria for a situation that you didn’t anticipate. Change the requirements based on the evolving understanding of the customer needs.</p> <p>How do we know if we Failed or if we Succeeded?  Most of the time a simple “5 Whys” exercise will get us there.  (Sometimes 1 Why might be sufficient!)  Why did you set that goal?  What is the purpose of the exit criteria?  Why did we define requirements in the first place?  If we failed at “the why”, then we failed.  Otherwise, redefine success and take a victory lap!</p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0tag:blogger.com,1999:blog-7414512759580466.post-68962414267375228642010-08-12T21:05:00.001-04:002010-08-12T21:05:30.720-04:00MSBuild Presentation - May 2010 UDNUG Meeting<p>This last week while thinking about going to the UDNUG (Utah .NET User Group) meeting this week, I realized that I never posted my notes and such from my MSBuild presentation at the UDNUG in May.  So without further ado, <a href="http://sites.google.com/a/softwareontheside.com/files/msbuild-demo-files">here are links to the final demo files</a> and below are my raw notes.  Enjoy!</p> <p>Why MSBuild? <br />.csproj files are MSBuild files <br />MSBuild is distributed with the .NET framework so a VS installation is not required on your build server. </p> <p><a href="http://nant.sourceforge.net/">NAnt</a></p> <p>Primary alternative is NAnt - was pretty much dead (very little activity in the last 4 years, mostly because it had matured and partly because MSBuild released with VS2005/.NET 2.0) <br />Earlier in 2010, .9 version is being worked on (in RC1) which I haven't looked at. </p> <p>Another is Ruby/Rake <br />I plan on looking into this some at some point as it would be nice to have a first class language, instead of XML configuation. <br />info on lostechies.com from Derick Bailey on this topic if you are interested (<a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/04/08/how-a-net-developer-learned-ruby-and-rake-to-build-net-apps-in-windows.aspx">Derick Bailey on Ruby/Rake</a>) <br />But even this uses MSBuild to build the actual projects, just uses Ruby to do additional work around MSBuild </p> <p>While I don't usually use this reason (I have chosen NHibernate over Entity Framework, nUnit over msUnit, etc) the fact that MSBuild is an MS product is useful.  Also it means that your build will be similar to a VS build (but not identical) Also it’s installed wherever the .NET framework is installed.</p> <p>Start with the classic "Hello World" demo </p> <p>Add Target with Message</p> <p>  <Target Name="Hello"> <br />    <Message Text="Hello Utah .NET User Group"/> <br />  </Target> </p> <p>Add Another Target </p> <p>  <Target Name="Before Hello"> <br />    <Message Text="Before Hello"/> <br />  </Target> </p> <p>Now I want Before to run and then Hello. </p> <p>Add "Also Before Hello" <br />  <Target Name="Also Before Hello"> <br />    <Message Text="Also Before Hello"/> <br />  </Target> </p> <p>Move Hello to the end <br />Note that the first target still runs by default.  Can specify any target to run on the command line. </p> <p><a href="http://msdn.microsoft.com/en-us/library/ms164311.aspx">Command Line Reference on MSDN</a></p> <p>Also can specify the "default target" using "DefaultTargets" (default Hello) </p> <p>  <Target Name="Hello Again"> <br />    <Message Text="Hello Again UDNUG!" /> <br />  </Target> </p> <p>Add Hello Again to the default targets.  Note that the targets run in order that they are listed. </p> <p>Add a depends on target to Hello Again: </p> <p>  <Target Name="Hello Again" DependsOnTargets="Before Hello"> <br />    <Message Text="Hello Again UDNUG!" /> <br />  </Target> </p> <p>Run: note that Before Hello ONLY RUNS ONCE. <br />the assumption is that you only want to build dependencies once. </p> <p>Properties <br />  <PropertyGroup> <br />    <MessageFor>Utah .NET User Group (from a Property)</MessageFor> <br />  </PropertyGroup> </p> <p>  <PropertyGroup> <br />    <MessageFor>Utah .NET User Group (from a Property)</MessageFor> <br />    <Today>$([System.DateTime]::Now)</Today> <br />  </PropertyGroup> </p> <p>  <Target Name="HelloProperties"> <br />    <Message Text="Hello $(MessageFor) on $(Today)"/> <br />  </Target> <br />  There are some property names that are reserved for MSBuild. </p> <p>Conditions </p> <p>    <MessageFor Condition="$(MF) == 'UDNUG'">Utah .NET User Group (from a Property)</MessageFor> <br />    <MessageFor Condition="$(MF) == 'UCC'">Utah Code Camp (from a Property)</MessageFor> <br />    <MessageFor Condition="$(MF) == ''">Nobody</MessageFor> </p> <p>Items/Item Groups </p> <p>  <ItemGroup> <br />    <SamplePhotos Include="C:\Users\Public\Pictures\Sample Pictures\*.jpg" /> <br />  </ItemGroup> <br />  <Target Name="Photos"> <br />    <Message Text="Photos: %0A%0D@(SamplePhotos, '%0A%0D')" /> <br />  </Target> </p> <p>Exclude <br />  <ItemGroup> <br />    <SamplePhotos Include="C:\Users\Public\Pictures\Sample Pictures\*.jpg" Exclude="C:\Users\Public\Pictures\Sample Pictures\*house*"/> <br />  </ItemGroup> </p> <p>Well known metadata  <br /><a href="http://msdn.microsoft.com/en-us/library/ms164313(v=VS.100).aspx">Well Known Item Metadata on MSDN</a></p> <p>  <Target Name="PhotosMeta"> <br />    <Message Text="Photo filename: %(SamplePhotos.Filename)%(SamplePhotos.Extension)" /> <br />  </Target> </p> <p>Transforms </p> <p>      <Message Text="Photo filenames: @(SamplePhotos->'%(Filename)%(Extension)')" /> </p> <p>Incremental Builds </p> <p>  <Target Name="Text" Inputs="@(TextFiles)" Outputs="@(TextFiles->'CopyOfTextFiles\%(Filename)%(Extension)')"> <br />    <Message Text="hooray for changeme.txt"/> <br />    <Copy SourceFiles="@(TextFiles)" DestinationFolder="CopyOfTextFiles"/> <br />  </Target> </p> <p>Import </p> <p>Move the following to Demo.Extra.proj </p> <p><Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <br />  <Target Name="Also Before Hello"> <br />    <Message Text="Also Before Hello"/> <br />  </Target> <br /></Project> </p> <p>  <Import Project="Demo.Extra.proj"/> </p> <p>Run the Hello target to show that it's using the other file too. </p> <p><a href="http://msdn.microsoft.com/en-us/library/7z253716(v=VS.100).aspx">Task Reference on MSDN</a></p> <p>MSBuild Community Tasks <br /><a href="http://msbuildtasks.tigris.org/">http://msbuildtasks.tigris.org/</a></p> <p>Show MSBuild.Community.Tasks.Targets <br />Show that it is using the UsingTask tag to import all the tasks. </p> <p>If you didn't use the MSI (in my case I want to have it xCopy buildable), you need to make sure to set MSBuildCommunityTasksPath so that the imported targets file can find the tasks. </p> <p>    <SourcePath>$(MSBuildProjectDirectory)</SourcePath> <br />    <MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(SourcePath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath> </p> <p>    <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> </p> <p>  <Target Name="Zip"> <br />    <Zip Files="@(SamplePhotos)" <br />        ZipFileName="SamplePhotos.zip" /> <br />  </Target> <br />Actually build a project! </p> <p>  <Target Name="Build"> <br />    <MSBuild Projects="@(Projects)"> <br />      <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt"/> <br />    </MSBuild> <br />    <Message Text="Built Assemblies: @(AssembliesBuilt)" /> <br />    <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="."/> <br />  </Target> </p> <p>  <ItemGroup> <br />    <Projects Include="C:\Users\Mike\Demos\MSBuildPrototype\MSBuildPrototype\MSBuildPrototype.csproj"/> <br />  </ItemGroup> </p> <p>New in MSBuild 4.0 <br />Not a lot of experience here, but there are a few features that look pretty exciting.</p> <p><a href="http://msdn.microsoft.com/en-us/library/dd633440(v=VS.100).aspx">New in MSBuild 4 on MSDN</a></p> <p><a href="http://msdn.microsoft.com/en-us/library/dd633440(v=VS.100).aspx">Property Functions</a></p> <p>String (instance) property functions </p> <p>  <Target Name="String"> <br />    <Message Text="MessageFor Length: $(MessageFor.Length)"/> <br />    <Message Text="MessageFor First 2: $(Messagefor.Substring(0,2))"/> <br />  </Target> </p> <p>Static property functions </p> <p>Getting the date before is an example of this. </p> <p>  <Target Name="Math"> <br />    <Message Text="Square root of $(Value) = $([System.Math]::Sqrt($(Value)))" /> <br />  </Target> </p> <p>MSBuild property functions </p> <p>  <Target Name="Add"> <br />    <Message Text="Sum of $(x) and $(y) is $([MSBuild]::Add($(x), $(y)))"/> <br />  </Target> </p> <p>  Can do x and y on separate /p: or use "" to wrap a ; separated pairs <br />RunBeforeTargets and RunAfterTargets </p> <p>Modify this: </p> <p>  <Target Name="Math" AfterTargets="Add" BeforeTargets="String"> <br />    <Message Text="Square root of $(Value) = $([System.Math]::Sqrt($(Value)))" /> <br />  </Target> </p> <p>Math runs After Add and Before String when you run either. </p> <p>Inline Tasks </p> <p>  <UsingTask <br />    TaskName="HelloWorld" <br />    TaskFactory="CodeTaskFactory" <br />    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > <br />    <ParameterGroup /> <br />    <Task> <br />      <Using Namespace="System"/> <br />      <Using Namespace="System.IO"/> <br />      <Code Type="Fragment" Language="cs"> <br />        <![CDATA[ <br />// Display "Hello, world!" <br />Log.LogError("Hello, world!"); <br />]]> <br />      </Code> <br />    </Task> <br />  </UsingTask> </p> <p>  <Target Name="Hello"> <br />    <HelloWorld /> <br />  </Target> <br />Show parameters </p> <p>  <UsingTask <br />    TaskName="HelloWorld" <br />    TaskFactory="CodeTaskFactory" <br />    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > <br />    <ParameterGroup> <br />      <Value ParameterType="System.Int32" Required="true"/> <br />    </ParameterGroup> <br />    <Task> <br />      <Using Namespace="System"/> <br />      <Using Namespace="System.IO"/> <br />      <Code Type="Fragment" Language="cs"> <br />        <![CDATA[ <br />// Display "Hello, world!" <br />Console.WriteLine("hello"); <br />Console.WriteLine(Value * Value); <br />//Log.LogError("Hello, world!"); <br />]]> <br />      </Code> <br />    </Task> <br />  </UsingTask> </p> <p>  <Target Name="Hello"> <br />    <HelloWorld Value="4"/> <br />  </Target> </p> Mike Clementhttp://www.blogger.com/profile/07418040981494491081noreply@blogger.com0