<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Dmitry Frenkel</title>
	<atom:link href="http://dimafr.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://dimafr.wordpress.com</link>
	<description>Software Architecture and Technology Blog</description>
	<lastBuildDate>Thu, 16 Feb 2012 17:35:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='dimafr.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/ccb43163d8a4b7693f97e4adf50737a5?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Dmitry Frenkel</title>
		<link>http://dimafr.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dimafr.wordpress.com/osd.xml" title="Dmitry Frenkel" />
	<atom:link rel='hub' href='http://dimafr.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Creating Testable WCF Data Services</title>
		<link>http://dimafr.wordpress.com/2011/11/14/creating-testable-wcf-data-services/</link>
		<comments>http://dimafr.wordpress.com/2011/11/14/creating-testable-wcf-data-services/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 09:40:40 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Data Services]]></category>
		<category><![CDATA[WCF Data Services]]></category>
		<category><![CDATA[Testability]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=295</guid>
		<description><![CDATA[One of the effective ways to expose your data on the web is to use WCF Data Services and OData protocol. In its simplest form, a WCF Data Service can be built by exposing your ADO.NET Entity Framework ObjectContext through the &#8230; <a href="http://dimafr.wordpress.com/2011/11/14/creating-testable-wcf-data-services/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=295&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of the effective ways to expose your data on the web is to use <a title="WCF Data Services" href="http://msdn.microsoft.com/en-us/data/bb931106.aspx">WCF Data Services</a> and <a title="OData" href="http://www.odata.org/">OData</a> protocol.</p>
<p>In its simplest form, a WCF Data Service can be built by exposing your <a href="http://msdn.microsoft.com/en-us/library/bb399572.aspx">ADO.NET Entity Framework</a> <a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx">ObjectContext</a> through the <a href="http://msdn.microsoft.com/en-us/library/cc646779.aspx">DataService&lt;T&gt;</a> class.<br />
However, when it comes to testing, especially in situations when you have to enhance data in the OData Feed with some additional information (through WCF <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.description.iservicebehavior.aspx">Behaviors</a> for example), or when you have to verify that your <a href="http://msdn.microsoft.com/en-us/library/dd744842.aspx">Query Interceptors</a> work as designed, using Object Context that is bound to a live database is hard because:</p>
<ul>
<li>Your tests that have little to do with the shape of your data become dependent on the database, which is a <strong>big</strong> problem</li>
<li>You have maintain test data in the database when you run your tests, which is a maintenance overhead</li>
</ul>
<p>So there lies our problem: how to expose data using WCF Data Services in a way where the database dependency can be mocked out during unit testing? The short answer is that we need to achieve better testability by introducing persistence-ignorant domain layer and by making our existing Object Context implement an interface that can be mocked/substituted in testing.</p>
<p>This article describes the concrete incremental steps you can take to get you from a standard Data Service built on top of Entity Framework Object Context to a solution that will satisfy testability requirements above. I will demonstrate the technique on a sample service connected to the <a href="http://msftdbprodsamples.codeplex.com/">AdventureWorksLT</a> database.</p>
<h3><span style="color:#333333;">Initial State: Data Service Of Object Context</span></h3>
<p><pre class="brush: csharp;">
public class MyDataService : DataService
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule(&quot;Products&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductCategories&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductDescriptions&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductModelProductDescriptions&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductModels&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;SalesOrderHeaders&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;SalesOrderDetails&quot;, EntitySetRights.All);

        config.UseVerboseErrors = true;
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}
</pre></p>
<h3><span class="Apple-style-span" style="color:#333333;">Step 1: Create an Interface that represents you Data Repository</span></h3>
<p>This step is easy: For every entity type you expose in your Data Service, add a method that returns <a href="http://msdn.microsoft.com/en-us/library/bb351562.aspx">IQueryable&lt;T&gt;</a>:</p>
<p><pre class="brush: csharp;">
namespace MyDataService.DataAccess
{
    public interface IMyDataRepository
    {
        IQueryable&lt;/pre&gt;
&lt;address&gt;Addresses { get; }
 IQueryable Customers { get; }
 IQueryable CustomerAddresses { get; }
 IQueryable Products { get; }
 IQueryable ProductCategories { get; }
 IQueryable ProductDescriptions { get; }
 IQueryable ProductModelProductDescriptions { get; }
 IQueryable ProductModels { get; }
 IQueryable SalesOrderHeaders { get; }
 IQueryable SalesOrderDetails { get; }
 }
}
</pre></p>
</address>
<p>After interface has been created, you can provide default/production implementation in the hand-written partial class that corresponds to your Object Context by just returning Object Sets already defined by you Object Context:</p>
<p><pre class="brush: csharp;">
namespace MyDataService.DataAccess
{
    public partial class AdventureWorksLTEntities: IMyDataRepository
    {
        IQueryable IMyDataRepository.Products
        { get { return this.Products; } }

        IQueryable IMyDataRepository.ProductCategories
        { get { return this.ProductCategories; } }

        IQueryable IMyDataRepository.ProductDescriptions
        { get { return this.ProductDescriptions; } }

        IQueryable IMyDataRepository.ProductModelProductDescriptions
        { get { return this.ProductModelProductDescriptions; } }

        IQueryable IMyDataRepository.ProductModels
        { get { return this.ProductModels; } }

        IQueryable IMyDataRepository.SalesOrderHeaders
        { get { return this.SalesOrderHeaders; } }

        IQueryable IMyDataRepository.SalesOrderDetails
        { get { return this.SalesOrderDetails; } }

        IQueryable&lt;/pre&gt;
&lt;address&gt;IMyDataRepository.Addresses
 { get { return this.Addresses; } }

 IQueryable IMyDataRepository.Customers
 { get { return this.Customers; } }

 IQueryable IMyDataRepository.CustomerAddresses
 { get { return this.CustomerAddresses; } }
 }
}
</pre></p>
</address>
<p>Now you have an interface in your system that defines data access methods already implemented by your Object Context.<br />
This means that if you build the rest of the system to rely/depend on this interface, rather than use its implementation (i.e. the Object Context), you can achieve better flexibility and the testability without having to worry about test databases and policing test data in your build environment and on developers&#8217; workstations.</p>
<p>This is a worthy and very achievable goal, but we have a few steps remaining to fully get us there.</p>
<h3><span class="Apple-style-span" style="color:#333333;">Step 2: Change Code Generation Template to use Self-Tracking Entities</span></h3>
<p>This step is needed because you typically do not want you entities to be database-bound, and instead you want a reusable, independent domain layer that can be used in multiple scenarios. This move will contribute to a better code flexibility and layering without jeopardizing data access functionality that Entity Framework provides out of the box. Full discussion on why separate persistence-ignorant domain layer is a good thing is out of scope for this article. If you want to research the subject further, I would start <a title="Stack Overflow Discussion on DDD" href="http://stackoverflow.com/questions/905498/what-are-the-benefits-of-persistence-ignorance">here</a>, <a title="The Unit Of Work Pattern And Persistence Ignorance" href="http://msdn.microsoft.com/en-us/magazine/dd882510.aspx#id0420099">here</a> and <a title="What is Domain-Driven Design?" href="http://domaindrivendesign.org/resources/what_is_ddd">here</a>.</p>
<p><a href="http://dimafr.files.wordpress.com/2011/11/addselftrackingentitiescodegeneration.png"><img class="align size-full" title="Adding Self-Tracking Entities Code Generation" src="http://dimafr.files.wordpress.com/2011/11/addselftrackingentitiescodegeneration.png?w=500" alt="Adding Self-Tracking Entities Code Generation"   /></a></p>
<p>Having done that, your Project containing Data Context will look differently:</p>
<ul>
<li>You will see AdventureWorks.Context.tt and code-generated Object Context in the AdventureWorks.Context.cs and AdventureWorks.Context.Extensions.cs</li>
<li>You will see AdventureWorks.tt and code-generated entity classes that match you Entity Framework Model.</li>
</ul>
<p>Note that entity classes do not have any dependency on the <a title="System.Data.Objects.DataClasses.EntityObject" href="http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject.aspx">EntityObject</a> and therefore do not have to live in your Data Access layer.</p>
<p><a href="http://dimafr.files.wordpress.com/2011/11/selftrackingentities-generatedcode.png"><img class="alignnone size-full" title="Self-Tracking Entities: Generated Code" src="http://dimafr.files.wordpress.com/2011/11/selftrackingentities-generatedcode.png?w=500" alt="Self-Tracking Entities: Generated Code"   /></a></p>
<h3><span class="Apple-style-span" style="color:#333333;">Step 3: Move Your POCO Entities into a separate &#8220;Domain&#8221; assembly</span></h3>
<p>Now that we have a domain layer of self-tracking plain old CLR objects (POCOs), we want to make it reusable.<br />
This means separating the entity classes into a separate assembly that does not have any dependencies on Entity Framework, System.Data or any other persistence technologies. The tricky part is that we want to still get the benefits of EF designer experience, i.e. if we added, removed or modified some entities, we want them to be re-generated the usual way.</p>
<p>To achieve that, follow these steps:</p>
<ul>
<li>Create a new Project where you intend to host your Domain Layer. Reference System.Runtime.Serialization.</li>
<li>Right-Click on the Entity Code Generation template (AdventureWorks.tt) and select <strong>Exclude From Project</strong>.</li>
<li>In your Domain Layer project, add existing Entity Code Generation Template (located in EDMX folder) <strong>as a link</strong>.Visual Studio will regenerate Domain Classes in the correct namespace that matches your Domain Layer:<a href="http://dimafr.files.wordpress.com/2011/11/separatedomainlayer1.png"><img class="alignnone size-full" title="Separate Domain Layer" src="http://dimafr.files.wordpress.com/2011/11/separatedomainlayer1.png?w=500" alt="Seperate Domain Layer"   /></a></li>
<li>Reference your new Domain project from Data Layer and from the Web Project hosting your Data Service.</li>
<li>Add using statements for your Domain namespace to fix compiler errors.</li>
<li>You will notice that one of the places you had to add using statement is you code-generated AdventureWorks.Context.cs. Since this class is being generated every time, it is better to add additional using statement to the .Context.tt template:<pre class="brush: csharp;">
EntityContainer container = ItemCollection.GetItems().FirstOrDefault();
if (container == null)
{
    return &quot;// No EntityContainer exists in the model, so no code was generated&quot;;
}

WriteHeader(fileManager, &quot;MyDataService.Domain&quot;);
BeginNamespace(namespaceName, code);
</pre></li>
</ul>
<h3><span class="Apple-style-span" style="color:#333333;">Step 4: Create your own Data Context that composes your Data Repository</span></h3>
<p>In the Data Access project, add a class that will represent new context will use in the Data Service.<br />
This class replaces Entity Context used before, and therefore it should implement all properties that return IQueryable instances for the Data Service. Since our Repository already implements all this, the implementation is trivial:</p>
<p><pre class="brush: csharp;">
namespace MyDataService.DataAccess
{
    public class MyDataContext
    {
        public IMyDataRepository Repository { get; private set; }

        public MyDataContext(IMyDataRepository repository)
        {
            if (repository == null)
            {
                throw new ArgumentNullException(&quot;repository&quot;, &quot;Expecting a valid Repository&quot;);
            }

            this.Repository = repository;
        }

        public MyDataContext(): this(new AdventureWorksLTEntities())
        {
        }

        public IQueryable&lt;/pre&gt;
&lt;address&gt;Addresses
 {
 get { return this.Repository.Addresses; }
 }

 public IQueryable Customers
 {
 get { return this.Repository.Customers; }
 }

 public IQueryable CustomerAddresses
 {
 get { return this.Repository.CustomerAddresses; }
 }

 public IQueryable Products
 {
 get { return this.Repository.Products; }
 }

 public IQueryable SalesOrderDetails
 {
 get { return this.Repository.SalesOrderDetails; }
 }

 public IQueryable SalesOrderHeaders
 {
 get { return this.Repository.SalesOrderHeaders; }
 }

 public IQueryable ProductCategories
 {
 get { return this.Repository.ProductCategories; }
 }

 public IQueryable ProductDescriptions
 {
 get { return this.Repository.ProductDescriptions; }
 }

 public IQueryable ProductModelProductDescriptions
 {
 get { return this.Repository.ProductModelProductDescriptions; }
 }

 public IQueryable ProductModels
 {
 get { return this.Repository.ProductModels; }
 }
 }
}</pre></p>
</address>
<h3><span class="Apple-style-span" style="color:#333333;">Step 5: Update Data Service to use custom Data Context</span></h3>
<p><pre class="brush: csharp;">
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyDataService : DataService
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule(&quot;Products&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductCategories&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductDescriptions&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductModelProductDescriptions&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;ProductModels&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;SalesOrderHeaders&quot;, EntitySetRights.All);
        config.SetEntitySetAccessRule(&quot;SalesOrderDetails&quot;, EntitySetRights.All);

        config.UseVerboseErrors = true;
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}
</pre></p>
<p>One you do that, Data Services infrastructure will switch from Entity Framework provider to a Reflection Provider.<br />
There are subtle but important differences between the two. One of the symptoms of those differences is that Reflection Provider does not understand POCO&#8217;s the same way Entity Provider understands Entities.<br />
If you run you service as is, you will get a bunch of errors stating that there are some unsupported properties.<br />
To fix those errors, you would have to create partial classes for your Domain entities that do two things:</p>
<ul>
<li>Explicitly define data service keys</li>
<li>Exclude Change Tracker from list of properties available for the Data Services to pick up</li>
</ul>
<p><pre class="brush: csharp;">
[DataServiceKey(&quot;AddressID&quot;)]
[IgnoreProperties(&quot;ChangeTracker&quot;)]
public partial class Address
{
}
</pre></p>
<p>Finally, verify that your service still works by testing it in the browser.<br />
You should be able to perform any operation you did before, but now you can also Unit Test your service without having to have a live database to talk to!</p>
<h3><span class="Apple-style-span" style="color:#333333;">Step 6: For testing, inject Mock Data Repository</span></h3>
<p>To do that, we will need to figure out how to &#8220;legally&#8221; let Data Service know that we want it to use our implementation of the Data Repository<br />
instead of default one that connects to a real database using Entity Framework. One way to do that is to use <a title="IoC and Dependency Injection" href="http://martinfowler.com/articles/injection.html">Inversion of Control and Dependency Injection</a>. However, making Data Service and WCF aware of IoC Containers is a tricky proposition &#8211; there is a simpler solution</p>
<p>What if we created a factory method and used it to create instances of the custom context whenever the Data Service needs one? Fortunately, WCF Data Service provides a way to do that by overriding <em>CreateDataSource</em> method in the Data Service class:</p>
<p><pre class="brush: csharp;">
public static Func DataContextFactory;

protected override MyDataContext CreateDataSource()
{
    return DataContextFactory != null ? DataContextFactory() : base.CreateDataSource();
}
</pre></p>
<p>Now our test code can set the Factory to create Data Context already initialized with a mock Repository.</p>
<p>This is, however, is only part of the problem &#8211; we also want to be able to host the Data Service inside of the test process without having to deploy anything to a real web server.<br />
Once again, this is solvable by creating in-process service host:</p>
<p><pre class="brush: csharp;">
public static class TestServiceHost
{
    internal static DataServiceHost Host
    {
        get;
        set;
    }

    internal static Uri HostEndpointUri
    {
        get
        {
            return Host.Description.Endpoints[0].Address.Uri;
        }
    }

    ///
&lt;summary&gt; /// Initialize WCF testing by starting services in-process
 /// &lt;/summary&gt;
    public static void StartServices()
    {
        var baseServiceAddress = new Uri(&quot;http://localhost:8888&quot;);
        Host = new DataServiceHost(typeof(Web.MyDataService), new[] { baseServiceAddress });
        Host.AddServiceEndpoint(typeof(IRequestHandler), new WebHttpBinding(), &quot;Service.svc&quot;);
        Host.Open();
        Trace.WriteLine(String.Format(
            &quot;Started In-Process Services Host on Base Address {0}, Endpoint Address {1}&quot;,
            baseServiceAddress,
            HostEndpointUri));
    }

    public static void StopServices()
    {
        if (Host != null)
        {
            Host.Close();
            Trace.WriteLine(String.Format(&quot;Stopped In-Process Services Host on {0}&quot;, HostEndpointUri));
        }
    }
}
</pre></p>
<p>Now we can start writing tests that do not need the hosting environment and a database to verify that your service works as designed, especially if you start adjusting its behavior to add security, custom metadata extensions, query interceptors,<br />
exception handling, etc.:</p>
<p><pre class="brush: csharp;">
[TestClass]
public class DataServiceTest
{
    [TestInitialize]
    public void SetUp()
    {
        TestServiceHost.StartServices();
    }

    [TestCleanup]
    public void TearDown()
    {
        TestServiceHost.StopServices();
    }

    [TestMethod]
    public void DataService_QueryProductss_ReturnsCorrectData()
    {
        var expected = new List()
                            {
                                new Product { Name = &quot;Product A&quot; },
                                new Product { Name = &quot;Product B&quot; }
                            };
        var mockRepository = new Mock();
        mockRepository.Setup(r =&gt; r.Products).Returns(expected.AsQueryable());
        Web.MyDataService.DataContextFactory = () =&gt; new MyDataContext(mockRepository.Object);

        var target = new ServiceClient.MyDataContext(TestServiceHost.Host.Description.Endpoints[0].Address.Uri);
        var actual = target.Products.ToList();
        Assert.AreEqual(expected.Count(), actual.Count());
        Assert.IsTrue(actual.All(p =&gt; expected.Any(x =&gt; x.Name == p.Name)));
    }
}
</pre></p>
<h3>Summary</h3>
<p>Building applications that expose WCF Data Service is relatively easy. What is more difficult is to make these applications testable.</p>
<p>This article demonstrated how to do that by switching code generation template to self-tracking POCOs,<br />
introducing persistence-ignorant domain layer and by making our existing Object Context implement an interface that can be mocked/substituted in testing.<br />
Every one of these improvements is for the better, but curiously, all of them happened in response to one goal to<br />
make our system more <strong>testable</strong>.</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/data-services/'>Data Services</a>, <a href='http://dimafr.wordpress.com/category/software-development/'>Software Development</a>, <a href='http://dimafr.wordpress.com/category/wcf/'>WCF</a> Tagged: <a href='http://dimafr.wordpress.com/tag/software-development/'>Software Development</a>, <a href='http://dimafr.wordpress.com/tag/testability/'>Testability</a>, <a href='http://dimafr.wordpress.com/tag/wcf-data-services/'>WCF Data Services</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/295/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/295/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=295&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2011/11/14/creating-testable-wcf-data-services/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/11/addselftrackingentitiescodegeneration.png" medium="image">
			<media:title type="html">Adding Self-Tracking Entities Code Generation</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/11/selftrackingentities-generatedcode.png" medium="image">
			<media:title type="html">Self-Tracking Entities: Generated Code</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/11/separatedomainlayer1.png" medium="image">
			<media:title type="html">Separate Domain Layer</media:title>
		</media:content>
	</item>
		<item>
		<title>Windows Azure Marketplace Expanded to Apps</title>
		<link>http://dimafr.wordpress.com/2011/07/12/windows-azure-marketplace-expanded-to-apps/</link>
		<comments>http://dimafr.wordpress.com/2011/07/12/windows-azure-marketplace-expanded-to-apps/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 23:03:21 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Windows Azure]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=397</guid>
		<description><![CDATA[Going beyond data: Windows Azure Marketplace just announced that it is expanding its capabilities to sell applications built on Windows Azure.  For now, apps are supported only in US market, but the team is planning to expand to other markets as well. Feel &#8230; <a href="http://dimafr.wordpress.com/2011/07/12/windows-azure-marketplace-expanded-to-apps/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=397&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Going <strong>beyond</strong> data: <a href="http://www.microsoft.com/windowsazure/marketplace/">Windows Azure Marketplace</a> just <a href="http://blogs.msdn.com/b/windowsazure/archive/2011/07/12/just-announced-windows-azure-marketplace-expands-application-selling-capabilities-in-us-markets.aspx">announced</a> that it is expanding its capabilities to sell applications built on Windows Azure.  For now, apps are supported only in US market, but the team is planning to expand to other markets as well.</p>
<p>Feel free to explore <a href="https://marketplace.windowsazure.com">Windows Azure Marketplace</a> to find applications and data you can use for your business. Create your own app and become Windows Azure Marketplace <a href="https://marketplace.windowsazure.com/publishing">Publisher</a>!</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/windows-azure/'>Windows Azure</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/397/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=397&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2011/07/12/windows-azure-marketplace-expanded-to-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Enforcing Code Coverage Targets is a Bad Idea</title>
		<link>http://dimafr.wordpress.com/2011/02/25/enforcing-code-coverage-targets-is-a-bad-idea/</link>
		<comments>http://dimafr.wordpress.com/2011/02/25/enforcing-code-coverage-targets-is-a-bad-idea/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 00:48:42 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=253</guid>
		<description><![CDATA[I recently observed an interesting conversation regarding code coverage standards. It boiled down to one simple question: Should we enforce mandatory code coverage standards by failing any build with low code coverage? Well, I think that the answer to this &#8230; <a href="http://dimafr.wordpress.com/2011/02/25/enforcing-code-coverage-targets-is-a-bad-idea/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=253&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently observed an interesting conversation regarding code coverage standards. It boiled down to one simple question:</p>
<p><em>Should we <strong>enforce</strong> mandatory code coverage standards by failing any build with low code coverage?</em></p>
<p>Well, I think that the answer to this question is a resounding <strong>NO</strong>, and here is why:</p>
<h3><span style="color:#808080;">Reason 1: Coverage does not mean Quality</span></h3>
<p><span style="color:#000000;">Low code coverage tells you that you don&#8217;t have enough tests. High code coverage tells you that you have a lot of tests. Neither tells you anything particularly useful about quality of your production code or, for that matter, quality of your tests. I readily concede that low code coverage is a <strong><em>smell</em> </strong>of bad quality, but it&#8217;s not a <em><strong>proof</strong></em>.  Absence of unit tests is alarming, and should be corrected, but what if your production code is actually pretty good? On the other hand, high code coverage may be achieved by bad test code &#8211; imagine battery of unit tests with no asserts in them because what your code returns in unpredictable. Yes, your code coverage is high, but your production code stinks.  At best, code coverage is an indirect indicator of overall quality and therefore by no means should be considered a build blocker (something that randomizes your <em><strong>entire</strong></em> team).</span></p>
<h3><span style="color:#888888;">Reason 2: You get exactly what you measure</span></h3>
<p><span style="color:#000000;">If you evaluate your team success based on the code coverage trends, you <em><strong>will</strong> </em>get the positive trends. You might, however, eventually land in a situation when you have good code coverage but bad quality, because when pushed to meet the code coverage bar (thing that you measure), people will cut quality corners. Compare this situation with measuring high-severity bugs that escaped your system all the way to the customer. That is a <em><strong>direct </strong></em>indicator of quality and something that is being done by an independent party (your customer), which is even better!</span></p>
<h3><span style="color:#808080;">Reason 3: More process won&#8217;t solve people problems</span></h3>
<p>So, we have a fact: Your engineers (notice that I bundle both Developers and Testers in one group) do not write enough unit tests to exercise most of your system. But why? What could be the real story behind this behavior?</p>
<p><span style="color:#000000;">There could be multiple scenarios at play here, but all of them point to People problems, not to lack of Process. Breaking low coverage builds constitutes nothing but more process and will not correct one of these possible people problems long-term:</span></p>
<ul>
<li><span style="font-weight:bold;color:#888888;"><em>Our Engineers don&#8217;t understand the value of writing <strong>good</strong> tests.</em></span></li>
</ul>
<p>Well, educate them! Explain that good test suites are not just burden, they are your safety net, your anti-regression armor, your documentation, you design driver, you early design verification and your sample code all in one!</p>
<ul>
<li><span style="color:#888888;"><strong><em>Our Engineers don&#8217;t have time to write tests &#8211; they are busy coding the features. </em></strong></span></li>
</ul>
<p><span style="color:#888888;"><em> </em></span><span style="font-weight:normal;">Your estimates don&#8217;t include enough time to outfit your features with proper test automation, and your management is apprehensive about spending 10 to 30% more time on each feature. I suggest a simple experiment: pick two features roughly similar in complexity, build one without tests and one with tests. Follow up by calculating number of bugs per feature that will follow in the next release and keep track of total amount of time, including shipping service packs and deploying quick fixes, that was needed in both cases. The results will be self-explanatory. Now you have <em>hard data</em> to take to your management.</span></p>
<ul>
<li><span style="color:#888888;"><strong><em>Our Developers don&#8217;t think that writing tests is in their job description.</em></strong></span></li>
</ul>
<p><span style="color:#ff0000;">Get another group of developers!</span></p>
<h3><span style="color:#888888;">To summarize&#8230;</span></h3>
<p><span style="color:#000000;">Measure your code coverage religiously and use it as one of the indicators of your overall quality. But don&#8217;t rely on it as your <em><strong>only</strong></em> indicator &#8211; don&#8217;t break your build over it, don&#8217;t yell at your engineers when code coverage drops 1%. Instead, make everybody <em><strong>aware </strong></em>why you think code coverage is important and review trends in your retrospective meetings. Encourage or even require your engineers to write tests to cover bugs and interesting usage scenarios, not your coverage targets. Enforce this rule using peer reviews. Correlate high-value bug escapes with components and use cases and adjust your efforts accordingly, so that if you have to improve things quickly, you can focus on unstable and buggy code first.</span></p>
<p><span style="font-size:26px;font-weight:bold;color:#808080;"> </span></p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/build/'>Build</a>, <a href='http://dimafr.wordpress.com/category/software-development/'>Software Development</a> Tagged: <a href='http://dimafr.wordpress.com/tag/build/'>Build</a>, <a href='http://dimafr.wordpress.com/tag/software-development/'>Software Development</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/253/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=253&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2011/02/25/enforcing-code-coverage-targets-is-a-bad-idea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Is Big Data Getting Too Big for the Environment?</title>
		<link>http://dimafr.wordpress.com/2011/02/17/is-big-data-getting-too-big-for-the-environment/</link>
		<comments>http://dimafr.wordpress.com/2011/02/17/is-big-data-getting-too-big-for-the-environment/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 17:13:47 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=214</guid>
		<description><![CDATA[I&#8217;ve been trying to find some solid data to answer the following question: What is the environmental impact of the &#8220;Big Data&#8220;? Let me explain&#8230; Collectively, internet search companies have been relying on advertising dollars to make themselves profitable while keeping internet &#8230; <a href="http://dimafr.wordpress.com/2011/02/17/is-big-data-getting-too-big-for-the-environment/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=214&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been trying to find some solid data to answer the following question:</p>
<p><em>What is the environmental impact of the &#8220;<a href="http://en.wikipedia.org/wiki/Big_data">Big Data</a>&#8220;?</em></p>
<p>Let me explain&#8230;</p>
<p>Collectively, internet search companies have been relying on advertising dollars to make themselves profitable while keeping internet search free for consumers.  This, however, meant that compared &#8220;traditional&#8221; advertising models, search providers needed to make internet advertising much more economically viable for those companies paying for ads. In other words, they needed to improve ads targeting, which they did and are doing today <em>very successfully</em>.  But those models and algorithms, as scientifically amazing as they are, rely on <em>massive </em>amounts of data being collected about our site visits, our clicks, our searches, our <em>behavior</em> online.  All this data needs to be stored and processed somewhere. Indeed, the world is now running tens of millions of servers (estimated at <a href="http://www.mckinsey.com/clientservice/bto/pointofview/pdf/BT_Data_Center.pdf">44 million</a>). Significant portion of these servers (how big of a portion?) is dedicated to storing and processing search logs and clicks data directly related to online advertising. And all of those servers <em>consume energy</em>, a lot of energy (estimated at <a href="http://www.mckinsey.com/clientservice/bto/pointofview/pdf/BT_Data_Center.pdf">0.5% of all electricity</a>) and allegedly create <a href="http://technology.timesonline.co.uk/tol/news/tech_and_web/article5489134.ece">significantly negative</a> impact on the environment.</p>
<p>Yes, I know that data centers engineering and management science together with software and hardware manufactures made <em>amazing</em> progress when it comes to data center and software <em>efficiency<strong> &#8211; </strong>but this is not the point of this post.</em></p>
<p>Regardless of how you feel about anthropogenic causes of global warming or about internet privacy, the fact is that we are still burning a lot (<em>how much?</em>) of energy&#8230; <em>to do what exactly? </em></p>
<p><em></em>How much data do we need to index the web and make it helpful for <a href="http://en.wikipedia.org/wiki/Web_search_query">all kinds</a> of web queries? How fast does this portion of the data grow? How does it compare with volumes of data needed to <em>continuously</em> infer better and better ads targeting based on our behavior online and our social connections? In absolute terms per product sold, is environmental impact of online advertising better or worse than environmental impact of traditional advertising models? Can we get our hands on this statistical data? Is it a worthwile undertaking to understand it better?</p>
<p>In addition to some opinions out there about the <a href="http://techcrunch.com/2009/03/22/why-advertising-is-failing-on-the-internet/">questionable usefulness of online advertising</a>, does online advertising basically helping us to &#8220;kill the planet&#8221;? Or is it as efficient environmentally as it seems to be economically? Are trends in data storage and processing sustainable with regards to the required energy production to support it? Should &#8220;Big Data&#8221; players bridge their considerable differences and collaborate on efficient and clean power production and distribution technologies with the same rigor they work on their own massively parallel data processing techniques?</p>
<p>I don&#8217;t know the answer to these questions &#8211; I am still searching for reliable data and useful models to estimate this.  If you have any suggestions &#8211; please feel free to reply to this post. I would be happy to collaborate!</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/research/'>Research</a> Tagged: <a href='http://dimafr.wordpress.com/tag/research/'>Research</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/214/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=214&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2011/02/17/is-big-data-getting-too-big-for-the-environment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Developer-Driven Is Not A Panacea</title>
		<link>http://dimafr.wordpress.com/2011/01/31/developer-driven-is-not-a-panacea/</link>
		<comments>http://dimafr.wordpress.com/2011/01/31/developer-driven-is-not-a-panacea/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 10:08:53 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=211</guid>
		<description><![CDATA[Idea of developer-driven or developer-centric organizations is being actively discuss lately thanks to the likes of Facebook. Some people, mostly developers, love it for its freedom and lack of heavy processes. I love it too &#8211; to a point. I &#8230; <a href="http://dimafr.wordpress.com/2011/01/31/developer-driven-is-not-a-panacea/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=211&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Idea of developer-driven or developer-centric organizations is being actively discuss lately thanks to the likes of <a href="http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/">Facebook</a>. Some people, mostly developers, love it for its freedom and lack of heavy processes. I love it too &#8211; to a point. I believe in its usefulness while a product is being conceived, while it is in the prototype or even in a rapid growth stage, while creators of the product have neither rich user data nor significant market penetration. In these situations, product team does not have any <em>data</em> to guide their development direction, and therefore tries to probe with multiple features.  However, there are obvious downfalls even at this stage:</p>
<ul>
<li>Developing cool new features before core functionality is in place is meaningless at best and distracting you from your mission at worst</li>
<li>Developers left to their own devices tend to over-engineer most of the features and create flexible frameworks for everything, even trivial things</li>
<li>Most developers suffer from <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">NIH syndrome</a>, which leads to everything being written at least twice if not more</li>
</ul>
<p>Let&#8217;s assume now that the product is becoming successful. It is growing in size, gaining more and more fans and/or more and more revenue. At this stage blindly following Developer-Driven process can get you into even more trouble.</p>
<p>Business:</p>
<ul>
<li>New features developers chose to implement may not be helping your product</li>
<li>New features developers chose to implement may not be what your users want most or want at all</li>
<li>New features developers chose to implement may be cannibalizing or hurting other important revenue-generating features</li>
<li>New features your developers chose to implement may not be the most profitable</li>
</ul>
<p>Technical:</p>
<ul>
<li>Duplicated code grows all over the place and when new features are being introduced, raging debates start about what to use and what to retire and why. There is no consensus, so different factions continue to use and improve their code of choice ignoring others.</li>
<li>Set of home-grown tools emerges that <em>mostly</em> work, but nobody is completely happy with them, so from time to time somebody creates new tools that do almost the same thing but &#8220;better&#8221;. Maintenance costs continue to grow&#8230;</li>
<li>Documentation becomes so far outdated that knowledge about overall system architecture is priceless and can only be found with people who have been on the team since its inception.</li>
<li>Build takes forever because of the amount of code. Configuration is mind-boggling because it is hard to configure dozens of &#8220;data-driven&#8221; frameworks to actually do what users want.</li>
</ul>
<p>I could continue this list for a while, you know&#8230;</p>
<p>So what&#8217;s the solution? In my mind, it is very simple &#8211; provide a system of <em>lightweight</em> checks and balances that will keep the good and eliminate the bad:</p>
<ol>
<li><strong>Get a <a href="http://alexweinsteinwork.wordpress.com/2011/01/20/what-are-product-managers-for-anyway/">good PM </a>on the team</strong>. Give them broad authority to <em>influence</em> and little authority to <em>dictate.</em> Make them work <em>together</em> with Dev and Test teams. <a href="http://angelaontech.wordpress.com/2011/01/20/what-should-a-product-manager-do/">Good PMs hate process</a> just as much as Developers, and they will provide an excellent balance against cowboy development and over-engineering problems. More importantly, this move will compliment technology focus of Dev-driven product with razor-sharp <em>customer focus. </em></li>
<li><strong>Get architects to actually do their job</strong>. Architects who design how features should work should also be capable enough to <em>quickly</em> code up reusable and complicated components and provide <em>actionable</em> feedback and oversight to other team members. However, architects who sit in an ivory tower are just as bad for the product as no architecture at all. Therefore, getting seasoned developers to become architects (i.e. <em>experts</em>) on the product is a better way to go, I think.</li>
<li><strong>Use <a href="http://videolectures.net/kdd09_kohavi_longbotham_pracew/">experimentation</a></strong> in addition to (or instead of) traditional marketing research. Once a product get beyond initial rollout stages and starts gaining steam, the only way to grow <em>effectively</em> is to <em>use data, </em>quickly try out new features, measure, and if ideas fail (most of them do, by the way) &#8211; fail early and get out.</li>
<li><strong>Watch over the build</strong> &#8211; <a href="http://dimafr.wordpress.com/2010/12/13/what-your-build-system-can-reveal-about-your-product/">avoid having dedicated build team</a>, keep number of branches to a minimum, make developers responsible for integrating code. This will serve as a forcing function to have a reasonable component architecture and inject enough engineering discipline.</li>
<li>Do not subscribe to &#8220;good developers write bug free code&#8221; myth, <strong>invest in test infrastructure</strong>, measure test coverage. Once again, placing test responsibility with Developers can be used as a forcing function to inject stability and reason into your code base.</li>
</ol>
<p>In short, maintain user-centric focus, keep it simple as much as possible, use real data, trust but verify.</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/project-management/'>Project Management</a>, <a href='http://dimafr.wordpress.com/category/software-development/'>Software Development</a> Tagged: <a href='http://dimafr.wordpress.com/tag/project-management/'>Project Management</a>, <a href='http://dimafr.wordpress.com/tag/software-development/'>Software Development</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/211/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=211&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2011/01/31/developer-driven-is-not-a-panacea/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
		<item>
		<title>How To: Connect TFS-bound Excel to Another Team Project</title>
		<link>http://dimafr.wordpress.com/2011/01/20/how-to-connect-tfs-bound-excel-to-another-team-project/</link>
		<comments>http://dimafr.wordpress.com/2011/01/20/how-to-connect-tfs-bound-excel-to-another-team-project/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 11:15:02 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[TFS]]></category>
		<category><![CDATA[How To]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=127</guid>
		<description><![CDATA[If you made any changes to TFS-bound Excel Workbook that come pre-installed with your Team Project, you might naturally want to share them with your colleagues who run other projects in your organization. For example, we created a souped-up version &#8230; <a href="http://dimafr.wordpress.com/2011/01/20/how-to-connect-tfs-bound-excel-to-another-team-project/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=127&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you made any changes to TFS-bound Excel Workbook that come pre-installed with your Team Project, you might naturally want to share them with your colleagues who run other projects in your organization. For example, we created a souped-up version of Iteration Backlog that computes our Team Velocity, reports on User Story progress and breaks up work between Developers and Testers. Making these changes available in the Team Project Template is useful for any Team Projects created in the future, but it does not help with existing Team Projects that might benefit from the same improvements. If the changes are significant, it might be hard and time-consuming to edit Iteration Backlog in another Team Project and we would naturally want to just take improved Iteration Backlog and “rebind it” to a new Team Project, in the same or in a different Team Project Collection or even Team Foundation Server instance.</p>
<p>Unfortunately, attempting to reconnect to another Team Project using “Configure Server Connection” option in the Team Foundation Ribbon will not work because it requires the same project collection and it primarily designed to work around backup/restore scenarios:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0025.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;margin:0 0 2px;" title="Configure Server Connection" src="http://dimafr.files.wordpress.com/2011/01/clip_image0025_thumb.jpg?w=502&#038;h=146" border="0" alt="Configure Server Connection" width="502" height="146" /></a></p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0035.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;" title="Configure Server Connection - Error" src="http://dimafr.files.wordpress.com/2011/01/clip_image0035_thumb.png?w=450&#038;h=223" border="0" alt="Configure Server Connection - Error" width="450" height="223" /></a></p>
<p>We will have to apply a workaround solution, which is the following:</p>
<p>1. Save a copy of original Excel Workbook and close it. Disable Team Foundation Add-In. Close Excel.</p>
<p>To disable TFS Add-in, go to File-&gt;Options-&gt;Add-Ins. Select COM Add-Ins in the Manage drop down and click GO:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0044.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;margin:0 0 2px;" title="Excel - Com Add-Ins" src="http://dimafr.files.wordpress.com/2011/01/clip_image0044_thumb.png?w=490&#038;h=641" border="0" alt="Excel - Com Add-Ins" width="490" height="641" /></a></p>
<p>In the dialog that shows up, uncheck Team Foundation Add-In and click OK:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0064.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;margin:0 0 2px;" title="Disable TFS Add-In" src="http://dimafr.files.wordpress.com/2011/01/clip_image0064_thumb.jpg?w=598&#038;h=241" border="0" alt="Disable TFS Add-In" width="598" height="241" /></a></p>
<p>2. Open the workbook and remove all custom document properties from the Workbook. These properties contain TFS binding information TFS Add-in will automatically recreate them when reconnecting to another Team Project. Not disabling Team Found add-in seems to allow it to re-create these properties even when saving the document.</p>
<p>This is a bit tricky and tedious, and you might want to use VBA for this. Click Alt+ F11, in the VBA Editor enter, and execute the following Macro:</p>
<div id="codeSnippetWrapper">
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">Sub</span> DeleteCustomProperties()</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">    Dim</span> p <span style="color:#0000ff;">As</span> DocumentProperty</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">    For</span> <span style="color:#0000ff;">Each</span> p <span style="color:#0000ff;">In</span> ActiveWorkbook.CustomDocumentProperties</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">        p.Delete()</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">    Next</span> p</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">End</span> <span style="color:#0000ff;">Sub</span></pre>
</div>
<p>3. Remove hidden verification worksheet. Save and close the Workbook.</p>
<p>This is also done in Visual Basic Editor because that page is hidden from the view. In the Project View in the Visual Basic, select a worksheet with name starting from “VSTS_ValidationWS” and in the Properties Editor change Visible property to xlSheetVisible:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0074.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;" title="Hidden Validation Sheet" src="http://dimafr.files.wordpress.com/2011/01/clip_image0074_thumb.png?w=383&#038;h=575" border="0" alt="Hidden Validation Sheet" width="383" height="575" /></a></p>
<p>After that, delete VSTS Validation Worksheet in Excel:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0084.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;margin:0 0 2px;" title="Delete Hidden Validation Sheet" src="http://dimafr.files.wordpress.com/2011/01/clip_image0084_thumb.png?w=293&#038;h=251" border="0" alt="Delete Hidden Validation Sheet" width="293" height="251" /></a></p>
<p>4. Re-enable TFS Add-in using the process opposite to the one described above. Open the Workbook again. Notice that when you navigate to the worksheet containing TFS-bound table regions, Team Ribbon does not activate Refresh button because it no longer knows that your workbook in connected to the TFS:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0104.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;" title="New TFS-Bound List" src="http://dimafr.files.wordpress.com/2011/01/clip_image0104_thumb.jpg?w=628&#038;h=101" border="0" alt="New TFS-Bound List" width="628" height="101" /></a></p>
<p>5. Make sure you do not delete the TFS-bound regions completely because if you do, your formulas will be damaged beyond repair. Keep at least one line from the old table and make sure you copy the name of the table to a text document somewhere – we will need it later:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0124.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;" title="Name of the Old List" src="http://dimafr.files.wordpress.com/2011/01/clip_image0124_thumb.jpg?w=628&#038;h=189" border="0" alt="Name of the Old List" width="628" height="189" /></a></p>
<p>6. Using New List button located in Team Ribbon, add another TFS-bound list that is connected to the same query in the destination Team Project and make sure column layout matches existing list. You will end up with two similar looking lists – one (with one remaining row) from old Team Project and one from the new Team Project:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0134.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;" title="New TFS List Added" src="http://dimafr.files.wordpress.com/2011/01/clip_image0134_thumb.png?w=389&#038;h=352" border="0" alt="New TFS List Added" width="389" height="352" /></a></p>
<p>7. Now use the old table name and new table name to adjust all formulas. Verify that formulas work as designed.</p>
<p>One again, this might be easier to accomplish with Visual Basic. Knowing old table name from step 5 and new table name from step 6, run the following macro (it might take a while to execute):</p>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">Sub</span> ReplaceFormulas(<span style="color:#0000ff;">ByVal</span> originalListName <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">String</span>,_
                    <span style="color:#0000ff;">ByVal</span> newListName <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">String</span>)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">    On</span> <span style="color:#0000ff;">Error</span> <span style="color:#0000ff;">Resume</span> <span style="color:#0000ff;">Next</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">    </span><span style="color:#0000ff;">Dim</span> w <span style="color:#0000ff;">As</span> Worksheet, i <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Long</span>, j <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Long</span>, _</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">        formulaValue <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">String</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">    For</span> <span style="color:#0000ff;">Each</span> w <span style="color:#0000ff;">In</span> ActiveWorkbook.Worksheets</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">        For</span> i = 1 <span style="color:#0000ff;">To</span> w.UsedRange.rows.Count</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">            For</span> j = 1 <span style="color:#0000ff;">To</span> w.UsedRange.Columns.Count</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">                formulaValue = w.Cells(i, j).formula</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">                If</span> formulaValue &lt;&gt; <span style="color:#006080;">""</span> <span style="color:#0000ff;">Then</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">                    formulaValue = Replace(formulaValue, _
                     originalListName, newListName, , , vbTextCompare)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">                   w.Cells(i, j).formula = formulaValue</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">                End</span> <span style="color:#0000ff;">If</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">            Next</span> j</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">        Next</span> i</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">     Next</span> w</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">End</span> <span style="color:#0000ff;">Sub</span>

<span style="color:#0000ff;">Sub</span> ReplaceAll()</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">    Dim</span> calc <span style="color:#0000ff;">As</span> XlCalculation
    Application.ScreenUpdating = <span style="color:#0000ff;">False</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">    calc = Application.Calculation</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">    Application.Calculation = xlCalculationManual
    ReplaceFormulas(<span style="color:#006080;">"VSTS_8eeef3b2_74af_457d_88e8_0fce8bc5d131"</span>, _
                    <span style="color:#006080;">"VSTS_d3ffaeb7_2a52_4d3e_afd8_2d7334bb47bb"</span>)
    Application.ScreenUpdating = <span style="color:#0000ff;">True</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">    Application.Calculation = calc</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">End</span> <span style="color:#0000ff;">Sub</span></pre>
<p>8. Remove old tables. The easiest way to accomplish this is to first convert it to a Range and then by deleting rows from the Worksheet:</p>
<p><a href="http://dimafr.files.wordpress.com/2011/01/clip_image0146.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0 initial initial;margin:0 0 2px;" title="Convert Table to Range" src="http://dimafr.files.wordpress.com/2011/01/clip_image0146_thumb.png?w=298&#038;h=241" border="0" alt="Convert Table to Range" width="298" height="241" /></a></p>
<p>9. Save modified Excel Workbook.</p>
<p>Note: If you have Pivot Table objects pointing to the old tables, you may need to augment ReplaceFormulas macro with updates to PivotTable objects – their Source Data needs to be updated.</p>
<p>Hope that helps!</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/tfs/'>TFS</a> Tagged: <a href='http://dimafr.wordpress.com/tag/how-to/'>How To</a>, <a href='http://dimafr.wordpress.com/tag/tfs/'>TFS</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/127/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=127&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2011/01/20/how-to-connect-tfs-bound-excel-to-another-team-project/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0025_thumb.jpg" medium="image">
			<media:title type="html">Configure Server Connection</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0035_thumb.png" medium="image">
			<media:title type="html">Configure Server Connection - Error</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0044_thumb.png" medium="image">
			<media:title type="html">Excel - Com Add-Ins</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0064_thumb.jpg" medium="image">
			<media:title type="html">Disable TFS Add-In</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0074_thumb.png" medium="image">
			<media:title type="html">Hidden Validation Sheet</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0084_thumb.png" medium="image">
			<media:title type="html">Delete Hidden Validation Sheet</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0104_thumb.jpg" medium="image">
			<media:title type="html">New TFS-Bound List</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0124_thumb.jpg" medium="image">
			<media:title type="html">Name of the Old List</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0134_thumb.png" medium="image">
			<media:title type="html">New TFS List Added</media:title>
		</media:content>

		<media:content url="http://dimafr.files.wordpress.com/2011/01/clip_image0146_thumb.png" medium="image">
			<media:title type="html">Convert Table to Range</media:title>
		</media:content>
	</item>
		<item>
		<title>Karma? I think not</title>
		<link>http://dimafr.wordpress.com/2011/01/14/karma-i-think-not/</link>
		<comments>http://dimafr.wordpress.com/2011/01/14/karma-i-think-not/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 02:05:52 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Motivation]]></category>
		<category><![CDATA[Social Dynamics]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=102</guid>
		<description><![CDATA[Recently I&#8217;ve started interacting with some people in Seattle startup community. Honestly, I half expected to find a bunch of antisocial geeks who troll about their employers and exchange &#8220;check out my new killer social entertainment network&#8221; messages. To my amazement, I found &#8230; <a href="http://dimafr.wordpress.com/2011/01/14/karma-i-think-not/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=102&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently I&#8217;ve started interacting with some people in Seattle startup community. Honestly, I half expected to find a bunch of antisocial geeks who troll about their employers and exchange &#8220;check out my new killer social entertainment network&#8221; messages. To my amazement, I found a really vibrant community of smart individuals who are willingly helping each other with useful information, references, ideas, and treat each other (mostly) with enormous respect.  These people have nothing to gain from giving out their advise or sharing their <strong><em>valuable</em></strong> ideas. On the contrary, somebody somewhere might benefit from this information to make their endeavor more successful, to get better funding, to hire better engineer, to meet interesting people.</p>
<p>So I started thinking about why this happens in this age of cutthroat competition. I don&#8217;t think it is Karma or &#8220;<a href="http://www.imdb.com/title/tt0223897/combined">Pay it Forward</a>&#8220;, though for some people out there that is a legitimate and commendable driver for this behavior. Instead, I think that it is a basic drive to look for and find better social interaction in our professional lives. Plus a lot of networking, of course. I firmly believe based on my own experiences that we strive to be <strong><em>accepted</em></strong> professionally, and these loosely coupled peer-to-peer communities satisfy that need. People treat each other as equals, assume the best instead of the worst, <strong><em>listen</em>, </strong>share their advice and help because they <strong><em>like to do it</em></strong>. It gives them a great feeling of self-worth, especially when they get the same kind of treatment from the others.  Notice that this is slightly (and in some cases drastically) different from the corporate world. First, no matter how senior your position is within your company, you are constrained by its reporting structure and by its culture. In some situations you are treated as a <strong><em>resource</em></strong>, and in some situations your opinion or ideas have hard time <strong><em>reaching the right audience</em></strong>. In these startup communities, however, things are different because these constraints don&#8217;t exist. So meeting somebody for coffee and chatting with them about your and their ideas is a much simpler proposition.</p>
<p>So, in light of these observations I&#8217;ve made a resolution this year &#8211; to help my friends in their crazy ideas when they need my help, or advise, or a sounding board, or all three. Just to have a professional environment outside of work that is slightly <strong><em>different</em></strong> from what I have at work. Just to geek out with my buddies on my free time while feeling important. Just to be <strong><em>free </em></strong>for a few hours every week. Ha!</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/motivation/'>Motivation</a>, <a href='http://dimafr.wordpress.com/category/social-dynamics/'>Social Dynamics</a> Tagged: <a href='http://dimafr.wordpress.com/tag/motivation/'>Motivation</a>, <a href='http://dimafr.wordpress.com/tag/social-dynamics/'>Social Dynamics</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/102/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=102&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2011/01/14/karma-i-think-not/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Symptoms of Sick Projects</title>
		<link>http://dimafr.wordpress.com/2010/12/30/symptoms-of-sick-projects/</link>
		<comments>http://dimafr.wordpress.com/2010/12/30/symptoms-of-sick-projects/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 17:58:05 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">https://dimafr.wordpress.com/?p=95</guid>
		<description><![CDATA[I recently got a new project assignment at work and started thinking about levels of uncertainty that exists in every software project. It’s been in the back of my mind a lot lately as I am trying to figure out &#8230; <a href="http://dimafr.wordpress.com/2010/12/30/symptoms-of-sick-projects/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=95&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently got a new project assignment at work and started thinking about levels of uncertainty that exists in every software project. It’s been in the back of my mind a lot lately as I am trying to figure out what is that we are trying to solve, how our new project is going to work, what do we need to do technically and organizationally and how can I make it bring value in the context of larger division and even the company.</p>
<p>First, I know that uncertainty is inevitable and it is basically good. Without uncertainty, there won’t be any room for initiative, innovation, and risk taking.  However, too much uncertainty typically results from other bad symptoms that bring enough distraction to make me worry and question the project’s validity.  I’ve been trying to classify these most telling symptoms, and find ways to treat them. I am purposely staying away from management styles, social dynamics, reporting hierarchies on a project or even the project architecture, though these can have plenty of problems as well.  I am thinking about basic, fundamental issues that interfere with way to approach all technology projects: find what the problem is and proceed to create a technology that will solve it.</p>
<p>Here is what I could come up with, and I’ve been:</p>
<h3>The NASA Pen Project</h3>
<p>This a project where everybody <strong><em>assumes</em></strong> that problem at hand can only be solved with a <em><strong>new</strong></em> technology and diligently and stubbornly tries to come up with such a solution. Anybody who dares to suggest that the problem can be solved by using an <strong><em>existing</em></strong> technology (potentially mixed with some skillful organization changes) is immediately dismissed because… Nobody can tell why.  This creates a situation when people who are actually doing the work can’t fathom why or how their work might be useful because they all know that existing technology is just as good or even better. This uncertainty over the project’s fate causes quality issues, not to mention the team morale, because people think that their time and their work is being <strong><em>wasted.</em></strong> The only effective way I found to resolve this is to bring data to compare the projected costs of developing and implementing new technology with likely much lower costs of using existing tools to solve the problem and to propose a set of organization changes that will remove existing barriers.</p>
<h3>The New Bicycle Project</h3>
<p>This is classic and rampant <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">NIH</a> symptom. Because of political pressure within an organization or because of artificial competition and meaningless disagreements between “big wigs” in multiple divisions, an emerging or even an existing technology is <strong><em>reinvented</em></strong> with various degrees of success over and over and over again. Everybody has fun working on the cool new thing on their own, but company resources needed to solve the same problem are doubled or tripled. Nothing or very little is shared, teams hate each other, team management tries to outsmart their peers in the eyes of executives, and in the end nobody achieves the level of success they could have achieved had they worked together. Two-pronged attack might help here, I think: relentless pressure from the bottom (people demanding increased reuse and sharing of products already under way) and smart management from the top (timely executive decisions to combine or eliminate duplicate efforts).</p>
<h3>The Emperor&#8217;s New Clothes Project</h3>
<p>This is hysterical to observe from the outside but it is very painful for the people involved. This is a project where everybody seems to know and understand what the <strong><em>real problem</em></strong> is, but instead of solving it directly, team seems to be busy creating technology <strong><em>to</em></strong> <strong><em>work around it</em></strong>. After a few of those, a technological monstrosity/hodge-podge emerges around the original problem at hand, and it is usually unmanageable, unmaintainable, does not make things better at all, and is very costly. Once again, this could be due to politics within an organization or due to entrenched and seemingly unsolvable nature of the main problem (which sometimes is not technological at all). But until somebody has the guts to become that child who yelled that the <a href="http://en.wikipedia.org/wiki/The_Emperor's_New_Clothes">emperor is naked</a>, things will continue to be very difficult and the original problem will become even more entrenched because now there is a large investment into this pseudo-solution.</p>
<h3>Go I Know Not Whither and Fetch I Know Not What Project</h3>
<p>This is uncertainty squared – nobody seems to <strong><em>know</em></strong> <strong><em>what the problem is</em></strong> or was to begin with, nobody seems to understand why an existing solution, if any, is inadequate, and nobody can describe in concrete terms their <strong><em>vision for the new solution</em></strong>. But the plans are already approved, money allocated, and your team is on the hook to deliver… something. The solution likely lies in peeling the onion and asking a lot of questions from a lot of people. Start challenging every assumption to see how sure people are that there is a problem. Find out its exact nature to avoid building a space pen. Make sure you reuse existing bicycles. Call the emperor naked if you have to. Do whatever you have to to define “whither” and “what”.  And if you can’t make any headway, be aware that there is a chance that you got this <a href="http://en.wikipedia.org/wiki/Go_I_Know_Not_Whither_and_Fetch_I_Know_Not_What">fairy tale</a> project because somebody wanted to remove you from the picture for a while or permanently&#8230;</p>
<p>Am I being too negative? Well, I don’t think so &#8211; I am an optimist. This is why I am doing my very best to prevent my new project from becoming one of these and I am beginning to like this challenge more and more.</p>
<p>Happy New Year!</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/project-management/'>Project Management</a> Tagged: <a href='http://dimafr.wordpress.com/tag/project-management/'>Project Management</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/95/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=95&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2010/12/30/symptoms-of-sick-projects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Creating Sustainable Internal Startups</title>
		<link>http://dimafr.wordpress.com/2010/12/23/creating-sustainable-rd/</link>
		<comments>http://dimafr.wordpress.com/2010/12/23/creating-sustainable-rd/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 07:00:12 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Innovation]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=77</guid>
		<description><![CDATA[According to the Wikipedia, sustainability is the capacity to endure.  In recent years, the term has been used almost exclusively in ecological sense, but I am going to stick with the simple definition: capacity to endure. Within every large self-respectful company, &#8230; <a href="http://dimafr.wordpress.com/2010/12/23/creating-sustainable-rd/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=77&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>According to the Wikipedia, <a href="http://en.wikipedia.org/wiki/Sustainability">sustainability</a> is the capacity to endure.  In recent years, the term has been used almost exclusively in ecological sense, but I am going to stick with the simple definition: capacity to <strong>endure</strong>.</p>
<p>Within every large self-respectful company, there is an R&amp;D organization that targets long-term aspirations, works on crazy projects that may or may not pan out, makes lots of mistakes and sucks up a lot of company money. Executives accept that fact because entrenched R&amp;D organizations provide future foundation for the company by doing both fundamental and applied research that is relevant to the company&#8217;s aspirations, even if in the short-term they have nothing to do with the problems at hand and the only thing that a company gets from their R&amp;D folks next quarter is most likely a huge bill. I am not going to argue with this status quo because I think that just like fundamental scientific research done at universities, corporate R&amp;D is basically a good thing.</p>
<p>What I wanted to talk about is so-called &#8220;Labs&#8221; projects that spring up from time to time <strong>in addition</strong> to primary research organizations.  Those guys act like startups &#8211; they are typically small driven teams that have a brilliant idea (or so they think at least) and that are lucky enough to have at least one executive who is willing to support them initially and let them work on that idea while protected them and supporting them by the money from corporate coffins. Sooner or later, however, this good will <strong>always</strong> ends. <strong>Always</strong>. Why? Because the fundamental goal of every corporation is to make profit and as far as crazy research goes, they already have that going on in their R&amp;D department.  I would estimate this grace period at maybe 2 or 3 years. After that, a Lab/Startup project has to show a <strong>real profit</strong> and have <strong>a significant impact</strong> on the business to make its executive sponsor look like a rock star.</p>
<p>If not, 9 times out of 10 it is going to be axed, reorganized or split, I guarantee you.  More often than not, <a href="http://angelaontech.wordpress.com/2010/10/15/why-labs-don’t-work/">Labs don&#8217;t work</a> because they make one of the following mistakes:</p>
<ul>
<li>They focus too much on internal needs first, provide &#8220;white glove treatment&#8221; to some of their internal customers and partners, neglecting other &#8220;less important&#8221; clients and choosing to not worry about basic viability and profitability of their product for the outside world.</li>
<li>Conversely, they focus too much on external customers, trying to generate industry buzz, giving out glorious interviews and writing superb articles in industry publications, but they never try to make their product accepted and used internally.</li>
<li>They neglect to formulate a long-term road map outfitted with both quality business model and clear technological improvements.</li>
<li>Their mission includes grandiose aspirations to change internal corporate culture and deliver the world peace and forgets primal need to make gazillion dollars within the first 5 years of existence.</li>
<li>Their internal structure resembles a garage project full of geeks having way too much fun for way too long, forgetting about releasing as often as they can and holding people accountable to the scope and schedule commitments they make.</li>
<li>They get comfortable being shielded by their executive sponsor and forget about the fact that this executive is the only protection they have from packs of hungry wolves that have to deal with today&#8217;s problems and who bring home profit every quarter doing things that may be not so cutting edge.</li>
</ul>
<p>So how do we create a sustainable internal startup that survives beyond the 2-3 years? By not doing these things. By making sure our strategy focuses on inside and outside needs. By working on business aspects of our idea as much as we work on technology.  By making our technology scale to our (prospective or real) customer needs early and well. By partnering with external organizations with which our company already has good relationships and asking, begging them to use our product and see if they like it. By making our executive sponsor look good every quarter because we landed another customer, or drastically increased scalability and performance, or shaved a significant chunk off our internal support costs, or shipped something really useful to our partners that saved or earned them <strong>real</strong> money.  By holding our development team&#8217;s feet to the fire all the time. By making our architects code and by making them help our developers understand their vision instead of isolating themselves into &#8220;I had a brilliant idea. I am great. Now you do the work&#8221; tower.  By constantly checking and challenging every decision our management makes against our long-term survival and profitability goals and against main goal of publicly releasing our product. By servicing as many customers as we can, even when it seems difficult. By <strong>relentlessly</strong> and <strong>obsessively</strong> eliminating every inefficiency and manual work in the product and in the process. By not expanding the headcount unless we have shown enough profit to pay for additional employees. By assuming that this quarter might be our last.</p>
<p>In short &#8211; by being a bunch of <a href="http://alexweinsteinwork.wordpress.com/2010/12/10/hungry-artist-paints-way-better/">hungry artists</a>.</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/innovation/'>Innovation</a> Tagged: <a href='http://dimafr.wordpress.com/tag/innovation/'>Innovation</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=77&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2010/12/23/creating-sustainable-rd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
		<item>
		<title>Triple Constraint of Happiness at Work</title>
		<link>http://dimafr.wordpress.com/2010/12/15/triple-constraint-of-happiness-at-work/</link>
		<comments>http://dimafr.wordpress.com/2010/12/15/triple-constraint-of-happiness-at-work/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 00:32:01 +0000</pubDate>
		<dc:creator>Dmitry Frenkel</dc:creator>
				<category><![CDATA[Motivation]]></category>
		<category><![CDATA[Social Dynamics]]></category>

		<guid isPermaLink="false">http://dimafr.wordpress.com/?p=54</guid>
		<description><![CDATA[Remember the Triple Constraint of Project Management? Remember how horrible and out of sorts it feels when your management attempts to maximize all three sides of the triangle? Well, I am going to attempt to make an analogy between Project Management &#8230; <a href="http://dimafr.wordpress.com/2010/12/15/triple-constraint-of-happiness-at-work/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=54&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Remember the <a href="http://en.wikipedia.org/wiki/Project_triangle">Triple Constraint</a> of Project Management? Remember how horrible and out of sorts it feels when your management attempts to maximize all three sides of the triangle?</p>
<p>Well, I am going to attempt to make an analogy between Project Management constraints and your Happiness at Work constraints. When I say &#8220;happiness at work&#8221;, I mean a situation when you are <em>mostly </em>happy to go to work every morning.  I don&#8217;t have any illusions that things could be <em>perfect</em>, at least not when you&#8217;ve been working in your current role for some time. I realize that there are <em>always</em> going to be problems, but those problems shouldn&#8217;t give you heartburn every second of every day to make you <em>leave</em> &#8211; those are the problems you or somebody else on your team is methodically working to solve and the rest of you are either helping or at least <em>not standing in the way</em>.</p>
<p>So what&#8217;s the constraints?  During my time in software development, I found that my personal happiness at work rests on three main constraints that are at the base of my professional <a href="http://en.wikipedia.org/wiki/Maslow's_hierarchy_of_needs">Maslow&#8217;s Pyramid</a>:</p>
<ul>
<li><strong>Product </strong>I am building</li>
<li><strong>Team </strong>I am working with</li>
<li><strong>Technology</strong> I am using</li>
</ul>
<p>When all three are balanced (once again, they <em>can&#8217;t</em> be all perfect all the time) &#8211; I am happy. When one is persistently screwed up, I am beginning to worry. When two are out of sorts, I am headed for the exit, unless I see a way to fix the problem. Let me explain why.</p>
<p><strong>Product </strong>I am building gives me and everyone around me <strong>purpose</strong>. Multiple factors contribute to good or bad feelings about the product. I like when I believe in the product, when I think it solves a real problem, when I find the problem space fascinating, when I feel connected to my users (this could be just an illusion, right?). Take this all away, and suddenly there is no purpose, no goal, no mountain to climb. It could be OK for a short while, but it gets on my nerves very quickly.</p>
<p><strong>Team</strong> I work with defines my <strong>social environment</strong> at work. I like to work in a team based on mutual respect, accountability, driven by results and not too political, and who doesn&#8217;t?  I also tend to pay attention to processes that exist in a team. How do ideas get communicated up the chain? Are they dismissed out of hand, do you have to be a member of  &#8221;in&#8221; crowd to be heard? Is your management <em>effective</em>, <em>accessible</em> and <em>open</em> or are they just along for the ride? Do they listen to valid concerns and take action to make the team better? Do they defend the team or just themselves in battles that are worth fighting? Basically, I try to evaluate my team using one main criteria: can we <a href="http://www.tablegroup.com/books/dysfunctions/">conquer team dysfunction</a> or not?</p>
<p><strong>Technology</strong> I deal with on a daily basis is hugely important for me as well. Basically, I want to be able to answer &#8220;yes&#8221; when somebody asks me question #9 on <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">the Joel Test</a>. I have to spend my working days making technology do what I want, so it is only reasonable that I should be a pretty demanding customer. I don&#8217;t want the technology to <em>waste my time</em> &#8211; I want it to <em>help me</em>. I also want to <strong>enjoy</strong> working with it. I also want it to be <em>marketable</em> enough for me to learn. No matter how enjoyable and effective Smalltalk is, the reality check tells me that becoming a Smalltalk expert is probably not as good for my resume as knowing Java or C#. And this is coming from a person that loves Smalltalk. Same goes for internal tools that most companies have.  None of these tools are marketable (they are internal), so if they are clunky, old and hard to work with, I will hate them.</p>
<p>So what do I tend to do when any of these pillars becomes jeopardized? Well, it&#8217;s always the same two choices when it comes to your basic needs being threatened: <a href="http://en.wikipedia.org/wiki/Fight-or-flight_response">fight or flight</a>, except I alway fight first. I stay loyal, I try to influence non-technical decisions about the product, I try to lend my time, expertise and advise to fix my dysfunctional team or I try to push for technological choices that I consider more promising, applicable and marketable.</p>
<p>However, if I can&#8217;t convince myself that at least two out of three are acceptable to me, there is nothing I can do to make them acceptable and the situation isn&#8217;t getting better, I think that it&#8217;s time to move on. As loyal as I am, there is always another team, another project, another challenge.</p>
<p>Because life is too short to spend it in a dead-end job you hate.</p>
<br />Filed under: <a href='http://dimafr.wordpress.com/category/motivation/'>Motivation</a>, <a href='http://dimafr.wordpress.com/category/social-dynamics/'>Social Dynamics</a> Tagged: <a href='http://dimafr.wordpress.com/tag/motivation/'>Motivation</a>, <a href='http://dimafr.wordpress.com/tag/social-dynamics/'>Social Dynamics</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dimafr.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dimafr.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dimafr.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dimafr.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dimafr.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dimafr.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dimafr.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dimafr.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dimafr.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dimafr.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dimafr.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dimafr.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dimafr.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dimafr.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dimafr.wordpress.com&amp;blog=18394202&amp;post=54&amp;subd=dimafr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dimafr.wordpress.com/2010/12/15/triple-constraint-of-happiness-at-work/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04d46cffc683edbda4c7c1b6f559ad81?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dimafr</media:title>
		</media:content>
	</item>
	</channel>
</rss>
