10 Things I Hate About Indigo

Steve is still confused, so I thought I would spell it all out for him.
 
  1. The examples, especially the accursed Calculator example that's infected MSDN. The worst part is not that it is stupid and inane (right, you're going to go across the network to add two numbers together, Hello, you have a computer right there in front of you). The worst part is the subtext that tells the unwary programmer that using Indigo is just like a local method call. I really thought, based on your comments at PDC 2003 ,that you guys understood that location transparency is bad, but apparently not.
  2. The client programming model that makes network roundtrips look just like local method calls (result = Calculator.Add(value1, value2). Why don't you have a simple messaging model for the client?
  3. The service programming model that encourages you to directly expose methods to remote callers rather than responding to messages as events.
  4. Typed services because they replicate RPC semantics. To quote the book, "working with typed services feels similar to RPC-style distributed object technologies such as .NET Remoting". This where you expect most developers (especially Mort) to work and it is the worst possible place.
  5. Untyped services which are just slightly less tightly coupled RPC's.
  6. Message-layer programming which where I'd like to be because down there it's obvious that Indigo is sending the messages for you, but it is so freaking complicated that mere MORTals will get hopelessly lost. Seriously, when we adopt Indigo at my day job, I know I'll have wrap this layer with a simpler, less complicated interface. It will look a lot like System.Messaging but it won't be limited to MSMQ. That's what I hoped Indigo would provide.
  7. Attribute abuse. I've already harped on this one, but let me add that by using attributes you're insinuating your code into my domain model in completely inappropriate ways. I want to use Indigo explicitly, not implicitly via attributes.
  8. Configuration is good for some things, but not others. You guys seem intent on repeating the mistakes of the past. In this case, it reminds me of MTS. We all learned pretty quickly after it was released that allowing someone to change the transactional model of a piece of code after deployment almost always ended in disaster. Likewise, several elements (transports, security, etc.) in Indigo are simply too fundamental to be usefully configurable.
  9. Svcutil is evil. This is the tool I was referring to in my earlier post. Just like the attribute-driven approach, Svcutil infects my domain model with your code. Svcutil always imposes distributed object/RPC semantic (at least as far as I know)>
  10. The "One Ring to Rule Them All" philosophy. The whole "unification" strategy looks more and more like you guys just took a whole bunch of unrelated and, in some cases, incompatible technologies and threw into one big bag without any thought as to the underlying architecture.
 
Let me sum things up like this. I want Indigo to stay out of my domain model. I would like a vastly simplified version of the message-layer programming model promoted as the right way for most developers to use Indigo services. If you took the best parts of System.Messaging and WSE, you would just about have it. I hope that clears things up.

Posted Aug 14 2005, 01:03 AM by john-cavnar-johnson
Filed under:

Comments

Daniel Moth wrote Blog link of the week 32
on 08-14-2005 3:04 PM
Blog link of the week 32
Tom Fuller wrote re: 10 Things I Hate About Indigo
on 08-14-2005 8:22 PM
I have to say that I really don't understand all of this negativity surrounding WCF and what it is providing to those of us who are building web services today. Maybe I'm simply naive to the underlying complexity that "oo semantics" introduces but I am starting to feel as though all of these issues have more to do with underlying design strategies than the technology that is implementing them.

You state above that your domain model is being corrupted by things like svcutil and attribute based programming. I would assume that this has something to do with the fact that there is too much code being masked from you. Don't you have the option to not use those attributes in most cases. Also isn't your domain model still preserved within the components you design and the methods for invoking their interfaces are something outside of that domain model all together? You also seem to be very concerned about over-configuration and rpc stylings creating tight couplings but aren't there features within WCF like multiple end-point definition and data/message contract versioing that make this platform more agile than anything before it? Doesn't that actually give us a looser coupling in a way?

So I have read much of the materials available at this time (Pallmann's book Programming Indigo for example) and I have followed all of these blogs between the Microsoft Indigo/Connected Systems Group Team and yourself. I really only put much credence in one of your points. The point you make about poor design direction and over-simplification of the examples is without a doubt the biggest gap in my mind to date.

I think there needs to be a major shift within Microsoft to help guide those that intend to use these technologies. The tenants of service orientation are rarely reinforced in the examples you see today and these "Morts" that you reference in your other blogs are going to spend much of their time abusing these technologies and not showcasing them.

I personally have mostly positive things to say about WCF/Indigo at this point. I build first generation web services today and I am literally hand cuffed by versioning issues, security issues, and hideous lack of boundary definition in my service libraries (ok nothing in the WCF release is going to fix the last one). I do expect WCF/Indigo to make my world as an application architect easier almost immediatley. By the way I'm not on Microsofts payroll I'm just well read on the subject and I have just about the opposite opinion of yours .... I'm just not convinced otherwise by your recent blog entries.
Mike Taulty's Weblog wrote Following comments on the Indigo programming model
on 08-15-2005 2:02 AM
Steve Swartz wrote re: 10 Things I Hate About Indigo
on 08-15-2005 10:08 AM
Thanks for taking the time to explain your concerns to me.

1. It sounds like a fair part of your reaction to Indigo is a reaction to the samples and David's book. In Beta1, with one book and a smattering of samples, we can only target a subset of our scenarios. It sounds like our initial efforts didn't speak to you. Hopefully, as more books and samples come out, some of them will be more to your taste, and you will be happier.

2. Indigo does have a simple message programming model for the client at the "upper-level". The client calls a method that sends a message and returns. The message is delivered to a method implemented at the service. If the contract involves return messages, the service can send them back to the client in a similar way.

3. Indigo does have a simple message programming model for the service that lets you respond to messages as events and send messages back to the client which are caught and responded to as events.

4,5. Are you unhappy here because you don't realize that Indigo supports simple messaging (your comments 2) and 3) seem to indicate that)? Are you unhappy because Indigo supports RPC as well as messaging? Are you unhappy because our examples and David's book lead with RPC? We can fix the first problem by exploring the details. We don't view the second issue as a problem at all: there are scenarios for RPC as well as messaging, and we find that people are really attracted to the idea of training their people in a single API that can be used to implement all the common distributed application patterns. We have worked hard to make the differences obvious and localized: if you understand how to process a message under a transaction, or how to do authorization, or how to use our instancing model, those things will work the same regardless of whether you’re doing messaging or RPC. If you’re unhappy with the focus of the first book and the examples, well, as I said, I hope people eventually talk about parts of the system in ways that speak to you better.

6. Again, you realize that you can do message-oriented programming at the upper layer, right?

7. As Tom says, most of the attributes in Indigo are shortcuts for imperative things you can do via APIs. Most people like the convenience of attributes, but we built the system so that people who don't like attributes don't have to use them. The one exception in V1 is contracts. Attributes are a convenient way to associate metadata contracts definitions with code that can be used to work with those contracts. Once our designers come online, you won't need to work with attributes. Once we have a richer modeling infrastructure, perhaps we'll have better ways than attributes to associate metadata with code. For now, they seem to us like the bets way to proceed.

8. Our config story is not like MTS’s config story. You cannot change things the code depends on for correctness from config. If the developer cares about the semantics of the transport/protocol stack (must have transacted queue, must have session, etc), they can assert these dependencies from their code. By default, we believe that the deployer is the one who should control the transport and protocol mechanisms at an endpoint -- HTTP or TCP, transport or message security, etc. Those are typically managed from config (though the developer can choose to ignore config and do what they want). Given this summary, what part of the config story do you disagree with?

9. Well, svcutil doesn't impose distributed object/RPC semantics. If you have a contract that has all [IN] and [OUT], then svcutil generates signatures used to send messages and process them like events. It's only if you have [IN/OUT] semantics in your contract that you will get RPC (which is what [IN/OUT] is about). If you dislike having a typed proxy generated for you that corresponds to the WSDL you want to use, then you can create the proxy code types yourself: you don't have to use svcUtil at all.

10. Of course I can't say anything in response to your assertion that we haven't thought through our architecture.
Sharon Rosner wrote re: 10 Things I Hate About Indigo
on 08-24-2005 4:29 AM
I don't mean to be rude or out of order, but if that is your viewpoint why do you insist on using Indigo and .Net? I mean, the folks at Microsoft have a certain way of looking at distributed computing and they've built Indigo in that vein. You want free-form, decoupled messaging? You can build it in PHP/Perl/Python very easily. For my company (http://vuniq.co.il) we looked at .Net and Java and both of them were overkill. Messaging is actually simple when you do it in a stateless, decoupled manner, and that's also the way it should look to the programmer.

Anyway, just my $0.02.
Alex G wrote re: 10 Things I Hate About Indigo
on 11-21-2007 7:30 AM
WCF rules my world.

I understand your statement about the domain model infection. Still, ask yourself if your domain entities should really double as datacontracts.

Certainly not for a rich domain model, because entities would need to fulfill both the data and operations contracts. As for an anemic domain model, what do you make of aggregates and lazy loading - those are operations hidden behind properties. And certainly you aren't planning on exposing repositories as operation contracts, that would be extremely silly.

So my answer to you is, leave your domain model intact, keep it in its own assembly. Your data and operations contracts should reside within the Application layer, not the domain layer, the same way your UI should not be directly coupled with your domain layer.

You may also prefer to step-up the architecture to 5 layers and have a service layer between your domain and application layers. In this case the client side has Interface and Application layers, then a big bold separation (in reality, the network sits here), then the server side has Service and Domain layers. Both client and server also have an Infrastructure layer - the infamous boilerplate.

What Eric Evans and Martin Fowler write are not meant as gospel, just inspiration. Adapt so you can leverage technology.

Add a Comment

(required)  
(optional)
(required)  
Remember Me?