The Unfrozen Caveman Engineer

Ramblings and Pontifications from the world of MBF

  • MBF and WinFS

    My last post was in late June when I blogged on WinFS.  At that point I hinted that there was a relationship between MBF and WinFS.  Since then, my blog has gone dark.

    I'm sure this was very unsatisfying for anyone who has an interest in MBF.  But hopefully you can now start to see the reasons behind the blackout.   As a personal philosophy, I want to make my best effort to only deliver you reliable information.  If I truly don't have reliable information, then I would rather stay quiet.

    Things weren't very reliable over the summer.  I don't think this should be a big surprise for anyone given the recent announcements about the Longhorn replan.  Avalon and Indigo are planned to ship co-incident with Longhorn but are not part of the operating system.  WinFS also is not part of the operating system and is planned to be in beta when the operating system ships and be delivered after that in production form.

    As I hinted in my June post, MBF does have a relationship with WinFS.  So MBF had some uncertainty over the summer as well.  I'm not certain that everything is sorted out yet.  But there have been some recent public announcements made and I would like to comment on them. 

    First, we have to establish the relationship between MBF and WinFS.  At some level MBF has a relationship or dependency on all the components of WinFX.  (WinFX being the name used to refer to Avalon, Indigo, and WinFS in the collective sense).  MBF needs Indigo to enable its mission to build Service Oriented business applications.  MBF will enable developers to build Avalon-based user interfaces for those business applications as well.

    But MBF has the deepest relationship with WinFS.  At the surface, they look totally different... WinFS is (was) used to show pictures in the "My Pictures" folder on your hard drive and MBF is used to build multi-user ERP applications. 

    Under the surface, MBF and WinFS were also significantly different.  WinFS is basically a single-user system (with some peer-to-peer type synchronization capabilities).  MBF is based on an N-Tier architecture.  WinFS is optimized for a client machine... memory footprint needs to be very small.  MBF is optimized for a server machine where you might want to consume more memory if it improved overall scalability.

    So MBF and WinFS were very different.  But should they be?

    I specifically selected examples for WinFS and MBF to be as different as possible (My Pictures vs. and ERP system).  But there is alot of overlap in other scenarios.  Suppose you're building a small business application.  Take Microsoft Money or Quickbooks or Peachtree as an example (Disclaimer:  These are just examples... this should not infer in any way that any of these products are really using MBF or WinFS).  Which would you choose:  MBF or WinFS?

    You want your product to run well on a single machine (small memory consumption) and you would want the deep shell integration that WinFS would bring.  Wouldn't it be fantastic to finally let users see their Customers and Orders in the shell?  But a significant portion of your business is selling multi-user systems.  While WinFS synchronization is great for keeping your pictures synced across machines, it really isn't going to be viable to build a multi-user business application.  So you need the server-side N-Tier capabilities that MBF provides.

    Earlier this year, it became apparent to us that ISVs really need one combined platform which merges the best of the WinFS and MBF data persistence stories.  A formal decision was made last May to begin an effort at aligning WinFS and MBF.  We (MBF) formed a team of 24 people to work on the merger.  I personally took the task of leading the development effort for that team.

    We worked over the summer taking MBF N-tier code, plus other goodies related to business logic support and worked to integrate that with the WinFS world.  We had alot of fun.  Got to work in the innards of Longhorn.

    But over the summer it also became clear that some changes were going to be made with the Longhorn plan in order for it to ship as planned in 06.  And adding more complexity by trying to align MBF and WinFS, while needed and important, was only making the schedule issues worse.  Now I do <not> want to infer that MBF integration was responsible for the overall Longhorn reset!  We were a very, very small part of a much more complex situation.

    However, at some point decisions had to be made.  We could not align MBF and WinFS and release Longhorn on time.  So the decision was to continue working on aligning MBF and WinFS, even if it meant that WinFS would not be part of Longhorn.   You can see this in any of the Longhorn reset PR. The press release says: (roughly) "WinFS was removed from Longhorn to make sure that it got server-side support".  While MBF is not mentioned by name... the server-side support for WinFS is at least partly coming from the MBF alignment.

    So where are we now?  Here is a link to one story:  http://www.techworld.com/opsys/news/index.cfm?NewsID=2170&Page=1&pagePos=14

    The story is generally factually correct.  The current plan of record has MBF joined at the hip with WinFS.  If WinFS slips, then so does MBF.  The story also correctly notes that there is still a possibility that MBF might ship earlier:

    "The current plan remains to ship MBF in the WinFS time frame. The MBF team, as a result of the decision to remove the link between WinFS and Longhorn, is investigating if it is possible to release earlier, but no commitments can be made at this time," a Microsoft spokesman said.

    But to make things clear... there is <no> move afoot to sever the alignment between MBF and WinFS.  We still have every intention of having a single API long term.  But it may be possible to ship something early which still aligns with a "1 API" story.  Before the Longhorn change, the combined WinFS \ MBF had to support both LOB scenarios and "My Pictures" in the Longhorn shell.  Now the WinFS has been removed from Longhorn it <may> be possible to ship a version early which only supports LOB.  It would still be one API, but it would be LOB focused in the near term, with more Shell focus added for the next release of the OS.

    There are no promises here.  The plan of record is that MBF will get aligned with WinFS.  If we can figure a way to accomplish that and still ship something earlier, then that will be considered a bonus.  Nothing is decided yet, but I can tell you that we are working very hard to get MBF to our ISVs as soon as possible.

  • WinFS

    Well, June is here so it must be time to make a post.  Let's talk about...  Hmmm... What should we talk about?  Hmmm....  How about WinFS!

    You know WinFS... It's one of the three main pillars of Longhorn Client (Avalon, Indigo, and WinFS).  Or maybe you don't know much about WinFS.  I haven't seen any WinFS bloggers on this site yet and maybe you missed PDC.  So perhaps a short WinFS tutorial is in order. 

    Consider the world of today.  The files on our hard drives are basically binary blobs.  We open the file with a Win32 FileOpen() command and then index into the byte stream.  That works just fine because your code knows that the jpg image starts just past the header at byte 186.  That's pretty much all you get from the file system: A stream of bytes.  Sad really, when you think about it.

    It’s unreasonable to think that people could really write meaningful, rich applications with only this “byte indexing” scheme that the file system provides.  So application developers have augmented this file system shortcoming for years by providing “APIs” to their file formats.  Basically, the application developer creates a DLL which has some method called “GetImage()” for jpgs.  Then an ISV who wants to get at the image in the jpg file just calls the “GetImage()” method in the DLL, and the DLL encapsulates the fact that you need to index 186 bytes into the file to find the image.  

    Well, that's certainly an improvement over a stream of bytes.  But it is an imperfect solution at best.  Each ISV builds these “File Access APIs“ in a different way.  If your application wants to read Adobe Acrobat files, then you have to hand-code knowledge of the Adobe Acrobat file access API into your code.  But what if you wanted to build an application which worked with many different file types in a rich way?  For example, what if you wanted to build a shell application something like Explorer.exe that could do rich queries across the 100,000 heterogeneous files you've got stored on your new 250 gig hard drive?

    To accomplish this, you would need a standard mechanism for discovering the content in your files.  What would that look like?  Well, let’s start by thinking about how it might work in the world of SQL.  Say I've got an ERP database with 2,000 different tables.  I have tables for Customers, Vendors, Orders, Invoices, etc... 

    I could fairly easily build a general purpose application which allowed me to browse over any of the tables in a generic, yet rich way.  My application could discover the list of tables with an sp_ command.  (And to be fair, the file system would let me get a list of files by traversing the directory structure).  But my SQL application could go way beyond the file system application.  My SQL application could call another sp_ command and get the column list for each table.  That's where the file system gets left in the dust.  The file system sees the file as a big binary blob, while SQL sees its relational data as structured.   My SQL browser could then fetch the data from each column, along with the datatype information and display it in a generic, yet fairly rich way.

    So the original WinFS vision (long, long ago) had its original goal to “move the Windows file system into SQL“.   But that (perhaps simplistic) approach didn't last long.  Sure, we could have moved the file system to SQL.  But a fundamental change to the OS file system is a big, big, traumatic deal.  We can only afford to make this kind of change perhaps once a decade.  Do we really want to inflict this pain, only to have applications using “SELECT Blah FROM filesystem“ SQL commands to directly access file data for the next decade?  Is there something better?

    If we only cared about browsing file system data (read only), then “SELECT blah“ with a result set of primitive data returned might have been OK.  But this is our big chance; shouldn't we maximize our opportunity?  Raw data is Dumb data...  In the next decade, people want to act on their data.  They want their data to have behavior.  When I find a jpg picture on my hard drive, I want to edit it.  I want to email it.  All these things require logic.  And that's something “SELECT blah“ can't easily provide.

    Hmmm...  data + behavior.  Maybe this CLR \ Managed Code thing that Microsoft is working on might apply?

    So there you have WinFS...  WinFS is about transforming the file system from a “dumb as a rock“ byte stream into an active layer of persistent objects.  These persistent objects should be queryable in a rich fashion.  I should be able to easily go to a metadata catalog and get a list of all persistent object types.  I should be able to update these objects and be assured that any logic to validate the data is present in the persistent object.  And I should be able to update a group of related persistent objects in a transactional manner.

    WOW.... that’s really cool!  Persistent objects with behavior.  What a concept!  Oh... wait a minute.  That sounds like MBF.  MBF is an environment which allows you to create a set of rich business objects (with behavior) which can be persisted to a database.

    Hmmm...  Is there more to this story?  How do MBF and WinFS relate?  Inquiring minds want to know!

    I guess you'll just have to wait for my next post.  (Don't you just love cliffhangers)!

  • MBF Joins the Longhorn Wave

    Its been a busy month.  We've been working furiously behind the scenes to sync up MBF with Longhorn.  Our previous plan of record had MBF being released in two phases.  The “business logic” portions of MBF were to release with Visual Studio 2005 (aka Whidbey).  Then the rest of MBF would ship with Longhorn.  

    This plan was a compromise from the beginning.   As previous posts have noted, MBF has many interesting parts (SOA, Process...).   However, all of those “interesting” parts were not shipping until Longhorn.  We literally couldn't ship rich SOA support with Whidbey... we had to wait for Indigo.  We couldn't ship the kind of lightweight, embedded process support we need in Whidbey... we had to wait for a future version of the BizTalk Orchestration engine.

    The only point of the MBF Visual Studio 2005 release was to enable developers to start coding their business logic.  This is actually a very worthwhile goal.  Business logic represents the largest portion of a business application.  Getting a head start coding the business logic is goodness... even if you have to wait for the Longhorn release of MBF to “finish” the application.

    However, as the months have gone by it has become more apparent that collapsing MBF into a single release would be more beneficial for our customers.  By shipping portions of MBF early in Whidbey, we were cementing portions of MBF into a non-Longhorn model.  In case you've been living under a rock, Longhorn is <the> platform for the next decade.  Shipping new bits which aren't aligned with Longhorn is a disservice to ISVs who want to build business applications which will last through the next decade.

    Here are some links to stories related to the MBF move to Longhorn.

    http://www.informationweek.com/story/showArticle.jhtml?articleID=19502405

    http://www.crn.com/sections/BreakingNews/dailyarchives.asp?ArticleID=49958

    Personally, I have mixed feelings on this topic.  Software developers live to ship code.  So delaying the first release of MBF is painful.  However, as a Software Architect, I am absolutely convinced that this was the right choice.  Shipping part of MBF in Whidbey and part in Longhorn would have created a system which spans two technology eras. 

     

     

  • Business Process Futures

    Two weeks without a post... sorry about that!  I've been traveling all over the place collaborating with people on the architecture for MBF process \ workflow.  I'm in a hurry so I may as well post about my recent work in the process world. 

    We believe that a strong process architecture is critical to building a successful SOA application.  SOA is about decomposing monolithic applications into finer grained services.  These services interact with each other asynchronously, across potentially long durations.  Something has to coordinate the work between services.  That “something” is a process engine.

    If you look at Microsoft's shipping products, the closest thing to a “process engine” is BizTalk. BizTalk is being used today to successfully coordinate XML messages between autonomous applications.  That's great...  I like BizTalk.  It's being used by real people to solve real problems.

    But that doesn't mean that it doesn't need some improvements to meet our future challenges.  “Coordinating XML messages between applications“ isn't quite the same thing as “coordinating work between fine grained services“.  My top three “wish list“ items for BizTalk in the future would be:

    1. Make it hostable

    Shipping versions of BizTalk always run in their own process.  (In other words, BizTalk is a “Server“... not an “Engine“). That's OK if you are willing to host your service inside BizTalk.  But what if you don't want to host your service inside BizTalk?  For example, Indigo makes it really easy to build your own NT service (or even just a command line application for that matter) that can act as a service and receive Indigo messages.  In this case I want my service to host BizTalk, not vice-versa.  This “build your own service“ model doesn't work well with BizTalk today.

    2. Don't require XML messages

    At first glance... this seems like heresy.  SOA is supposed to be heterogeneous, and XML is clearly the best choice for messages in a heterogeneous environment.   I'm not questioning that point.  However, what about optimizations when both the service and the service consumer happen to be homogeneous?  Suppose the service and the service consumer both happen to be CLR-based applications?  Indigo supports this model.  The service consumer can “send“ a CLR class as a message, and a service can “receive“ a message in the form of a CLR class.  The specific wire format is totally transparent.  Maybe Indigo goes to XML and back, or perhaps it uses a more binary wire format as an optimization.

    Current shipping versions of BizTalk don't support this model.  Someone who wants to send a message to BizTalk must convert their CLR class to XML.  Then once BizTalk receives the XML message, you have to convert the XML back to a CLR class. 

    Items #1 and #2 are especially difficult if you want to use process within a single CLR-based service.  All your code is CLR-based (C# or VB.NET), and you are running in a single process (a single service).  Yet to use current BizTalk you would have to constantly convert back and forth from XML just to “talk to yourself“.  Further, if your service couldn't be hosted inside BizTalk, then you would also constantly be jumping across processes as well.

    Cross process calls and constant XML serialization\deserialization is expensive.  It's OK for very coarse grained interaction between applications (the current BizTalk usage pattern).  But it won't be OK in the future if we want to use process in a very fine grained fashion.

    3. Allow schedule creation via mainstream languages

    This one doesn't have a direct tie to SOA, but it is important nonetheless.  Schedules \ Orchestrations are created in BizTalk 2004 using a language called XLang/s.  Of course, sometimes this underlying language is hidden by graphical design tools.  But if the graphical orchestration designer doesn't meet your needs... you will be “coding” in XLang/s. 

    Now there are some good arguments for having a specialized language for process expression.  Having this as an option is perfectly acceptable.  However, it's the only option in BizTalk 2004.  If you want to code an orchestration in BizTalk 2004, forget your C# \ VB.NET skills... you've got to either use the graphical designer or learn a new language.  This seems a bit harsh. 

    So here is the great news....  The BizTalk team is well on their way to addressing all three of these concerns!  You should definitely check out their PDC session on “BizTalk Futures”:

    PowerPoint only:

    http://microsoft.sitestream.com/PDC2003/DAT/DAT321_files/Botto_files/DAT321_Parasnis.ppt

    Streaming Audio \ Video:

    http://microsoft.sitestream.com/PDC2003/DAT/DAT321.htm

    As a quick summary the BizTalk team is working on creating a “BizTalk Engine” which:

    1. Is hostable by any application \ service. 

    2. Can send \ receive messages either as XML or as serializable CLR classes. (Supports Indigo as a transport protocol).

    3. Can be programmed using mainline languages (C#, VB.NET, etc...) using familiar concepts like code beside (the same model used by Avalon, MBF, and many other Microsoft products in the Whidbey \ Longhorn waves).

    This is about as far as I can go without violating NDA stuff... but be sure an look through their PDC presentation.  That's the most non-NDA information that you can get at this point.  But I can say that I am <very> excited about BizTalk's future.  These changes will enable MBF to support process at a very fine grained level, both cross service and even intra-service!  And because the process is expressed in mainstream CLR languages, the same developer can reasonably code both business logic and process flows in the same language.

  • Transaction Processing in an SOA World

    My previous post asserted:

    Don’t get me wrong… SOA doesn’t exist today.  The current “state of the art” is exactly duct tape and bailing wire.  But SOA <will> exist in the future, and when it does it will drive a tidal wave of change through the “I built my own client\server toolset” crowd.

    This assertion generated some good discussion around the maturity level of SOA.  Some folks argued that they've been building SOA applications for many years, while others agreed that SOA is more of a vision at this time.

    It all depends on your problem space.  SOA is about decomposing large monolithic applications into fine-grained, autonomous applications which communicate via an open protocol.  Someone could probably argue that they built DOS-based SOA architectures 20 years ago by splitting their single application into multiple TSR's (Terminate and Stay Resident) modules which used interrupts to communicate!

    This blog is focused on business applications.  Business applications live and die in the transaction processing world.  In this context, any judgment on the suitability of an SOA architecture must be in terms of its support for transaction processing.

    I certainly don't have space to give a full backgrounder on transaction processing (Jim Gray's classic transaction processing tome is >1000 pages!).  But the essence of transaction processing is the ability to accomplish a unit of work in a multi-user environment.  The fathers of relational processing created a set of principals labeled “ACID“:  Atomic, Consistent, Isolated, and Durable which together form the foundation for modern transaction processing systems.

    Relational systems implement ACID semantics with several key pieces of infrastructure.  The lock manager provides Isolation.  The log provides Durability and Atomic behavior.  Referential Integrity, along with locks, assure Consistency.  The sophistication of these facilities has grown over time.  For example, lock managers have moved from simplistic page locking algorithms to row locking with sophisticated escalation heuristics. 

    So now we want to take our monolithic business applications and split them into fine-grained autonomous services.  How do I coordinate a unit of work across several services?  My tried and true relational ACID capabilities are now gone, and they are replaced by....  XML and Webservices?

    I'm sorry... I love XML and think WebServices are great.  But they are not even close to a replacement for ACID semantics.  This isn't a damnation of SOA, it's just a recognition that we've got a ton of work to do! 

    This work is happening across Microsoft.  The Indigo team is hard at work implementing reliable messaging.  This is a key piece of infrastructure for “D“urability.  They are also working on WS-Transactions, which goes a long way to providing Atomic semantics.  The BizTalk team has a role to play as well.  Processes will be a key player for providing Isolation and Consistency in the absence of low-level data locks.

    And last, the MBF team has a role to play as well.  Application developers spent the last decade developing best practices and proven approaches for building client\server applications.  The shift to SOA will require a totally new set of approaches.  For example, in the client\server world I could enforce referential integrity between order and customer by writing one line of declarative RI.  Now order and customer are in different services... you either have to implement an asynchronous “is it OK if I delete this record“ protocol, or you have to change the application to simply never delete records.  Either one is a profound change to how business applications are built.

    The Microsoft Business Framework will build upon the work from the Indigo and BizTalk teams, just as historical client\server toolsets built upon core relational ACID semantics.  Let's get going, we've got a lot of work ahead of us to make SOA-based transaction processing a reality!   

     

  • Greetings from the Unfrozen Caveman Engineer!

    Welcome to my inaugural blog post. My name is Tim Brookins, and I'm an Architect in the Developer Division here at Microsoft.

    For those without context, the “Unfrozen Caveman” was a running Saturday Night Live skit about a decade ago. I work at Microsoft, so I haven't watched TV in the last decade to know if the skit ever runs anymore or not!

    My area of expertise is building platforms for business applications. Some people simplistically think: “Here's a database (SQL Server), and a language (C#)... now go build your business application”. But in reality it’s a lot more complicated than that, at least if the application is significant.

    All the major players in the business application space have traditionally built their own proprietary platforms to support their applications. For example, SAP has ABAP and PeopleSoft has PeopleTools.

    Even smaller companies have made large investments in business application platforms. I was formerly a principal architect at Great Plains Software, and I led the team which developed our own client\server based business application platform called “Dexterity”. Along the way, we acquired or merged with several other mid-market accounting companies: Solomon Software in the US, and Navision Software in Copenhagen, Denmark. Guess what... They all had proprietary platforms as well!

    These proprietary platforms are <expensive>. Both Dexterity (the Great Plains business application platform), and MorphX (the Navision Axapta application platform) are complete, vertically integrated environments. They have their own form layout packages, their own database APIs, their own scripting languages, and even their own debuggers. Think home brewed Access, Powerbuilder, or FoxPro... it’s not cheap to build something like this from scratch!

    So why do companies do this? Do they really enjoy investing boatloads of resources into building infrastructure rather than building the business application itself? Of course, the answer is “No”. Nobody wants to spend money unwisely.

    Some might argue that these companies built their own platforms to provide “API stability”. I'll be the first to admit the Microsoft hasn't done a very good job over the years of providing long lasting, stable APIs. ERP applications are huge. They have thousands of forms in the UI, thousands of tables in the database, and millions of lines of business logic. They take years or even decades to build. Completely abstracting an application via your own platform can really ensure that some unforeseen API change doesn't force you to throw away your business logic and start from scratch.

    But I argue that the “API abstraction” was an important, yet secondary motivation for building these platforms. In many cases, the cost of building the platform was probably more than the cost of re-writing the application because of technology changes.

    So what was the motivation? Well, we didn't know it at the time, but these proprietary business platforms were early attempts at what we would now call “Domain Specific Models”, with an accompanying custom Framework.  You can see these elements by simply looking at the hard drive of a Great Plains install. An installed Great Plains system has a main application exe (the framework) which is about 3 meg. Then next to it on the hard drive is a giant data file which contains the entire application, as data (domain model).

    Now of course both the Navision and Great Plains platforms were early, baby steps toward a full featured domain model with framework.  I don’t want to over blow their capabilities.  However, even in their early form, they provided enough value to merit the significant investment to build the platform.  We'll learn more about the compelling value of domain modeling over the life of this blog.

    So enough of the history lesson… what about the future?  We believe that there are several gigantic paradigm shifts occurring which will revolutionize business applications in the next decade.  I don’t have the space in this post to discuss them all, but I will touch quickly on two of the most important:  robust domain modeling in mainstream tools, and service oriented architectures (SOA).

    We’ve established that pretty much every significant business application developer has historically invested in building their own platform.  These platforms were typically simplistic domain specific models with an accompanying framework, based on client\server technology. 

    The emergence of SOA pretty much obsoletes these client\server toolsets.  Of course business developers can prolong the lifecycle of their proprietary tools.  They can keep building monolithic client\server applications and bind them together at the edges with some XML and a few web service calls.  But sooner or later the life support will give out and customers will see the duct tape and bailing wire holding these applications together.

    Don’t get me wrong… SOA doesn’t exist today.  The current “state of the art” is exactly duct tape and bailing wire.  But SOA <will> exist in the future, and when it does it will drive a tidal wave of change through the “I built my own client\server toolset” crowd.

    This blog will talk about this gigantic impending shift.  I work on an effort within the Developer Division to build a toolset and accompanying service oriented framework which supports robust business domain modeling integrated into Visual Studio.  The codename of this effort is the Microsoft Business Framework (MBF).


© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker