Rants, rambles, news and notes from another geek

Geek Notes 2004-05-28

I’m at the aiport, working on a nasty Win32 DLL written in C, waiting for my flight back to Denver. Looks like I’ve fallen a bit behind on the Geek Notes, so I’ve got my work cut out for me.

  • MSDN TV: Building Your First Business Process - Watch Scott Woodgate show how easy it is to build a business process using Visual Studio .NET and BizTalk Server 2004, expose that business process as a Web service, and then consume the business process inside InfoPath - all within 20 minutes.
  • Microsoft Keyboard Layout Creator - I’ve been threatening to create a Dvorak-style keyboard mapping but instead of using English to figure out character usage ratios, I want to use C/C++/C# character usage. Maybe I’ll have time some day… probably not.
  • TMC Introduces SOA Blueprints - Sounds like an interesting idea, create a set of best-practices and open-specifications for multi-platform SOA development.
  • NUnitAddin Has&nbsp_place_holder;Gone Green! - Jamie has finally released a version of my favorite VS.NET addin that now has a GUI and nice little green and red dots in a tree. Must have.
  • ObjectSpaces Isn’t Going to Ship - Not all that surprising. Anybody remember when this product was actually annouced? Back in .NET 1.0. We’ll see if it ever ships.
  • New FileDisassembler for Reflector 4.0 - Wow. It now makes all the other bits that you need to really be able to compile the code. Very cool.

Concerns About Religion in Visual Studio 2005 Team System

I am really starting to feel better about what VS2K5TS is bringing to the table, but I still have some concerns. My biggest concern is around “religious intrusion”.

Every development organization has a completely different way of doing development. Many of the decisions that are made are&nbsp_place_holder;what I call “religious decisions”. By that I mean that there is really no verifiable way to say that this methodology is better than that one, or that TDD is always better than writing tests after the code. I am concerned that these tools will end up with a specific religion that makes assumptions about how we work.

I know that we are being told that all of this stuff is extensible and can be replaced with other 3rd party tools, but sometimes the religion can get tied up in the extensibility model.&nbsp_place_holder;&nbsp_place_holder;This is actually my biggest concern. If the extensibility model is clean and unpolluted by religion, then the community will be able to extend in ways that provide the kind of infrastructure that we need. If the model is not left unencumbered by religion, however, we will find that extending the platform will be next to impossible.

When you have religion you often don’t realize the impact it has on the decisions you make. Because it is one of those things where you are actually baffled when you find someone who believes differently…

“You do WHAT?” the consultant asked his client…

As we have seen in the real world, religion is a major cause of conflict between different groups of people. The RUP vs. Agile war is an obvious example in the software development community. It is one of those things where there is no objective “right answer”. People are firmly convinced that their belief is the “one true way”, but in fact it is subjective opinion.

To illustrate how religion can influence the design of an extensibility mode, consider the current Visual Studio source control API (SCC). The design of this interface makes the assumption that you will be using a lock-edit-commit model for managing your code instead of an edit-merge-commit model. This has a significant impact on the semantics of source control management. For example, it assumes that a file will have its read-only bit set. When you work in something like Subversion or CVS, you don’t use operating system file attributes to indicate the state of the file. Rather SVN and CVS use a hidden folder called .svn or .cvs. This and a number of other little things have made it very difficult to implement CVS or SVN Add-Ins for Visual Studio without going completely around the SCC and doing all the work by hand (as AnkhSVN did).

Unless the VS2K5TS team is very careful, the source code issue is just one place of many where this religious intrusion could occur. The integration of methodology and process into the IDE is another obvious place. The testing and reporting frameworks could also be susceptible.

Hopefully they will hear this from more people than just me and will strive to at least keep the extensibility APIs clean.


DEV302: Visual Studio 2005 Enterprise Tools - Building Robust and Reliable Systems

This session, which basically covered the “A day in the life of a developer” concept was a pretty good overview of how all this Visual Studio 2005 Team System (VS2K5TS) stuff will impact those of us who actually write code for a living.

Unit Testing and Test-Driven Development

Jim Newkirk gave a very quick 10 minute demo of TDD using VS2K5TS. The support in the new tool is pretty darn good. One of the cooler things how the refactoring tools support TDD. Recall that when you are doing Test-Driven Development you often write a test before the method you are testing has even been written. One of these refactoring tools now shows you a SmartTag that lets you quickly insert a stub method into the class being tested. Very nice.

However, I do have a few complaints about the unit testing stuff I have seen:

  • To use the refactoring above, the target class has to already exist, which in pure TDD isn’t the case at the very beginning
  • I really have to ask why they changed the name of the attributes from those defined in the xUnit frameworks. I’m guessing it is just a matter of wanting to be different, but I really think they should reconsider. [TestFixture] and [Test] and [ExpectedException] are consistent across NUnit and csUnit, so why should this tool be different?
  • I’m not all that enamored with the test runner UI. I can’t seem to figure out how to run it from the keyboard, and there is a popup dialog that insist on asking me to select a test configuration every time. Annoying.
  • I’m not at all happy that the Unit Testing stuff will be included in Test System but not in the lower down versions of the VS product stack, Unit Testing is far too important to say that only the top tier product can have it.

Code Coverage

Eric Lee opened this demo by polling the audience and discovering that everyone had heard of code coverage analysis but that no one uses it. If you’re ever heard me talk about testing and stuff, you probably know that I am not a big fan of code coverage analysis. My feeling is that it tends to be treated as panacea to project managers who love to be able to say things like “our unit tests covered 92% of our code, so we know that the code is ready.”

Or even worse, I have a fear that a manager might institute a policy that states, “All code must have unit tests that cover 100% of the code.” If this is used in place of good code reviews, I feel certain that we will start to see developers who learn to get 100% coverage in a lazy an ineffective way. Management will feel good, but the code will be bad.

Notice that I am not saying that code coverage analysis is by itself bad. But I an concerned that it will be misused. I certainly intend to use it as a developer to keep an eye on my unit testing coverage, but I know to never depend on it as a measure of unit testing quality.

Code Analysis

Eric gave a detailed explanation of that static code analysis is and laid a foundation for his demo. I really think this stuff is going to be useful, but once again I reserve judgment until I get a chance to play with the bits myself.

It looks and sounds like a tightly integrated version of FxCop. Like FxCop, it allows you to create custom rules, ships with a massive base set of rules, etc. Looks pretty good.

Application Verifier

Find problems as your application runs. The team specifically set out to address the problems of

  • “Works on my machine”

  • “It used to work”

  • Runtime issues

Some of the many things that it checks for include

  • Application compatibility issues

  • Defects

  • Security checks

  • Logo compliance

Also good stuff.

Code Profiler

The first part of this Eric showed was Sampling. This takes samples of the methods that are called in our application. It tallies up the totals and gives you a quick look at the method call counts. It gives you an easy way to quickly identify possible problem areas.

The second half of the code profiling system is Instrumentation. Eric suggested that we should move to this more intrusive way of profiling after using Sampling to get an idea of where we should look. It injects code into the running code to enable to collection of detailed timing probe data. This lets you determine, for example, that a specific line of code in a method is the main source of delay. (Eric confirmed that this is basically an integrated&nbsp_place_holder;combination of the existing add-on profiling tools that are on MSDN today.)

Eric also showed the reports and summary information that are created. I know this stuff is going to be very useful to all of us.


One thing I was to say though is that this is an early preview. I have been talking a lot with this team and they are very interested in what people think of all this stuff. So expect it to change between now and when it actually ships. And we all need to be sure to tell them a little about each of our religions so they don’t leave anything out.

Pluralsight Is LIVE!

For any of you wondering what Keith Brown, Aaron Skonnard, Mike Woodring and Fritz Onion are doing at Pluralsight (which has had nothing more than a coming soon webpage up)…

Their site is now live! From www.pluralsight.com:

Founded by some of the most well respected .NET talents, Pluralsight is striving to build a strong technical community that will benefit developers everywhere. The Pluralsight members share a unique passion for software technology, with over 50 years of collective experience in software development, research, writing, speaking, and professional training focused primarily on the various Microsoft development platforms. Pluralsight members are known for their ability to clearly distill what really matters, providing valuable insight to the developers they serve. As proven authors, Pluralsight members have collectively authored over 10 books and 175 advanced technical articles, which have appeared in such publications as MSDN Magazine, Microsoft Systems Journal, Microsoft Interactive Developer and many others. Their work is recognized internationally as the place to turn for unique insight into the latest emerging technologies.

Pluralsight focuses on three main areas: building community, providing professional training, and developing technical content. With insightful bloggers and close ties to many of Microsoft’s product teams, the Pluralsight community will help you stay plugged into the heart of the industry. We host professional training events designed to help developers get up to speed quickly. We also spend a great deal of time developing whitepapers, samples, tools and other forms of technical content designed to directly support the developer community.

Pluralsight’s goal is to become greater than the sum of its parts: a home for smart developers

Nice job guys! Good luck.

Continuous Integration BoF

Just a reminder that my BoF “Continuous Integration in .NET” is at 6:30 tonight in Room 17A.

See you there!

DEV200: General Session - Managing the Software Lifecycle With Visual Studio 2005

This session, hosted by Rick LaPlante was an hour and a half of drilldown into Visual Studio 2005 Team System. Their idea was to show the information and process flow from Project Manager to Infrastructure Architect to Application Architect to Developer. It was a nice demo and continued by feeling of cautious optimism about this product. Here are my very disorganized notes….

Project Manager

The root of it all

Sees what is happining in the project

Assigns work items

Unit testing

Looks like NUnit: [TestClass], [TestMethod], etc.


code coverage


Code colorization

custom local methodology help system

Provided by the underlying enterprise methodology

static analysis

policy files

dev can override, but it gets promoted to project manager

Tester Mode


Build data, including touched projects, tests run, code coverage, etc

See resolved work items in each checkin

Reports generated by build server

Load tests: Browser, network type, etc.

Right click “create bug” and it attaches the test result and assigns the work item.

Back to developer mode

Developer sees the bug and gets the graph in his IDE

Developer adds instrumentation to the app

Can run Tom’s test without guessing what Tom did

All data collected

Developer identified the problem method and fixes it

Project Manager

Sees code coverage deficiency and starts hassling developers

NAnt Build Files for Continuous Integration BoF

I have a few minutes tonight, so in case anyone asks, I wanted to share my barebones build files that I put together for my CI BoF tomorrow night. These are two very simple NAnt scripts that you can use with a Cruise Control .NET (CCNET) setup. One of my biggest goals when putting these together was to make them as reusable as possible. I wanted to be able to take these from one project to the next and not have to make tons of edits to get them to work. Since my demo uses Subversion for source control, these files reference the SVN.EXE command line tool. If should be a simple matter to switch to a different provider.

The first one is the CCNET Bootstrapper file. The basic purpose of this file is to be the one that CCNET can use to clean, checkout and then build the project. I don’t include this file in the actual project source tree. Rather it is part of the CCNET setup. It is completely parameterized so that the same file can be used for multiple CCNET projects on the same server.

 _place_holder;  _place_holder;  _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder;  _place_holder;

That is the file that is responsible for getting a fresh, clean checkout of the source tree and then lanching the master build file for that project. Here is the starting build file for my demo project.

 _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder;  _place_holder;  _place_holder; _place_holder;  _place_holder;  _place_holder;  _place_holder;  _place_holder;  _place_holder;  _place_holder;  _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; <exec program="${fxcop.executable}"  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;commandline="/o:${results.dir}/${file}-fxcop.xml /c /f:${assembly.name} /s"  _place_holder; _place_holder; _place_holder; _place_holder; _place_holder; _place_holder;failonerror="false"/>  _place_holder; _place_holder; _place_holder;  _place_holder; _place_holder;  _place_holder; _place_holder; _place_holder;  _place_holder;  _place_holder; _place_holder; _place_holder;

(This is all in one build file, which works for a simple setup like this, but if your build system gets more complicated you might want to consider splitting it into multiple build files and either launching them with the task or including them and calling them with the task.)

Like I said, I’m trying to make this as reusable as possible, and I may not have succeeded completely. I haven’t actually used this script on a large project yet, so some of my “tricks” may not work at all. The main trick is that I am trying to get NUnit and FxCop to automatically figure out which assemblies to scan based on their assembly names. This works for my projects because we say in our coding standards that all test assemblies will be named XXX.Tests.dll. So I can run NUnit on those and FxCop on the others.

I would be very interested to hear what any of you think about these scripts.

CTS200 - Connected Systems: Service Orientation and the Windows/.NET Developer

Much like Don Box and Chris Anderson did during the MVP Summit, he and Doug Purdy opened this session with the Questions part and then spent the entire session answering those questions.

The question list was long and good and generally focused on COM+, MSMQ, and SO (no longer SOA… just SO).

Here are the primary points (bold is the title of the slide, comments are mine unless quoted.)

There Is Only One Program and It Is Still Being Written

This is one of those things that, like much of Don’s most important statements, is more philosophical than practical. But it did certainly ring true for me.

This program is the IT environment taken as a whole. When we write a “program” we are just adding to the Program (yeah… like the Matrix). Whether or not our program survives is really an issues of Darwinian natural selection within in the context of The Program.

Choice Is an Illusion

This point was a bit of a ramble, but the key point was…

Don Box: “We all like to think that the statement, “Grant me the courage to change the parts that I can change. Grant me the patience to deal with the parts that I can’t change. I grant me the wisdom to know the difference. But let me tell you… you can’t actually make significant change to the Program.”

Objective Interpretation is an Oxymoron

Doug Purdy asked us all to close our eyes and think about when we saw when he said… “Car”.

I saw my car. Some people say a Porche. Some saw a Corvette. The point was made.

Doug Purdy: “What does car mean? There is no such thing as objectivity when we talk about the exercise of interpretation.”

Good Contracts Make For Good Neighbors

Don used an analogy I haven’t heard him use before. He said that when people put up fences between their houses it actually improved neighborly relations, because there is no dispute over where the boundary is. The application of that analogy to the SO world is pretty obvious.

First Do No Harm

This one is pretty clear, right?

Innovate Locally, Interop Globally

Again, this is a consistent message with what Don said back at PDC. If The Program is a heterogeneous collection of little programs all interoperating, then the obvious area where one can innovate is within your local domain. You can’t expect to influence The Program at large.

How much COM Does The Program Need?

Quite a bit. We will always have unmanaged systems and COM is the best way to interop with local unmanaged resources.

How Much Remoting Does The Program Need?

Some. Remoting is still and will continue to be the best way to interoperate across App Domains within a single managed application.

How Much ES Does The Program Need?

Lots. ES (aka Com+) is the most efficient way to communicate across machine boundaries when you know that both ends are managed .NET code. Unlike remoting, you can secure it.

How Much ASMX Does The Program Need?

Lots and lots and lots. More to come. ASMX is the best way to proceed unless it won’t work for you.

Don Box: “Unless you can’t do what you need using ASMX, you should be using it. Use the model (ed. SOAP) and the implementation (ed. performance and such) will catch up.”

How Much WS-* Does The Program Need?

Less. Use only what you need to get your job done.

How Much WSE Does The Program Need?

Use it when SOAP isn’t good enough. A specific example is when you know you need to deal with message routing and forwarding and need to maintain security and trust expectations. If you are just point-to-point without any of those needs, then why not just use channel security (e.g. HTTP AUTH)?

So as expected it was a good talk, with lots of good guidance, but very little technical details.

Visual Studio 2005 Team System Site Goes Live!

I’m sitting in the staff room with Harry Pierson watching Steve Ballmer’s Keynote address. Steve is always a good speaker and a lot of fun to listen to.

While we were hanging out, Harry said, “Have you been to the Architecture site this morning?” (In case you don’t know, he is largely responsible for that excellent piece of content. Check it out here.)

I had been there lately, but I hadn’t been there this morning. So after a couple of failed attempts to get on the wireless network, I hit the site.

(At about this point, Steve is talking about the developer tools that use automation to increase developer productivity.)

When I finally get the MSDN Architecture Center website up, what do I see at the top of the page but a link to Announcing VIsual Studio 2005 Team System for Architects.

This suite of products, formerly known as Burton, is an amazing looking collection of tools to extend the VS.NET environment with enterprise team development tools like:

  • Source Control: A new “server- and database-based change manegement system that is scalable to large teams and projects.”
  • Work Item Tracking: “designed to manage a development life cycle end-to-end.”
  • Testing Tools - “Test Explorer is a convenient way to view all of the tests, including manual, unit, and load tests…”
  • Advanced Development Tools - Static analysis tools… unit testing tools… performance profilers… build server…

All I can say is WOW! If this stuff delivers on the promises offered on the documentation up already, then Microsoft will have produced the most significant improvement to the development suite since… well… since the release of Visual C++ or Visual Basic.


Finally, the tools will have broad support for large development teams. For distributed development teams. It will finally provide a source control system that works. An integrated unit testing platform.


The Whidbey announcement last fall was huge for the general development community, but for me, a person who has to lead teams of people to get real work done, this is more important.


Here are a few links:

UPDATE: The demo just finished and it looks pretty darn good. The code coverage tool was interesting… red source indicates code that wasn’t exercised by the test, while green source indicates that it was run by the tests. Sounds interesting. They didn’t show the source code repository stuff, which disappointed me. They also demoed PREfast which is a cool integrates security analysis tool. This still is really going to be great.

TechEd Bingo!

Datagrid Girl and ObjectSharp bring you…

TechEd Bingo!

Print yourself a card. Pay attention to the speakers in the sessions you are in. Mark off the words you hear and don’t forget to yell out BINGO if you get a win!

Marcie says that on Tuesday she will have “pink bingo dabbers” for marking your spots.