December book review: Don't Just Roll the Dice

Neil Davidson
Don't Just Roll the Dice: A usefully short guide to software pricing

To download a free eBook, click here.

For the month of December, I picked a short fun-to-read book filled with refreshing yet practical ideas on software pricing. The book is very informative, thought-provoking, and engaging. Will it become something you enjoy reading over the upcoming holidays?

Neil Davidson, the author of the Don't Just Roll the Dice, is a co-founder of the Red Gate Software that provides database tools for developers and administrators. Neil investigates how to make an informed guess at what your product is worth on the market. In the attempt to answer this question, he describes many first-hand real-world experiences demonstrating how a pricing strategy can work to your advantage over your competition.

The book is organized around a series of questions. I listed a few of them below:

  • What is your product?
  • Who are your customers?
  • What is your product's objective and perceived value to your customers?
  • How do people generate their perceived value of your product and how could you increase it?
  • How could you create product versions and bundle your software to increase revenue?

Happy reading!

Silverlight 4 at TCSLUG on Tue, Dec 15, 2009

Who: Shannon Braun
What: Silverlight 4 – A First Look
When: Tuesday, December 15, 2009
12:00 - 1:30 PM
Where: Twin Cities Silverlight User Group
Cost: Free

Registration is required. See more information at TCSLUG.

November Architect: Domain Model Structure - Part 2: Entities

Last month, we started a discussion around how to organize classes inside your domain model in a clear, easy-to-understand, and easy-to-maintain way. We reviewed our objectives and discussed why they are important. This month, we will start revealing a story of a business domain for the purposes of developing a software application. We will look into what is being managed in the domain day to day: Entities.

Discovering Entities

There are a number of technical definitions of an Entity that are popular in the industry. For example, here is a definition from Eric Evans' book Domain Driven Design, p. 89: An object that is not fundamentally defined by its attributes, but rather by a thread of continuity and identity.

The way I prefer to think about Entities is what we manage in our domain day after day. Entities span through long periods of time and run across multiple systems. They often have lives well beyond our applications and must be effectively tracked. As a general rule, assume that mistakes in Entity identification and tracking are expensive to notice and repair.

To discover Entities in your domain, talk to your functional people and end users. Ask them to walk you through scenarios the new system should implement. How are your users going to use your application? What is important to them and why? What do they really care about? What is important to your company and how does it need to be reported? The chances are you will be talking about what needs to be tracked and how, thus you will be talking about Entities.

Examples: Person, Account, Loan, Application, Payment.

Entity Relationships

What are the relationships between your Entities? Before getting into technical details, create a simple analysis diagram that shows the Entities you have discovered and their relationships. Lets consider a simple example:

Scenario 1: User logs in into the system to check the status of their applications and loans.

Scenario 2: User calls a Customer Service Representative (CSR) to reset their password.

Entity Relationship

Your research and conversations about the domain model revealed 4 Entities: Account, Person, Application, and Loan. Let us walk through the first scenario:

  1. User logs in into the system. The system needs to retrieve the user's security Account and verify their username, password, and any additional validation factors.
  2. Upon successful login, the system retrieves a previously stored Person record based on Account information. Thus, you see an arrow from Account to Person. You learned that each Account has a corresponding Person record, but not all People have created an online Account. That explains the numerical values on the diagram.
  3. Based on Person, the system retrieves their Application and Loan information. Thus, the arrows are shown from Person to Application and Loan. Person is created on the system with their first Application, but not all Applications are approved to become a Loan. Notice that there is no arrow between Application and Loan - we cannot determine its direction based on our current scenarios.
Now, let us take a look at the second scenario:
  1. User cannot verify the security information during login and calls CSR to reset their password. CSR asks them a series of Personal questions and retrieves their Person record.
  2. CSR retrieves the user's Account record for additional verification and resetting the password. Thus, you see an arrow from Person to Account.
Do not worry about having a circular dependency between Account and Person on the Analysis diagram. In one of our next articles, we will show several implementation options for the relationships. We will not have a circular dependency in the final implementation.

Domain Model Structure

Account, Person, Application, and Loan are our first classes in the Domain Model. For now, place them together in a sub-folder under the Domain Model root. We name this folder "Operation":

Domain Model Structure - Operation folder

Summary and Additional Tips

  1. Entity is an object that is not fundamentally defined by its attributes, but rather by a thread of continuity and identity.
  2. Entities span through time and space and are being tracked and managed in the day-to-day operations.
  3. Discover Entities by talking to your functional and end users. Create simple Analysis diagrams as a result of these conversations.
  4. Entity's primary responsibility is to maintain its continuity. Keep it simple by leaving complex behaviors out of its class definition.
  5. Managing life-cycle of Entities is a complex and risky job. Try to keep the number of Entities in the system down. Too many Entities will defuse your model and create no value.
  6. Compare Entities of the same type by their identity regardless of their form and history. Make identity type a Value Object.
  7. If you are interested in creating a simple base Entity class, you can start with the one listed below:

    ///<summary>Base Entity Class </summary>
    public class Entity <T>
        public T ID { get; protected set ; }
        public static T NewID { get { return default (T); } }

        ///<summary>Returns true if the object has not being stored in the system. </summary>
        public bool IsNew { get { return Equals(NewID, ID); } }
        public Entity(T id) { ID = id; }

Happy coding! To be continued...

Microsoft released Silverlight 4 Beta

At the PDC 2009 conference, Microsoft announced a beta release of Silverlight 4. The final release is expected in the first half of 2010.

JetBrains TeamCity 5.0 released

JetBrains released a new version of TeamCity, a popular build management and continuous integration server. The release includes a number of important new features:

In the past, if you owned a license to a previous version of Team City Enterprise Edition, you qualified for a free upgrade. Unfortunately, this is no longer the case. With TeamCity 5.0, JetBrains requires you to buy an annual subscription at $999 per year in order to qualify for an upgrade.

The Professional Edition that supports up to 20 user accounts and 20 build configurations is still available at no cost.

Happy coding!

SATARAID5 Manager could not acquire application lock in Windows 7: Solved

I have recently purchased Sans Digital TowerRAID TR4M 4, an inexpensive RAID solution for 4 1TB drives that supports both eSATA and USB interfaces. I love its simplicity: a single cable puts a high-performance and a high-reliability storage solution at your fingertips. Excellent choice for your home office or small business data center!

The device comes with Silicon Image SATARAID5 Manager software for configuration and management of TowerRAID TR4M 4 using a graphical user interface. While the SATARAID5 Manager lacks visual appeal and usability features we have learned to expect from a modern application, it has all the capabilities you need to create, configure, and manage your RAID groups.

It was a bit of a challenge for me to get the SATARAID5 Manager up and running on my Windows 7 machine. Immediately after the application started, the "Could not acquire application lock" error message came up forcing the SATARAID5 Manager to be closed:


Could not acquire application lock!

I was not able to find a clean solution to the problem, but I can share with you a work-around. To start the SATARAID5 Manager without exceptions, disable notification in the User Access Control Settings and restart your computer:

Could not acquire application lock!

After configuring your RAID groups, do not forget to change the User Access Control Settings back to their original values.

Happy coding!

WCF service for Cold Fusion client: undefined portType in WSDL

We have been helping a company consume our WCF services from Cold Fusion. I was surprised when a relatively simple WCF service caused an exception in the Cold Fusion 9 cfinvoke tag. The error message stated that there was an undefined portType in WSDL.

To solve the issue, declare a namespace in the ServiceBehavior attribute of your WCF service and leave the namespace empty in the ServiceContract attribute:

[ServiceBehavior(Namespace = "")]

Happy coding!

WCF service with Named Pipe Binding on multiple sites in IIS7

A named pipe is a system kernel object that processes on the same server may use for communicating with each other. It is a fast, secure, and reliable way for your applications to access on-machine WCF services.

While working on the test server that hosted multiple sites in IIS7 (test, uat, staging, etc.), I have noticed that for a single web service all sites used the same named pipe - you can look at all named pipes defined on your system using a tool like PipeList. Needless to say, reusing the same named pipe is not a desirable behavior in this situation.

I looked closer into the issue. From what I now understand, WCF uses an algorithm that maps a service path to the pipe name. By default, this algorithm ignores the domain name of the site and, thus, all sites on the server map services with the same local path to the same named pipes.

That explain the root cause of the issue. How can we get it fixed? How can we force the algorithm to take the domain name into acount when creating a named pipe?

The first step is to set the hostNameComparisonMode attribute to Exact in the NetNamedPipeBinding configuration of your service:


    <binding  name="YourNamedPipeBinding"  hostNameComparisonMode="Exact" />


The second step is to modify the net.pipe binding on each IIS7 website:

Named Pipe Binding Information

Hope it helps. Happy coding!

Welcome to ModelBlog

Thank you for visiting ModelBlog. We hope the time you spend with us will be both entertaining and worth your while. Have fun!