<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Reed Copsey, Jr. &#187; Professional</title>
	<atom:link href="http://reedcopsey.com/category/professional/feed/" rel="self" type="application/rss+xml" />
	<link>http://reedcopsey.com</link>
	<description>Thoughts on C#, WPF, .NET, and programming for Scientific Visualization</description>
	<lastBuildDate>Mon, 28 Nov 2011 20:42:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Reflections on GiveCamp</title>
		<link>http://reedcopsey.com/2011/10/25/reflections-on-givecamp/</link>
		<comments>http://reedcopsey.com/2011/10/25/reflections-on-givecamp/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 00:20:48 +0000</pubDate>
		<dc:creator>Reed</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Professional]]></category>
		<category><![CDATA[Charity]]></category>
		<category><![CDATA[GiveCamp]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://reedcopsey.com/2011/10/25/reflections-on-givecamp/</guid>
		<description><![CDATA[I participated in the Seattle GiveCamp over the weekend, and am entirely impressed.&#160; GiveCamp is a great event – I especially like how rewarding it is for everybody involved.&#160; I strongly encourage any and all developers to watch for future GiveCamp events, and consider participating, for many reasons… GiveCamp provides real value to organizations that [...]]]></description>
			<content:encoded><![CDATA[<p>I participated in the <a href="http://www.seattlegivecamp.org/">Seattle GiveCamp</a> over the weekend, and am entirely impressed.&#160; <a href="http://givecamp.org/">GiveCamp</a> is a great event – I especially like how rewarding it is for everybody involved.&#160; I strongly encourage any and all developers to <a href="https://twitter.com/#!/givecamp">watch for future GiveCamp</a> events, and consider participating, for many reasons…</p>
<p><span id="more-314"></span>
<ul>
<li><strong>GiveCamp provides real value to organizations that truly need help.&#160; </strong></li>
</ul>
<p>The Seattle event alone succeeded in helping <a href="http://seattlegivecamp.wikispaces.com/">sixteen non-profit organizations</a> in many different ways.&#160; The projects involved varied dramatically, including website redesigns, SEO, reworking data management workflows, and even game development.&#160; </p>
<p>Many non-profits have a strong need for good, quality technical help.&#160; However, nearly every non-profit organization has an incredibly limited budget.&#160; GiveCamp is a way to really give back, and provide incredibly valuable help to organizations that truly benefit.</p>
<p>My experience has shown many developers to be incredibly generous – this is a chance to dedicate your energy to helping others in a way that really takes advantage of your expertise.&#160; Your time as a developer is incredibly valuable, and this puts something of incredible value directly into the hands of places its needed.</p>
<p>First, and foremost, GiveCamp is about providing technical help to non-profit organizations in need.</p>
<ul>
<li><strong>GiveCamp can make you a better developer.&#160; </strong></li>
</ul>
<p>This is a fantastic opportunity for us, as developers, to work with new people, in a new setting.&#160; The incredibly short time frame (one weekend for a deliverable project) and intense motivation to succeed provides a huge opportunity for learning from peers.&#160; </p>
<p>I’d personally like to thank off the developers with whom I worked – I learned something from each and every one of you.&#160; I hope to see and work with all of you again someday.</p>
<ul>
<li><strong>GiveCamp provides an opportunity for you to work outside of your comfort zone. </strong></li>
</ul>
<p>While it’s always nice to be an expert, it’s also valuable to work on a project where you have little or no direct experience.&#160; My team focused on a complete reworking of our organizations message and a complete new website redesign and deployment using <a href="http://wordpress.org/">WordPress</a>.&#160; </p>
<p>While I’d used WordPress for my blog, and had some experience, this is completely unrelated to my professional work.&#160; In fact, nobody on our team normally worked directly with the technologies involved – yet together we managed to succeed in delivering our goals.&#160; </p>
<p>As developers, it’s easy to want to stay abreast of new technology surrounding our expertise, but its rare that we get a chance to sit down and work on something <em>practical</em> that is completely outside of our normal realm of work.&#160; I’m a desktop developer by trade, and spent much of the weekend working with CSS and Photoshop.&#160; Many of the projects organizations <em>need</em> don’t match perfectly with the skill set in the room – yet all of the software professionals rose to the occasion and delivered practical, usable applications.</p>
<ul>
<li><strong>GiveCamp is a short term, known commitment. </strong></li>
</ul>
<p>While this seems obvious, I think it’s an important aspect to remember.&#160; This is a huge part of what makes it successful – you can work, completely focused, on a project, then walk away completely when you’re done.&#160; There is no expectation of continued involvement.&#160; While many of the professionals I’ve talked to are willing to contribute some amount of their time beyond the camp, this is not expected.</p>
<p>The freedom this provides is immense.&#160; In addition, the motivation this brings is incredibly valuable.&#160; Every developer in the room was very focused on delivering in time – you have one shot to get it as good as possible, and leave it with the organization in a way that can be maintained by them.&#160; This is a rare experience – and excellent practice at time management for everyone involved.</p>
<ul>
<li><strong>GiveCamp provides a great way to meet and network with your peers. </strong></li>
</ul>
<p>Not only do you get to network with other software professionals in your area – you get to network with amazing people.&#160; Every single person in the room is there to try to help people.&#160; The balance of altruism, intelligence, and expertise in the room is something I’ve never before experienced.</p>
<p>During the presentations of what was accomplished, I felt blessed to participate.&#160; I know many people in the room were incredibly touched by the level of dedication and accomplishment over the weekend.</p>
<ul>
<li><strong>GiveCamp is fun. </strong></li>
</ul>
<p>At the end of the experience, I would have signed up again, even if it was a painful, tedious weekend – merely due to the amazing accomplishments achieved throughout the event.&#160; However, the event is <em>fun.</em>&#160; </p>
<p>Everybody I talked to, the entire weekend, was having a good time.&#160; While there were many faces focused into a near grimace at times (including mine, I’ll admit), this was always in response to a particularly challenging problem or task.&#160; The challenges just added to the overall enjoyment of the weekend – part of why I became a developer in the first place is my love for challenge and puzzles, and a short deadline using unfamiliar technology provided plenty of opportunity for puzzles.&#160; As soon as people would stand up, it was another smile.</p>
<p>&#160;</p>
<p>If you’re a developer, I’d recommend looking at <a href="http://givecamp.org/">GiveCamp</a> more closely.&#160; Watch for an event in your area.&#160; If there isn’t one, consider building a team and <a href="http://givecamp.org/home/for-organizers/">organizing an event</a>.&#160; The experience is worth the commitment.&#160; </p>
]]></content:encoded>
			<wfw:commentRss>http://reedcopsey.com/2011/10/25/reflections-on-givecamp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>2010 Visual C# MVP Award</title>
		<link>http://reedcopsey.com/2010/04/01/2010-visual-c-mvp-award/</link>
		<comments>http://reedcopsey.com/2010/04/01/2010-visual-c-mvp-award/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 23:05:11 +0000</pubDate>
		<dc:creator>Reed</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Professional]]></category>
		<category><![CDATA[MVP]]></category>

		<guid isPermaLink="false">http://reedcopsey.com/2010/04/01/2010-visual-c-mvp-award/</guid>
		<description><![CDATA[I received a pleasant surprise today.&#160; I was presented this morning with the 2010 Microsoft® MVP Award for Visual C#.&#160; According to the award email, this “award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others.” I feel honored and proud to receive this award, and [...]]]></description>
			<content:encoded><![CDATA[<p>I received a pleasant surprise today.&#160; I was presented this morning with the <a href="https://mvp.support.microsoft.com/default.aspx/gp/mvpawardintro" target="_blank">2010 Microsoft® MVP Award</a> for Visual C#.&#160; According to the award email, this “award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others.”</p>
<p>I feel honored and proud to receive this award, and hope that I can continue to be a valuable member of the community in the future.&#160; Thank you to everyone who nominated me!</p>
]]></content:encoded>
			<wfw:commentRss>http://reedcopsey.com/2010/04/01/2010-visual-c-mvp-award/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>About Big-O Notation &#8211; The good, the bad, and the confusing</title>
		<link>http://reedcopsey.com/2009/09/18/about-big-o-notation-the-good-the-bad-and-the-confusing/</link>
		<comments>http://reedcopsey.com/2009/09/18/about-big-o-notation-the-good-the-bad-and-the-confusing/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 00:11:02 +0000</pubDate>
		<dc:creator>Reed</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Professional]]></category>

		<guid isPermaLink="false">http://reedcopsey.com/?p=56</guid>
		<description><![CDATA[Often, prior to using a specific algorithm, it helps to understand information about how the algorithm scales.&#160; In order to document this, computer science has borrowed a notation from mathematics called Big-O notation. Understanding Big-O notation is critical in making good decisions about algorithms or libraries used to implement routines.&#160; However, there is often a [...]]]></description>
			<content:encoded><![CDATA[<p>Often, prior to using a specific algorithm, it helps to understand information about how the algorithm scales.&#160; In order to document this, computer science has borrowed a notation from mathematics called <a href="http://en.wikipedia.org/wiki/Big_O_notation" target="_blank">Big-O notation</a>.</p>
<p>Understanding Big-O notation is critical in making good decisions about algorithms or libraries used to implement routines.&#160; However, there is often a lot of misunderstanding about what it means, and I frequently see this used as justifications for poor decisions.</p>
<p> <span id="more-56"></span>
<p>First, let’s define <a href="http://en.wikipedia.org/wiki/Big_O_notation" target="_blank">Big-O notation</a>.&#160; Big-O notation describes the limiting factor of a function as the argument or domain size of the function approaches a specific value, typically infinity.&#160; Big-O notation describes <strong>a growth rate</strong>, <strong>not a speed</strong>.&#160; This is important – one very common misunderstanding about Big-O notation is that it describes how “fast” a function will be – and this is never true.&#160; It describes how a function or algorithm will scale, but says absolutely nothing about speed.</p>
<p>When programming, Big-O notation can be used to describe many different things.&#160; Most frequently it is describing the algorithm in terms of instruction count or speed, but can also be used to describe memory or resource usage.&#160; It’s important to know what is being described when making decisions based off this information, and seeing that an algorithm is “O(N)” isn’t enough information, in and of itself, to know what that means.</p>
<p>When and why is this useful?&#160; It becomes very important to understand this when we start dealing with collections, especially if the collection is large or of an unknown scale.&#160; For example, say you’re going to do some basic image processing, and you have the choice between a couple of different algorithms.&#160; If each algorithm’s limiting behavior is based off the total image size, and the algorithm’s operation count is described in Big-O notation, the total number of operations will vary dramatically as your image size changes.&#160; For example, let’s say we have the choice of 3 algorithms described by three different, but <a href="http://en.wikipedia.org/wiki/Big_O_notation#Orders_of_common_functions" target="_blank">common Big-O notations</a>:</p>
<ul>
<li>Algorithm A: Linear &#8211; O(N) </li>
<li>Algorithm B: Logarithmic &#8211; O(log N)&#160;&#160;&#160; </li>
<li>Algorithm C: Quadratic &#8211; O(N^2) </li>
</ul>
<table border="1" cellspacing="0" cellpadding="2" width="500">
<tbody>
<tr>
<th valign="top" width="100">Image Resolution</th>
<th valign="top" width="100">Total Pixels</th>
<th valign="top" width="100">Potential Instructions: A</th>
<th valign="top" width="100">Potential Instructions: B</th>
<th valign="top" width="100">Potential Instructions: C</th>
</tr>
<tr>
<td valign="top" width="87">16&#215;16</td>
<td valign="top" width="162">256</td>
<td valign="top" width="142">256</td>
<td valign="top" width="164">2</td>
<td valign="top" width="179">65,536</td>
</tr>
<tr>
<td valign="top" width="87">256&#215;256</td>
<td valign="top" width="162">65,536</td>
<td valign="top" width="142">65,536</td>
<td valign="top" width="164">5</td>
<td valign="top" width="179">4,294,967,296</td>
</tr>
<tr>
<td valign="top" width="87">512&#215;512</td>
<td valign="top" width="162">262,144</td>
<td valign="top" width="142">262,144</td>
<td valign="top" width="164">5</td>
<td valign="top" width="179">68,719,476,736</td>
</tr>
</tbody>
</table>
<p>[I am, for here, assuming Log in base 10, but for Big-O, it could be any logarithmic base and still be O(log N)]</p>
<p>Note the huge discrepancy in terms of instruction count!&#160; Algorithm C is a <strong>quadratic</strong> algorithm, meaning that its instruction count increases by the square of the number of elements (pixels, in this case).</p>
<p>Now, given the information above, it seems like you would naturally always choose Algorithm B – it scales much, much better.&#160; Often, this is true, and this is a good way to choose between algorithms, but we don’t have enough information to make an educated decision at this point.</p>
<p>Remember above – I mentioned that Big-O describes a growth rate, and not a speed.&#160; In addition, it describes an upper bound for the growth rate, not necessarily the average case scenario.&#160; For example, it may be that algorithm C is the fastest algorithm for processing a single pixel – perhaps by a factor of thousands.&#160; Let’s look at these algorithms, and assign the number of actual microseconds each pixel takes to process on average, and look at the same chart as above:</p>
<ul>
<li>Algorithm A: 0.1 seconds </li>
<li>Algorithm B: 10 seconds </li>
<li>Algorithm C: 50 microseconds </li>
</ul>
<table border="1" cellspacing="0" cellpadding="2" width="576">
<tbody>
<tr>
<th valign="top" width="114">Image Resolution</th>
<th valign="top" width="111">Total Pixels</th>
<th valign="top" width="109">Theoretical Execution Time: A</th>
<th valign="top" width="114">Theoretical Execution Time: B</th>
<th valign="top" width="126">Theoretical Execution Time: C</th>
</tr>
<tr>
<td valign="top" width="119">16&#215;16</td>
<td valign="top" width="114">256</td>
<td valign="top" width="112">25.6 seconds</td>
<td valign="top" width="117">20 seconds</td>
<td valign="top" width="129">3.3 seconds</td>
</tr>
<tr>
<td valign="top" width="120">256&#215;256</td>
<td valign="top" width="114">65,536</td>
<td valign="top" width="114">6,553.6 seconds</td>
<td valign="top" width="118">50 seconds</td>
<td valign="top" width="131">214,748 seconds</td>
</tr>
<tr>
<td valign="top" width="120">512&#215;512</td>
<td valign="top" width="112">262,144</td>
<td valign="top" width="115">26,214 seconds</td>
<td valign="top" width="118">50 seconds</td>
<td valign="top" width="132">…too long…</td>
</tr>
</tbody>
</table>
<p>This shows off a basic misconception of Big-O notation.&#160; It’s not about speed.&#160; Granted, if you’re planning to deal with megapixel imagery, you’d probably still choose the algorithm above with the best Big-O notation.&#160; However, there are two things that may trip you up here when you’re developing this algorithm.</p>
<ol>
<li>If you developed the three algorithms above looking only at a small image, you’d probably have picked algorithm C, hands down, because the per-pixel routine is so dramatically faster. </li>
<li>If you developed the three algorithms above with a large image, you’d have given up on algorithm C quickly, because of it’s poor scalability. </li>
</ol>
<p>However, both of those are not necessarily good things.</p>
<p>In case 1: The reason this is bad is obvious.&#160; Later, when you fed the routine a large image, you’d be in trouble (especially if you didn’t realize that it was quadratic at the time).</p>
<p>In case 2: If this routine was always going to be used on very small images, Algorithm C is a superior choice, even though it has the worst Big-O description.&#160; This is because it’s single element speed is so much better.&#160; </p>
<p>Also, Big-O only describes the upper bound (which is very important), but the average case of an O(N^2) function may actually be closer to N Log N (<a href="http://en.wikipedia.org/wiki/Quicksort" target="_blank">quicksort</a> is this way).&#160; It may be that, when we actually look at real execution times in a profiler with real data, the algorithm performs, on average, in N log (N), in which case the “real” runtime may be more like:</p>
<table border="1" cellspacing="0" cellpadding="2" width="576">
<tbody>
<tr>
<th valign="top" width="114">Image Resolution</th>
<th valign="top" width="111">Total Pixels</th>
<th valign="top" width="109">“Real” Execution Time: A</th>
<th valign="top" width="114">“Real” Execution Time: B</th>
<th valign="top" width="126">“Real” Execution Time: C</th>
</tr>
<tr>
<td valign="top" width="119">16&#215;16</td>
<td valign="top" width="114">256</td>
<td valign="top" width="112">21 seconds</td>
<td valign="top" width="117">18 seconds</td>
<td valign="top" width="129">0.003 seconds</td>
</tr>
<tr>
<td valign="top" width="120">256&#215;256</td>
<td valign="top" width="114">65,536</td>
<td valign="top" width="114">3,531 seconds</td>
<td valign="top" width="118">42 seconds</td>
<td valign="top" width="131">3.5 seconds</td>
</tr>
<tr>
<td valign="top" width="120">512&#215;512</td>
<td valign="top" width="112">262,144</td>
<td valign="top" width="115">21,454 seconds</td>
<td valign="top" width="118">43 seconds</td>
<td valign="top" width="132">8 seconds</td>
</tr>
</tbody>
</table>
<p> All of a sudden, our O(N^2) algorithm is looking very, very good – much better than any of our other algorithms!
<p>What can we take from this?&#160; There are a couple of important points:</p>
<ul>
<li>Big-O Notation can provide critical information about the scalability of an algorithm.&#160; Coupled with information about the algorithm itself, this can help us decide which of multiple algorithms will be the “best” choice.</li>
<li>Big-O Notation <strong>does not provide information about speed</strong>.&#160; Factors in the algorithm itself, including total number of instructions required, are not included as part of this notation.</li>
<li>Knowing the Big-O notation for a method, or doing your own <a href="http://algo.inria.fr/AofA/" target="_blank">analysis of the algorithm</a>, is not a substitute for profiling.&#160; “Bad” routines in terms of their Big-O notation can outperform “good” routines, in certain situations.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://reedcopsey.com/2009/09/18/about-big-o-notation-the-good-the-bad-and-the-confusing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC</title>
		<link>http://reedcopsey.com/2009/04/10/aspnet-mvc/</link>
		<comments>http://reedcopsey.com/2009/04/10/aspnet-mvc/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 22:29:00 +0000</pubDate>
		<dc:creator>Reed</dc:creator>
				<category><![CDATA[Professional]]></category>

		<guid isPermaLink="false">http://reedcopsey.com/?p=25</guid>
		<description><![CDATA[A couple of days ago I went to the Bellingham .NET Users Group event for April.&#160; Jonathan Carter, the technical evangelist for ASP.NET MVC did the talk for the evening, and I must say, it was quite interesting. Now, personally, I am not a “web guy.”&#160; I do nearly all of my development on the [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago I went to the <a href="http://www.bellinghamdotnet.org" target="_blank">Bellingham .NET Users Group</a> event for April.&#160; <a href="http://www.lostintangent.com/" target="_blank">Jonathan Carter</a>, the technical evangelist for ASP.NET MVC did the talk for the evening, and I must say, it was quite interesting.</p>
<p>Now, personally, I am not a “web guy.”&#160; I do nearly all of my development on the desktop, and most of my experience with web development has been using the LAMP stack, mostly via PHP.&#160; I do try to keep current on what’s out there, and play with a few technologies as they become commonplace, but my day to day programming is still C++ and C# on the desktop.</p>
<p>That being said, I was pleasantly surprised with <a href="http://www.asp.net/mvc/" target="_blank">ASP.NET MVC</a>.&#160; The routing mechanism that’s core to the framework is very elegant.&#160; It does seem obvious to me that Microsoft is borrowing ideas from the Ruby on Rails folks with this – it’s a pretty far departure from the previous means of developing using ASP.NET.</p>
<p>In particular, I love the separation of concerns and the testability.&#160; I definitely think it’s worth checking out…</p>
]]></content:encoded>
			<wfw:commentRss>http://reedcopsey.com/2009/04/10/aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
 
