<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8200924474223180475</atom:id><lastBuildDate>Wed, 28 Aug 2024 04:09:15 +0000</lastBuildDate><category>.net</category><category>software architecture</category><category>unit testing</category><category>code quality</category><category>load testing</category><category>general</category><category>software design</category><title>CodeFlow</title><description></description><link>http://codeflow.blogspot.com/</link><managingEditor>noreply@blogger.com (dilan)</managingEditor><generator>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-5352128991271899345</guid><pubDate>Sat, 05 Mar 2011 20:26:00 +0000</pubDate><atom:updated>2011-03-05T12:43:55.108-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software architecture</category><title>Roles and Responsibilities of a Software Architect</title><description>&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The following is a list (which is not intended to be comprehensive, by any means) of the roles and responsibilities of a Software Architect.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Roles of a Software Architect&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Customer Facing - Evangelist, Negotiator&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Team Facing - [Designer, Programmer], Process Guide&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Management Facing - Evangelist, Negotiator&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Responsibilities of a&amp;nbsp;Software Architect&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Estimation&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Analyze skill requirements&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Ensure requirements make sense (esp. NFRs)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Prepare domain model&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Design solution architecture (candidate + selected)&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Balance trade offs&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Capture rationale&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Select technology&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Provide technical guidance (research, samples, references, training to team)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Define development environment&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Automated Builds&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Continuous Integration&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Unit Testing&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Software Configuration Management (SCM)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Metrics&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Pioneer new technologies; training team where gaps exist&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Troubleshooting/Performance optimization (especially in maintenance)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Maintain engineering discipline/rigor&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Monitor and control via reviews&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Risk/Issue assessment&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Input to defect triage process&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Assess team member performance, provide feedback&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Recruitment&amp;nbsp;(conducting interviews, identifying organizational skill gaps)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Pre-sales (especially in a consultancy environment)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;If this describes what you do, you just might be a Software Architect...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;</description><link>http://codeflow.blogspot.com/2011/03/roles-and-responsibilities-of-software.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-2992460787227859112</guid><pubDate>Thu, 13 May 2010 20:02:00 +0000</pubDate><atom:updated>2010-05-13T14:02:26.353-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">code quality</category><title>StyleCop</title><description>Having worked in both types of software companies (#1 - those that care about the quality of the code it produces, #2 - those that do not... and preferring the former by some way!), I was pleased to come across &lt;a href=&quot;http://stylecop.codeplex.com/&quot;&gt;StyleCop&lt;/a&gt; - a tool that complements FxCop (which analyzes adherence to the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms229042.aspx&quot;&gt;Microsoft Design Guidelines for Developing Class Libraries&lt;/a&gt; in .NET assemblies) by checking source code for adherence to the coding standard.&lt;br /&gt;&lt;br /&gt;Assuming company type #1, as the size of development teams increases with the scale of the project (and hence, the product under development), the importance of having source code developed in a consistent style increases. StyleCop is an invaluable tool in this regard; it checks source code from spacing between code elements to the correctness of documentation (albeit at a fairly rudimentary level). Even better, it allows &lt;a href=&quot;http://blogs.msdn.com/sourceanalysis/pages/source-analysis-msbuild-integration.aspx&quot;&gt;integration with Visual Studio projects&lt;/a&gt; via MSBuild targets, which will force a build failure in the face of source code that falls short of the coding standard.&lt;br /&gt;&lt;br /&gt;This does raise some issues for those that differ with Microsoft in the standards they apply; for these StyleCop provides 2 possible options:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Customize the StyleCop settings (optionally, writing custom analysis rules)&lt;/li&gt;&lt;li&gt;Change your coding standard&lt;/li&gt;&lt;/ol&gt;I took option #1, by disabling the settings that went against the coding standard - e.g. requiring that fields be defined at the end, methods be organized in order of visibility (as opposed to functionality/having overloads grouped together). StyleCop saves these settings in a Settings.StyleCop file; when analyzing source code, the merged StyleCop settings will be applied to all files in and below the closest folder containing the Settings.StyleCop file.&lt;br /&gt;&lt;br /&gt;The merge mentioned above is implemented as follows: StyleCop applies settings from the global default included in the installation through the folder hierarchy, with the lowest level settings file having the highest priority. Hence, it is possible to define settings and override them at the required level of granularity. For example, I have a Settings.StyleCop file at the same level as the .sln file; however, I have another Settings.StyleCop file wherever an override is required (such as in IDE generated code), at a lower level in the source code structure. This also allows applying StyleCop within legacy codebases in areas where new features are being developed, for example.&lt;br /&gt;&lt;br /&gt;Thus far, StyleCop is working just fine; a further minor adjustment to development protocol to require zero FxCop and StyleCop warnings when committing source code to version control will hopefully take the development team to the next level of code quality.</description><link>http://codeflow.blogspot.com/2010/05/stylecop.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-1856006104950946019</guid><pubDate>Thu, 13 May 2010 19:23:00 +0000</pubDate><atom:updated>2010-11-06T10:33:31.403-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">code quality</category><title>FxCop and Custom Dictionaries</title><description>I&#39;ve moved back to using FxCop 1.36 (instead of the Visual Studio Code Analysis feature), for the following reasons:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Managing exclusions/suppressions is easier than in code (especially in identifying the exclusions added without justification!)&lt;/li&gt;
&lt;li&gt;Identification of issues that no longer exist in the codebase (near impossible in large codebases, with the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.diagnostics.codeanalysis.suppressmessageattribute.aspx&quot;&gt;SuppressMessage&lt;/a&gt; attribute)&lt;/li&gt;
&lt;li&gt;Suppressions will not get built into the assembly as metadata&lt;/li&gt;
&lt;/ol&gt;The main problem that I encountered in this move was with the use of custom dictionaries; while FxCopCmd.exe supports a &lt;em&gt;/dictionary&lt;/em&gt; command-line switch, the FxCop GUI tool does not have a feature to add a custom dictionary.&lt;br /&gt;
&lt;br /&gt;
There are some special paths which can be used to store the custom dictionary, such as the FxCop installation and User Profile paths - these have a major drawback in team development scenarios: they are not conducive for maintaining the dictionary in a common location in source control (in my case, in a path relative to the FxCop project file). Storing the custom dictionary in the same folder as the FxCop project file is supposed to work, but I could not get this to work as mentioned &lt;a href=&quot;http://stackoverflow.com/questions/359290/how-to-get-the-fxcop-custom-dictionary-to-work&quot;&gt;here&lt;/a&gt;, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb429472(VS.80).aspx&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://stackoverflow.com/questions/359290/how-to-get-the-fxcop-custom-dictionary-to-work&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The solution I came up with (quite by accident, while performing a diff on the FxCop project file after using FxCopCmd.exe with the &lt;em&gt;/dictionary&lt;/em&gt; and &lt;em&gt;/update&lt;/em&gt; switches!) was to add the relative path of the custom dictionary into a &lt;customdictionary&gt;child element of the &#39;CustomDictionaries&#39; &lt;customdictionaries&gt;element in the FxCop project file. I used the $(ProjectDir) variable within the FxCop project file to ensure the path of the custom dictionary would remain dynamic. As far as I can tell, this XML structure and the use thereof has not been documented by Microsoft.&lt;br /&gt;
&lt;br /&gt;
A secondary benefit in using this approach is the facility to use the same custom dictionaries which were previously referenced from Visual Studio projects as &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb514188.aspx&quot;&gt;Code Analysis Dictionaries&lt;/a&gt;, from source control.&lt;br /&gt;
&lt;br /&gt;
A third tab in the FxCop GUI (in addition to the Targets and Rules tabs) to contain the dictionaries would be useful, to make using custom dictionaries easier. In essence, all it would have to do is handle adding/removing of CustomDictionary elements (i.e. a programmatic equivalent of my manual solution above).&lt;br /&gt;
&lt;br /&gt;
Another great feature (on a slightly unrelated note) would be a set of MSBuild targets (in a .target file) that can be used to integrate with Visual Studio, &lt;em&gt;a la&lt;/em&gt; the &lt;a href=&quot;http://blogs.msdn.com/sourceanalysis/pages/source-analysis-msbuild-integration.aspx&quot;&gt;StyleCop VS integration&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
EDIT: As per Steven&#39;s request, given below is the change I made to the .FxCop XML project file; under the &#39;ProjectOptions&#39; element, I changed the &#39;CustomDictionaries&#39; element to read as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: small;&quot;&gt;&amp;lt;CustomDictionaries SearchFxCopDir=&quot;True&quot; SearchUserProfile=&quot;True&quot; SearchProjectDir=&quot;True&quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;CustomDictionary Path=&quot;$(ProjectDir)/CodeAnalysisDictionary.xml&quot; /&amp;gt;
&amp;lt;/CustomDictionaries&amp;gt;
&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;
Seems the word &#39;CodeDictionaries&#39; had got stripped from the original post (as I&#39;d used angle brackets); I&#39;ve corrected the original article text.&lt;br /&gt;
&lt;br /&gt;
Hope this explains my hack/fix sufficiently; I&#39;d have liked to submit a .FxCop file, but it seems Blogger.com doesn&#39;t allow attachments.... :-(</description><link>http://codeflow.blogspot.com/2010/05/fxcop-and-custom-dictionaries.html</link><author>noreply@blogger.com (dilan)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-8792447862377236262</guid><pubDate>Thu, 21 Jan 2010 17:47:00 +0000</pubDate><atom:updated>2010-01-21T10:00:03.686-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software design</category><title>Presentation on Software Design Principles</title><description>&lt;a href=&quot;http://docs.google.com/fileview?id=0BxpC_dieX_cmMzQzZmJiNjAtNDEzNy00YTM4LThkMDMtNGU2ZGZkYzZkNDk3&amp;amp;hl=en&quot;&gt;This &lt;/a&gt;is a presentation on Software Design Principles, mainly based on the work of Bob Martin.&lt;br /&gt;&lt;br /&gt;The slide deck is dedicated to Bob Martin and the other software engineering pioneers who set the foundation for the software we develop today. Thank you!</description><link>http://codeflow.blogspot.com/2010/01/presentation-on-software-design.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-1452846457566686398</guid><pubDate>Fri, 17 Oct 2008 06:54:00 +0000</pubDate><atom:updated>2008-10-16T23:54:18.660-07:00</atom:updated><title>An educated guess (Timur Fanshteyn): Subversion pre-commit hooks</title><description>Am in the middle of migrating a load of VSS databases to SVN repositories... and came across the following article which shows how to prevent developers from committing without adding comments.&lt;br /&gt;&lt;br /&gt;Sweet! :-)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://blog.tfanshteyn.com/2007/11/subversion-pre-commit-hooks.html&quot;&gt;An educated guess (Timur Fanshteyn): Subversion pre-commit hooks&lt;/a&gt;</description><link>http://codeflow.blogspot.com/2008/10/educated-guess-timur-fanshteyn.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-3584400788708285962</guid><pubDate>Tue, 05 Aug 2008 17:08:00 +0000</pubDate><atom:updated>2008-08-05T10:08:46.110-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software architecture</category><title>Ctrl-Shift-B: Interactive Application Architecture Patterns</title><description>I&#39;ve been looking into the viability of using the Model-View-Presenter pattern just recently and came across another in-depth article by Derek Greer.&lt;br /&gt;&lt;br /&gt;This is easily one of the best articles I&#39;ve read - get yours at &lt;a href=&quot;http://ctrl-shift-b.blogspot.com/2007/08/interactive-application-architecture.html&quot;&gt;Ctrl-Shift-B: Interactive Application Architecture Patterns&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It&#39;s a pity the guy doesn&#39;t seem to get to post more often - (being a software developer, it isn&#39;t surprising...)&lt;br /&gt;&lt;br /&gt;I will be posting my findings on the Model-View-Presenter pattern soon, but I suggest you don&#39;t hold your breath.... (after all, I&#39;m a software developer too!)</description><link>http://codeflow.blogspot.com/2008/08/ctrl-shift-b-interactive-application.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-1322667171313650465</guid><pubDate>Mon, 04 Aug 2008 21:25:00 +0000</pubDate><atom:updated>2008-08-04T14:25:58.198-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software architecture</category><title>Ctrl-Shift-B: The Art of Separation of Concerns</title><description>Derek Greer has written a detailed post on Separation of Concerns (SoC), at &lt;a href=&quot;http://ctrl-shift-b.blogspot.com/2008/01/art-of-separation-of-concerns.html&quot;&gt;Ctrl-Shift-B: The Art of Separation of Concerns&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;He also explains how we can achieve good SoC by decomposing a design into verticals (modules) and horizontals (layers), also looking at how aspects (AOP) allow us to take this to yet another level.&lt;br /&gt;&lt;br /&gt;The post also discusses Inversion of Control (IoC) and Dependency Injection (DI)... and how they contribute to good separation as well.&lt;br /&gt;&lt;br /&gt;All-in-all, a good read.&lt;br /&gt;&lt;br /&gt;Remember:&lt;br /&gt;&lt;br /&gt;(High SoC) == (High cohesion, Low coupling) == &lt;a href=&quot;http://en.wikipedia.org/wiki/Bad_Thing#A_Good_Thing&quot;&gt;A Good Thing&lt;/a&gt;!</description><link>http://codeflow.blogspot.com/2008/08/ctrl-shift-b-art-of-separation-of.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-6398680455308512453</guid><pubDate>Fri, 09 May 2008 08:27:00 +0000</pubDate><atom:updated>2008-05-09T01:29:31.035-07:00</atom:updated><title>Concurrency &amp; Nine 9&#39;s with Erlang</title><description>Came across a post by an old friend on &lt;a href=&quot;http://kindageeky.blogspot.com/2007/12/concurrency-nine-9s-with-erlang.html&quot;&gt;Concurrency &amp;amp; Nine 9&#39;s with Erlang&lt;/a&gt; - an interesting read.</description><link>http://codeflow.blogspot.com/2008/05/concurrency-nine-9s-with-erlang.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-48802861012495784</guid><pubDate>Thu, 16 Aug 2007 17:32:00 +0000</pubDate><atom:updated>2007-08-16T11:31:14.605-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">load testing</category><title>Article on LoadRunner vs VSTS</title><description>Just came across &lt;a href=&quot;http://www.loadtester.com/vsts.php&quot;&gt;this&lt;/a&gt; article on LoadRunner against Visual Studio Team System, by Scott Moore.&lt;br /&gt;&lt;br /&gt;NOTE: the article in question is not totally impartial (who is???), as Scott Moore is a consultant for a company partnering with HP/Mercury. The same goes for this blog, in a direction tending towards Microsoft.&lt;br /&gt;&lt;br /&gt;There are some valid points made re. the versatility of LoadRunner - Microsoft is not going to get their hands on the innards of SAP and Oracle in the near(?) future, so it&#39;s unlikely that they will be able to compete on that front. That being the case, Scott Moore is (IMO) spot on with his call that VSTS is not going to be a LoadRunner killer. ERP solutions will always need load testing and LoadRunner will probably handle that admirably... but having tried both VSTS and LoadRunner, the ease with which a test can be recorded and parameterized without delving into script is pretty impressive. However, the lack of support for Opera/Firefox browsers on VSTS is a fairly large shortcoming, as-is the current shortcomings in data generation and binding.&lt;br /&gt;&lt;br /&gt;Having read the article, I think I&#39;ll stand by my previous conclusion of horses for courses: ASP.NET or another web app, which can be tested off pure HTTP - use VSTS. Heavy duty requirements? Go with LoadRunner. Either option has a price tag beyond my personal reach, anyway...!</description><link>http://codeflow.blogspot.com/2007/08/article-on-loadrunner.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-2714976598234290942</guid><pubDate>Thu, 16 Aug 2007 17:32:00 +0000</pubDate><atom:updated>2007-08-16T11:16:35.100-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">unit testing</category><title>Unit Testing in Visual Studio 2008 (&#39;Orcas&#39;) - Professional Edition</title><description>The &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2007/07/26/vs-2008-and-net-3-5-beta-2-released.aspx&quot;&gt;good word&lt;/a&gt; is that unit testing will be available in the professional editon of Visual Studio. This is a near mandatory feature in an IDE today, which most Java IDEs provide out-of-the-box; TDD in .NET would have been further along the road today if VS2005 Pro had included the unit testing feature.&lt;br /&gt;&lt;br /&gt;Let&#39;s just hope that they don&#39;t provide unit testing while leaving out the code coverage feature! :P</description><link>http://codeflow.blogspot.com/2007/08/unit-testing-in-orcas-vs-pro.html</link><author>noreply@blogger.com (dilan)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-3180945101293613359</guid><pubDate>Thu, 16 Aug 2007 17:32:00 +0000</pubDate><atom:updated>2007-08-16T11:36:15.281-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">load testing</category><title>Load testing with VSTS and LoadRunner</title><description>I&#39;ve not been able to post for a while - been knee deep in work and life, while standing on my head...&lt;br /&gt;&lt;br /&gt;Anyway, I&#39;ve been working with the QA team at my workplace on load testing some of our applications headed for Production over the last few days, getting a taste of both LoadRunner and VSTS.&lt;br /&gt;&lt;br /&gt;LoadRunner is *the* heavy duty tool supporting loads of protocols, including SAP and Siebel (amongst others), in addition to the basic requirement of HTTP. We were testing an ASP.NET application which came a cropper when ViewState values would not get replayed, but until then recording a test, replaying it and configuring a load was fairly simple. Debugging is not A-grade AFAIK - but breakpoints and analysis of variables is provided. We tested this off a 10 day trial license, which restricts load to 10 virtual users; the real thing is *said* to be &lt;a href=&quot;http://answers.google.com/answers/threadview?id=555953&quot;&gt;expensive&lt;/a&gt; (claims unverified).&lt;br /&gt;&lt;br /&gt;On to Visual Studio Team System (VSTS) - Microsoft have done a good job making setting up a test easy, but the bias towards testing Microsoft stuff is definitely visible (e.g. in browser support). Setting up a test was easy, as was parameterizing it. LoadRunner has lots of features to generate data, but VSTS 2005 required some effort to bind to a data source. Thankfully, VSTS 2008 (&#39;Orcas&#39;) will have &lt;a href=&quot;http://blogs.msdn.com/andyphilpotts/archive/2007/06/20/easily-bind-to-csv-or-xml-data-sources.aspx&quot;&gt;data binding to CSV/XML&lt;/a&gt; files in-built; VSTS does provide for extensibility via Request/Test Plugins, which can be used to provide data. I did hit an issue where if an asp:Button &lt;?xml:namespace prefix = asp /&gt;&lt;asp:button&gt;has its UseSubmitBehavior switched off, the script records the Cancel button&#39;s existence on the page as well, leading to the subsequent HTTP request not being handled correctly by the server. Tests were conducted on a 180-day trial license, without any feature restrictions.&lt;br /&gt;&lt;br /&gt;The comparison plays out like this - for basic web apps (definitely ASP.NET apps), VSTS should suffice. While not being cheap, VSTS does not cost as much as LoadRunner. However, LoadRunner is a far more mature product and versatile with it - having support for ERPs and protocols like CITRIX and RDP. The VSTS feature of rigging Unit Tests and Web Tests into Load Tests was pretty impressive and the .NET language + debugging features of the VS IDE outstripped LoadRunner by some distance.&lt;br /&gt;&lt;br /&gt;Final word: select what you need for your specific requirement; but for the majority of small-medium business applications, VSTS should meet your need.&lt;br /&gt;&lt;/asp:button&gt;&lt;asp:button&gt;&lt;/asp:button&gt;</description><link>http://codeflow.blogspot.com/2007/08/load-testing-with-vsts-and-loadrunner.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-9061247902858247453</guid><pubDate>Tue, 01 May 2007 11:23:00 +0000</pubDate><atom:updated>2009-02-26T06:49:23.633-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software architecture</category><title>Anemic vs. Rich Domain Models</title><description>There&#39;s debate at almost religious intensity on some forums as to the type of domain model to be used in developing applications.&lt;br /&gt;&lt;br /&gt;The rich &lt;a href=&quot;http://martinfowler.com/eaaCatalog/domainModel.html&quot;&gt;Domain Model&lt;/a&gt; (proposed by Martin Fowler) suggests having e.g. Employee objects, with all operations on an Employee provided by the class itself - such as Employee.Save(). Fowler argues that this makes for better object orientation, as there is greater encapsulation and the opportunity for polymorphic use of objects.&lt;br /&gt;&lt;br /&gt;The alternative is the Anemic Domain Model (the term coined by &lt;a href=&quot;http://www.martinfowler.com/bliki/AnemicDomainModel.html&quot;&gt;Fowler&lt;/a&gt; himself makes clear how much he dislikes the model by using a term with negative implications) and probably inspired by the design of stateless session beans from EJB. This design has (to follow the above example) Employee objects containing their own data, but EmployeeManager or EmployeeService classes containing the operations - such as EmployeeManager.Save(Employee).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Anemic_Domain_Model&quot;&gt;Wikipedia&lt;/a&gt; labels the latter as an anti-pattern; however, given that there are so many proponents of the Anemic Domain Model (ADM), labeling it an anti-pattern seems to be an extremist, dogmatic point of view. The pro-ADM argument is that breaking the functionality out into separate classes further enhances separation of concerns, which is a good design practice.&lt;br /&gt;&lt;br /&gt;Personally, I&#39;ve found the ADM to be a simple one to develop, lending itself well to generation of code via templates etc. Furthermore, with the whole SOA/Web Service buzz, services as per ADM make a lot of sense; even use of the GOF Facade design pattern would probably lead to the same solution. Say in a Web Service application, the designer would be forced to make the Domain Model dependent on the relevant Web Service - in my book, placing Web Service calls behind Employee.Save() would be mixing up far too many concerns (i.e. business logic + web service invocation code).&lt;br /&gt;&lt;br /&gt;Fowler&#39;s rich Domain Model is an ideal solution - and I&#39;ve used it successfully on several in-process solutions - and if it can be achieved outside of the pro-ADM arguments just outlined - I&#39;m all for it. Maybe having the UI talk to a rich Domain Model (your formal API), which in turn talks to the back end comprising an ADM would be the answer... however, this would mean code that would be repetitive and leave that much more room for defects to creep in.&lt;br /&gt;&lt;br /&gt;It all comes down to a question of how pragmatic a software designer is willing to be. The only certainty is that this argument will not be going away anytime soon.&lt;br /&gt;&lt;br /&gt;A few blogs which have opinions on this topic:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.substanceofcode.com/2007/01/17/from-anemic-to-rich-domain-model/&quot;&gt;http://www.substanceofcode.com/2007/01/17/from-anemic-to-rich-domain-model/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://vitamic.wordpress.com/2007/01/04/anemic-domain-model-illustrated/&quot;&gt;http://vitamic.wordpress.com/2007/01/04/anemic-domain-model-illustrated/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://dotnetjunkies.com/WebLog/richardslade/archive/2007/03/07/209401.aspx&quot;&gt;http://dotnetjunkies.com/WebLog/richardslade/archive/2007/03/07/209401.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://wagnerblog.com/?p=805&quot;&gt;http://wagnerblog.com/?p=805&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Finding references on this matter is not hard at all...&lt;br /&gt;&lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;q=rich+domain+model&quot;&gt;Google for rich Domain Model&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.google.com/search?q=anemic+domain+model&amp;amp;hl=en&amp;amp;start=10&amp;amp;sa=N&quot;&gt;Google for Anemic Domain Model&lt;/a&gt;</description><link>http://codeflow.blogspot.com/2007/05/anemic-vs-rich-domain-models.html</link><author>noreply@blogger.com (dilan)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-1693421879010616352</guid><pubDate>Sun, 11 Feb 2007 18:14:00 +0000</pubDate><atom:updated>2007-02-11T11:52:37.166-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">unit testing</category><title>Unit Testing Internal Types (2)</title><description>It works!&lt;br /&gt;&lt;br /&gt;In a previous &lt;a href=&quot;unit-testing-internal-types.html&quot;&gt;article&lt;/a&gt;, I discussed unit testing internal classes which are typically instantiated using Reflection and are accessed via a Facade.&lt;br /&gt;&lt;br /&gt;Learnings: When TestDriven.NET runs NUnit tests through the IDE, configuration values seem to be pulled from testassembly.dll.config.temp, while the specified configuration file is used if run through the NUnit GUI.&lt;br /&gt;&lt;br /&gt;These files would have to be replaced with our custom content, to test the internal component, through the Facade.&lt;br /&gt;&lt;br /&gt;Anyway, I scrapped together a helper class that would handle copying of the configuration content (overloads for config content as a string and alternatively, a source config file). The [TestFixtureTearDown] method is used to restore the original configuration, while individual [Test]s can use the helper to copy the relevant config file for running.&lt;br /&gt;&lt;br /&gt;I&#39;m glad that it worked, but given that it&#39;s a hacked together solution, could stop working with any forthcoming release of NUnit (e.g. if config files are locked for the duration of execution etc.).&lt;br /&gt;&lt;br /&gt;Steven Cohn (&lt;a href=&quot;http://weblogs.asp.net/stevencohn/archive/2004/06/06/unit-testing-c-internal-members.aspx&quot;&gt;in his blog&lt;/a&gt;) made good sense about not modifying the &#39;System Under Test&#39;, in order to test it. The only thing I&#39;ve got to say about &#39;pragmatic unit testing&#39; is, given all the restrictions in testing internal types, the most pragmatic thing would be to stop unit testing... :P&lt;br /&gt;&lt;br /&gt;You&#39;d think I&#39;d be happy at having solved the problem (hack or otherwise), but strangely, jumping through hoops does sweet nothing for the temper! ;-)</description><link>http://codeflow.blogspot.com/2007/02/unit-testing-internal-types-2.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-8747876821523311816</guid><pubDate>Sat, 10 Feb 2007 12:25:00 +0000</pubDate><atom:updated>2007-02-10T05:13:05.822-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">unit testing</category><title>Unit Testing Internal Types</title><description>Problem: .NET classes of &#39;internal&#39; visibility to be unit tested (in this case, using NUnit).&lt;br /&gt;&lt;br /&gt;Complication: These classes are part of a &#39;provider&#39; model (pluggable components instantiated via a Factory Method implementation, based on configuration settings). Access to the functionality to be tested would be via a Facade class, which looks up configuration and instantiates the relevant type using Reflection.&lt;br /&gt;&lt;br /&gt;Known Solutions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use of &lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/0tke9fxk.aspx&quot; target=&quot;_blank&quot;&gt;Friend assemblies&lt;/a&gt; - however, to maintain security (ensuring only our Unit Test assembly invokes the internal types) we would need to strong name our assembly under test. This has a cascading effect, as all its references then need to be strong named. Not an option, when you consider that we might have a reference on an external vendor&#39;s component somewhere down the dependency chain.&lt;/li&gt;&lt;li&gt;Writing the Unit Tests in the same assembly - which clutters up the codebase goodstyle.&lt;/li&gt;&lt;li&gt;Write Reflection based wrappers (a la VSTS) - which the Professional edition of VS2005 does not have.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Yet another solution?&lt;/p&gt;&lt;p&gt;I&#39;m sure there is a downside to the following approach, which I&#39;m going to find out about the hard way - but till then:&lt;/p&gt;&lt;p&gt;The complication states that the required values need to be pulled from configuration. What price placing the default configuration file in the execution path during the method marked with [TestFixtureSetUp], to be overwritten at the beginning of the individual [Test] method by a separate configuration file containing the relevant settings, methinks... all this is very much guesswork, depending on NUnit allowing the configuration file to be overwritten. &lt;/p&gt;&lt;p&gt;I&#39;m thinking a feature in NUnit like the VSTS &lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/microsoft.visualstudio.testtools.webtesting.deploymentitemattribute(VS.80).aspx&quot; target=&quot;_blank&quot;&gt;[DeploymentItem]&lt;/a&gt; attribute would have been very helpful in this scenario...&lt;/p&gt;&lt;p&gt;Will blog about whether this works... if it works!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://codeflow.blogspot.com/2007/02/unit-testing-internal-types.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8200924474223180475.post-3778463703064583485</guid><pubDate>Thu, 08 Feb 2007 14:58:00 +0000</pubDate><atom:updated>2007-02-11T12:15:30.190-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">general</category><title>And about time too!</title><description>Continuous Deprioritization: the reason why I never got around to running a blog thus far. After deliberating and procrastinating for a couple of years, I finally got around to starting up this blog.&lt;br /&gt;&lt;br /&gt;And just like *that*, the words run dry!</description><link>http://codeflow.blogspot.com/2007/02/and-about-time-too.html</link><author>noreply@blogger.com (dilan)</author><thr:total>0</thr:total></item></channel></rss>