<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.magenic.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Aaron's Technology Musings</title><link>http://blog.magenic.com/blogs/aarone/default.aspx</link><description>Who let this guy on the podium?</description><dc:language>en</dc:language><generator>CommunityServer 2.1 (Build: 60809.935)</generator><item><title>Unit Test Framework for Silverlight: UnitDriven</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/07/16/Unit-Test-Framework-for-Silverlight_3A00_-UnitDriven.aspx</link><pubDate>Wed, 16 Jul 2008 11:58:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:5072</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/5072.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=5072</wfw:commentRss><description>&lt;p&gt;Some of my colleagues at Magenic, &lt;a href="http://www.justnbusiness.com/"&gt;Justin Chase&lt;/a&gt; and &lt;a href="http://www.lhotka.net/weblog/"&gt;Rocky Lhotka&lt;/a&gt;, have developed a very nifty framework for unit testing Silverlight apps - &lt;a href="http://codeplex.com/unitdriven/"&gt;UnitDriven&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In particular, it is optimized for testing asynchronous code in Silverlight, which is virtually impossible with existing unit test frameworks - both from Microsoft and elsewhere.&amp;nbsp; More details are available from the &lt;a href="http://codeplex.com/UnitDriven"&gt;CodePlex &lt;/a&gt;site.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=5072" width="1" height="1"&gt;</description></item><item><title>What the F#? - Role of F# in your Future Development Plans</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/07/07/What-the-F_23003F00_-_2D00_-Role-of-F_2300_-in-your-Future-Development-Plans.aspx</link><pubDate>Tue, 08 Jul 2008 01:27:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4894</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4894.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4894</wfw:commentRss><description>&lt;a href="http://video.msn.com/video.aspx?vid=652189c3-ecfa-43cf-ae9e-416716c6bdda" title="What the F#" target="_new"&gt;Video: What the F#&lt;/a&gt;


&lt;p&gt;In this video from TechEd Online, recorded at Teched last month, &lt;a href="http://www.pandamonial.com/"&gt;Amanda Laucher (aka Pandamonial)&lt;/a&gt; and I talk about what F# is, why you should care, and why functional programming matters.&lt;/p&gt;

&lt;p&gt;In an amazing coincidence, Amanda happened to have printed a F#TW t-shirt (i.e. F# For The Win, for those unaccustomed to the meme) - which is particularly ironic given that is an anagram of our interview :)&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4894" width="1" height="1"&gt;</description></item><item><title>9 Questions Series- Chris Williams aka Blogus Maximus</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/07/02/9-Questions-Series_2D00_-Chris-Williams-aka-Blogus-Maximus.aspx</link><pubDate>Wed, 02 Jul 2008 14:04:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4766</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4766.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4766</wfw:commentRss><description>Chris has done the hard work of compiling a very &lt;a href="http://blogusmaximus.net/category/8218.aspx"&gt;interesting interview series&lt;/a&gt; with some notable, not to mention &lt;a href="http://blog.magenic.com/blogs/aarone/default.aspx"&gt;fairly obscure&lt;/a&gt;, people in the .net community.&amp;nbsp; Definitely worth checking out to get a sense for who all those folks are that you meet at TechEd and similar events.&lt;br /&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4766" width="1" height="1"&gt;</description></item><item><title>DuckCallLib v0.2, Introducing object.As&lt;T&gt;</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/07/01/DuckCallLib-v0.2_2C00_-Introducing-object.As_3C00_T_3E00_.aspx</link><pubDate>Tue, 01 Jul 2008 19:31:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4762</guid><dc:creator>aarone</dc:creator><slash:comments>4</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4762.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4762</wfw:commentRss><description>&lt;p&gt;Scratching another itch, and after reading some feedback from &lt;a href="http://tinyurl.com/46k22w"&gt;mihailik on my previous post&lt;/a&gt; - I decided to implement some additional functionality in DuckCallLib to make it more useful.&amp;nbsp; As before, the bits are available on &lt;a href="http://www.codeplex.com/DuckCallLib"&gt;codeplex&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;So, again, with great fanfare, I introduce my first cut at an dynamic proxy mechanism that works generally for objects that leverages the duck typing mechanism we previously built.&amp;nbsp; The purpose of this is to allow a consumer of an object to recognize when an object they don&amp;#39;t control has certain behavior, and without having to implement a wrapper on your own, simply apply an interface to the object at runtime, whether it explicitly supports the interface or not.&lt;/p&gt;
&lt;p&gt;Usage is generally as follows:&lt;/p&gt;
&lt;font face="courier"&gt;
&lt;p&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;interface IEggable { string LayEgg(); }&lt;br /&gt;
class Platypus { public string LayEgg { return &amp;quot;egg&amp;quot;; } } //notice it does not implement IEggable&lt;br /&gt;
 &lt;br /&gt;
//we don&amp;#39;t know for sure if a platypus can lay eggs, since we are dealing with it as an object, but we can try&lt;br /&gt;
object someObjectThatMightLayEggs = new Platypus();&lt;br /&gt;
var eggLayingPlatypus = someObjectThatMightLayEggs.As&amp;lt;IEggable&amp;gt;();&lt;br /&gt;
Assert.IsTrue(eggLayingPlatypus.LayEgg() == &amp;quot;egg&amp;quot;);&lt;/span&gt;&lt;/p&gt;
&lt;/font&gt;
&lt;p&gt;Still a work in progress.&amp;nbsp; I doubt I handle generics well, and I need to something other than crash on method missing, but the hardest part (for me) - generating the dynamic proxy that implements the interface dynamically using Reflection.Emit (ugh) is done.&lt;/p&gt;
&lt;p&gt;Enjoy, and as always, feedback is appreciated. &lt;/p&gt;&lt;p&gt;&lt;em&gt;Update, duh moment, I just realized I started to re-implement &lt;a href="http://www.codeplex.com/DynamicProxies"&gt;this (Jason Bock)&lt;/a&gt; and &lt;a href="http://www.castleproject.org/dynamicproxy/index.html"&gt;this (Castle Project)&lt;/a&gt;.&amp;nbsp; Ah well, if nothing else, going through creating one of these has given me a much better sense for how to do nifty stuff with Reflection.Emit.&amp;nbsp;&lt;/em&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4762" width="1" height="1"&gt;</description><category domain="http://blog.magenic.com/blogs/aarone/archive/tags/DuckCallLib/default.aspx">DuckCallLib</category></item><item><title>Introducing DuckCallLib - An Extension Method to (almost) enable Duck Typing in C#</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/26/Introducing-DuckCallLib-_2D00_-An-Extension-Method-to-_2800_almost_2900_-enable-Duck-Typing-in-C_2300_.aspx</link><pubDate>Thu, 26 Jun 2008 16:38:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4693</guid><dc:creator>aarone</dc:creator><slash:comments>8</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4693.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4693</wfw:commentRss><description>
&lt;p&gt;Scratching an itch today, thinking about code I have written in the past to attempt to do duck calls in C# (that is, call a named method without explicitly knowing that it even supports the method) - I decided, what the heck, why not just write the extension method over object required to do duck calls.&lt;/p&gt;

&lt;p&gt;So, with great fanfare (ha!) - I have published DuckCallLib on codeplex (&lt;a href="http://www.codeplex.com/DuckCallLib/"&gt;codeplex.com/duckcalllib&lt;/a&gt;).&amp;nbsp; This is hardly a big project, more like a handy piece of code that allows you to not have to dig through reflection yourself every time you need to handle a duck typing scenario from C# code.&lt;/p&gt;

&lt;p&gt;Let say we have a simple class, such as this:&lt;/p&gt;
&lt;font face="courier"&gt;
&lt;p&gt;&amp;nbsp; public class RandomClass&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public int AddNumbers(int op1, int op2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (op1 + op2);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public double AddNumbers(double op1, double op2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (op1 + op2);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; }&lt;/p&gt;
&lt;/font&gt;
&lt;p&gt;Now, lets say we want to call &amp;quot;AddNumbers&amp;quot; without knowing anything about RandomClass:&lt;/p&gt;
&lt;font face="courier"&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object rndClass = new RandomClass();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object two = rndClass.DuckCall(&amp;quot;AddNumbers&amp;quot;, new object[] { 1, 1 }, null);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsTrue((int)two == 2);&lt;/p&gt;
&lt;/font&gt;
&lt;p&gt;Or, a more complex and meaningful scenario, we want try to make a call, but have a lambda get invoked if the method is missing:&lt;/p&gt;
&lt;font face="courier"&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Func&amp;lt;object,string,object[],object&amp;gt; methodMissingHandler =&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (source, methodName, theParameters) =&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (decimal)theParameters[0] + &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (decimal)theParameters[1];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object rndClass = new RandomClass();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object two = rndClass.DuckCall(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;AddNumbers&amp;quot;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new object[] { 1m, 1m }, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; methodMissingHandler );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsTrue((decimal)two == 2m);&lt;/p&gt;
&lt;/font&gt;
&lt;p&gt;As you can see, ruby this isn&amp;#39;t.&amp;nbsp; It is not nearly as clean syntactically as I would like it to be.&amp;nbsp; However, given the current limitations of the C# language, this is what I have been able to come up with.&amp;nbsp; If anyone has other ideas, I certainly encourage anyone to send em my way.&lt;/p&gt;

&lt;p&gt;Enjoy! &lt;br /&gt;
&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4693" width="1" height="1"&gt;</description><category domain="http://blog.magenic.com/blogs/aarone/archive/tags/DuckCallLib/default.aspx">DuckCallLib</category></item><item><title>The Summer F# Tour</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/26/The-Summer-F_2300_-Tour.aspx</link><pubDate>Thu, 26 Jun 2008 03:28:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4687</guid><dc:creator>aarone</dc:creator><slash:comments>1</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4687.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4687</wfw:commentRss><description>&lt;p&gt;This Summer, I am very excited to be doing a couple talks on F# around the midwest.&lt;/p&gt;&lt;p&gt;On July 8th, I kick things off in &lt;a href="http://groups.google.com/group/bloomingtondotnet/browse_thread/thread/25c900ad1bbd23d1"&gt;Bloomington Illinois&lt;/a&gt;, where I will be covering the overview and the details about not only how to do useful things in F#, but &lt;em&gt;why&lt;/em&gt; you should do useful things with F#.&amp;nbsp; It is a talk that, I hope, gets people excited about functional programming in general, and F# in particular.&lt;/p&gt;&lt;p&gt;In August, I visit &lt;a href="http://www.madnug.org/"&gt;South Bend, Indiana&lt;/a&gt;, where I will hopefully reach another audience to again spread the good word about F#.&lt;/p&gt;&lt;p&gt;Then in early September, I come back to Chicago, where I will be doing a couple sessions at the upcoming Chicago Day of .NET (tentative title), one of which will be about F# :)&lt;/p&gt;&lt;p&gt;In all cases, if you can make it, I very much look forward to meeting you and having not only a talk, but ultimatley a dialog about what functional programming in general, and this language in particular, means to you as a software developer. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4687" width="1" height="1"&gt;</description><category domain="http://blog.magenic.com/blogs/aarone/archive/tags/F_2300_/default.aspx">F#</category></item><item><title>BI Presentation is Published</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/17/BI-Presentation-is-Published.aspx</link><pubDate>Tue, 17 Jun 2008 16:33:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4625</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4625.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4625</wfw:commentRss><description>&lt;p&gt;My &lt;a href="http://www.technologyexecutivesclub.com/Webcasts/magenic0408/Presentation_Files/index.html"&gt;talk last April on Business Intelligence&lt;/a&gt; is up on the Technology Executives Club website.&lt;/p&gt;&lt;p&gt;Business Intelligence continues to be an enterprise that, in my humble view, tends to be too tied to particular products, and not to specific domains.&amp;nbsp; When people look for BI experts, they look to expertise with some variant of a tool, rather than expertise in a relevant domain.&amp;nbsp; This, and the fact in general that BI is tightly coupled to persistence technology (i.e. databases) I believe is a barrier to doing effective BI, as when the limiting factor becomes technology expertise rather than domain expertise, it limits the talent pool greatly.&lt;/p&gt;&lt;p&gt;Similar to those who see SOA through the lens of product companies that push SOA solutions, rather than as a broader architectural concern that should be technology independent, it seems BI should be seen not in the lens of Oracle, Microsoft, or any other software vendor, but through a more outcome oriented lens.&amp;nbsp; That is, BI solutions should be things that you buy to help you achieve particular functional goals (i.e. increase sales) - with BI technology competing on the basis for efficiency in enabling those goals.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4625" width="1" height="1"&gt;</description></item><item><title>New i4o Release Published - i4o 0.91 Beta 2</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/08/New-i4o-Release-Published-_2D00_-i4o-0.91-Beta-2.aspx</link><pubDate>Sun, 08 Jun 2008 21:47:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4525</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4525.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4525</wfw:commentRss><description>&lt;p&gt;Well, it&amp;#39;s about time, but after a hiatus to work on implementing indexing in CSLA.net, I have provided some very badly needed updates to i4o.&lt;/p&gt;&lt;p&gt;Added are the following:&lt;/p&gt;&lt;p&gt;* POCO support&lt;/p&gt;&lt;p&gt;Indexable collections can be done over existing classes.&amp;nbsp; Indexes are added using the AddIndex(string property) method, where by adding the index by naming the property, an index gets created for current items, and all future items.&amp;nbsp; RemoveIndex(string property) is also added.&lt;/p&gt;&lt;p&gt;* Remove fixed&lt;/p&gt;&lt;p&gt;The remove method has been properly implemented.&lt;/p&gt;&lt;p&gt;* Unit test suite&lt;/p&gt;&lt;p&gt;A unit test suite that achieves over 90% code coverage has been added.&amp;nbsp; Future development will be done via Red--&amp;gt;Green--&amp;gt;Refactor. :)&lt;/p&gt;&lt;p&gt;* VB String queries supported&lt;/p&gt;&lt;p&gt;An issue where VB queries that use strings were not being indexed due to VB replacing a standard string compare with it&amp;#39;s own string comparison method call.&amp;nbsp; That corner case is now handled.&lt;/p&gt;&lt;p&gt;As always, you can download the new bits by going to &lt;a href="http://www.codeplex.com/i4o"&gt;codeplex.com/i4o&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4525" width="1" height="1"&gt;</description><category domain="http://blog.magenic.com/blogs/aarone/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.magenic.com/blogs/aarone/archive/tags/indexed+LINQ/default.aspx">indexed LINQ</category><category domain="http://blog.magenic.com/blogs/aarone/archive/tags/i4o/default.aspx">i4o</category></item><item><title>Safely home after TechEd</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/07/Safely-home-after-TechEd.aspx</link><pubDate>Sat, 07 Jun 2008 04:19:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4521</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4521.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4521</wfw:commentRss><description>&lt;p&gt;After some flight delays and the normal fun one has while navigating airports, yours truly is back home.&lt;/p&gt;&lt;p&gt;Next on the agenda technology-wise is an refresh with a couple of minor bug fixes for &lt;a href="http://codeplex.com/i4o"&gt;i4o&lt;/a&gt;, as well as dynamic indexing capability.&amp;nbsp; I found an issue with i4o in how it handles VB string comparisons and it not recognizing it can take advantage of the index on those (darned conversion of x == y to String.Compare(x,y)) - issue is resolved (had to for the demo) - but given I am already in there again, it is a good occasion to do some other updates as well that I have been putting off for too long.&lt;/p&gt;&lt;p&gt;As well, I am pleased to announce that myself and Amanda Laucher (aka &lt;a href="http://www.pandamonial.com/"&gt;Pandamonial&lt;/a&gt;) did a very fun video cast from the TechEd Fishbowl appropriately called &amp;quot;What the F#&amp;quot;, that should be published soon and explains some of the reasons that developers and their bosses ought to be interested in this new, exciting technology coming from Microsoft (link will be forthcoming when they publish it).&lt;/p&gt;&lt;p&gt;All in all, an amazing experience as usual.&amp;nbsp; &lt;/p&gt;&lt;p&gt;P.S. If you are ever at Universal Studio, the Simpsons Ride is a must see.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4521" width="1" height="1"&gt;</description><category domain="http://blog.magenic.com/blogs/aarone/archive/tags/TechEd/default.aspx">TechEd</category></item><item><title>Day #2, Highlights, and why UX matters</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/04/Day-_2300_2_2C00_-Highlights_2C00_-and-why-UX-matters.aspx</link><pubDate>Wed, 04 Jun 2008 12:30:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4480</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4480.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4480</wfw:commentRss><description>&lt;p&gt;Spent some time at the C# booth, managed to catch Hanselman&amp;#39;s talk on MVC, caught David Platt&amp;#39;s &amp;quot;Why Software Sucks&amp;quot; talk, which was pretty neat and engaging.&amp;nbsp; The latter was interesting for me as I have been of the same opinion for some time, especially since the reason that it often does is related to very poor user interaction design.&lt;/p&gt;&lt;p&gt;Which really gets me to the biggest development, in my view, that has occurred with .NET this year.&amp;nbsp; No, it&amp;#39;s not LINQ, it&amp;#39;s not EF, and it&amp;#39;s not even F# (that will be next year :p)&amp;nbsp; It is WPF and Silverlight finally giving control of the UI to a user experience person.&amp;nbsp; Platt&amp;#39;s talk, which reminds us that people use software as a means to an end, not as the end in itself, reminds you that yes, you need to really think hard about how usable your application is.&amp;nbsp; In the end, unless you are writing Lord of the Rings Online or World of Warcraft, most people want to spend as little time in your application as possible.&lt;/p&gt;&lt;p&gt;A lot of corporate software, frankly, goes unused.&amp;nbsp; And a big reason is that there is a lot of really unusable corporate software (not to mention &amp;quot;shelfware&amp;quot; commercial software).&amp;nbsp; Providing good UX is a critical factor to actually realizing your technology investment.&amp;nbsp; The days where UX is considered &amp;quot;extra fluff&amp;quot; are long gone.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4480" width="1" height="1"&gt;</description></item><item><title>TechEd: Gates Keynote</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/03/TechEd_3A00_-Gates-Keynote.aspx</link><pubDate>Tue, 03 Jun 2008 14:32:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4469</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4469.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4469</wfw:commentRss><description>&lt;p&gt;A good presentation, very interesting, but especially worthwhile was the &amp;quot;&lt;a href="http://www.youtube.com/watch?v=i1M-IafCor4"&gt;last day at Microsoft&lt;/a&gt;&amp;quot; video and the robot version of Steve Ballmer doing a robot version of the &amp;quot;Developers, Developers, Developers&amp;quot; monkey dance.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4469" width="1" height="1"&gt;</description></item><item><title>Evening #1 at TechEd</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/06/03/Evening-_2300_1-at-TechEd.aspx</link><pubDate>Tue, 03 Jun 2008 04:15:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4461</guid><dc:creator>aarone</dc:creator><slash:comments>2</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4461.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4461</wfw:commentRss><description>&lt;p&gt;Well, no &amp;quot;Technical Education&amp;quot; yet, but...&lt;/p&gt;&lt;p&gt;a.) spent a couple hours practicing my speech for Thursday&lt;/p&gt;&lt;p&gt;b.) networked with some folks from MSFT&lt;/p&gt;&lt;p&gt;c.) avoided recording embarrassing podcasts :)&lt;/p&gt;&lt;p&gt;All in all, mission accomplished!&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4461" width="1" height="1"&gt;</description></item><item><title>IEggable?  Learn about it on Deep Fried Bytes #2</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/05/30/IEggable_3F00_--Learn-about-it-on-Deep-Fried-Bytes-_2300_2.aspx</link><pubDate>Fri, 30 May 2008 22:31:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4433</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4433.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4433</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://keithelder.net/blog/"&gt;Keith Elder&lt;/a&gt;&amp;#39;s new &lt;a href="http://s3.amazonaws.com/deepfried/podcasts/2/deepfriedbytes_02.mp3"&gt;podcast &lt;/a&gt;is up and rolling, with the second episode featuring a bunch of us that were, ahem, enjoying ourselves quite a bit at the MVP summit last April.&amp;nbsp; Very funny stuff, especially towards the end.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4433" width="1" height="1"&gt;</description></item><item><title>Fixed Bid Projects and Naked Call Options</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/05/28/Fixed-Bid-Projects-and-Naked-Call-Options.aspx</link><pubDate>Wed, 28 May 2008 21:10:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4404</guid><dc:creator>aarone</dc:creator><slash:comments>1</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4404.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4404</wfw:commentRss><description>&lt;p&gt;Part of my role at Magenic for the Chicago office is that I am the person who writes the proposal, facilitates getting an estimate from our technical people, and negotiates with clients to determine how the project will be structured.&amp;nbsp; Frequently, we come upon requests from clients that they would like us to bid on the work with a fixed price rather than a time and materials quote that is &amp;quot;open ended&amp;quot;.&lt;/p&gt;&lt;p&gt;Of course, having been on the other side of the table in my career, as a buyer of technology services from firms like ours, I completely understand where the impulse comes from.&amp;nbsp; You worry about cost overruns, about a vendor coming in and under-performing while you continue to pay the bill.&amp;nbsp; Indeed, especially when you have real P&amp;amp;L responsibility, it is a scary thought - like getting in a taxi and asking a driver whom you may or may not trust to take you to some ambiguous location that you have only the faintest idea of where it is.&amp;nbsp; Especially knowing that the way they make your budget is that they give you X certain dollars to accomplish Y.&lt;/p&gt;&lt;p&gt;I like analogies to financial services terms because, at least, there is some math that backs them up and allows you to price risks, such as using the &lt;a href="http://en.wikipedia.org/wiki/Black-Scholes"&gt;Black-Scholes&lt;/a&gt; model for option pricing.&amp;nbsp; So here goes.&amp;nbsp; When a client finds they need a software solution, in financial services terms, they are &amp;ldquo;short&amp;rdquo; the solution.&amp;nbsp; That is, they have a need, which requires them to go the market and purchase it, just like someone who is &amp;ldquo;short&amp;rdquo; a stock has a requirement to go onto the open market and purchase said stock.&amp;nbsp; The same would be true if you are without a house, and needed to buy one, you are considered &amp;quot;short&amp;quot; housing.&amp;nbsp; Generally, it means that you will benefit if the price of housing falls, but you will suffer if the price of housing rises.&lt;br /&gt;&lt;br /&gt;There are two ways that the organization that is &amp;ldquo;short&amp;rdquo; a software solution can go about purchasing it.&amp;nbsp; One is to simply buy the solution (aka a T&amp;amp;E project) &amp;ndash; over the course of a year, which will expose them to market risk (price of solution could rise, just like the price of a share does) -&amp;nbsp; or, in the alternative, they can purchase a &amp;ldquo;call option&amp;rdquo; to purchase the solution at a fixed price, which means that they pay a premium for the option, just like you would if you purchase an option to buy a stock at a given price one year out.&amp;nbsp; The premium can often be substantial &amp;ndash; even in the world of stock options, where &amp;ldquo;at the money&amp;rdquo; options (i.e. option to purchase at today&amp;rsquo;s price) one year out often sell at 20% or more of the value of the stock itself.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;As a solution provider, we are either net sellers of &amp;ldquo;solutions&amp;rdquo; &amp;ndash; i.e. going short people that we have in inventory &amp;ndash; in the case of a T&amp;amp;E project, or we are writers of call options on people in the case of fixed bid projects.&amp;nbsp; In other words, the appropriate term for what we do when we write fixed bid proposals is called &amp;ldquo;&lt;a href="http://www.investopedia.com/articles/optioninvestor/122701.asp"&gt;writing naked call options&lt;/a&gt;&amp;rdquo;.&amp;nbsp; This link provides a good explanation of the &lt;a href="http://www.investopedia.com/articles/optioninvestor/122701.asp"&gt;risks involved with writing naked calls&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;How does this relate to clients?&amp;nbsp; Well, it is sobering to realize that when your vendor is writing fixed bid proposals, they are doing the consulting version of writing naked calls.&amp;nbsp; They get a &amp;quot;risk premium&amp;quot; for writing it, with the underlying knowledge that we are taking a huge risk that has undefined boundaries - especially if there is any ambiguity at all in the body of the requirements.&amp;nbsp; All other things being equal, it is much more cost effective to develop a trusted relationship with a partner where you get consistent delivery of software, than to pay the risk premium that all firms that have any premise of surviving in the long term will charge for a fixed bid project.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;At Magenic, not only do we have multiple levels of oversight for all fixed bid projects, but we also dictate that we do the project management (to further manage the risk), and as well, agree to a change order process that assures that additional work that is outside the defined scope is separately paid for.&amp;nbsp; So we engage in some traditional risk mitigation that helps us manage the downside risks when we do fixed bid projects.&lt;/p&gt;&lt;p&gt;However, it is all for naught if we write a fixed bid, allow our sponsor to go to a finance committee and get a budget number on the basis of that number, and then have to &amp;quot;change order&amp;quot; them to death, which over the long term can break down the trust between client and vendor, absent expectations from the start that the number should be more flexible (which of course begs the question, why fixed bid then?).&amp;nbsp; While it protects us from the worst consequences of the naked call, it does not protect our sponsor, who often deals with a body that is not going to be interested in how we get to a result, only in the result itself, and the short term bottom line impact of getting there.&amp;nbsp; Therefore, even in a case where our own risk mitigation is perfect, there is a great deal of residual risk left over when we do fixed bid projects.&lt;/p&gt;&lt;p&gt;So, what to do about this?&amp;nbsp; Well, as with all things in life where nuance is required, it depends.&amp;nbsp; Having worked at a major accounting firm myself, I understand the market realities that demand service providers that are willing write call options and &amp;quot;insure&amp;quot; against requirements change.&amp;nbsp; That said, living in the world of technology, I understand that opportunities emerge during the entire course of the project, especially in requirements and envisioning phases.&amp;nbsp; Thus, you have to ask yourself as a buyer what is more important - price certainty or agility?&amp;nbsp; Or a mix of the two that moves to a higher degree of price certainty after a shorter &amp;quot;agile&amp;quot; period that at least gets a good set of requirements.&amp;nbsp; Or better yet - though certainly not always viable, the ability to have some flexibility in the annual budget cycle when opportunities arise so you can prioritize throughout the year as opportunities emerge - i.e. the ability to six months into the year to pull from one project into another if one area looks promising and perhaps another less so.&lt;/p&gt;&lt;p&gt;Regardless, it is important to understand that there is not a company on Earth in the technology services business - at least one you want to deal with (aka one that has financial viability) - that will trade risk for nothing.&amp;nbsp;&amp;nbsp; Price certainty for a good that isn&amp;#39;t defined to exact specifications is always going to come at a cost, and while that is sometimes required, having a constructive and trusting relationship with your provider that has transparency about cost, opportunity, and risk on an ongoing basis will save you money and, frankly, lead to greater project success.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4404" width="1" height="1"&gt;</description></item><item><title>See you in Orlando</title><link>http://blog.magenic.com/blogs/aarone/archive/2008/05/27/See-you-in-Orlando.aspx</link><pubDate>Tue, 27 May 2008 19:16:00 GMT</pubDate><guid isPermaLink="false">2a277c9f-7f25-4670-9bb2-55c6ffd86e07:4389</guid><dc:creator>aarone</dc:creator><slash:comments>0</slash:comments><comments>http://blog.magenic.com/blogs/aarone/comments/4389.aspx</comments><wfw:commentRss>http://blog.magenic.com/blogs/aarone/commentrss.aspx?PostID=4389</wfw:commentRss><description>&lt;p&gt;On June 5, early in the morning, I will be doing an updated talk on building indexing capabilities in your Linq-to-Objects queries.&amp;nbsp; Updated because:&lt;/p&gt;&lt;p&gt;* I am including a VB element in my talk, based on some good feedback from Julie Lerman.&amp;nbsp; One of the 3 demos will be in VB.&lt;/p&gt;&lt;p&gt;* I will be debuting ranged query capability, which I now have working in LINQ to CSLA.&amp;nbsp; Once it is debugged, I will be porting it over to i4o as well.&lt;/p&gt;&lt;p&gt;If you are a reader and you happen to be at TechEd, hit me up for a beer - I am always up for a good debate on technology :)&lt;/p&gt;&lt;p&gt;Until then, I am likely to be very much heads down polishing my presentation up as we get ready.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blog.magenic.com/aggbug.aspx?PostID=4389" width="1" height="1"&gt;</description></item></channel></rss>