Solutions Architecture Blog

January 2008 - Posts

Globalization and Localization
by Mark Strawmyer 01.30.08

Comments    No Comments

Matt Goebel sat down with Larry Clarkin recently to do a podcat for The Thirsty Developer, which is a podcast that Larry and Dave Bost have started. 

The topic of the discussion was globalization and localization in Windows Forms applications.  Matt has some very relevant experience from a Smart Client that he's built that has over 15,000 seat deployments and runs in 6 different languages including Mandarine Chinese.  He and Larry swap some stories about trials and tribulations and some best practices on building applications that need to support multiple languages.

Here are some relevant links to articles by Crowe folks on Windows Forms or Smart Client related topics:
Windows Forms Tricks You May Have Missed
ClickOnce Extends Windows Forms Applications into Smart Client Applications
Build a Localized Form that Speaks the User's Language
Creating Custom WPF Controls
Getting Started with Microsoft Synchronization Services for ADO.NET
Making a Pre-Vista Application Vista Compliant

Cyclomatic Complexity Podcast
by Mark Strawmyer 01.22.08

Comments    No Comments

I sat down with Larry Clarkin recently to do a podcat for The Thirsty Developer, which is a podcast that Larry and Dave Bost have started.  Larry and Dave are both Developer Evangelists for Microsoft that I'm fortunate to interact with in the community.

The topic of the discussion was in regards to Visual Studio Team Suite 2008 and some of the great features in the Developer Edition and how they're helping our Crowe project teams in their effort.  As a bonus I got to say cyclomatic complexity, which while a tongue twister is fun to discuss.

Take a listen.  I'd love to hear some feedback.

Document Non-functional Requirements
by Daan De Brouckere 01.07.08

Comments    No Comments

When a new solution is being discussed, it’s easy to focus on all of the things it should do, what it should look like, and what technologies it should be based on. It’s very easy to get caught up in discussions with business resources about comprehensive feature sets and ways to present the information to customers. With a technical audience, it’s entertaining to squabble about the pros and cons of using one technology versus another to address the functional needs of a business problem.

When do discussions about disaster recovery, performance and scalability come into play? When should they? Why can’t I just say that the system shouldn’t fail, it should be fast, and it should be able to scale? The short answer is that this could be quite cost-prohibitive. The longer answers are below.

Let’s start with disaster recovery. I liken the conversation about disaster recovery to discussions about life insurance. To most people, it’s not fun to talk about what would happen if you die. Same goes for the brand new system you’re about to build. Disaster recovery is not a topic to be discussed AFTER the database gets corrupted or the application server CPU overheats. These are conversations that have to be had BEFORE the system is designed. Just as the functional requirements are documents, so should be these disaster recovery requirements. Based on different up-time needs and recovery efficiency, disaster recovery requirements could vary from making sure each server is backed up nightly to putting structure around a hot-backup on the other side of the country.

When it comes to talking about performance, the conversation tends to be easier; however, the proper documentation of performance requirements can be tough. How do you account for variations in network traffic? What if another process is running on your application server? The recommendation I have here is that you start by determining what an adequate response time looks like for the key functions in your new system. This needs to be balanced with the cost for delivering that kind of performance. Execute your performance tests in an environment that closely mirrors production. When it comes to documenting actual performance requirements, these can vary from a generic average response time per function to specific metrics around the key transactions of the system based on expected usage patterns throughout the day or during a specific time period (think concert ticket sales).

What about scalability? How do we expect the system to grow over the next several years? How many users do we expect initially? How many of them will be using the system concurrently? Even after having the answers to these questions (or best guesses), documenting requirements around scalability is difficult. I would recommend turning these into technical requirements around sustainable transaction throughput. Considering these requirements during the design phase allows you to build in the proper flexibility so the system can support the future anticipated growth.

Beyond these three different types of non-functional requirements, there may be many more that should be considered based on the system’s particular needs. The trick is to recognize early on in the initiation phase all the different non-functional aspects that are critical to the success of the system, documenting them, validating them, and ensuring they are written in a objective way.

Value of Guidance Solutions / Frameworks
by Mark Strawmyer 01.02.08

Comments    No Comments

I was recently engaged in discussions about the use of design patterns that resulted in my reflecting on projects I've seen where I judge design patterns to have been used successfully.  Design patterns can indeed add significant value to a solution and its long term viability and success.  They can also add a great deal of complexity based upon the pattern in question.  The more main stream the more likely the code will pass the maintenance test where another developer can pick up the code and successfully make modifications or additions that properly adhere to the pattern in play.  The more obscure the pattern the less likely another developer can easily maintain. 

As I reflected on times where I've seen patterns be successful I kept coming back to a commonality of what I refer to as a guidance solution or guidance framework being in place early on.  This boils down to work being done up front to put in place a detailed example of how code will be written.  It involves items such as creating a solution, putting stubs for various code projects that will hold the UI, data layer, business logic, etc, Enterprise Library or other core components included, and then building out some portion of the solution that hits the database or performs some other item of functionality that will be fairly common within the code base.  An ASP.NET web project example would be getting the solution setup, establishing multiple projects to hold different tiers of code, getting the authorization provider up and going, and building a secured maintenance page that retrieves and allows updates of data from a data source.  Plugging in the use of data retrieval, error handling, audit trail, and logging, and demonstrated use of design patterns such as MVC, MVP, factory, etc to provide a concrete example.  This stubbed out solution then serves as a working example for other developers to emulate in writing their code so they aren't starting from scratch themselves.

Guidance Solutions / Frameworks certainly don't guarantee success by any means, but the times I've seen them in play from the start other developers have been able to roll on to the project and contribute fairly rapidly without an extreme learning curve.  The key being that it needs to be done up front to maximize the value and serve as an example for consistency from the start.  Otherwise there is an inevitable part of the project where refactoring is forced to take place to bring consistency to a code base riddled with inconsistency as many of the developers chose different approaches to common items such as database access, logging, and exception handling.  Having the guidance framework in place from the start helps avoid this what can be time consuming and costly quality issue phase on projects.  Even better is if the up front work is done with more common practices that are well known and will require less education within the team and a higher chance it will be willingly adopted over having to force adoption.