Paul Gielens:ThoughtsService

another Endpoint to my thoughts

News

Syndication

Ads


Favorites

Projects

July 2004 - Posts

Thoughts on Modern Software Factories (1),

My recent project, which was a success in many ways also had its “bads”. Like so many other projects we missed milestones, ignored our budget far to often and suffered from bad leadership. A lot of companies see themselves in an industry which is rapidly maturing. A more demanding customer changes the market place rapidly. Producing good quality software on time is hard and forces us to look closer at the processes and the role(s) we play in them.

 

The craftsmanship of software engineering is facing a new challenge because the software industry might be industrialized [Greenfield and Short]. I can almost hear you think that developing software simply cannot be industrialized. It would loose all aspects we like so much about our work, wouldn’t it? If anyone should know I would. In a previous life I’ve worked in the metal industry. Back then one of the main reasons for my career change was retaining back my creativity (I actually found out that it was this what I was missing a little while back). So now the software industry might be industrialized... hell no! psst… hell yes, you see Modern Software Factories abstract us from all irrelevance and drives us to be creative in what we do best.

 

In essence the goals of industrializing the software industry, building a Software Factory consisting out of one or more Software Production Lines are productivity and predictability [Toon Loonen].

 

Optimizing productivity contains many of the insights which underlie the Japanese Kanban system.

 

Kanban was developed at the Toyota car plants in Japan as a program to smooth the flow of products throughout the production process. It aims to improve productivity by observing the flow of products through the production system [PMS].

 

Assuming possible products (depending on your business) would be; information analyses, architecture, software, documents, etc. How can we influence the flow of products in a Software Production Line? The better the flow is the higher the rate at which we produce right? First we need to study, throughput, inventory, and operating expenses.

 

Throughput is the rate at which the Software Factory makes money through selling finished goods (some of the products mentioned earlier). It is not a measure of production.

 

Inventory is defined as the raw software (reusable components) or buyable components (for example an Object Relational-mapping framework) , finished goods in the form of in-house developed reusable components. Standards. Proven architecture can as well be seen as inventory. I guess solid Domain knowledge (Domain knowledge isn’t stable, business changes rapidly, and so I doubt that Domain knowledge is properly categorized as inventory) fits in this category as well.

 

Operating expenses are defined as the cost of converting inventory into throughput. You could think of direct or indirect labor, facilities. Or if you work at Microsoft; soda machines, couches, gadgets… just to name a few. Operating expenses are a measure of costs incurred to produce some of the products mentioned earlier.

 

Changes in any of these three elements result in changes in the financial measurements as follows:

-         Return on Investment (ROI),

-         Net profit,

-         Cash flow.

 

The goal of a Software Production Line is to increase throughput, decrease inventory and operating expenses. The question now is how do these variables measure up? Do as I do and spend some time thinking on Modern Software Factories.

 

In a future post I will discuss bottlenecks and their influence on productivity. How we can make productivity measurable to achieve a certain degree of predictably. And finally what a Modern Software Factory has to do with creativity.

 

[Greenfield and Short]

Jack Greenfield and Keith Short. Software Factories: Assembling Applications with Patterns, Frameworks, Models and Tools, 2003.

 

[Toon Loonen]

Toon Loonen. Architectuur en Ontwikkelstraat, 2000

 

[Anko Duizer]

Anko Duizer. Ontwikkelstraat, MSDN column 2004

 

[PMS]

Browne, Harhen, Shivnan. Production Management Systems: An Integrated Perspective. 1996

Random Observations

The Nerd, the Suit, and the Fortune Teller. A parody on SOA's business value.

Philip Nelson wrote a very interesting post regarding Delegates. I haven't really made up my mind about this. And I thought I knew my Delegates.

Philip also makes a plea for customized SQL. Based on my experience with Process Management Systems which encapsulate lots of data and require real-time access to control functions I must say I fully agree on his pov. SQL is a great place to optimize with a high ROI rate.

I've been asked to engineer an auditing system. During my research I stumbled upon Christian Bauer's (Hibernate) History triggers and Hibernate article. This could be a useful feature for Neo as well.

Interesting read: An Agile Approach to a Legacy Systems

There's a slight possibility I'll be job hunting soonish.

Distributing LCE in COM+

MSMQ... DCOM... COM+ = LCE

 

In this post I asked for advice on a loosely coupled event server. Since Alex Thissen recommended me on using the Loosely Coupled Event (LCE) service System.EnterpriseServices features we’ve been heading in that direction. Although LCE’s are fairly simple to configure on your local box, remote subscription can cause quit a bit of pain. I directly started to export proxy packages, but I soon found out that the remote proxy didn’t let the events flow over remote boundaries. Alex kindly corrected me, and even found the time to write a short article including a demo project. Thanks Alex!

 

I almost forget to mention Yves, Yves suggested WS2.0 which would require some additional coding over LCE's but looks like a great alternative.

Posted: Jul 29 2004, 03:57 PM by p.gielens | with 2 comment(s)
Filed under:
Transactional (DTC) Receive on MSMQ brings legacy system on its knees.

Once up on a time when the world was all about NT we were able to both send and receive messages from a local message queue as well as a remote message queue. As the cream on top the cake it was even possible to enlist this work in a transaction coordinated the DTC('s). This article gives you a more detailed view on what was possible with MSMQ & MTS at that time. As of today a mission critical application started to fail and since we recently updated our application server to Win2k we're assuming we overlooked some compatibility issues. A colleague did some digging in the Microsoft documentation and found the following disturbing information.

MSMQ1.0 doesn't support transactional read from non-local (remote) queues. This means that reliable, exactly once reception isn't available from remote queues.

Sure we should have know you Microsofties warned us and did your best to hide that information somewhere in MSDN. You should have left it out in the first place! Taking this a step further we’ve found out that:

When using a transaction to retrieve messages, the queue must be a local transactional queue. You cannot retrieve a message from a remote transactional queue

…as this article states.

A suggested solution is a Transactional Read-response Application. Guess we’ll have to invest/waste our time on a workaround.

Another interesting thing is that the .NET documentation isn’t explicit about this neither. My guess is that System.Messaging is a managed wrapper and is thus experiencing the same problems.

This is just one of those days I guess.

COM+ introduction (Dutch)

Alex has written a nice introduction to COM+ programming in a .NET world (Dutch).

Posted: Jul 22 2004, 09:20 AM by p.gielens | with no comments
Filed under:
Tough decision (MSMQ, DCOM, COM+)

We have a legacy windows service (vb6) where we do FTP-style messaging integration (quit common in the previous decennia :D). Once the FTP communication goes down we’d like to share this knowledge as status information to those of interest (probably one or more .NET clients).

 

Personally I tend to lean against a MSMQ’ing solution which is loosely coupled and very interoperable but harder to administrate. A coworker suggested reworking the service to spawn events which would result in tightly coupled and less interoperable (which isn’t completely valid considering .NET COM interop) solution. The third possibility is using COM+ Loosely Coupled Events. It should be obvious all three alternatives are based on a publisher subscriber mechanism. What technology would you prefer?

Dutch .NET Developers Alliance newest additions

Today the Dutch .NET Developers Alliance counts 19 active developers. I’ve added all the guys listed at the portal site heefthetover.net (blogging in our native langue). I as well added Wilco Bauwer which I picked up via on of my trackbacks.

 

Import the latest Dutch .NET Developers Alliance OPML file in your favorite RSS reader.

Posted: Jul 19 2004, 09:34 PM by p.gielens | with 2 comment(s)
Filed under:
Factory Pattern with Generics

I had a very interesting discussion (with a Java goeroe) regarding the code listing below and I agree with him. What’s your opinion about using generics in this context? For instance, what is the benefit of using f.Create<Car>(“Kitty”) over f.CreateCar(“Kitty”)?

using System;
using System.Collections.Generic;
using System.Text;

namespace PaulGielens.Patterns.Creational
{
    public abstract class Vehicle
    {
        protected string name;
        protected string type;

        public Vehicle()
        {
        }

        public Vehicle(string name)
        {
            this.name = name;
        }

        // a person who bought my car wants to change its name, unless
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        // but can't change it's type
        public string Type
        {
            get { return type; }
        }
    }

    // a concrete vehicle
    public class Car : Vehicle
    {
        public Car() : base()
        {
        }

        public Car(string name, string type) : base(name)
        {
            base.type = type;
        }
    }

    interface IVehicleFactory
    {
        T CreateObject<T>(string name) where T : Vehicle, new();
    }

    public class VehicleFactory : IVehicleFactory
    {
        public T CreateObject<T>(string name) where T : Vehicle, new()
        {
            // create instance of Type T where this type derives from Vehicle
            T v = new T();
            v.Name = name;

            return v;
        }
    }

    public class FactoryPatternUsingGenericMethod
    {
        static void Main(string[] args)
        {
            IVehicleFactory f = new VehicleFactory();
            Car c = f.CreateObject<Car>("Kitty");
        }
    }
}

Posted: Jul 01 2004, 10:10 PM by p.gielens | with 7 comment(s)
Filed under:
VS.NET Error loading type library/DLL

Although I’m a big fan of Resharper (or was) I’d advise to hold of a little on installing it on your production box. What I just did with the latest version and it broke my VS.NET IDE completely. Does “Error writing the project file. Error loading type library/DLL.” Say anything to you?

I
just repaired my VS.NET installation and I’m back in business, but do I dare to install Resharper “again”?

I’m such a geek and couldn’t resist installing Sharpreader again to see if the same errors arise. It’s all working fine again. Let the refactorings begin.

Posted: Jul 01 2004, 01:40 PM by p.gielens | with 2 comment(s)
Filed under:
More Posts