“All for this one moment” is Lufthansa’s
marketing tagline for FlyNet, their in-flight Internet service. One of the ads
reads (I don’t have the exact wording right so, so I paraphrase) “Read
your email or cheer about the goal in the 92th minute”. Now… that
with the goal is of course an issue, because how could you possibly see it? Sure,
there are live text tickers on news sites and there is Internet radio, but that’s
all lame, right? So I bought myself a PC with some big disks, two TV capture
cards, upped my DSL connection at home to 3072/512KBps, and got myself a copy
of SnapStream’s Beyond TV. Outcome:
Live TV from Germany, football included, streamed from my home PC to my
notebook to anywhere I go – given that I get at least a 96 KBps link. The
maximum feed I can get out of this with a good connection to home is about 496
KBps, which gives me near VHS picture and sound quality.
The screenshot is taken in the Lufthansa lounge at Munich airport. Connection
is via Vodafone’s WLAN. Greece playing Japan in the Confederation Cup
right now. (Of course they’ve got that here on the regular TV screens,
but it seemed like a good moment to show that).
“Self inflicted damage“ is probably the right expression to use.
It’s Sunday, I am home, it’s a beautiful day and I am once again
packing a suitcase. The taxi arrives at 16:00h and I’ll be airborne at
around 16:45h (the drive to Düsseldorf airport from my apartment is about 8
minutes and I am already checked in via phone) going to Munich and from there
to Bern in Switzerland for a 1 1/2 day workshop with a customer. Tuesday
afternoon I take the train to Zürich airport and will fly straight to Brussels
for a series of meetings Tuesday evening and Wednesday all day. As per current planning,
I’ll be back at Düsseldorf airport on Wednesday by 21:45h.
And all that in a week that was supposed to be “work at home”. In
the past four months, I’ve been to the U.S. three times and I’ve
been to Singapore, Algeria, Saudia Arabia, Pakistan, and Turkey as well as in
Croatia, Slovenia, Austria, Norway, England, Italy, and Holland – with the
occasional business meeting in Germany in between. With some of these trips
being really short – like less than 2 full days in Karachi, Pakistan
coming from Miami in Florida (+9 hrs) and leaving to Europe (-3 hrs) I even
give up trying to adjust to the time zones and if I happen to wake up at 3am in
the morning I just accept that as what the body thinks is right, make or order
coffee and just stay awake. I thought last year was nuts in terms of traveling,
but this year easily beats it.
The traveling per-se isn’t all that bad, but getting up at 3:30am in
the morning or earlier or just stay awake through the evening to catch a flight
in the Middle-East, crossing more than 6 hours of time-zone differentials three
times in a week, and all the irregular sleep hours and the irregular eating
hours are definitely causing stress, are badly affecting my ability to get work
done and aren’t really healthy. And since I am always cordially invited
to be someone’s guest most of the evenings I am on the road, it’s
not a very polite thing to reject the invitation to dinner and a drink or two –
which doesn’t help keeping the weight down and doesn’t contribute
to be well rested all the time. And I really can see why some frequent business
travelers become alcoholics. If one’s body is easily vulnerable to addiction,
the “dinner meeting culture” alone drives people straight to the
edge and then they do hard liquor – done. Beer and wine in good measure is
good enough for me, thanks.
What’s somewhat frustrating about the traveling on tight schedules is
that you often get to places where you haven’t been and then you don’t
get to see anything of the city or country. Pakistan is one of these
examples, with the added, unfortunate complication of a very volatile security
situation. I’ve now been in Karachi twice and all I have seen is the
airport, the highway from the airport into the city, a particular hotel (both
times), and two restaurants. And whenever we left the hotel, we’ve been
in a bus followed by a pick-up truck with a bunch of policemen with
machine-guns. And with that “experience”, you get pulled in front
of a TV camera for an interview and get asked “what do you think of
Pakistan?” Well… What
I can say about Pakistan is that the people are great. It’s difficult to
find a room with 600-800 people who are so exuberantly enthusiastic about
information technology as in Karachi. It’s hard to find a fitting analogy
to describe it, but the way they are longing for and absorbing knowledge is as
if you had a room full of sponges and you are holding a water hose at it for an
hour and once you are done, the floor is still dry like a desert. And once you
say “that’s it, thank you for your attention” at the end of a
session, you’ve got 50 people jumping up, running up to the front, bombarding
you with questions. It’s absolutely amazing.
Also amazing is my new friend Arfa
Karim (picture), who is the youngest “Microsoft Certified Professional”
in Pakistan and – by what I have been told – the youngest girl at
that in the world, having achieved the application developer certification with
just 9 years of age. And after talking too her for quite a bit in Karachi this
year, I can say that Arfa certainly didn’t cheat there. She’s really
a C# wizard and she’s got a well developed self-esteem about it.
Speaking of “Microsoft Certified” …
Since May, I proudly carry the title of a Microsoft Certified
Architect after passing a very humbling board review in Redmond. It’s
my first ever Microsoft Certified Anything that I have, so I am very happy to
have it. The Microsoft Certified Architect program, which has only been
announced at TechEd US, is a very interesting and very ambitious program, which
is not primarily about Microsoft technologies and not about someone sitting down
and answering some questions to a program. To become an MCA, you have to be a
well-rounded person, balancing technical, business and people skills and you
have to prove that you’ve done stuff and shipped stuff. Having been
accepted into the circle of the first 50 MCAs is truly a big thing – and given
who the other folks are, I am still not sure whether I am worthy. When I was
sitting on the reviewer side of the certification board in March (they had a boot-up
“chicken and egg” issue – only MCAs can sit on the board, but
what do you do if there are none?) I had several people where I was thinking to
myself “who are you to dare making any judgment about this person?”
since we’ve had several people coming in where you just learn new stuff
with every sentence they’re saying.
From the board review in May I went straight to one of every year’s
favorite “little big conferences” in Portoroz/Slovenia, to
which I’ve been for the 4th straight year. There are just over
2 million Slovenians overall, but Microsoft manages to pull well over 1500
people to a developer and IT pro conference. Translated to the scale of
Germany, we’d have to have 64000 attendees at an event to match that. And
traditionally, Microsoft Slovenia throws one of the best event parties each
year.
Once things settle down at the end of this week and with only one (“the”)
major event left to go in this first half year (TechEd Europe in Amsterdam), I’ll
have to log some of the past months travel experiences for myself here in my
blog and also get back to writing about technology issues. There are a lot of
things that I’ve learned and I’ve actually written a bit of code here
and there that’s worth sharing, but with all the travel I just never
found time to sit down and write about it – sometimes I just need a break
as well. TTYL, gotta catch a flight.
Here’s the raw, not really well documented code drop with the sample
and framework code for my CSI360 and CSI359 talks here at TechEd US. The talks
are today at 5pm (CSI360 – Asynchronous Messaging) and on Thursday at
1:30pm (CSI359 – Handling Transaction Abort Cases). As soon as I find
time, I’ll document the framework classes a bit better here on the blog.
The archive contains, amongst other things, a WSE channel and a
WebRequest/WebResponse set that lets you use MSMQ as an alternate transport for
WSE and/or ASMX. It also has the complete queue listener code for the messaging
series I posted some
months ago.
My blogging backlog is ridiculous. In the past weeks I’ve crossed the
Atlantic several times (with one quick trip to Singapore in addition to that),
had some crazy “one city per day” trips and had to meet deadlines
for whitepapers, articles, and presentations. I guess I travel too much. From
here (Orlando,FL) I will fly straight to the Pakistan Developer Conference in
Karachi (about 24 hours, via Amsterdam and Dubai) and then back home. If all
goes well, I’ll be at home for 2 weeks. That’s a first for this
year, I think.
Download: techEd2005.zip
In the past months I’ve been throwing ideas back and forth with some of
my friends and we’re slowly realizing that “Service Oriented
Architecture” doesn’t really exist.
The term “Service Oriented Architecture” implies that there is
something special about architecture when it comes to service orientation, Web
services, XML, loose coupling and all the wonderful blessings of the past 5
years in this wave. But if you look at it, there really isn’t much
special about the good, old, proven architectural principles once you throw
services into the picture.
I’ll try to explain what I mean. There are five pillars of software
architecture (this deserves more elaboration, but I will keep it short for
now):
·
Edges: Everything that talks about how the network edge of
a software system is shaped, designed, and implemented. SOAP, WSDL, WS-*, IIOP,
RMI, DCOM are at home here, along with API and message design and ideas about
coupling, versioning, and interoperability.
·
Protocols: Which information do you exchange between two
layers of a system or between systems and how is that communication shaped?
What are the communication patterns, what are the rules of communication? There
are low-level protocols that are technically motivated, there are high-level
protocols that are about punting business documents around. Whether you render
a security token as a binary thing in DCOM or as an angle brackets thing is an
edge concern. The fact that you do and when and in which context is a protocol
thing. Each protocol can theoretically be implemented on any type of edge. If
you were completely insane, you could implement TCP on top of SOAP and
WS-Addressing and some other transport.
·
Runtimes: How do you implement a protocol? You pick an
appropriate runtime, existing class or function libraries, and a programming
language. That’s an architectural decision, really. There are good
reasons why people pick C#, Java, Visual Basic, or FORTRAN, and not all of them
are purely technical. Technically, the choice of a runtime and language is
orthogonal to the choice of a protocol and the edge technology/design.
That’s why I list it as another pillar. You could choose to do everything
in Itanium assembly language and start from scratch. Theoretically, nothing
stops you from doing that, it’s just not very pragmatic.
·
Control Flow: For a protocol to work and really for any
program to work, you need concepts like uni- and bidirectional communication
and their flavors such as datagrams, sockets, and queues, which support
communication styles such as monologues, dialogues, multicast, or broadcast.
You need to ideas like parallelization and synchronization, and iterations and
sequences. All of these are abstract ideas. You can implement those on any
runtime. They are not dependent on a special edge. They support protocols, but
don’t require them. Another pillar.
·
State: This is why we write software (most of it, at
least). We write software to transform a system from one state to the next.
Press the trigger button and a monster in Halo turns into a meatloaf, and you
score. Send a message to a banking system and $100.000 change owners. Keeping
track of state, keeping it isolated, current, and consistent or things to
consider. Is it ok to have it far away or do you need it close by? Do you
cache, and replicate it for the purpose? Is it reference data or business data?
Consolidated, preprocessed, or raw? How many concurrent clients have access to
the data and how do you deal with the concurrency? All these are questions that
have to do with state, and only state. None of this is depends on having a
special technology that is being talked through way up above at the edge.
Service orientation only speaks about the edge. Its tenets are about loose
coupling, about independent evolution and versioning of contracts, and about
technology-agnostic metadata exchange. All this is important to make systems
interoperate better and to create systems where the effects of changes to one
of its parts to any other part are minimized.
But none of the SO tenets really speaks about architecture [Sidenote: The “autonomy”
is about autonomous development teams and not about autonomous computing]. When
you look at what’s being advertised as “serviced oriented
architecture”, you see either the marketing-glorified repackaging of
Ethernet, TCP/IP, and LDAP (“Enterprise Service Bus”), or
architectural blueprints that looks strikingly similar to things that people
have been doing for a long time with DCE, CORBA, J2EE, COM, or mainframe
technologies. What’s different now is that it is easier, cheaper and
likely more productive to create bridges between systems. And even that comes
at a significant price at this point. Realistically, the (web) services stacks
yet have to catch up with these “proprietary” stacks in terms of
reliability, security, and performance.
There is Service Orientation – and that’s good. There is
appropriate architecture for a problem solution – and that’s good
too. These are two things. Combining the two is excellent. But “Service
Oriented Architecture” is not an isolated practice. I’ve started to
use “SO/A” to make clear that I mean architecture that benefits
from service orientation.
I understand that there is an additional architectural tier of “service
orientation” that sits at the business/technology boundary. On that
meta-level, there could indeed be something like “service oriented
architecture” along the lines of the service convergence that Rafal, Pat
and myself were discussing
on stage at TechEd Europe last year. But when I see or hear SOA discussed,
people speak mostly about technology and software architecture. In that
context, selling “SOA” as a completely new software architecture
school does not (no longer) make sense to me.
Or am I missing something?
Ron Jacobs has posted
podcasts of two conversations Ron and Arvindra Sehmi and
myself had at Microsoft UK two weeks ago, when we coincidentally ran into each
other there.
I just looked at my blog and found that I haven’t written anything in
more than three weeks and not anything of any substance in more than 6 weeks. I
can’t even believe it’s been that long. Time flies by when you’re
busy. I still owe a follow up to this
here, and will try to get that done in the next two weeks or so.
So what happened in the past 6 weeks? I learned how to stand and “surf”
for several seconds at a time on a snowboard in Vail (Colorado) and bruised
every part of my body the next week when my friends put me up on a real
mountain in Keystone. I had the honor of sitting on the review board of the
Microsoft Certified Architect program in Redmond, attended the Indigo Software
Design Review in Seattle, spoke at the Visual Studio User Groups in Denver and
Boulder (Tim Huckaby gave me 15 minutes of his time at the latter), and had
several customer meetings in the US and Germany. I recorded 8 hours worth of
webcasts on Service Orientation and spoke at workshops on the same topics in
Belgium and Germany. I spoke at the Microsoft Gulf Developer Conference
GDC2005 in Riyadh (Saudi Arabia), at the Microsoft North Africa Developer
Conference NDC2005 in Algiers (Algeria), and between all these things I ported
an application to Indigo and prepared my talks for several conferences that are
happening this next week and later this year and for which the content
deadlines were due.
Now, if that sounds busy, consider next week: Today I fly to Istanbul at
17:30h, get there at 21:30h. I will do 3 talks at a large MS conference in Istanbul the next
day. Tuesday morning (really: middle of the night) I have to get out to the
airport and catch a 5:40am flight to Ljubljana in Slovenia. From there I will
be picked up and driven to Opatija in Croatia where I’ll do a track
keynote and another talk at the WinDays conference in the
afternoon. After dinner, I go back to Ljubljana aiport and fly (at 11:45pm)
back to Istanbul, getting there at 2:50am. 3 more talks in Turkey on Wednesday.
Then, Thursday morning, I catch the same flight to Ljubljana at 5:40am, but
will connect through to Vienna in Austria where I will arrive at around 8:30am
and will hurry to the Microsoft office to do two full days of Visual Studio
2005 training for the MS Ascend program and then fly home to Düsseldorf Friday
evening. By Saturday I will likely need medical attention.
The upcoming week is so crazy that I will try to document it here. Let’s
see whether I can pull it off.
You can make a difference on this day in April. Go and sign this petition.
Help save IDL.
What I personally would love to see are two new switched alongside midl.exe
/mktyplib203:
/wsdl – Verifies that all attributes used are applicable to a wsdl
contract and then generates a *.wsdl file from IDL
/serviceModel – Verifies that all attributes are System.ServiceModel
compatible and then generates a *.cpp file (managed code!) definition Indigo
[ServiceContract] and [OperationContract].
The Indigo bits are out at MSDN Subscriber downloads. Go get them and start
playing.
Tools, SDKs and DDKs,
Platform Tools, SDKs, DDKs
WinFX SDK –
Community Technology Preview
Avalon and Indigo Community Technology Preview - March 05 (English)
I’ll write a few more parts of my little
Indigo series next weekend (too busy during the week), and will move from “throw
arbitrary XML on the wire” to typed messages. However, before I’ll
do so, I am curious about your opinion and I am asking you to comment (on the
blog-site) on which of the following two declarations you would prefer.
I should probably quickly explain a few things before I let you look at the
code snippets: [DataContract] attribute essentially replaces [Serializable]
for Indigo and is used to label classes than can be serialized by the System.Runtime.Serialization
infrastructure into XML or into a binary representation. So the
serialization control through attributes is unified and independent of the
actual output flavor you choose at runtime. The [DataMember] attribute labels
fields or properties that are part of the data contract and should be (de)serialized.
Unlike the current serialization models of Remoting (System.Runtime.Remoting.Formatters)
and the XML Serializer (System.Xml.Serialization) where the
serializers grab anything public, this model is strictly opt-in, meaning
that public fields and properties do not get serialized unless you explicitly
label them with [DataMember]. Even more surprising, the new
serialization infrastructure does work with fields that are private.
I have a clear preference for one of these two declarations and have also what
I think to be a solid explanation for why I prefer it, but before I elaborate,
I am interested in your opinion.
Version A
|
[DataContract]
public partial
class Address
{
[DataMember("Company")]
private string company;
[DataMember("RecipientName")]
private string recipientName;
[DataMember("AddressLine1")]
private string addressLine1;
... more fields ...
public string Company
{
get
{ return company; }
set
{ company = value; }
}
public string RecipientName
{
get
{ return recipientName; }
set
{ recipientName = value; }
}
public string AddressLine1
{
get
{ return addressLine1; }
set
{ addressLine1 = value; }
}
... more properties and methods and stuff ...
}
|
Version B
|
[DataContract]
public partial
class Address
{
private string company;
private string recipientName;
private string addressLine1;
... more fields ...
[DataMember("Company")]
public string Company
{
get
{ return company; }
set
{ company = value; }
}
[DataMember("RecipientName")]
public string RecipientName
{
get
{ return recipientName; }
set
{ recipientName = value; }
}
[DataMember("AddressLine1")]
public string AddressLine1
{
get
{ return addressLine1; }
set
{ addressLine1 = value; }
}
... more properties and methods and stuff ...
}
|
Consider this obvious statement: The class is declared in this way to provide
programmatic access to and encapsulation of data that will eventually be
serialized into some wire format or deserialized from a wire format.
Christian Weyer is staying at my
place for the next three nights, because we’re both presenting at a
Microsoft Visual Studio 2005 training at Microsoft’s Neuss office, which
is more or less down the street (highway) from where I live. Christian brought
some good beer from his region (Franken – Bavaria’s northern part)
and we’re having some of that, watch some TV (“We Were
Soldiers” and “Broken Arrow”, we’re just guys like the
next one), and otherwise get some email done, and chat. We just agreed on our
programming hero. The prize goes to: Lutz
Roeder. We’d be nothing without Reflector.
|