tag:blogger.com,1999:blog-58572567137850019672024-02-20T04:43:21.842-08:00timstallTim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.comBlogger507125tag:blogger.com,1999:blog-5857256713785001967.post-81403853978443650922015-03-14T12:21:00.003-07:002015-03-14T12:22:03.181-07:00Chicago Code Camp 2015 - April 18thIt's coming... Saturday April 18th, now in downtown Chicago<br />
<br />
<a href="http://www.chicagocodecamp.com/">http://www.chicagocodecamp.com/</a><br />
<br />
Free conference with great topics and dedicated people.Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com2tag:blogger.com,1999:blog-5857256713785001967.post-42886239291452842672014-01-08T18:58:00.003-08:002014-01-08T18:58:57.330-08:00Chicago Code Camp 2014 is coming on April 26!Chicago Code Camp 2014 is coming again on April 26 at College of Lake County. This is the 6th CCC. Find all the details on the website:<br />
<br />
<a href="http://www.chicagocodecamp.com/">http://www.chicagocodecamp.com</a><br />
<br />
I've found this to be a magical event in the past - 200 developers enjoying an all day, free event, on Saturday (usually no work conflict), with 30 diverse sessions from volunteer speakers... Makes you love our profession!Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com6tag:blogger.com,1999:blog-5857256713785001967.post-86303882273278675322013-09-03T18:35:00.001-07:002013-09-03T18:47:00.664-07:00Presenting at SDC on Empowering a Team as an Individual ContributorI had the opportunity to present at the SDC on "Empowering a Team as an Individual Contributor" (9/1/2013).<br />
<br />
<a href="http://www.meetup.com/SoftDev/events/134325872/">http://www.meetup.com/SoftDev/events/134325872/</a><br />
<br />
Most developers are individual contributors (IC) – in other words they do not have direct reports. But even as a non-manager, you can empower an entire team. This is due to the nature of software engineering, where developers create their own tools, a star developer can be 10x as productive as an average developer, and a single developer can use technology for team-wide impact. With the right mindset ("add business value"), and using a combination of hard skills (automation, tooling, code generation, open source, code reuse, etc…) and soft skills (interviewing, mentoring, communication and knowledge sharing, etc…), you can be that IC developer who helps lift your entire team, and have fun along the way. Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-69503098658266669812013-02-11T19:33:00.001-08:002013-02-11T19:33:24.257-08:00The one ratio to rule them all<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">I was reading from "</span><a href="http://www.amazon.com/Good-Great-Companies-Leap-Others/dp/0066620996/ref=sr_1_1?s=books&ie=UTF8&qid=1360639103&sr=1-1&keywords=good+to+great"><span style="font-family: Calibri;">Good to Great</span></a><span style="font-family: Calibri;">", excellent book, and it mentioned one of the things successful companies did was chase a simple, single ratio. Sure, there's always more to it, but that one ratio helps focus the team. For most software departments, that ratio is something like:</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">(Requested Features / Incident Count ) per developer per month.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">Basically, you want to crank out lots of features and have very low incidents. "Emergency" deploys, production bugs, outages – those essentially count as incidents.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">All the good things either help increase requested features, or decrease incidents, and hence drive this ratio up.</span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-bottom: medium none; border-collapse: collapse; border-left: medium none; border-right: medium none; border-top: medium none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 1184;"><tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"><td style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;">
<b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;">Increase: Requested Features<o:p></o:p></span></b></div>
</td><td style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;">
<b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;">Decrease: Incident Count<o:p></o:p></span></b></div>
</td></tr>
<tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes;"><td style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 239.4pt;" valign="top" width="319"><div class="MsoListParagraphCxSpFirst" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Application frameworks</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Reusable blocks</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Code generation</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">High quality, motivated, developers</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Tools</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">etc…</span></div>
</td><td style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 239.4pt;" valign="top" width="319"><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Automated build and deployment</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">High unit testability</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Low QA bug count</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">DevOps, application monitoring</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Developer conscience</span></div>
<div class="MsoListParagraphCxSpLast" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">etc…</span></div>
</td></tr>
</tbody></table>
<br />
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<br /></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">Most of the time, a team gets into trouble when it starts chasing things other than this ratio:</span></div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Hours on a timesheet (instead of actually producing something)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Face time in meetings or the office (instead of actually producing something)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Thinking how their manager thinks (which may not actually increase feature output)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">High Lines-of-Code count (more codes != more features)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">"Feeling" busy (merely <i style="mso-bidi-font-style: normal;">feeling</i> busy doesn't mean cranking out useful code)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Cool technology for the sake of cool technology <span style="mso-spacerun: yes;"> </span></span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Job security via undocumented process</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Coding to show how smart you are (as opposed to code to make the requested feature)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Rating/grading the quality of developers (as opposed to making the business happy with working features)</span></div>
<div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Avoiding mistakes (as opposed to the addition of value)</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">Sure, these things by themselves aren't bad (avoiding mistakes and using new technology), but they are secondary to the <i style="mso-bidi-font-style: normal;">real</i> goal. As long as a developer – or worse, an entire team – <span style="mso-spacerun: yes;"> </span>chases them instead of the real goal, they will always be less than great.</span></div>
Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-64711532552414745452012-11-30T00:00:00.000-08:002012-12-02T09:10:06.720-08:00Lesson from the flaming BBQ - people who just get it<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">I was hosting a BBQ over the summer, giving me a chance to use my very rusty "grill master" skills. Stepping away from the grill for just a few moments, I looked back to see huge flames spilling out of the grill. Luckily for me, one of the guys nearby just stepped in and quickly turned down the heat. He didn't track me down and notify me of the flames, ask me if it was okay, or delay in any way – he just did it. By the time I got back to the grill and all was calm, he casually mentioned turning down the heat. He had done many BBQs before, and he just "got it".</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">That's what a good team wants from its developers – people who just get it. They see a fire, and deal with it. Sure they keep management informed, but they don't make management a bottleneck with and endless stream of questions. These are developers who write that extra null-check, create the defensive code that defaults to a safe value if a param is missing, make a safe business assumption for a validation rule, upload a tool or patch to a shared drive so the next guy can easily get it, you get the idea… In each case, they could do it the "wrong" way, but they risk that and do it anyway.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">I think this ultimately stems from management. First, management needs an atmosphere that encourages common-sense risk. Micro-management creates an aura where developers are scared to do the slightest action without multiple levels of approval for fear that no matter how obvious it may seem, it was the wrong thing. If you see the hamburgers burning, but you're not "allowed" to touch the grill, you'll just sit and watch dinner burn, and no one wins. Second, management needs to delegate and encourage and build up developers to take such "risks". <span style="mso-spacerun: yes;"> </span>Start small. It's much like a parent training their kids. Sure eventually someone guesses wrong (say they pick the wrong default validation rule and hence need to re-code it), but if they got the previous nine right, then your team comes out ahead. It sure beats eating charcoaled burgers because the team has been trained to only allow managers to turn down the grill.</span></div>
Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-89604942876505296732012-09-27T19:05:00.002-07:002012-09-27T19:07:07.235-07:00Does an expert follow all the rules?<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;"><div class="MsoNormal" style="margin: 0in 0in 10pt;">
Some people think an expert is one who can follow all the rules. Others think that an expert is one who knows when to break the rules, <em>and</em> can do so to get the job done. </div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
Ideally you'd have both, but I favor the second. The first depends on what the rules are – are they good guidelines or are they ivory tower red-tape and bad process. </div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
</div>
</span></div>
Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-90665655603944600052012-08-20T00:00:00.000-07:002012-08-20T15:31:13.620-07:00Digging with spoons – the case against progress<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">Say you need to dig a big hole. Do you dig with a spoon or a shovel? Most progress-oriented developers would think “of course we use shovels”, but they continually get surprised when on their real projects the team still essentially digs with spoons. Why? How could someone possibly want to dig with a little spoon instead of a big shovel? Sure, I favor shovels, but I’ve seen over the years that people think <i style="mso-bidi-font-style: normal;">very</i> differently, and some people could offer <i style="mso-bidi-font-style: normal;">lots</i> of reasons to use spoons instead:</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">1.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">We already have a spoon right now.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">2.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">It won't really take that long to dig with spoons.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">3.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">I used a spoon before; you should use a spoon to.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">4.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Using a spoon teaches you how to dig, when I was in school they taught us to dig with spoons.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">5.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Using a shovel is the lazy way out.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">6.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">A spoon gives you the granularity you need, you don't really know what you're digging if you have a shovel.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">7.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">The boss thinks spoons are better (that's how he did it back when he dug).</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">8.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">If we switch to shovels now, that would be admitting we were wrong before.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">9.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">We need objective measurements (committees, score cards, analysis docs) to truly show if a shovel is better than a spoon.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">10.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">You’re just advocating using shovels because you read some blog about it.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">11.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">That big shovel is too heavy; spoons are lighter so we can dig faster.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">12.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">The shovel wasn’t built here.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">13.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">You’re not part of the process improvement team, so don’t worry about it.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">14.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">We’re already successful, so we don’t need to change how we do things.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">15.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Well, I actually read that shovels are bad.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">16.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Spoons were working fine before you got here.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">17.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">My last company used shovels, and they went out of business.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">18.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Your attempt to change our process means that you’re not being a team player.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">19.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Your job is to dig, focus on that.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">20.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">We can use spoons for now, and then use shovels later.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">21.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Not everyone knows how to use shovels, and we can't afford the training costs right now.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">22.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">We’re under contract to use spoons.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">23.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">The boss’s boss is friends with a spoon manufacturer; we really ought to keep using spoons.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">24.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Are you so special; is a spoon not good enough for you?</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">25.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">If we use spoons, there won't be enough work to do and people will lose jobs.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">26.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Our competitors use spoons (I heard), so we should be fine.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">27.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">Our competitors use shovels, so doing something different gives us a competitive advantage.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">28.</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span style="font-family: Calibri;">This discussion of spoons vs. shovels is just a distraction from the real goal of digging.</span></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt;">
<br /></div>
<div class="MsoNoSpacing" style="margin: 0in 0in 0pt;">
<span style="font-family: Calibri;">Each of these brings to mind some analogy with some past software project where the “slow” way (i.e. spoons) was preferred. Part of empowering a team is to overcome this sort of thinking to show that it’s really in the <i style="mso-bidi-font-style: normal;">team’s</i> best interest to use shovels.</span></div>
Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-9189589064798697792012-05-31T19:19:00.002-07:002012-05-31T19:19:52.946-07:00How is a senior developer different from a junior developer?<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">There is not one right answer. It’s easy to say “a senior dev knows more and does more”, but I think there’s an additional dimension – a junior dev is merely expected to code to the spec, whereas a senior dev fundamentally takes responsibility and ownership for improving everything they encounter.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">Here’s a braindump; obviously my opinion. Not a complete list, and not a one-size fits all. I was light on the exact technical requirements (as that changes), and focused more on the concepts. Perhaps in another blog post I’ll do a braindump of what a senior dev is not <span style="mso-spacerun: yes;"> </span>(i.e. how is a senior dev different than a tech lead or architect). I’m using C# and .Net as an example, but you could easily substitute those.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">There’s also an </span><a href="http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm"><span style="color: blue; font-family: Calibri;">interesting matrix here</span></a><span style="font-family: Calibri;">.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;">Writes good code that just works</span></b></div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Be able to code to specification is assumed. Should be able to leverage experience and past domain knowledge to fill in some gaps in a spec. Does not need everything explained in complete detail.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Writes working code that handles non-happy path and has low bug count. Can quickly create code – does not need to continually refer to reference documentation.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Codes for non-functional requirements, like performance, maintenance, testability, security, etc…</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Can write code with the minimal length and complexity.</span></div>
<div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Thoroughly unit tests applicable code.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;">Respected by peers</span></b></div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has written a module or tool directly used by others on the team. A senior dev does not just write code in their corner.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Can review other’s code and suggest improvements that others will actually implement.</span></div>
<div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Other developers ask for your technical opinion</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;">Experience</span></b></div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has built end-to-end products, through all tiers, that ran in production for multiple<span style="mso-spacerun: yes;"> </span>releases</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has written 10,000+ lines of C# code that passed code review</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has created at least 4 different Visual Studio project types (WinForm, web, WinService, Console, etc…)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has created developer tools and utilities besides just visual studio. I.e. has used a profiler or visual studio plug-in or code analyzer or code generator.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has troubleshot a production security or performance error.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has written multi-threaded backend code</span></div>
<div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Has at least 1 technical niche of expertise</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;">Takes Responsibility</span></b></div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Does actions to make other developers better, such as writes reusable code, mentors, solves critical path problems, automates a previously manual task, etc...</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">No longer just focused on development, but helps improve the process of development.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Can refactor legacy code without a formal project</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Can resolve unanticipated coding or validation problems without pulling in a more senior resource</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Can pick up new technologies without formal training (may need formal training for an entirely new platform)</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Continually looks for code reuse and ways to decrease technical debt.</span></div>
<div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Can tell management what the developer needs in order to be more productive</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;">Has platform-specific knowledge</span></b></div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;">
<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">This is the standard list you’d see on a job description (“Knows threading, diagnostics, reflection, IO, etc…, Can explain 5 design patterns, etc…)</span></div>
<div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in;">
<br /></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-42790247323062194842012-05-30T18:43:00.001-07:002012-05-30T18:43:49.473-07:00Free WMI Code Creator - WMICodeCreator.exe<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">I’ve tinkered with WMI in the past, usually to find some IIS, network, or process information <i style="mso-bidi-font-style: normal;">on remote machines</i> where there wasn’t a readily-available API. I realize as the world of .Net APIs expand, the need for WMI shrinks, but it’s still an underlying technology that lets you do “magic” when there appears to be no other way. </span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">However, the problem I’ve often had with WMI is finding the exact query to run. To my knowledge, it didn’t have intellisence, and I never clicked with the reference manual. I recently found a tool that makes it easy to generate WMI snippets – the free </span><a href="http://www.microsoft.com/en-us/download/details.aspx?id=8572"><b style="mso-bidi-font-weight: normal;"><span style="color: blue; font-family: Calibri;">WMI Code Creator v1.0</span></b></a><span style="font-family: Calibri;">. Yes, this tool is from <i style="mso-bidi-font-style: normal;">2005</i>, yes that means I am absolutely no WMI guru, but I still wanted to pass it along.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">The tool provides a GUI to select the various namespaces and classes from which to construct your WMI query, and then lets you select the properties (“columns”) to return. <span style="mso-spacerun: yes;"> </span>Then, it lets you execute the code on the fly. The tool just worked. </span><a href="" name="_GoBack"></a><span style="font-family: Calibri;">Here’s a snippet of what it returns for querying process information.</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="color: blue; font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;">using</span><span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"> System;</span></div>
<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="color: blue; font-family: "Courier New"; font-size: 8pt; line-height: 115%; mso-no-proof: yes;">using</span><span style="font-family: "Courier New"; font-size: 8pt; line-height: 115%; mso-no-proof: yes;"> System.Management;</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="color: blue; font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;">try</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;">{</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 1;"> </span>ManagementObjectSearcher searcher =</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="mso-spacerun: yes;"> </span><span style="color: blue;">new</span> ManagementObjectSearcher(<span style="color: #a31515;">"root\\CIMV2"</span>,</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="mso-spacerun: yes;"> </span><span style="color: #a31515;">"SELECT * FROM Win32_Processor"</span>);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 1;"> </span><span style="color: blue;">foreach</span> (ManagementObject queryObj <span style="color: blue;">in</span> searcher.Get())</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 1;"> </span>{</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"-----------------------------------"</span>);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Win32_Processor instance"</span>);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"-----------------------------------"</span>);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Family: {0}"</span>, queryObj[<span style="color: #a31515;">"Family"</span>]);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"ProcessorId: {0}"</span>, queryObj[<span style="color: #a31515;">"ProcessorId"</span>]);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"ProcessorType: {0}"</span>, queryObj[<span style="color: #a31515;">"ProcessorType"</span>]);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 1;"> </span>}</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;">}</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="color: blue; font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;">catch</span><span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"> (ManagementException e)</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;">{</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;"><span style="mso-tab-count: 1;"> </span>MessageBox.Show(<span style="color: #a31515;">"An error occurred while querying for WMI data: "</span> + e.Message);</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;">
<span style="font-family: "Courier New"; font-size: 8pt; mso-no-proof: yes;">}</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-81520611902176354242012-05-23T00:00:00.000-07:002012-05-23T00:00:08.985-07:00Chicago Code Camp 2012<div class="MsoNormal" style="margin: 0in 0in 10pt;">
<span style="font-family: Calibri;">This Saturday, we had another successful </span><a href="http://www.chicagocodecamp.com/"><span style="font-family: Calibri;">Chicago Code Camp</span></a><span style="font-family: Calibri;"> at the CLC campus. About 400 signed up, and we estimate about 180-200 showed up based on sign-in logs. It was a "free" event thanks to our dozen sponsors and 30+ speakers. The courtyard was filled with impromptu developer discussions. Our morning registration and lunch lines flew <span style="mso-spacerun: yes;"> </span>with almost no wait time. All around it was a wonderful event. I'm always honored to be a part of such an event.</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-16317902476159051532012-03-21T18:15:00.001-07:002012-04-02T19:49:09.335-07:00Presenting at SDC on Build Servers and MetricsUPDATE: <a href="http://www.lcnug.org/Downloads/ALM_Build_Metric_4_1_2012.zip"><strong>Download PowerPoint Here</strong></a><br />
<br />
----<br />
I'll be presenting at the Software Development Community (SDC) on Sunday, April 1st on Build Servers and Metrics. The SDC meets in Oakbrook.<br />
<br />
<a href="http://www.meetup.com/SoftDev/events/43412322/">http://www.meetup.com/SoftDev/events/43412322/</a><br />
<br />
<strong>ALM tooling:</strong> <strong>Empowering teams with build servers and metrics</strong><br />
Everyone knows that automated builds are a good thing, but many teams don't leverage them fully because it's hard to get started. Tim will go over practical techniques and concepts for automating builds with TFS and MSbuild. Once you have an automated build, there are dozens of steps you can hook into it, such as metrics. Tim will walk through several core metrics, including line count, code churn, duplication, complexity, and test code coverage, as well as the concepts and pitfalls for adopting these within a team.Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-13688409381313964492012-03-21T18:04:00.000-07:002012-03-21T18:04:28.595-07:00Chicago Code Camp is coming May 19The fourth Chicago Code Camp is coming to <a href="http://www.clcillinois.edu/aboutclc/grayslake_directions.asp">CLC</a> on May 19:<br />
<br />
<a href="http://www.chicagocodecamp.com/"><strong>http://www.chicagocodecamp.com/</strong></a><br />
<br />
You can register here:<br />
<br />
<a href="http://chicagocodecamp2012.eventbrite.com/"><strong>http://chicagocodecamp2012.eventbrite.com</strong></a><br />
<br />
Chicago Code Camp is a free, one day conference on Saturday May 19th, for developers of all skill levels and interests with multiple sessions running side-by-side throughout the day.Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-87602894603433898722012-02-26T20:08:00.000-08:002012-02-26T20:08:33.134-08:00Bluffing Line Count and why it's still useful<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">I'll take it as a given that every developer knows that line count is a problematic metric. You know you got problems when someone with power thinks that "Homer did twice as much work because he wrote twice as many lines". Why is line count so unreliable? Here are some reasons to get started:</span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">1.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Significant lines vs. raw, i.e. whitespace, comments, brackets on new-line</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">2.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">New code (creates lots of it) vs. production bug update (</span><a href="http://www.timstall.com/2007/10/five-hours-for-one-line-of-code.html"><span style="font-family: Calibri;">5 hours to fix 1 line</span></a><span style="font-family: Calibri;">)</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">3.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Generated files (proxies, designer) or massive </span><a href="http://www.timstall.com/search/label/codegen"><span style="font-family: Calibri;">code generation</span></a></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">4.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Copying 1000 lines from open-source online (algorithm works, so low risk, but you've added a lot of code)</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">5.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Complexity of code, i.e. a 20-line algorithm may be more work than 1000 line of casual UI and data hookup.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">However, if you're trying to coordinate more than 10 developers, and you have no other metric, line count still has <i style="mso-bidi-font-style: normal;">some</i> value because it quickly tells you <i style="mso-bidi-font-style: normal;">something</i> is going on. (i.e. the "something is better than nothing" philosophy.) You've got to look at the trends, not the absolute values. </span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo2; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">It's useful to know if your team's average developer produces 500 lines of code (LOC) per week (of course this varies from team to team), then seeing someone produce either 50 or 5000 should catch your attention. Sure, there may be a good reason, but you at least want to be aware of what that reason is. Is the guy generating 5000 massively copying and pasting code, re-inventing the wheel for quick-to-write utility code, or using a passive code-generator instead of your team's ORM framework? Is the guy only doing 50 not checking anything in, and waiting to surprise the team with 4 weeks of work the day before code freeze for one "glorious" check-in?</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo2; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Line count is ubiquitous and everyone can understand it.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo2; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Line count is very cheap to calculate; many tools can provide this.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo2; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Line count is the basis for two more relevant metrics: </span><a href="http://msdn.microsoft.com/en-us/library/ms244698(v=vs.90).aspx"><span style="font-family: Calibri;">code churn</span></a><span style="font-family: Calibri;">, which tells you how many lines per file is changing per changeset (and hence per developer), and code duplication (I personally love </span><a href="http://www.harukizaemon.com/simian/"><span style="font-family: Calibri;">Simian</span></a><span style="font-family: Calibri;"> for this).</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l1 level1 lfo2; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">You can also write reports splitting line count by file name to see the ratio of business, entity, data-access, unit test, UI, etc… For example, is someone checking in 1000 lines of business logic, but with zero unit tests? It's something worth investigating.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">You cannot reduce an art like code craftsmanship to auto-generated metrics. But the metrics do offer clues to what is going on. <span style="mso-spacerun: yes;"> </span>It's good to be aware, but never judge a developer on metrics alone.</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-79028877173262160232012-01-18T00:00:00.000-08:002012-01-18T00:00:02.002-08:00The problem with "It's not what you know, it's who you know."<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">I wasn't the most popular kid growing up. Even in college as I lived up to the analytical stereotype and stayed home studying (a better word would be "experimenting" or "training"), my party-going acquaintances would assure me that I was investing in the <i style="mso-bidi-font-style: normal;">wrong</i> thing. "It's not what you know, it's <i style="mso-bidi-font-style: normal;">who </i>you know. So don't spend so much <span style="mso-spacerun: yes;"> </span>effort with the books when it's the relationships that matter." And there certainly is some truth to this. We've all seen the stranger's perfect resume get passed over for the friend's average resume (the stranger is by definition unknown, and therefore risky, so there <i style="mso-bidi-font-style: normal;">is</i> business rational to pick the safe candidate over the risky one). People ultimately make the decisions, so people are important. It's one reason I so actively endorse the community user groups.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">However, there must be balance. There are three caveats that this cliché misses:</span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">1.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">If what you know is valuable, then people will want to know you. Even a hermit who cures cancer will begrudgingly become famous. Recruiters in every major city are scouring over LinkedIn, user groups, monster, dice, and every online job board trying to find good candidates, offering bounties, and poaching top talent from competitor's. In other words, "what you know" will quickly open doors to "who you know" (and "who knows you").</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">2.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">Really, it's not "who <i style="mso-bidi-font-style: normal;">you</i> know," but "<i style="mso-bidi-font-style: normal;">who</i> knows you." Sharing an elevator, or even a lunch, doesn't mean that they'll risk their reputation giving you a referral, or that you can "phone them for a favor".</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">3.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;">There are talkers and doers. Talkers can drop a name for every occasion, have 500+ social-networking friends, and can truthfully say things like "Oh, I know Acme's Chicago director, Bill, we met at last Autumn's pumpkin-throwing contest…" They could get the interview with their connections, but they could never pass the interview itself.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Of course, with "what you know" vs. "who you know", like most two-way debates in life, you'd prefer both. But in the field of software engineering, you can never sell-short the "what you know".</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-45783167574596062022012-01-16T20:09:00.000-08:002012-01-16T20:09:25.737-08:00Command-line Cyclomatic Complexity in VS2008 with VS2010 free Metrics.exe<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Visual <span style="mso-spacerun: yes;"> </span>Studio had code complexity metrics, but they were only available in the GUI. (At least for code coverage you could </span><a href="http://www.timstall.com/2008/09/automating-code-coverage-from-command.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">call the private assemblies</span></span></a><span style="font-family: Calibri;"> and roll your own command-line tool.) However, VS 2010 offers<span style="mso-spacerun: yes;"> </span>a free power-tool that lets you run complexity metrics from the command line! The result is an xml file, so you can leverage that for anything you need.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">These blogs tell more: </span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><a href="http://blogs.msdn.com/b/camerons/archive/2011/01/28/code-metrics-from-the-command-line.aspx"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">http://blogs.msdn.com/b/camerons/archive/2011/01/28/code-metrics-from-the-command-line.aspx</span></span></a></div><div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><a href="http://devmatter.blogspot.com/2011/01/visual-studio-code-metrics-powertool.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">http://devmatter.blogspot.com/2011/01/visual-studio-code-metrics-powertool.html</span></span></a></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Part of the cool thing is even if you're still on VS2008 (!), and you can't buy a 3rd party tool (</span><a href="http://www.timstall.com/2009/05/cool-tool-ndepend-for-automated-code.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">NDepend</span></span></a><span style="font-family: Calibri;">!), you can still use the 2010 power tools to call .Net 3.5 assemblies. So, you could install VS2010 on your build server and use the power tools on 2008 builds.</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-61102254302469622462012-01-05T00:00:00.000-08:002012-01-05T00:00:00.634-08:00Detecting if a file is a merge in TFS VersionControl database<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">I was trying to run some metric calculations on files within a changeset, but I only wanted <i style="mso-bidi-font-style: normal;">new</i> files – i.e. I wanted to filter out merged, branched, or renamed files. For example, if someone created a branch, that shouldn’t count as adding 1000 new files.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">One solution I found was to check the Command column of the TfsVersionControl.dbo.tbl_Version table. I realize the TfsVersionControl is a transactional database, and reports are encouraged to go off of </span><a href="http://msdn.microsoft.com/en-us/library/ms244687(v=VS.90).aspx"><span style="color: blue; font-family: Calibri;">TfsWareHouse</span></a><span style="font-family: Calibri;">, but that didn’t seem to contain this field.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Here’s the relevant SQL (<b style="mso-bidi-font-weight: normal;">NOTE: this is for VS2008</b>, I haven’t tested it on VS2010).</span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="color: blue; font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;">select</span><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-spacerun: yes;"> </span></span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-spacerun: yes;"> </span>CS<span style="color: grey;">.</span>ChangeSetId<span style="color: grey;">,</span> FullPath<span style="color: grey;">,</span> Command<span style="color: grey;">,</span> CreationDate<span style="color: grey;">,</span></span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">case</span></span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-tab-count: 2;"> </span><span style="color: blue;">when</span> <span style="background: yellow; mso-highlight: yellow;">Command <span style="color: grey;">in</span><span style="color: blue;"> </span><span style="color: grey;">(</span>2<span style="color: grey;">,</span>5<span style="color: grey;">,</span>6<span style="color: grey;">,</span>7<span style="color: grey;">,</span>10<span style="color: grey;">,</span>34<span style="color: grey;">)</span></span> <span style="color: blue;">then</span> <span style="color: magenta;">cast</span><span style="color: grey;">(</span>1 <span style="color: blue;">as</span> <span style="color: blue;">bit</span><span style="color: grey;">)</span></span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">else</span> <span style="color: magenta;">cast</span><span style="color: grey;">(</span>0 <span style="color: blue;">as</span> <span style="color: blue;">bit</span><span style="color: grey;">)</span></span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">end</span> <span style="color: blue;">as</span> IsNew</span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="color: blue; font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;">from</span><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"> TfsVersionControl<span style="color: grey;">..</span>tbl_Version V <span style="color: blue;">with </span><span style="color: grey;">(</span><span style="color: blue;">nolock</span><span style="color: grey;">)</span></span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-spacerun: yes;"> </span><span style="color: grey;">inner</span> <span style="color: grey;">join</span> TfsVersionControl<span style="color: grey;">..</span>tbl_ChangeSet CS <span style="color: blue;">with </span><span style="color: grey;">(</span><span style="color: blue;">nolock</span><span style="color: grey;">)</span> </span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">on</span> V<span style="color: grey;">.</span>VersionFrom <span style="color: grey;">=</span> CS<span style="color: grey;">.</span>ChangeSetId</span></div><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="color: blue; font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;">where</span><span style="font-family: "Courier New"; font-size: 10pt; mso-no-proof: yes;"> CS<span style="color: grey;">.</span>ChangeSetId <span style="color: grey;">=</span> 20123<span style="color: green;"></span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><br />
</div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">The question becomes, what does the “tbl_Version .Command” column mean, and why those specific values? I couldn’t find official documentation (probably because it’s discouraged to run queries on it), so I did a distinct search on 50,000 different changesets to find all values being used, and I worked backwards comparing it against the Team Explorer UI to conclude it appears to be a bitflag for actions:</span></div><br />
<table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin: auto auto auto 4.65pt; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 1184; width: 157px;"><tbody>
<tr style="height: 15pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; height: 15pt; mso-border-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><b><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Command</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><b><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Bit value</span></span></b></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 1;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">add</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">1</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 2;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">edit</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">2</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 3;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">branch</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">4</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 4;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">rename</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">8</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 5;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">delete</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">16</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 6;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">undelete</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">32</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 7;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">branch</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">64</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 8; mso-yfti-lastrow: yes;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 57.7pt;" valign="bottom" width="77"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 60.05pt;" valign="bottom" width="80"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><span style="color: black; mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">128</span></span></div></td></tr>
</tbody></table><br />
<div class="MsoNormal" style="margin: 0in 0in 10pt;"><br />
</div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Recall there can be multiple actions (hence the bit field), such as merge <i style="mso-bidi-font-style: normal;">and</i> edit. So, if you want to find new code – i.e. adds or edits, then we’d take the following bit flags: <b style="mso-bidi-font-weight: normal;">2, 5, 6, 7, 10, and 34</b>.</span></div><br />
<table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin: auto auto auto 4.65pt; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 1184; width: 301px;"><tbody>
<tr style="height: 15pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;"><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; height: 15pt; mso-border-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Is New?</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Bit value</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Actions</span></span></b></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 1;"><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Yes</span></span></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">2</span></span></b></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 2;"><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Yes</span></span></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">5</span></span></b></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">add (folder)</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 3;"><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Yes</span></span></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">6</span></span></b></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">type/edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 4;"><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Yes</span></span></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">7</span></span></b></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">add (add file)</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 5;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">8</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">rename</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 6;"><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Yes</span></span></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">10</span></span></b></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">rename/edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 7;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">16</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">delete</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 8;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">24</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">delete,rename</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 9;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">32</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">undelete</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 10;"><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">Yes</span></span></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">34</span></span></b></div></td><td nowrap="nowrap" style="background: #92d050; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">undelete, edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 11;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">68</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">branch</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 12;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">70</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">branch, edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 13;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">84</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">branch,delete</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 14;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">128</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 15;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">130</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge, edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 16;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">136</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge,rename</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 17;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">138</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge,rename,edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 18;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">144</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge,delete</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 19;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">152</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge, delete, rename</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 20;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">160</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge, undelete</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 21;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">162</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge, undelete, edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 22;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">196</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge, branch</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 23;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">198</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge, branch, edit</span></span></div></td></tr>
<tr style="height: 15pt; mso-yfti-irow: 24; mso-yfti-lastrow: yes;"><td nowrap="nowrap" style="background: yellow; border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 48pt;" valign="bottom" width="64"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">No</span></span></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 56.25pt;" valign="bottom" width="75"><div align="right" class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; text-align: right;"><b><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">212</span></span></b></div></td><td nowrap="nowrap" style="background-color: transparent; border-bottom: windowtext 1pt solid; border-left: #f0f0f0; border-right: windowtext 1pt solid; border-top: #f0f0f0; height: 15pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0in; width: 121.5pt;" valign="bottom" width="162"><div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="mso-ascii-font-family: Calibri; mso-bidi-font-family: Calibri; mso-fareast-font-family: "Times New Roman"; mso-hansi-font-family: Calibri;"><span style="font-family: Calibri;">merge, branch, delete</span></span></div></td></tr>
</tbody></table><br />
<div class="MsoNormal" style="margin: 0in 0in 10pt;"><br />
</div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Of course, this is induction, and it’s possible I may have missed something, but given a large sampling and lots of spot-checking, it appears to be reliable.</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com6tag:blogger.com,1999:blog-5857256713785001967.post-8284917331464385742012-01-04T06:00:00.000-08:002012-01-04T06:00:06.977-08:00It’s not your code, but it is your opportunity<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">I occasionally hear the developer say “my code”, as in “I’ll check in <i style="mso-bidi-font-style: normal;">my code</i> </span><a href="http://www.timstall.com/2011/12/benefits-to-check-in-early-and-often.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">at the end of next week</span></span></a><span style="font-family: Calibri;">”, or “<i style="mso-bidi-font-style: normal;">My code</i> doesn’t need </span><a href="http://www.timstall.com/search/label/testing"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">unit tests</span></span></a><span style="font-family: Calibri;">”.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">In one sense, I want developers to think “this is my code” so they take pride in doing the best job possible. But really, it’s not your code, it’s the company’s code – they’re paying for it, and often legally they own it (i.e. it would be illegal to take chunks of code you wrote at one company and either privately sell it, or check it into another company’s source code repository).</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">This perspective really changes the discussion, i.e. “The company would like their code to be checked-in on a regular basis”, or “The company would like their code to be properly tested”.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">However, it is the developer's "opportunity to learn" – i.e. the company keeps the code, but the developer keeps the improved skill from writing that code.</span></span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-67667081040104981362012-01-03T20:23:00.001-08:002012-01-03T20:23:26.051-08:0031 User Groups in the Midwest<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Clark Sell did a great series on the various user groups in the Midwest. He provided a helpful recap here:</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><b style="mso-bidi-font-weight: normal;"><span style="mso-fareast-font-family: "Times New Roman";"><a href="http://csell.net/2011/12/31/31-days-of-community-my-recap/"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">http://csell.net/2011/12/31/31-days-of-community-my-recap/</span></span></a></span></b></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Here's the link for our </span><a href="http://csell.net/2011/12/02/31-days-of-community-lake-county-net-users-group-lcnug/"><span style="font-family: Calibri;"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;">Lake County </span>.Net <span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;">Users Group (LCNUG)</span></span></a><span style="font-family: Calibri;">.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">There's over a dozen groups in Illinois alone.<span style="mso-spacerun: yes;"> </span>There's something for everyone. Given the benefits of such groups (meeting dedicated peers <i style="mso-bidi-font-style: normal;">face to face</i>, hearing from expert presenters, etc…), check it out.</span></span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-74840008885492093532011-12-30T12:06:00.000-08:002011-12-30T12:06:16.542-08:00The benefits to “check in early and often”<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">I am a huge advocate of checking in early and often. I’ve seen many a project get burnt by the developer who saves 3 weeks of work for a single “glorious” check-in.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">I favor frequent check-ins because it’s:</span></span></div><ol style="margin-top: 0in;" type="1"><li class="MsoNormalCxSpMiddle" style="mso-list: l0 level1 lfo1;"><b style="mso-bidi-font-weight: normal;"><span style="mso-fareast-font-family: "Times New Roman";">Cheaper integration.</span></b><span style="mso-fareast-font-family: "Times New Roman";"> Someone once said “Integration is pay me now or pay me later”, and I find it much easier to pay now. Especially with automated builds and continuous integration, it’s much easier to check in 10 little changes than 1 big change (Sometimes I think of it like being easier to hold my breath for 30 seconds, ten times, as opposed to holding it for 5 minutes straight). Why? Because with bigger changes, you inevitably get farther out of sync – especially on critical shared files – and there’s more to forget.</span></li>
<li class="MsoNormalCxSpMiddle" style="mso-list: l0 level1 lfo1;"><b style="mso-bidi-font-weight: normal;"><span style="mso-fareast-font-family: "Times New Roman";">More objective measure of what you really have: </span></b><span style="mso-fareast-font-family: "Times New Roman";">Code that isn’t checked in, that just works on a developer’s machine, doesn’t really exist. They might as well say “<a href="http://www.timstall.com/2011/12/10-reasons-why-build-works-locally-but.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="color: blue;">it works in my head</span></span></a>”. Once you actually get the code past a build server’s policy, then we can see what’s really there.</span></li>
<li class="MsoNormalCxSpMiddle" style="mso-list: l0 level1 lfo1;"><b style="mso-bidi-font-weight: normal;"><span style="mso-fareast-font-family: "Times New Roman";">Earlier Detection:</span></b><span style="mso-fareast-font-family: "Times New Roman";"> We all know it’s cheaper to fix a bug or redesign the sooner you catch it. I’d rather developers check in code early so we can quick detect things (“why is there 5000 lines but no tests?”)</span></li>
<li class="MsoNormalCxSpMiddle" style="mso-list: l0 level1 lfo1;"><b style="mso-bidi-font-weight: normal;"><span style="mso-fareast-font-family: "Times New Roman";">More Modular:</span></b><span style="mso-fareast-font-family: "Times New Roman";"> Checking in 10 chunks of code, where each one works, implies more granular and modular code. I.e. code that can at least be split into multiple check-ins is more modular than code that can’t be split at all.</span></li>
</ol><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Of course there’s always exceptions (you do a massive refactoring, etc…), but those should be the exception, not the rule.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Most of the time, in my experience, large check-ins by developers means something <i style="mso-bidi-font-style: normal;">bad</i> – spaghetti code, tightly-coupled code, code that was trying to hide under the radar until right before the deadline and then the developer says “oops, I just don’t have time to change it”, or something like that. Think of it like this: there is zero benefit to you to have to wait one month before seeing what a developer is doing, but there is benefit to early detection of code, so risk-reward wise it’s better to check-in early.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Note that for these purposes, <b style="mso-bidi-font-weight: normal;">a shelve set is not the same as a check-in</b>. Shelvesets are private, and hence deliberately avoid the benefits listed above (which some say is a feature). For example, you mostly likely don’t have builds on a private shelfset. For a developer to say “I put my 20,000 lines in a shelveset” is misguided– use a branch instead if you need to.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">So how to encourage check-in early and often?</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">You could write a whole chapter on this, but here's a short answer: You can explain the benefits so some developers are internally motivated, or you can make it official policy so that other developers are externally “motivated”. You can leverage the </span><a href="http://msdn.microsoft.com/en-us/library/ms244698(v=VS.90).aspx"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">TFS Code Churn</span></span></a><span style="font-family: Calibri;"> tables to automatically monitor activity, or even just view check-ins in Team Explorer, to see how often a developer checks in and how much code has changed. If a developer or contractor insists that they need to wait 1 month to check-in <i style="mso-bidi-font-style: normal;">their</i> code when “it’s ready”, you’ve got problems, much like if a developer insisted they didn’t need to follow any other policy or good practice.</span></span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-31300184000550849762011-12-05T18:16:00.000-08:002011-12-05T18:16:30.519-08:00Is development for sissies?<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">I was reading the book "Tales to make boys out of men" (I have 2 young <s>ferocious gorillas</s> boys). It was filled with adventurous stories of courage and valor who fought battles in the jungle or trekked through the frost-bitten Antarctic. Then here am I, a software engineer, essentially doing a "desk job" in an air-conditioned office with free coffee. </span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Sometimes I see people who have two categories: "tough-guy" jobs like fighter pilot, football player, or astronaut,<span style="mso-spacerun: yes;"> </span>and "sissy" jobs like software engineer sitting behind a desk. What do I tell my impressionable kids?</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">I see it like this. "Tough-guy" jobs are honorable, and you certainly need them. But don't dismiss a "desk job" as being a sissy. Many IT engineers need to work with the most ferocious, dangerous, lethal, destructive animal on the planet – other people.<span style="mso-spacerun: yes;"> </span>People inevitably have competing demands and interests, there are ruthless sharks out there, and any job that must </span></span><a href="http://www.timstall.com/2010/08/secrets-to-winning-at-office-politics.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: "Times New Roman";"><span style="color: blue;">constantly deal with people</span></span></a><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;"> cannot, by definition, be a sissy job.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Second, developers also must work with the most uncaring and cold-hearted beast ever to exist – the compiler. The compiler doesn't care if you've had a bad day, if your code <i style="mso-bidi-font-style: normal;">should</i> work, or if you've spent a hundred hours on a 5 minute task. It has no grace. Such an inhuman vacuum is not the field of sissies.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Furthermore, other people are depending on the IT engineer's work. You could have a million customers using your financial application, or a billion dollars of revenue flowing through your processing system. Hackers attack your system every day. And the system <i style="mso-bidi-font-style: normal;">has got to work</i>. To have that sort of responsibility is not sissy-like.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Lastly, software engineering is so complex that you inevitably make mistakes (sometimes <i style="mso-bidi-font-style: normal;">really</i> big ones) – and then need to own up to them. That takes courage.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Ok, it's still not Rambo, but software engineering is not for the weak.</span></span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com2tag:blogger.com,1999:blog-5857256713785001967.post-48763817299769461922011-12-02T00:00:00.000-08:002011-12-02T00:00:06.911-08:0010 Reasons why the build works locally but fails on the build server<div class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">This is a braindump:</span></span></div><div class="MsoListParagraphCxSpFirst" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">1.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Developer did not check all the files in, or developer doesn't have the latest files (sometimes TFS hiccups getting latest dlls files).</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">2.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Different modes (release vs. debug). Either #if DEBUG, or project is unmarked in configuration manager.</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">3.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Different bin structure - each project gets its own (Default for visual studio), vs. single shared bin for all (default for TFS). This is especially common when different versions of the same assembly is referenced in multiple projects in the same solution.</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">4.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Different platform/configuration</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">5.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">The build is running other steps (perhaps a packaging or command-line unit tests)</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">6.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Different bitness, say developer workstation is 64-bit, but build server is 32-bit, and some extra step breaks because of this.</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">7.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Rebuild-vs-build. Developer not running a rebuild. Hence there's an error in creating a dll, but it already exists on dev machine due to some other process, but build server fails.</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">8.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Workspace mapping is incorrect – TFS not getting all the files it needs</span></span></div><div class="MsoListParagraphCxSpMiddle" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">9.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Unit test code coverage – visual studio (at least 2008) can be very brittle running command line unit tests and code coverage.</span></span></div><div class="MsoListParagraphCxSpLast" style="line-height: normal; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-layout-grid-align: none; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">10.</span><span style="font: 7pt "Times New Roman";"> </span></span></span><span style="mso-fareast-font-family: "Times New Roman";"><span style="font-family: Calibri;">Treat warnings as compile errors – depending on your process, the build server may fail on these, but Visual studio may only flag you with a warning (which dev ignores)</span></span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com9tag:blogger.com,1999:blog-5857256713785001967.post-67548229040723955122011-11-29T00:00:00.000-08:002011-11-29T00:00:07.336-08:00Why I'm liking Pluralsight<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">My department had scheduled to send each of us to training. We had different training classes, and the specific vendor for my class needed to cancel. That left me short notice to squeeze in different training by year end. So, being creative, I got an online subscription to </span><a href="http://www.pluralsight-training.net/"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="color: blue;">Pluralsight</span></span></a><span style="font-family: Calibri;"> instead of the traditional training. </span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">PluralSight is a set of online .Net videos created by industry experts.<span style="mso-spacerun: yes;"> </span>Each video seems 2-4 hours' worth of power point slides and code demos. It's worked out very well. What I'm liking so far:</span></div><div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">Different medium -</b> After 10 linear feet of books, I like the different medium. Hearing someone's voice seems to trigger a different part of the brain for remembering, and seeing the demo from end-to-end has obvious benefits over isolated screenshots in a book or article.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">It's on-demand</b> – It's hard to make it to physical events. I like the inherent benefit of on-demand training, where I can listen on my schedule (by which I mean everyone else's schedule - my kid's sleeping schedule, my company's work schedule, etc…)</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">Professional content </b>- There are tons of free videos online, but these are often like </span><a href="http://www.timstall.com/2008/05/reactive-learner-is-also-reactive.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">reactionary scraps</span></span></a><span style="font-family: Calibri;">. To break the ice with a new technology, it helps to have a systematic 2-hour block that goes from end-to-end.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">Track progress</b> – Some personality types won't care about this, but I like how it tracks completion progress through courses. It's almost like finishing levels of a video game.</span></div><div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">Coordinated</b> – I don't need 10 videos all telling different or rehashed angles of the same thing (which is often what I'd find in a google search) – rather I need one good video that nails it, or a collection of videos that each explains their specific part well.</span></div><div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";"> </span></span></span><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">Continually Improving</b> – They seem to come out with a few new "courses" every week. </span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">It's getting to the point where rather than watch my favorite sitcom, I watch the next Pluralsight video.</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-7655171437844844132011-11-27T17:55:00.000-08:002011-11-27T17:55:48.022-08:00Measure what you actually care about<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Our three kids are currently 2, 4, and 6. We are starting to potty train the youngest. She's a cute thing, but you can imagine it's always a trying experience. Because I'm very anti-ivory-tower, and think the best developers are the ones grounded in the practically of everyday life (such as potty-training a two-year old), I can't help but think how this relates to software engineering.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Here's how: we found ourselves rewarding our daughter every time she successfully went potty. It sounded reasonable, but we remembered that it's actually misleading – we're rewarding the <i style="mso-bidi-font-style: normal;">wrong</i> thing. What we really want is not a two-year old that goes potty every 20 minutes in order to earn her chocolate-chip, but rather a two-year old that remains <i style="mso-bidi-font-style: normal;">dry</i>. Even two-year olds can figure out how to game the system.</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">This sort of misguided measurement is what often occurs in demoralized IT shops. For example, the main compensation is based on the </span><a href="http://www.timstall.com/2008/07/bugs-kill-them-when-it-cheapest.html"><span style="mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi;"><span style="font-family: Calibri;">number of bugs</span></span></a><span style="font-family: Calibri;"> fixed or number of UI screens created (because it's easy to measure), but what they actually care about is increased <i style="mso-bidi-font-style: normal;">functionality</i> or <i style="mso-bidi-font-style: normal;">quality</i>. The irony is that this often encourages the exact opposite of what the boss really wants. Just like I don't want<span style="mso-spacerun: yes;"> </span>a two-year old going "tinkle" every 20 minutes, I don't want developers gaming the system by fixing large quantities of irrelevant or duplicate bugs. </span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">The blog post doesn't have a quick answer, I mainly just wanted to write about my daughter's potty-training adventures while she was taking a nap. But a quick approach is to focus on what you actually care about (say quality), and then work backwards thinking "what would high quality look like", such as less production complaints, les support time, less application down time, less developer time spent fixing bugs, etc… Then focus how to measure <i style="mso-bidi-font-style: normal;">those</i> things.</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com1tag:blogger.com,1999:blog-5857256713785001967.post-22907402621965039732011-08-03T00:00:00.000-07:002011-08-03T00:00:09.477-07:00Whatever requirements we're given tomorrow, we got to get that done<div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">I've seen a thousand hacks justified with "We got to get <i style="mso-bidi-font-style: normal;">it</i> done". You know the drill – copy and paste 200 lines of code, hard-code data that should be configurable, skip any automated testing, etc… Such hacks come at the expense of future flexibility (i.e. good design). </span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">However, ironically, given the continual feature change, scope creep, and unknowns in software development, the real question becomes "Whatever requirements we're given <i style="mso-bidi-font-style: normal;">tomorrow</i>, we got to get <i style="mso-bidi-font-style: normal;">that</i> done."</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">This second question, the more realistic one for long-term departments, brings completely opposite connotations than the first. Instead of cranking out a feature now with no concern for maintenance costs or flexibility tomorrow, developers need to prepare – i.e. ensure they have automation, builds, reuse, etc…</span></div><div class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-family: Calibri;">Besides technical debt, the other problem I have with the "just get it done now" crowd is the false sense of nobility. Often these devs insist that they're doing a good thing (putting out a fire), but really it's just punting the problem down the road for <i style="mso-bidi-font-style: normal;">someone else</i> to pay while they boast how quickly they've solved it.</span></div>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0tag:blogger.com,1999:blog-5857256713785001967.post-34209867785520495302011-07-27T00:00:00.000-07:002011-07-27T00:00:07.449-07:00Why you’re in trouble if you rely on 30-page SOPs<span lang="EN"> <div align="left" dir="ltr">Every organization wants to have its development processes documented into Standard Operating Procedures (SOPs) for the obvious reasons – faster onboarding, standardization, auditing, etc… The Holy Grail is the potential to hire a bunch of contractors (or outsource), tell them to read a novel worth of documentation, and then they’re fully up to speed a week later. SOPs also imply that the team knows what it is doing and has a plan, which is one indicator of a mature organization. SOPs are also a prerequisite for outsourcing, an appealing option for large organizations. </div><div align="left" dir="ltr">While documentation has its benefits, you can’t rely solely on large documents to communicate process and onboard new people. Here are at least four common problems, and it will result in a frustrated and confused team:</div><ol><div align="left" dir="ltr"></div><li>The doc itself will be wrong (or outdated), such as skipping steps or assuming institutional knowledge. This is especially common if you hire outside consultants (with no institutional knowledge of your systems) to document your process.</li>
<div align="left" dir="ltr"></div><li>It’s easier to bluff a doc – a busy tech writer will hurry the doc, thinking it looks done ("I’ve written 50 pages!"), but the content won’t be correct or specific enough.</li>
<div align="left" dir="ltr"></div><li>Screens will vary (example: the software is upgraded or the OS doesn’t match).</li>
<div align="left" dir="ltr"></div><li>People simply won’t read the docs, they’re skim and miss details.</li>
</ol><div align="left" dir="ltr">Several ways to communicate an SOP instead of just 30-page MSWord docs:</div><ul><div align="left" dir="ltr"></div><li><strong>Favor automation over documentation</strong> where possible. The best document is an automated script. A script is usually kept up to date (compared to a doc) because developers need the script to work. It’s also much faster (and less error-prone) for a new guy to kick off the script than to tediously step through 20 pages of instructions.</li>
<div align="left" dir="ltr"></div><li>Lower the cost of documenting by leveraging a wiki. Developers are far more likely to update or correct a wiki then a big MSWord doc on SharePoint.</li>
<div align="left" dir="ltr"></div><li>Favor simplifying the process so the doc itself is simpler. </li>
</ul></span>Tim Stallhttp://www.blogger.com/profile/09064881589918690051noreply@blogger.com0