<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>Lokad Aggregated News</title>
      <description>Presenting a deeper insight into the diverse and dynamic life of the Lokad.com - on-line provider of forecasting and business analytics services and solutions</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=68ec45b123685ad407b576ec48a02333</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=68ec45b123685ad407b576ec48a02333&amp;_render=rss&amp;page=2" />
      <pubDate>Thu, 31 May 2012 22:07:43 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/lokad" /><feedburner:info uri="lokad" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
         <title>Whitepaper on Out-of-Shelf Monitoring Technology released</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/r8bef9uscqU/whitepaper-on-out-of-shelf-monitoring-technology-released.html</link>
         <description>&lt;p&gt;Few aspects of retailing are as fundamental as &lt;strong&gt;fully stacked shelves&lt;/strong&gt;, and few concerns rank higher with an ever more demanding customer than product availability. Regardless, &lt;strong&gt;on-shelf availability&lt;/strong&gt; remains a huge challenge for the industry. Growing, more dynamic product portfolios, staff and cost cuts combined with an increasingly complex supply chain have increased the challenge.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/GetFile.aspx?File=/Products/Shelfcheck/Whitepaper%20Introduction%20to%20Out-of-shelf%20Monitoring%20Systems.pdf"&gt;&lt;img src="http://blog.lokad.com/storage/WhitepaperOOSMonitoring-250x323.png" alt="Cover of the OOS whitepaper by Lokad" style="float:left;margin-right:20px;"/&gt;&lt;/a&gt;While shelf availability is a top concern for customers and retailers alike, even the Tier I retailers today mostly rely on manual checks by store staff. This puts a large burden on employees, and response times to out-of-shelf situations are slow.&lt;/p&gt;
&lt;p&gt;However, grocery retailers a crossed Europe and the US have started to explore technology that can help address the problem. With this in mind, we have published a &lt;strong&gt;&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/GetFile.aspx?File=/Products/Shelfcheck/Whitepaper%20Introduction%20to%20Out-of-shelf%20Monitoring%20Systems.pdf"&gt;whitepaper&lt;/a&gt; on out-of-shelf monitoring technology&lt;/strong&gt; which gives an overview of&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objectives of out-of-shelf monitoring systems&lt;/li&gt;
&lt;li&gt;Introduction to the technology &lt;/li&gt;
&lt;li&gt;Definition of performance characteristics&lt;/li&gt;
&lt;li&gt;Quantification of system capabilities and limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Are we missing some interesting aspects of this type of technology, or do you have experience with OOS monitoring systems you want to share? Please let us know in the comments.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:16389198</guid>
         <pubDate>Wed, 23 May 2012 11:54:40 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/5/23/whitepaper-on-out-of-shelf-monitoring-technology-released.html</feedburner:origLink></item>
      <item>
         <title>DDD/CQRS Challenge - Integrating Distributed Systems</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/r89rVZR_LNk/dddcqrs-challenge-integrating-distributed-systems.html</link>
         <description>&lt;p&gt;Let's have a look at the relatively simple DDD/CQRS challenge in &lt;strong&gt;integrating elements of a distributed system&lt;/strong&gt; composed of a &lt;em&gt;different bounded contexts&lt;/em&gt; and deployed across &lt;em&gt;different hosting environments&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let's imagine a small Software-as-a-Service company which provides some subscription-based service while charging customers per consumption on pay-as-you-go basis. Software infrastructure of such company could consist of only 3 bounded contexts (a major oversimplification on my part, bigger view might be &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/7/birds-eye-view-of-a-distributed-system-context-map.html"&gt;more complicated&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/05/2012-05-22_100843.jpg?__SQUARESPACE_CACHEVERSION=1337674187688" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subscriptions&lt;/strong&gt; - subscription management system, that keeps track of all customers, their active plans, billing information, invoices, monthly service consumption and available login keys. This system is architected as NoSQL solution with event sourcing and is deployed on a dedicated server (with plans to redeploy it to Azure some time later).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud Services Integration&lt;/strong&gt; - massively scalable set of services deployed in Windows Azure (e.g. using some &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/5/2/processing-big-data-in-cloud-a-la-lokad.html"&gt;big data processing design&lt;/a&gt;). Among the other things, these services expose API to 3rd party companies and even products of the same company. This API is secured by user tokens, which are replicated from the subscriptions BC. This project is stable and does not change frequently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Product 1&lt;/strong&gt; - a new product being delivered by the company. It is developed as a standalone set of systems that enhance user experience, using Cloud API. This product leverages authentication and user management capabilities from "Subscriptions" and interoperates with API.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some examples of the interactions between these system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If new user is added to the subscriptions, it's auth credentials should be immediately (within 1-2 seconds) replicated to Cloud Services, to enable access via API.&lt;/li&gt;
&lt;li&gt;If customer's account is locked out due to balance overdraft, then all related users should be locked out of the API.&lt;/li&gt;
&lt;li&gt;When services consumption is detected in the API, it should be within 5 minutes reported to subscriptions portal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Naturally all &lt;strong&gt;these systems have to work independently&lt;/strong&gt; in such way, that if one of these is down, the rest will continue doing their part (at the very least by providing read-only UI, at best - doing everything that is not dependent on the other systems). &lt;/p&gt;

&lt;p&gt;For example, if subscriptions are down for maintenance or Cloud Services and Product 1 should continue working as they were (all pending changes should be replicated after system comes back online).&lt;/p&gt;

&lt;p&gt;Additional constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resulting design (with inherent implications) should be relatively easy to explain to a Junior dev.&lt;/li&gt;
&lt;li&gt;It should also be relatively straightforward to deploy and run systems both locally (xcopy deployment of .NET code) and in the cloud.&lt;/li&gt;
&lt;li&gt;systems should be able to change independently and rapidly as they follow their individual DDD evolution paths (for example, weekly releases with &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/21/ddd-evolving-business-processes-a-la-lokad.html"&gt;new business processes&lt;/a&gt; but without breaking any relations).&lt;/li&gt;
&lt;li&gt;no more than 3 people per project to develop and maintain it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note, that we are focusing here only on the integration between the systems. Internal design of each system might affect such integration, but is less relevant in this case. Still it would be nice, if integration patterns shared natural affinity with internal design of each bounded context (this tends to create systems that are more robust and practical).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How would you approach this problem?&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=7svSemKeNGc:VjsEftmNu5k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=7svSemKeNGc:VjsEftmNu5k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=7svSemKeNGc:VjsEftmNu5k:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=7svSemKeNGc:VjsEftmNu5k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=7svSemKeNGc:VjsEftmNu5k:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=7svSemKeNGc:VjsEftmNu5k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=7svSemKeNGc:VjsEftmNu5k:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/7svSemKeNGc" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/5/22/dddcqrs-challenge-integrating-distributed-systems.html</guid>
         <pubDate>Tue, 22 May 2012 08:37:06 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/7svSemKeNGc/dddcqrs-challenge-integrating-distributed-systems.html</feedburner:origLink></item>
      <item>
         <title>Making sense of the marketing automation software market</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/iVnAqCwE2nY/making-sense-of-the-marketing-automation-software-market.html</link>
         <description>&lt;p&gt;I recently spent some time researching &lt;strong&gt;marketing automation software&lt;/strong&gt; and realized that before starting to assess specific software products I needed to gain a general understanding of the space and how certain players and verticals fit into an SMB's sales and marketing efforts. This is very basic stuff, but one needs to start somewhere. Here is a summary of what I learned.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;strong&gt;Marketing vs. sales vs. CRM&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;The full customer process from 'cradle to grave' is divided into marketing, sales and customer relationship management. The responsibility of marketing is to reach an audience, create interest in the product, and produce 'qualified leads', which are then handed over to sales. The responsibility of sales is to take qualified leads, and turn them into buying customers.&amp;nbsp;Marketing activities have in the last years broken into inbound and outbound marketing.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Software solutions on the market are typically following the this structure: Inbound marketing solutions, outbound marketing solutions, sales and CRM.&amp;nbsp;While these solutions often have some overlap, they are all designed with one 'step' in the marketing and sales process in mind.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;strong&gt;Inbound vs. outbound marketing&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;There is a whole 'war' waged on inbound vs. outbound, with inbound being the hot new thing on the block. Inbound marketing is often defined as any activity that 'lets customers find you' (SEO, content marketing, social media, blogging, email), while outbound marketing can be summarized as all paid advertising plus outbound activities such as calling and emailing (SEM, tradeshows, advertising, cold calling, email).&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;Opponents of outbound marketing also call it 'interruption marketing' and argue their support of inbound marketing with 'the new customer' who is savvy, will pull quality info rapidly from multiple sources (on the web mainly) and who is more pro-active while less willing to respond to unsolicited approaches.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;I concur with the opinion that both should go together. Outbound marketing will help create awareness of the company, while inbound marketing seems very powerful to develop and nurture this interest. Every company will have to find the mix of both that works best for its business.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Inbound marketing automation software&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;Inbound marketing automation software lets you create and publish content in the various channels, and provides a very close tracking of customer behavior (profiling) by measuring visits, pages viewed, content downloaded, sign ups, time spent on the website plus targeted emailings for lead nurturing that are based on this behavior.&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;What I believe makes this approach very interesting is that it provides the tools to achieve the following things:&lt;/p&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Create visibility on the web by blogging, SEO, social media publishing -&amp;gt;&amp;nbsp;&lt;strong&gt;Demand/lead generation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Measure and analyse prospect behavior; identify prospect interest and stage in the buying cycle -&amp;gt;&amp;nbsp;&lt;strong&gt;Lead management&lt;/strong&gt;&amp;nbsp;(lead -scoring, -intelligence, -tracking)&lt;/li&gt;
&lt;li&gt;'Hit' customers with the right content at the right time. Right content = matching interest AND stage in the buying cycle) -&amp;gt;&amp;nbsp;&lt;strong&gt;Lead nurturing&amp;nbsp;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Measure and optimize your processes (which 'campaigns' work with which customer group, A/B testing, automated emailing, trigger actions for automated emailings etc.) &amp;nbsp;-&amp;gt;&amp;nbsp;&lt;strong&gt;Analytics and optimization&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Automation of lead nurturing, analytics, workflow -&amp;gt; inbound&amp;nbsp;&lt;strong&gt;marketing automation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example: Once the particular interest and stage in the buying cycle of a website visitor is identified (based on behavior and often automated) the prospect will receive emailings tailored to his profile. What's more, emailings can be timed to optimize opening times (based on statistical evidence).&lt;/p&gt;
&lt;p&gt;Email is used as a tool in inbound as well as outbound marketing, and software for both segments will have sound email capabilities.&lt;/p&gt;
&lt;p&gt;I find particularly interesting the notion that&amp;nbsp;&lt;strong&gt;not every prospect that engages you (or your website) is a buyer yet. &lt;/strong&gt;In&amp;nbsp;fact, most are not, and 'lead nurturing' is an activity aimed at turning these prospects into buyers over time. By providing the ability to identify, measure and track prospects a tailored follow-up for the particular prospect can be achieved, and to some extend automated.&amp;nbsp;Turning this around, it enables me to avoid wasting time on low probability prospects, and to avoid annoying prospects that are not ready to buy with too much and the wrong type of communication.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Prominent vendors:&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.hubspot.com/default.aspx"&gt;Hubspot&lt;/a&gt;,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.silverpop.com/"&gt;Silverpop&lt;/a&gt;,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.market.com/"&gt;Marketo&lt;/a&gt;,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.eloqua.com/"&gt;Eloqua&lt;/a&gt;&amp;nbsp;(from suitability for smallest to largest customer). Others include (&lt;a rel="nofollow" target="_blank" href="http://www.actonsoftware.com/"&gt;Acton software&lt;/a&gt;,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.exacttarget.com/"&gt;Exacttarget&lt;/a&gt;,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.seomoz.org/features"&gt;SEOMoz&lt;/a&gt;)&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Outbound marketing software&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;Outbound marketing includes email campaigns, calling, SEM, affiliate, offline advertising, trade-shows etc. In the case of calling, outbound marketing and inside sales largely overlap. I'll only mention calling and emailing as outbound channels here: &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Calling:&lt;/strong&gt;&amp;nbsp;Inside sales/outbound telephone marketing ("telemarketing") software is designed squarely around maximum calling efficiency, accountability and scalability (of teams) and provides contact, list and lead management functionality. It covers outbound marketing and outbound sales requirements alike.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;Prominent vendors:&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://vanillasoft.com/"&gt;Vanillasoft&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mass emailing:&lt;/strong&gt;&amp;nbsp;Emailing software solutions seem to be mostly designed for mass emailing: List cleansing, list segmentation, message templates and layouting, email deliverability, analytics (delivery, opening and click rates), scalability are key features. Typically these solutions are rather suited for B2C and potentially large B2B vendors.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
Prominent vendors: There are hundreds of vendors to be found through google.&amp;nbsp;&lt;br /&gt; 
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Email drip campaigns, newsletters. &lt;/strong&gt;&lt;strong&gt;S&lt;/strong&gt;imilar to emailing software with an optimization towards newsletters and &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Drip_marketing"&gt;drip campaigns&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;Prominent vendors:&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://mailchimp.com/"&gt;Mailchimp&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1:1 emailing:&lt;/strong&gt;&amp;nbsp;For companies wishing to increase the efficiency of 1:1 emailing (typically large enterprise B2B) there does not seem to be a dedicated software on the market. Some inbound marketing solutions as well as telemarketing solutions have emailing features that provide limited functionality that can be used for an efficient 'personal' emailing strategy. &amp;nbsp;Relevant features include templates, automatic personalization of the addressee, email preview and analytics (opening rates). Furthermore, some solutions provide the ability to create event driven 'drip campaigns', e.g. an automatic, personalized email based on customer behavior (opening of email, reply etc.).&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Vendors providing some capability:&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.hubspot.com/default.aspx"&gt;Hubspot&lt;/a&gt;,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.silverpop.com/"&gt;Silverpop&lt;/a&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://vanillasoft.com/"&gt;Vanillasoft&lt;/a&gt;. However it is seems apparent that they are not a dedicated solution for 1:1 email marketing.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;strong&gt;Integration&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;CRM: An important question is CRM integration, as all solutions mentioned work towards delivering a qualified lead to sales for further managment from within a CRM system. Some vendors can directly integrate with some of the largest CRM vendors. Other than that, contact export/import features seem to be provided by all vendors.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For a start-up that is just building up a marketing and sales effort it is most likely not reasonable to run multiple solutions for a very small team. It has to make a difficult choice where to focus and enjoy a dedicated software, and where to cope with the limitations of the solution. It is particularly difficult to decide while it is still unclear which marketing efforts are the most profitable ones (partly because there is not software in place to track and measure campaing ROIs)&lt;/p&gt;
&lt;p&gt;Creating a long-list of in- and outbound marketing tasks and features might be a good first step, and a subsequent prioritization according to the marketing and sales process that management has in mind will help determine the best solution for you business&lt;/p&gt;
&lt;/div&gt;</description>
         <author>Matthias Steinberg</author>
         <guid isPermaLink="false">http://www.matthias-steinberg.com/journal/2012/5/21/making-sense-of-the-marketing-automation-software-market.html</guid>
         <pubDate>Mon, 21 May 2012 17:14:50 +0000</pubDate>
      <feedburner:origLink>http://www.matthias-steinberg.com/journal/2012/5/21/making-sense-of-the-marketing-automation-software-market.html</feedburner:origLink></item>
      <item>
         <title>ROI = Return On Inventory?</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/quaGoh16Pog/roi-return-on-inventory.html</link>
         <description>&lt;p&gt;ROI stands of course for &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Return_on_investment"&gt;return on investment&lt;/a&gt;. However, the idea that &lt;strong&gt;every euro or dollar &amp;lsquo;invested&amp;rsquo; in inventory brings a certain return&lt;/strong&gt; in terms of profits is a powerful thought. When looking at inventory from this angle, two questions arise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are profits earned by a product versus the capital invested in stocking it (i.e. ROI) similar over the product portfolio?&lt;/li&gt;
&lt;li&gt;If the ROIs of the various products are heterogeneous &amp;ndash; how can the overal ROI delivered by the inventory be maximized?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img style="float:left;margin-right:10px;" src="http://blog.lokad.com/storage/ROI-Illustration1-400x350.png" alt="ROI meter"/&gt; As you will have guessed, the answer to the first question is a clear &amp;lsquo;NO&amp;rsquo;. The return generated by a product for the euros invested in stocking it differs vastly from product to product. Two aspects have a major impact.&lt;/p&gt;
&lt;p&gt;First, the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Gross_margin"&gt;gross margin&lt;/a&gt; of a product directly affects the ROI. This is obvious, and product managers naturally try to build a portfolio with high margins in mind. However, many other considerations come into play such as the coverage of the product portfolio for example. Adding more products to the portfolio is often also a strategy for growth.&lt;/p&gt;
&lt;p&gt;The second aspect is more subtle, but equally important: &lt;strong&gt;The amount of stock that is required to provide a desired availability (i.e. &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/salescast-service-level.ashx"&gt;service level&lt;/a&gt;) varies significantly among products.&lt;/strong&gt; The main driver here is the volatility of demand - the higher the uncertainty of the future demand, the higher the inventory level required to assure a given service level.&lt;/p&gt;
&lt;p&gt;As an example, lets imagine two products with the same gross margin that sell the same number of units during the year, thus generating the same amount of annual gross profit. However, product A sells the same amount each week with a high certainty, while product B is much more erratic with no sales for weeks and large orders in others. To achieve the same availability or &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/salescast-service-level.ashx"&gt;service level&lt;/a&gt; for both products, the safety stock for product B will be a lot higher than for product A, where very little uncertainty and therefore &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/calculate-safety-stocks-with-sales-forecasting.ashx"&gt;safety stock &lt;/a&gt;requirement is given. As a result, product B requires much more units in stock than product A to achieve the same annual profit. The ROI for product A is therefore significantly higher.&lt;/p&gt;
&lt;p&gt;&lt;img style="float:right;" src="http://blog.lokad.com/storage/ROI-Illustration2-400x250.png" alt="Inventory is money"/&gt;Businesses continually work on maximizing their&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Return_on_Capital_Employed"&gt;return on capital employed&amp;nbsp;&lt;/a&gt;(ROCE). Inventory is a significant part of the capital invested by most retailers, and therefore an important opportunity for optimization. The good news is that&lt;strong&gt; &lt;/strong&gt;the potential for&lt;strong&gt; optimizing the ROI of your inventory by&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;taking advantage of the heterogeneous ROIs across your catalog is large&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The latter is done by finding the optimal service level at which an SKU produces the best ROI within the constraint of a set inventory budget. As a result availability and revenue can be increased for a given inventory budget, or cash can be released from inventory while maintain the overall availability.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;analysis behind this optimization however is not trivial&lt;/strong&gt; given the non-linear correlation between service level and inventory levels. Additionally, a set of &amp;lsquo;strategic&amp;rsquo; constraints such availability goals for certain products need to be taken into account.&lt;span style="color:black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This is a challenge which we plan to take on in the near future, the &lt;strong&gt;goal being a fully automated ROI optimization&lt;/strong&gt; over the product portfolio for a given working capital sum. As an output, the system will determine service levels per SKU that give the highest availability (and therefore revenues) for a chosen inventory budget.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Excessive inventory reduces the return on invested capital, but too little inventory diminishes profits&lt;/strong&gt; as well. The optimal inventory level is therefore a trade-off between stock-out cost and inventory cost, and falling too far on either side of the optimum will negatively impact your business. Our plans for service level optimization will leverage our forecasting technology. &lt;strong&gt;Stay tuned.&lt;/strong&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:16216559</guid>
         <pubDate>Wed, 16 May 2012 12:00:00 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/5/16/roi-return-on-inventory.html</feedburner:origLink></item>
      <item>
         <title>Sparsity: when accuracy measure goes wrong</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/9hPWqpM_tOI/sparsity-when-accuracy-measure-goes-wrong.html</link>
         <description>&lt;p&gt;Three years ago, we were publishing &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2009/4/22/overfitting-when-accuracy-measure-goes-wrong.html"&gt;Overfitting: when accuracy measure goes wrong&lt;/a&gt;, however overfitting is far from being the only situation where simple accuracy measurements can be &lt;strong&gt;very misleading&lt;/strong&gt;. Today, we focus on a very error-prone situation: &lt;strong&gt;intermittent demand&lt;/strong&gt; which is typically encountered when looking at &lt;strong&gt;sales at the store level&lt;/strong&gt; (or Ecommerce).&lt;/p&gt;

&lt;p&gt;We believe that &lt;strong&gt;this single problem alone&lt;/strong&gt; has prevented most retailers to move toward advance forecasting systems at the store level. As with most forecasting problems, it's &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/10/20/out-of-shelf-can-explain-14-of-store-forecast-error.html"&gt;subtle&lt;/a&gt;, it's &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/4/1/business-is-up-but-forecasts-are-down.html"&gt;counterintuitive&lt;/a&gt;, and &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2010/11/19/fallacies-in-data-cleaning-for-short-term-sales-forecasts.html"&gt;some companies&lt;/a&gt; charge a lot to bring poor answers to the question.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog.lokad.com/storage/intermittent-behavior-001.png" alt="Illustration of intermittent sales" style="float:left;margin-right:10px;"/&gt;&lt;/p&gt;

&lt;p&gt;The most popular error metrics in sales forecasting are the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Mean_absolute_error"&gt;Mean Absolute Error&lt;/a&gt; (MAE) and the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Mean_absolute_percentage_error"&gt;Mean Absolute Percentage Error&lt;/a&gt; (MAPE). As a general guideline, we suggest to &lt;a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=j3c2NETWk2Y"&gt;stick with the MAE&lt;/a&gt; as the MAPE behaves very poorly whenever time-series are not smooth, that is, all the time, as far retailers are concerned. However, there are situations where MAE too behaves poorly. &lt;strong&gt;Low sales volumes&lt;/strong&gt; fall in those situations.&lt;/p&gt;

&lt;p&gt;Let's review the illustration here above. We have an item sold over 3 days. The number of unit sold over the first two days is zero. On the third day, one unit get sold. Let's assume that the demand is, in fact, of exactly 1 unit every 3 days. Technically speaking, it's a &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Poisson_distribution"&gt;Poisson distribution&lt;/a&gt; with &amp;lambda;=1/3.&lt;/p&gt;

&lt;p&gt;In the following, we compare two forecasting models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a flat model &lt;em&gt;M&lt;/em&gt; at 1/3 every day (the &lt;em&gt;mean&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;a flat model &lt;em&gt;Z&lt;/em&gt; at &lt;strong&gt;zero&lt;/strong&gt; every day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As far inventory optmization is concerned, the model zero (Z) is &lt;strong&gt;downright harmfull&lt;/strong&gt;. Assuming that &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/calculate-safety-stocks-with-sales-forecasting.ashx"&gt;safety stock analysis&lt;/a&gt; will be used to compute a reorder point, a zero forecast is very likely to produce a reorder point at zero too, causing &lt;strong&gt;frequent stockouts&lt;/strong&gt;. An accuracy metric that would favor the model zero over more &lt;em&gt;reasonable&lt;/em&gt; forecasts would be behaving rather poorly.&lt;/p&gt;

&lt;p&gt;Let's review our two models against the MAPE (*) and the MAE.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;M&lt;/em&gt; has a MAPE of 44%.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Z&lt;/em&gt; has a MAPE of 33%.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;M&lt;/em&gt; has a MAE of 0.44.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Z&lt;/em&gt; has a MAE of 0.33.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(*) The classic definition of MAPE involves a division by zero when the actual value is zero. We assume here that the actual value is replaced by 1 when at zero. Alternatively, we could also have divided by the forecast (instead of the actual value), or use the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/SMAPE"&gt;sMAPE&lt;/a&gt;. Those changes make no difference: the conclusion of the discussion remains the same.&lt;/p&gt;

&lt;p&gt;In conclusion, here, &lt;strong&gt;according to both the MAPE and the MAE, model zero prevails&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;However, one might argue that this is simplistic situation, and it does not reflect the complexity of a real store. &lt;strong&gt;This is not entirely true&lt;/strong&gt;. We have performed &lt;strong&gt;benchmarks over dozens of retail stores&lt;/strong&gt;, and usually the winning model (according to MAE or MAPE) is the &lt;strong&gt;model zero&lt;/strong&gt; - the model that returns always zero. Futhermore, this model typically &lt;em&gt;wins&lt;/em&gt; by a &lt;strong&gt;comfortable margin&lt;/strong&gt; over all the other models. &lt;/p&gt;

&lt;p&gt;In practice, &lt;strong&gt;at store level, relying either on MAE or MAPE&lt;/strong&gt; to evaluate the quality of forecasting models is &lt;strong&gt;asking for trouble&lt;/strong&gt;: the metric favors models that return zeroes; the more zeroes, the better. This conclusion holds for about every single store we have analyzed so far (minus the few high volume items that do not suffer this problem).&lt;/p&gt;

&lt;p&gt;Readers who are familar with accuracy metrics might propose to go instead for the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Mean_squared_error"&gt;Mean Square Error&lt;/a&gt; (MSE) which will not favor the model zero. This is true, however, MSE when applied to erratic data - and sales are store level &lt;em&gt;are erratic&lt;/em&gt; - is not numerically stable. In practice, any &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Outlier"&gt;outlier&lt;/a&gt; in the sales history will vastly skew the final results. This sort of problem is THE reason why statisticians have been working so hard on &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Robust_statistics"&gt;Robust statistics&lt;/a&gt; in the first place. No free lunch here.&lt;/p&gt;

&lt;h3&gt;How to assess store level forecasts then?&lt;/h3&gt;

&lt;p&gt;It took us &lt;strong&gt;a long, long time, to figure out a satifying solution&lt;/strong&gt; to the problem of quantifying the accuracy of the forecasts at the store level. Back in 2011 and before, we were essentially cheating. Instead of looking at daily data points, when the sales data was too sparse, we were typically switching to weekly aggregates (or even to monthly aggregates for extremely sparse data). By switching to longer aggregation periods, we were artificially increasing sales volumes &lt;em&gt;per period&lt;/em&gt;, hence making the MAE usable again.&lt;/p&gt;

&lt;p&gt;The breakthrough came only a &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2012/3/12/quantiles-inventory-optimization-20.html"&gt;few months ago&lt;/a&gt; through quantiles. In essence, the enlightenment was: &lt;strong&gt;forget the forecasts, only reorder points matter&lt;/strong&gt;. By trying to optimize our &lt;em&gt;classic&lt;/em&gt; forecasts against metrics X, Y or Z, we were trying to &lt;strong&gt;solve the wrong problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wait! Since &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/reorder-point-definition.ashx"&gt;reorder points&lt;/a&gt; are computed based on the forecasts, how could you say forecasts are irrelevant?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We are not saying that forecasts and forecast accuracy are irrelevant. However, we are stating that only the &lt;strong&gt;accuracy of the reorder points themselves&lt;/strong&gt; matter. The forecast, or whatever other variable is used to compute reorder points, cannot be evaluated on its own. Only accuracy of the reorder points need and should be evaluated.&lt;/p&gt;

&lt;p&gt;It turns out that &lt;strong&gt;a metric to assess reorder points exists&lt;/strong&gt;: it's the &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/pinball-loss-function-definition.ashx"&gt;pinball loss function&lt;/a&gt;, a function that has been known by statisticians for decades. Pinball loss is vastly superior not because of its mathematical properties, but simply because &lt;strong&gt;it fits the inventory tradeoff&lt;/strong&gt;: too much stocks vs too much stockouts.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:16172667</guid>
         <pubDate>Tue, 08 May 2012 11:09:37 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/5/8/sparsity-when-accuracy-measure-goes-wrong.html</feedburner:origLink></item>
      <item>
         <title>Move Forward by Discarding Complex Tech</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/Zk3eJRttN-c/move-forward-by-discarding-complex-tech.html</link>
         <description>&lt;p&gt;Good things are either well-forgotten past or a complete rip-off from the nature. It seems that at Lokad we are going all the way back in time ourselves as well.&lt;/p&gt;

&lt;p&gt;Over the course of the last few days we had really interesting times at Ufa office, while &lt;strong&gt;migrating entire event replication infrastructure to a new model&lt;/strong&gt;. If you wish, you can call this infrastructure as &lt;em&gt;bounded context of digital nervous system&lt;/em&gt; that is represented by &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/7/birds-eye-view-of-a-distributed-system-context-map.html"&gt;green arrows in our context maps&lt;/a&gt;. This is a really interesting place for us, since it "touches" multiple other bounded contexts and actually crosses 2 clouds and 1 additional datacenter deployment-wise. Change shocks are mesmerizing to observe. &lt;/p&gt;

&lt;p&gt;Now, instead of a mixture of Azure queue delivery and ZeroMQ streaming, our applications just &lt;strong&gt;push large event streams over hand-made HTTP replication protocol&lt;/strong&gt;. This effectively uses HttpListener and WebRequests, which are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rather performant;&lt;/li&gt;
&lt;li&gt;dead-simple and well understood;&lt;/li&gt;
&lt;li&gt;have minimal friction of introducing replication to new projects (ZeroMQ is pretty invasive here, if you go for Azure);&lt;/li&gt;
&lt;li&gt;can be debugged with a lot of HTTP-based tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The design is rather simple, practical and works well for streams of half a million of events (albeit performance could be improved a lot). This was really important, since we have now a number of bounded contexts to integrate together and the volume of event streams just keeps on growing.&lt;/p&gt;

&lt;p&gt;It is curious, how our movement forward towards better and simpler designs happens concurrently with &lt;strong&gt;stepping back from complex technologies to much simpler ones&lt;/strong&gt;. In other words, we &lt;strong&gt;gain by discarding things&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Another example of such behavior is related to our recent decision to &lt;strong&gt;discard ProtoBuf as the storage format for large data objects&lt;/strong&gt;, while &lt;strong&gt;replacing ProtoBuf+Gzip with TSV+Gzip&lt;/strong&gt;. This applies specifically to &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/5/2/processing-big-data-in-cloud-a-la-lokad.html"&gt;bounded contexts that deal with big data&lt;/a&gt;. Reasons for that being:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ProtoBuf by default loads all objects directly into the memory at once (imagine a dataset of 1 GB), while the default behavior of text files is streaming;&lt;/li&gt;
&lt;li&gt;For numerical data TSV+Gzip compresses better than ProtoBuf+Gzip, since archivers were initially designed and optimized specifically for handling text data;&lt;/li&gt;
&lt;li&gt;You can read and parse TSV dataset with tools on any platform, including scripts and Excel. While with protobuf, some intermediate dancing would be required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, if I can reduce a number of technologies in a given bounded context, while making it more practical and performant, then that's a clear choice.&lt;/p&gt;

&lt;p&gt;As you can see, &lt;strong&gt;in certain scenarios&lt;/strong&gt;, we are stepping back from cool and smart tech towards something more practical and simple. This "stepping back" actually enables us to solve certain problems that exist in this specific scenario. Surprisingly enough, this brings us closer to the Unix philosophy: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I certainly didn't expect to see this happening before, not even theoretically. However, &lt;strong&gt;in practice, there is a big difference between theory and practice&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Caveats&lt;/h2&gt;

&lt;p&gt;Please, keep in mind, that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;we are aware of ProtoBuf capability to read items sequentially.&lt;/li&gt;
&lt;li&gt;we still will be using ProtoBuf for serializing messages, including events that are used for our event sourcing scenarios (leveraging for .NET development a wonderful library by &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/protobuf-net/"&gt;Marc Gravell&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;these examples just serve the purpose of illustrating possibility of cases, where you can move forward by discarding a technology. Specific decisions might not be applicable directly to your case.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=VuiC37AJ6mE:p-6TrGSmvH0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=VuiC37AJ6mE:p-6TrGSmvH0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=VuiC37AJ6mE:p-6TrGSmvH0:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=VuiC37AJ6mE:p-6TrGSmvH0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=VuiC37AJ6mE:p-6TrGSmvH0:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=VuiC37AJ6mE:p-6TrGSmvH0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=VuiC37AJ6mE:p-6TrGSmvH0:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/VuiC37AJ6mE" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/5/5/move-forward-by-discarding-complex-tech.html</guid>
         <pubDate>Sat, 05 May 2012 04:53:56 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/VuiC37AJ6mE/move-forward-by-discarding-complex-tech.html</feedburner:origLink></item>
      <item>
         <title>Video: Quantile Forecasts - Part 2</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/OElxxA53m_M/video-quantile-forecasts-part-2.html</link>
         <description>&lt;p&gt;Last week, we published the &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2012/4/25/video-quantile-forecasts-part-1.html"&gt;Quantile Forecasts - Part 1&lt;/a&gt; video; here comes the Part 2. In the previous video, we discussed what quantiles were about. In short, it's a new way to look at the inventory optimization mechanism itself.&lt;/p&gt;

&lt;p&gt;In Part 2, we provide some non-technical insights why quantile forecasts outperforms classic ones in three usual situations.&lt;/p&gt;

&lt;p&gt;Video summary (7min46):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High service levels&lt;/li&gt;
&lt;li&gt;Intermittent demand&lt;/li&gt;
&lt;li&gt;Spiky demand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't hesitate to post questions in comments.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:16061733</guid>
         <pubDate>Wed, 02 May 2012 05:00:42 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/5/2/video-quantile-forecasts-part-2.html</feedburner:origLink></item>
      <item>
         <title>Processing Big Data in Cloud à la Lokad</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/xIK_qL5GhxI/processing-big-data-in-cloud-a-la-lokad.html</link>
         <description>&lt;p&gt;Let's talk about a simple approach to visualise, model and deliver complex large-scale data processing tasks.  Such tasks would deal with datasets that are so large, that they don't fit into the memory of a single machine and would also take ages to compute on a single machine. These datasets can often be referred to as "BigData".&lt;/p&gt;

&lt;p&gt;Such tasks would benefit from distributing out the work and storage load between relatively cheap machine instances that are made available in the cloud (either public or "private"). We would also want to optimize our consumption costs by get these resources only when they are needed and releasing afterwards.&lt;/p&gt;

&lt;p&gt;Let's also assume that such processing task, requires &lt;strong&gt;complex sequence of steps in order to complete&lt;/strong&gt; (more complex than a mere MapReduce). Some steps must be processed before others can start, while others can work in parallel batches. Actual steps of the job are idempotent, messages can be delivered more than once or simply fail. &lt;/p&gt;

&lt;p&gt;Here is an example of how such processing graph could look like:&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/05/2012-05-02_graph.jpg?__SQUARESPACE_CACHEVERSION=1335899043937" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;That's how I would approach such problem in the situation, when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;development resources are limited;&lt;/li&gt;
&lt;li&gt;data processing model is not formally established and is likely to evolve;&lt;/li&gt;
&lt;li&gt;team (or a single developer) is familiar with event sourcing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would split the problem domain into two separate bounded contexts: Orchestration and Data Processing.&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/05/2012-05-02_bigdata.png" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Bounded Contexts&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Orchestration Bounded Context&lt;/strong&gt; will be responsible for navigating data processing graph and orchestrating the individual jobs. Behaviors for that will be captured inside an aggregate root that uses event sourcing for persistence (AR+ES) for better testing and getting persistence mismatch troubles out of the way. Deployment-wise, this aggregate can live in a separate machine and would be configured in such a way, that all commands to this aggregate are synchronized and executed on a single thread (just a routing rule for messages).&lt;/p&gt;

&lt;p&gt;AR+ES just schedules batches of tasks that can be executed an parallel, and issues second batch only when the first one is complete. &lt;/p&gt;

&lt;p&gt;Should there be any message duplication (always a possibility in the cloud environments), AR+ES can easily track and drop duplicates by keeping hashes of already completed task batch identifiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Processing Bounded Context&lt;/strong&gt; will be implemented using a set of command handlers that consume work commands from an input queue and process them. These handlers would operate upon data that is stored somewhere in the cloud and is considered to be immutable for the duration of the specific big data process. Commands and events can contain meta-data, parameters and references to this immutable data.&lt;/p&gt;

&lt;p&gt;In essence, command handler is a function that will take as input a command (which could contain a reference to larde immutable data blob), perform certain operations and publish an event (optionally saving some large processing data into another data blob). &lt;/p&gt;

&lt;p&gt;Multiple instance of command handlers would be picking commands from the input queue in this bounded context. In essence, they would be competing for the jobs, just like clercs in the bank "compete" for customers standing in line (customer is handled by only one clerk). However, we would be better than a bank, since if we can always massively increase the number of command handlers handling the load, by instructing cloud fabric to provision more machines.&lt;/p&gt;

&lt;p&gt;Both bounded contexts subscribe to all important domain events of each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; we should differentiate between actual data (which is so large that it does not fit into a single machine/process) and behavioral metadata. The former is accessed only by data processing bounded context, while the latter is passed within the messages between both bounded contexts. For example, number of time series in dataset is metadata, while actual values within these time series are actual 'raw' data.&lt;/p&gt;

&lt;p&gt;Orchestration Aggregate would use that metadata to make decisions that 'drive' the process through the graph.&lt;/p&gt;

&lt;h2&gt;Flow of work&lt;/h2&gt;

&lt;p&gt;Let's say we have a &lt;code&gt;ProcessAggregate&lt;/code&gt; that contains orchestration logic for our complicated MapReduce process. When this aggregate starts, it simply publishes X events that say something&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;TaskAScheduledEvent(processId = 1, taskID = guid)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; there is more elegant way to do this, but that would require going deeper into DDD&lt;/p&gt;

&lt;p&gt;These events would be received by Receptor (or Port) in the second bounded context, which would  translate them into instances of &lt;code&gt;ProcessTaskACommand&lt;/code&gt;. These command messages would be passed into the queue from which multiple worker machines pick their jobs. &lt;/p&gt;

&lt;p&gt;When command handler finishes processing the task it sends &lt;code&gt;TaskAProcessedEvent&lt;/code&gt;, which will get routed back to the &lt;code&gt;ProcessAggregate&lt;/code&gt; as &lt;code&gt;ConfirmTaskAResults(task ID = guid)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Within the aggregate we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mark task as confirmed (if it hasn't already been reported due to message duplication).&lt;/li&gt;
&lt;li&gt;If this task completes some batch and enables further processing, we schedule more tasks for cloud execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can also define a timeout view that simply lists all tasks that are currently running. Timeout manager (a simple process) regularly checks this view and sends "TryTimeoutTaskX" to the aggregate. Aggregate checks with it's internal state, and if task indeed has not been processed, decides to either reissue the task or terminate the whole process (yes, we essentially implement our timeout tracking as a &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/21/ddd-evolving-business-processes-a-la-lokad.html"&gt;business process within Lokad.CQRS architecture style&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;Gotchas&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt; of this approach (esp. if aligned with Lokad.CQRS architecture style):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no need to worry about persistence of complex object that represents our graph decision logic;&lt;/li&gt;
&lt;li&gt;orchestration logic can be explicitly tested with the specifications (and documented as such);&lt;/li&gt;
&lt;li&gt;we can easily migrate between multiple versions of the data process without downtime or stopping processes;&lt;/li&gt;
&lt;li&gt;process can easily be developed and debugged on the local machine, while being deployed to any cloud afterwards;&lt;/li&gt;
&lt;li&gt;we use same approaches and ideas that are used within Lokad.CQRS architecture style for modeling more conventional business concepts (this lowers learning barrier and allows to reuse answers to some common problems).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Drawbacks&lt;/strong&gt; of this approach are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It requires certain development discipline (and familiarity with cloud computing and AR+ES);&lt;/li&gt;
&lt;li&gt;At the moment of writing, there is no prepackaged infrastructure for event sourcing that would work out-of-the-box;&lt;/li&gt;
&lt;li&gt;performance of this approach would be somewhat inferior to finely tuned functional style map-reduce process implementation;&lt;/li&gt;
&lt;li&gt;this is a batch-processing approach, which is not fit for real-time processing (yet).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, with this approach we trade some performance for development and deployment flexibility. This enables us to rapidly model and implement big data process (especially when requirements are still changing). After the process is formalized, we can always fine-tune and optimize bottlenecks. Although frequently you would find that it is cheaper to add another server (worth 100 EUR per month) than waste multiple development days of brilliant developers on performance optimizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heads up&lt;/strong&gt;: the entire infrastructure does not need to be really performant with one exception - if you are doing hundreds of thousands of messages within a single process, then it's worth to invest effort in messaging infrastructure (e.g. direct communication with ZeroMQ), otherwise latency will kill everything. Event stream for actual process aggregate can be simply cached in memory.&lt;/p&gt;

&lt;h2&gt;Deployment Options&lt;/h2&gt;

&lt;p&gt;Below are some deployment variations that could be used within this approach. We can implement our core processing logic without any coupling to specific deployment environment and then deploy in various configurations. The latter would require just re-configuration and optionally providing some specific adapters implementations (for messaging, event sourcing and large BLOB streaming).&lt;/p&gt;

&lt;p&gt;Alternatively you can have the same project prepared for multiple deployment options from the start.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local development machine:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orchestration bounded context runs as one thread;&lt;/li&gt;
&lt;li&gt;multiple data processing command handlers run either as parallel threads or as multiple instances of a single console app;&lt;/li&gt;
&lt;li&gt;file system is used for both message queueing, persistence of large binary files and event streams for aggregates.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows Azure Cloud:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orchestration bounded context runs in a single worker role (e.g. instance of Lokad.CQRS-based engine);&lt;/li&gt;
&lt;li&gt;data processing handlers run as additional Windows Azure worker roles (you can configure them to run on X different threads within Y worker role instances);&lt;/li&gt;
&lt;li&gt;Large data is streamed to Azure Blob Storage, just like event streams for AR+ES entities;&lt;/li&gt;
&lt;li&gt;Azure queues are used for messaging.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amazon Elastic Compute:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orchestration bounded context is a single VM, while Data processing command handlers run within multiple replicas of another VM. We scale by adding or dropping instances of that second VM.&lt;/li&gt;
&lt;li&gt;Amazon S3 storage is used for persisting large binary data, while local instance of RabbitMQ is used for messaging; event streams could be persisted locally within orchestration VM.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obviously, these are just some of the few options. You can have completely different scenario, based on the specific resources, requirements, risks and constraints within you project.&lt;/p&gt;

&lt;p&gt;In each of these cases, elastic scaling can be done by implementing a simple task that would watch upon the amount of messages waiting in the command queue of data processing bounded context, adjusting number of command handler instances accordingly.&lt;/p&gt;

&lt;h2&gt;Final Words&lt;/h2&gt;

&lt;p&gt;This approach is in not a silver bullet. It just summarizes some limited experience gained while developing and maintaining non-realtime big data processes that could be hosted both in the cloud and on-premises. As such, it can have numerous applicability limitations (especially if you are working within constrained enterprise environment). Some alternative approaches and references worth mentioning are available in the &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/2/13/reading-list-on-big-data.html"&gt;reading list on Big Data&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, if you need to quickly deliver out some scalable multi-step data process with one person, no money for expensive software licenses and just a few weeks of time, then this approach might give you some ideas.&lt;/p&gt;

&lt;p&gt;If you want to read more along these lines, here are a few more relevant posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/3/31/anatomy-of-distributed-system-a-la-lokad.html"&gt;Anatomy of Distributed System à la Lokad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/7/birds-eye-view-of-a-distributed-system-context-map.html"&gt;Bird's-eye view of a Distributed System - Context Map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/14/software-war-starts-with-a-map-context-map.html"&gt;Software War Starts with a Map, Context Map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/17/ddd-from-reality-to-implementation.html"&gt;DDD: From Reality to Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/21/ddd-evolving-business-processes-a-la-lokad.html"&gt;DDD: Evolving Business Processes a la Lokad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=RYQMIsXoDNk:tKY20vKPtnA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=RYQMIsXoDNk:tKY20vKPtnA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=RYQMIsXoDNk:tKY20vKPtnA:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=RYQMIsXoDNk:tKY20vKPtnA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=RYQMIsXoDNk:tKY20vKPtnA:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=RYQMIsXoDNk:tKY20vKPtnA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=RYQMIsXoDNk:tKY20vKPtnA:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/RYQMIsXoDNk" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/5/2/processing-big-data-in-cloud-a-la-lokad.html</guid>
         <pubDate>Tue, 01 May 2012 20:36:07 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/RYQMIsXoDNk/processing-big-data-in-cloud-a-la-lokad.html</feedburner:origLink></item>
      <item>
         <title>Continuous Delivery with Lokad.CQRS</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/BKiIiOeQJpU/continuous-delivery-with-lokadcqrs.html</link>
         <description>&lt;p&gt;Today I was presenting at the Roots about Lokad.CQRS architecture style. As part of the presentation I created a quick deployment of Lokad sample project, tweaked for a continuous delivery scenario. &lt;/p&gt;

&lt;p&gt;In short, every time a change is pushed to &lt;code&gt;master&lt;/code&gt; within this repository: &lt;a rel="nofollow" target="_blank" href="https://github.com/abdullin/lokad-cqrs-appharbor"&gt;Lokad.CQRS-AppHarbor&lt;/a&gt;, AppHarbor performs a new full deployment of this site: &lt;a rel="nofollow" target="_blank" href="http://lokad-cqrs.apphb.com"&gt;http://lokad-cqrs.apphb.com&lt;/a&gt;. It is the duty of Lokad.CQRS to rebuild any projections that might have changed in the code.&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-26_135941.jpg" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;For the most fun: this deployment is actually about 2 clouds. AppHarbor (located within Amazon) deals with builds and hosting, while data is persisted on Azure. I just didn't have time to write adapters for the persistence available within the AppHarbor (the entire deployment thing was delivered within few litres of coffee and 6-8 man hours of work).&lt;/p&gt;

&lt;p&gt;Naturally, while working with the system within local development environment, persistence is based on dead-simple file storage.&lt;/p&gt;

&lt;p&gt;Currently this repository is an off-shot of latest Lokad.CQRS, created for the demo purposes. &lt;/p&gt;

&lt;p&gt;However, this experience enables totally new development approach by massively slashing down development friction. I'm tempted to push it to the master of Load.CQRS and keep it hooked with this continuous deployment, while maybe even adding more domain "meat" around inventory management concept. I think, some fun could be had around the process, where every accepted pull request is immediately deployed to production.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=iZyL2ZhCOgM:0IIvxJPemkA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=iZyL2ZhCOgM:0IIvxJPemkA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=iZyL2ZhCOgM:0IIvxJPemkA:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=iZyL2ZhCOgM:0IIvxJPemkA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=iZyL2ZhCOgM:0IIvxJPemkA:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=iZyL2ZhCOgM:0IIvxJPemkA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=iZyL2ZhCOgM:0IIvxJPemkA:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/iZyL2ZhCOgM" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/4/26/continuous-delivery-with-lokadcqrs.html</guid>
         <pubDate>Thu, 26 Apr 2012 12:02:45 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/iZyL2ZhCOgM/continuous-delivery-with-lokadcqrs.html</feedburner:origLink></item>
      <item>
         <title>Video: Quantile Forecasts - Part 1</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/Pq4vtGSBYyk/video-quantile-forecasts-part-1.html</link>
         <description>&lt;p&gt;Quantile forecasts offer a &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2012/3/12/quantiles-inventory-optimization-20.html"&gt;radically new&lt;/a&gt; and better way to compute optimal reorder points. Here is our first video about this little supply chain breakthrough.&lt;/p&gt;

&lt;p&gt;Video summary (6min25):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What are quantiles?&lt;/li&gt;
&lt;li&gt;How do quantiles work?&lt;/li&gt;
&lt;li&gt;What are the advantages of quantiles?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;i&gt;Stay tuned for more.&lt;/i&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:15987485</guid>
         <pubDate>Wed, 25 Apr 2012 09:24:25 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/4/25/video-quantile-forecasts-part-1.html</feedburner:origLink></item>
      <item>
         <title>DDD: Evolving Business Processes a la Lokad</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/7rlWrY7PpoA/ddd-evolving-business-processes-a-la-lokad.html</link>
         <description>&lt;p&gt;As you already know, there are multiple ways to express any given core business concept in the code via domain modeling (we discussed this topic in &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/17/ddd-from-reality-to-implementation.html"&gt;previous article&lt;/a&gt;). These ways  usually depend on the architecture style selected for the bounded context, in which we are currently working.&lt;/p&gt;

&lt;p&gt;For now, let's focus on one of such domain concepts: &lt;strong&gt;long-running business processes&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;In a cloud-based SaaS company, we could have following business processes (among many other):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if invoice has a non-zero amount and was not paid within 15 days, then send customer a reminder.&lt;/li&gt;
&lt;li&gt;if customer balance stays below -5EUR for more than 30 days, then issue a lockdown.&lt;/li&gt;
&lt;li&gt;if distributed computing process has not finished processing all data batches within 1 hour, then restart it once (except cases, when it was already restarted - then issue a termination alert)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you probably already noticed, these &lt;strong&gt;examples share a few similarities&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;they are aware of the passing of time and deal with it;&lt;/li&gt;
&lt;li&gt;these processes express rather complex precondition that is based on current state of the system and leads to one or more &lt;code&gt;then&lt;/code&gt; outcomes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's assume that we are dealing with a distributed system, where information about current state is shared with events. In such case, our business process might resemble a piece from complex event processing and would look this from the logical perspective:&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-21_bp-1.jpg?__SQUARESPACE_CACHEVERSION=1334996466613" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;How can we implement this "Business Process" box? There are multiple alternatives, depending on the architecture style you have chosen. &lt;/p&gt;

&lt;p&gt;For example, you can use a state machine, where each instance of state machine would correspond to a specific process instance that you are tracking. Events would then be used to navigate an instance of the state machine across the nodes. It will also use external timer service to send messages "to future" (where message is put on hold till certain time comes).&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-21_bp-st.jpg?__SQUARESPACE_CACHEVERSION=1334997691189" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;State machines are good for formalized domains. You can learn more about such approaches in the materials provided by Gregory Young and Udi Dahan.&lt;/p&gt;

&lt;p&gt;However, when we are dealing with business processes, that are rich with fuzzy logic, uncertainty and also happen to evolve rapidly, then a more simple solution might be needed. Especially, when you have almost no development time to spare.&lt;/p&gt;

&lt;p&gt;What is the most simple solution in case with locking customer balance for overdrafts? For instance, we can project all events to a view, which will &lt;strong&gt;track&lt;/strong&gt; all active customers that used our services and went below the threshold at some point. Then our &lt;strong&gt;execution&lt;/strong&gt; will be responsible for regularly checking this view and sending "Lockdown" to every customer that had his balance below the threshold for too long.&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-21_bp-2.jpg?__SQUARESPACE_CACHEVERSION=1334996503818" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;This component would also need to keep in mind that certain customers require special handling and investigation before being locked out, while others can be locked right away. Naturally, these rules will be changing really often.&lt;/p&gt;

&lt;p&gt;What is the fastest and most flexible way to implement such component in a rapidly growing and changing environment? &lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-21_bp3.jpg?__SQUARESPACE_CACHEVERSION=1334996518303" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;You simply wire view to the UI, attach a button to send "lockdown command" and &lt;strong&gt;ask a person&lt;/strong&gt; from the business department to &lt;strong&gt;spend half an hour per week processing all late customers&lt;/strong&gt;. This will save dev department hours on implementing these complex execution rules, testing them and then changing (as business discovers new corner cases). Essentially we let the rules evolve and change in the environment that shapes them: in the minds of business managers.&lt;/p&gt;

&lt;p&gt;In other words, at this point &lt;strong&gt;we avoid large development effort with a little bit of human time&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Please, keep in mind, that once business processes are established and we have so many cases, that manually processing them takes too much time (that should be a profitable company by then), we can always &lt;strong&gt;rewrite these lockdown rules as a continuously running server-side task&lt;/strong&gt; (rules would be mostly established by then). We could still keep the projection and a corresponding view.&lt;/p&gt;

&lt;p&gt;At this point we &lt;strong&gt;invest a fixed amount of development to automate a large portion of manual work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This gradual evolution of business processes is currently the recommended approach within Lokad.CQRS architecture style for delivery of non-formalized and rapidly changing business rules.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=cZytGnP2yDg:0zJbt4xaG9I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=cZytGnP2yDg:0zJbt4xaG9I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=cZytGnP2yDg:0zJbt4xaG9I:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=cZytGnP2yDg:0zJbt4xaG9I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=cZytGnP2yDg:0zJbt4xaG9I:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=cZytGnP2yDg:0zJbt4xaG9I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=cZytGnP2yDg:0zJbt4xaG9I:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/cZytGnP2yDg" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/4/21/ddd-evolving-business-processes-a-la-lokad.html</guid>
         <pubDate>Sat, 21 Apr 2012 08:46:30 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/cZytGnP2yDg/ddd-evolving-business-processes-a-la-lokad.html</feedburner:origLink></item>
      <item>
         <title>DDD: From Reality to Implementation</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/UcLGhxl2LsE/ddd-from-reality-to-implementation.html</link>
         <description>&lt;blockquote&gt;
  &lt;p&gt;This is yet another post in a series that were triggered by fruitful discussions with &lt;a rel="nofollow" target="_blank" href="http://vaughnvernon.co/"&gt;Vaughn Vernon&lt;/a&gt; over content for his DDD book.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think, one of the sources of confusion in DDD/CQRS world is that we often mix terms and concepts that belong do absolutely different layers (and that we don't know how to go from one to the other). Let's start by introducing the following separation:&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-17_DDD-reality.jpg?__SQUARESPACE_CACHEVERSION=1334640831088" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;For the new readers, DDD stands for Domain Driven Design, which was introduced by &lt;a rel="nofollow" target="_blank" href="http://domaindrivendesign.org/about"&gt;Eric Evans&lt;/a&gt; in the book with the same name. CQRS stands for Command-Query Responsibility Principle, which is often associated with architecture styles for implementing systems with DDD and optional Event Sourcing. The term was coined and explored by &lt;a rel="nofollow" target="_blank" href="http://goodenoughsoftware.net/"&gt;Greg Young&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Reality&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reality&lt;/strong&gt; is that thing around us, which we perceive through our senses and continuously try to understand. In the context of business and software, &lt;strong&gt;reality contains core business concepts&lt;/strong&gt; which are important for the competitive advantage of our business. We want to capture them and then somehow express in code for automation purposes. For example, business concepts could involve things as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer&lt;/li&gt;
&lt;li&gt;Registration Process&lt;/li&gt;
&lt;li&gt;Customer Subscription&lt;/li&gt;
&lt;li&gt;Invoice&lt;/li&gt;
&lt;li&gt;Invoice Payment Cycle&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;I'm taking examples from the environment of Software-as-a-Service (SaaS) company, since that's what I'm mostly familiar with.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Domain Model&lt;/h2&gt;

&lt;p&gt;As we learn more about reality and business concepts, we could distill our understanding into the &lt;strong&gt;domain model&lt;/strong&gt;, which contains all things that are relevant and important in the current situation. For the sake of simplicity, we will break down the entire model into set of bounded contexts (BCs) which are separate by the natural boundaries we've discovered in the real world.&lt;/p&gt;

&lt;p&gt;In SaaS world we could highlight BCs like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer Subscriptions and Billing&lt;/li&gt;
&lt;li&gt;Client Portal&lt;/li&gt;
&lt;li&gt;Reporting&lt;/li&gt;
&lt;li&gt;Product 1&lt;/li&gt;
&lt;li&gt;Product 2&lt;/li&gt;
&lt;li&gt;Cloud integration&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of the bounded contexts in this model stems directly from our understanding of the reality and the natural boundaries that we have identified (&lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/14/software-war-starts-with-a-map-context-map.html"&gt;read more&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;If we dive inside one of these bounded contexts, we could discover more fine-grained concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubiquitous Language&lt;/li&gt;
&lt;li&gt;Aggregate and Aggregate Root&lt;/li&gt;
&lt;li&gt;Consistency Boundary&lt;/li&gt;
&lt;li&gt;Business Process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please keep in mind, that these are purely logical concepts, that have (yet) nothing to do with the implementation and all the less important details!&lt;/p&gt;

&lt;p&gt;The process of identifying BC boundaries can take into consideration things like: teams, skills, available resources and technologies. However, &lt;strong&gt;at this level we still don't care about technical details like&lt;/strong&gt;: frameworks, databases, message middleware, service buses etc. We just create foundation for making conscious choice later down the road.&lt;/p&gt;

&lt;h2&gt;Architecture Styles and Implementation&lt;/h2&gt;

&lt;p&gt;Only after we have identified bounded contexts, we can focus on each BC and start thinking about implementation matters, while considering project specifics. Result of this exciting process would be a choice of key elements for the specific bounded context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;development process&lt;/strong&gt; - how do we organize and manage our development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;architecture style&lt;/strong&gt; - how do we structure and design software implementation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;technology stack&lt;/strong&gt; - what technologies do we use and how do we get them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;resource allocation&lt;/strong&gt; - how do we get resources (budgets, people, knowledge) for the project delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For instance, if our teams are familiar with the SQL/RavenDB and NService Bus, we can pick &lt;strong&gt;architecture style described by Udi Dahan&lt;/strong&gt; (&lt;a rel="nofollow" target="_blank" href="http://www.udidahan.com/?blog=true"&gt;blog&lt;/a&gt;), where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aggregates are persisted with SQL+NHibernate or RavenDb;&lt;/li&gt;
&lt;li&gt;command handlers and application services are hosted by NServiceBus;&lt;/li&gt;
&lt;li&gt;business processes are implemented with NServiceBus sagas;&lt;/li&gt;
&lt;li&gt;consistency boundaries happen within the transaction scope;&lt;/li&gt;
&lt;li&gt;views are created either by in-memory events or via projected audit logs;&lt;/li&gt;
&lt;li&gt;development process will be aligned towards Waterfall or Agile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If environment requires event sourcing or teams are hyped with &lt;strong&gt;AR+ES architectural style of Greg Young&lt;/strong&gt; (&lt;a rel="nofollow" target="_blank" href="http://goodenoughsoftware.net/"&gt;blog&lt;/a&gt;), we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;persist aggregates with event sourcing in event streams;&lt;/li&gt;
&lt;li&gt;host command handlers in custom message dispatchers that use something like AMQP or direct socket communication;&lt;/li&gt;
&lt;li&gt;business processes are mainly implemented with state machines hosted within event handlers or via document-based state machines (where state is persisted in messages);&lt;/li&gt;
&lt;li&gt;views are disposable and are projected from event streams to whatever technology that is needed;&lt;/li&gt;
&lt;li&gt;consistency boundaries are within aggregate;&lt;/li&gt;
&lt;li&gt;use Agile development process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At Lokad we are mostly using &lt;strong&gt;Lokad.CQRS architecture style&lt;/strong&gt; (&lt;a rel="nofollow" target="_blank" href="http://lokad.github.com/lokad-cqrs/"&gt;sample&lt;/a&gt;) that is derived from Greg's but is fine-tuned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fit cloud computing environments while supporting on-premises deployments;&lt;/li&gt;
&lt;li&gt;reduce development friction and development effort at the &lt;strong&gt;cost of higher requirements for team skills and discipline&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;support rapid domain evolution in rapidly changing business environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture style involves following technical choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aggregates are persisted with event sourcing in event stream;&lt;/li&gt;
&lt;li&gt;message handlers are hosted in custom message dispatchers provided by Lokad.CQRS sample project (with adapters for on-premises and cloud deployments);&lt;/li&gt;
&lt;li&gt;business process transitions are implemented as part of the aggregate behaviors (they could be triggered by user interactions, stateless event handlers sending commands in response to events or tasks that sending commands on a schedule);&lt;/li&gt;
&lt;li&gt;views are disposable and are projected from event streams, using dead-simple key-value persistence for the majority of cases (with adapters for on-premises and cloud);&lt;/li&gt;
&lt;li&gt;consistency boundaries are per entity (aggregate or view instance);&lt;/li&gt;
&lt;li&gt;rapid development process is used for multiple releases per week/day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obviously, these are just a few options of implementing a given bounded context. There are more architecture styles available out there (and each architecture style can have multiple implementation options and variations).&lt;/p&gt;

&lt;h2&gt;DDD Modeling Process&lt;/h2&gt;

&lt;p&gt;Now, for the most fun part. This trajectory from reality to architectural style is just a &lt;em&gt;happy path scenario&lt;/em&gt; that happens only in dreams. In reality you might need to &lt;strong&gt;iterate from reality to implementation multiple times&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-17_DDD-iterate.jpg?__SQUARESPACE_CACHEVERSION=1334644192048" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;These iterations are the foundation of the &lt;strong&gt;approach to explore and capture core business concepts in domain model&lt;/strong&gt; (or, one of the approaches). Approach is totally attributed to Greg Young. &lt;/p&gt;

&lt;p&gt;We start by sketching out domain model without even trying hard to be precise from the start. Then we try to implement it in the code using the &lt;strong&gt;most hacky approach possible&lt;/strong&gt;. Lokad.CQRS style with file-based persistence and messaging works for us, because it is designed for rapid iterations and has the least friction (I'll need to do a quick video on that process). &lt;/p&gt;

&lt;p&gt;One of the goals here is to build a set of unit tests that use &lt;a rel="nofollow" target="_blank" href="http://cqrsguide.com/doc:specification"&gt;specifications&lt;/a&gt; to verify behaviors of aggregate roots with event sourcing (AR+ES). These specifications can be printed out as use cases in human-readable way.&lt;/p&gt;

&lt;p&gt;More often than not, a lot of problems and questions show up during this implementation phase. At this point we usually forget about the implementation (while keeping our use cases) and go back to the domain experts with these questions (more often than not, for me this boils to going and talking to the mirror). Then we adjust the domain model according to the lessons learned. Depending on the nature of the adjustment, implementation is either discarded completely or refactored to fit (AR+ES specifications are usually kept between these iterations, to make sure that we don't loose any captured use case).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;process is repeated till we distill our domain model&lt;/strong&gt; to the point that it captures all required business concepts in a way that can be easily implemented in the code. At this point we can print out specifications, reconfigure implementation to use adapters for production environment (e.g. Azure), push it to production and try to call it a day (only to have next challenge handed to us).&lt;/p&gt;

&lt;p&gt;PS: If you are interested in this topic, next article in the series might interest you: &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/21/ddd-evolving-business-processes-a-la-lokad.html"&gt;DDD: Evolving Business Processes a la Lokad&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=L-q8S7St46k:vY095fYNrlc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=L-q8S7St46k:vY095fYNrlc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=L-q8S7St46k:vY095fYNrlc:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=L-q8S7St46k:vY095fYNrlc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=L-q8S7St46k:vY095fYNrlc:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=L-q8S7St46k:vY095fYNrlc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=L-q8S7St46k:vY095fYNrlc:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/L-q8S7St46k" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/4/17/ddd-from-reality-to-implementation.html</guid>
         <pubDate>Tue, 17 Apr 2012 07:17:24 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/L-q8S7St46k/ddd-from-reality-to-implementation.html</feedburner:origLink></item>
      <item>
         <title>Lokad.CQRS Architecture Style: Plans and Boundary</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/dEvX1d13V54/lokadcqrs-architecture-style-plans-and-boundary.html</link>
         <description>&lt;blockquote&gt;
  &lt;p&gt;Все фигня, кроме пчел, да и пчелы - тоже фигня (c) &lt;br /&gt;
  &lt;strong&gt;Ответ старого пчеловода на вопрос о смысле жизни&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over the course of last few months I was lead to a simple realization: &lt;strong&gt;CQRS/ES is not a top-level architectural style, but rather a tactical choice&lt;/strong&gt;. Yes, I know that this is what people have been talking about for all the time; but hearing is one thing, while understanding is the other.&lt;/p&gt;

&lt;p&gt;This simple realization makes CQRS/ES much less important on the big picture (or maybe my own picture just got bigger). So, when we have a complex problem at hand, we start by identifying natural boundaries around some core business concepts, which would let us identify separate bounded concepts. Only then we can decide about architectural styles that could be applied within a specific bounded contexts. (I went into more detail on that in my &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/4/14/software-war-starts-with-a-map-context-map.html"&gt;last post&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://lokad.github.com/lokad-cqrs/"&gt;Lokad.CQRS&lt;/a&gt; (in it's current anatomy branch on github) is currently a &lt;strong&gt;sample project demonstrating my favorite way of implementing bounded contexts&lt;/strong&gt; that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rich in business behavior;&lt;/li&gt;
&lt;li&gt;require rapid changes and releases (we are rapidly learning about environment);&lt;/li&gt;
&lt;li&gt;require elastic scalability and ability to be deployed to various cloud environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a sharp tool, that requires discipline as well as people with certain knowledge and experience. On the bright side - it is verified by practical experience, cloud outages and startup environment.&lt;/p&gt;

&lt;p&gt;As you can see, we've just defined &lt;strong&gt;applicability boundaries of Lokad.CQRS+ES approach&lt;/strong&gt;. This actually helps it to focus and stop attempts to handle all possible scenarios. The approach works and &lt;strong&gt;I don't plan a lot of changes any time soon&lt;/strong&gt; (maybe just more documentation and tooling improvements). &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;My current friction points currently reside on a higher level - making multiple bounded contexts (that are deployed across clouds and datacenters) to work together. Especially, when you have a rapidly growing software-as-a-service company that tends to introduce multiple services and changes per year; where each one brings new bounded contexts and details on the global strategy map (and these guys just don't know how to stop).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once again, I'm happy with the current state of Lokad.CQRS architecture style and don't expect a lot of changes to it. CQRSGuide will probably gradually transition into a documentation guide across that specific architecture style. &lt;/p&gt;

&lt;p&gt;Please keep in mind, that this approach is just one of many out there. There are two other options in .NET world that I want to highlight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NServiceBus and things that &lt;a rel="nofollow" target="_blank" href="http://www.udidahan.com/"&gt;Udi Dahan teaches&lt;/a&gt;. I might have strong personal disapproval of values and grounds of his approaches, however they work in world's largest companies. You can't argue with that.&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://cqrsjourney.github.com/"&gt;Microsoft CQRS P&amp;amp;P Journey&lt;/a&gt;, which has a strong technical team with a diverse advisory group. In my opinion they are focusing too much on debates and less important technical things, but the progress Microsoft is making is impressive. I wish them luck.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are interested in pushing state of the art in this area, I encourage you to &lt;strong&gt;dive deeper, learn and share what you have learned&lt;/strong&gt;. It does not matter, which project you would choose for that - you will gain and give a lot either way.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=5fG0CmkkfnQ:hLx6RLvfcA4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=5fG0CmkkfnQ:hLx6RLvfcA4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=5fG0CmkkfnQ:hLx6RLvfcA4:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=5fG0CmkkfnQ:hLx6RLvfcA4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=5fG0CmkkfnQ:hLx6RLvfcA4:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=5fG0CmkkfnQ:hLx6RLvfcA4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=5fG0CmkkfnQ:hLx6RLvfcA4:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/5fG0CmkkfnQ" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/4/15/lokadcqrs-architecture-style-plans-and-boundary.html</guid>
         <pubDate>Sun, 15 Apr 2012 09:11:46 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/5fG0CmkkfnQ/lokadcqrs-architecture-style-plans-and-boundary.html</feedburner:origLink></item>
      <item>
         <title>Software War Starts with a Map, Context Map</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/QhNmZkQyres/software-war-starts-with-a-map-context-map.html</link>
         <description>&lt;blockquote&gt;
  &lt;p&gt;Let us continue revisiting the big picture overview of all DDD and CQRS things, based on the things I've learned recently in collaboration with &lt;a rel="nofollow" target="_blank" href="http://goodenoughsoftware.net/"&gt;Gregory Young&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://vaughnvernon.co/"&gt;Vaughn Vernon&lt;/a&gt;. We will start with the most important things.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's imagine that you are a software manager challenged with a new project to deliver. The project is really interesting and challenging, customer can talk about it for hours. Sometimes there will be references to similar projects to copy and cool technologies that should help. You and your team are already itching to start flush out some specs and start developing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it really where you start?&lt;/strong&gt; Wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complex software project is a war&lt;/strong&gt; - it is unpredictable and brutal fight to hit moving target, while always running short on time and resources.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;NB: I'm currently talking about "startup" environments. Enterprise situations with available resources and preallocated budgets are a different story that we are not interested right now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You don't enter software war with low-level details. You don't start with detailed tech specifications or strategies (unless you want to have perfectly planned and failed &lt;em&gt;blitzkrieg&lt;/em&gt; on your hands). First &lt;strong&gt;you need a strategic map&lt;/strong&gt; with bird's-eye view of the current situation at hand. Maybe this war is not even worth entering?&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-13_russia.png?__SQUARESPACE_CACHEVERSION=1334292365690" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;One of the approaches of getting such map is to make your way through "Domain-Driven Design: Tackling Complexity in the Heart of Software" by Eric Evans (just make sure to read it this way: chapter 11 - END; Beginning - END).&lt;/p&gt;

&lt;p&gt;Domain Driven Design (DDD) is a special way to look at core business concepts that exist in a real world and deeply connect them to evolving domain model, that could be easily implemented in software to solve specific problems. In other words, it can help to look at real world, understand it and divide into a set of separate territories that can be conquered separately, step by step.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“One step at a time, ... I can walk around the world. Watch me.” (c) L.M.Bujold&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Separate territories are called "&lt;em&gt;bounded contexts&lt;/em&gt;", while the big map is called "&lt;em&gt;context map&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;We use DDD toolset (set of rules, hints and guidelines) to look at the complex mess of important business concepts and identify natural boundaries around some of them. These natural boundaries would be discovered in the real world and then transferred to our "context map". Area within the boundary will be called "bounded context"&lt;/p&gt;

&lt;p&gt;This process is equivalent to geography or geology, where explorers map the terrain and draw borders around areas that look the same according to some arbitrary criteria. Criteria for finding such natural boundaries can be extremely different and will depend on your situation (synonym to "situation" is "context"). As it has always been: drawing maps is a challenge, especially when half of the territory is terra incognita (or covered by the "fog of war").&lt;/p&gt;

&lt;p&gt;Please keep in mind, that Context Map is not a plan of some distant future. It is merely a reflection of current situation that we have in our software project or a company. It is a map of terrain that has to stay updated and real, in order to be of any use.&lt;/p&gt;

&lt;p&gt;Let me be clear: you don't necessarily need to map all the terrain of software project on a context map, before starting to work on it (sometimes research and development is the only way to move forward). However, &lt;strong&gt;staying aware of the business situation&lt;/strong&gt; (context), uncharted areas, and potential unknown risks, &lt;strong&gt;will make you more prepared for unexpected changes&lt;/strong&gt; in the future. Being able to divide complex problem area into a set of separate bounded contexts will make it easier to think through the situation and approach it.&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-07_context-map-2.png" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The biggest advantage of separate bounded contexts is about their explicit separation from each other. &lt;strong&gt;Once we have clear boundaries, we can consciously focus on the situation inside&lt;/strong&gt; in relevant isolation. For each specific context within a boundary, we can pick the most efficient combination of technologies, teams and development approaches.&lt;/p&gt;

&lt;p&gt;For example, given a SaaS battlefield and a new secret "Product XYZ", the latter could allow division into two separate bounded contexts. One specific bounded context (highly complicated and requiring special approach) can be handled by a special research and development team, while the other neightboring BC could be delegated to a team specializing in solving diverse and messy situations.&lt;/p&gt;

&lt;p&gt;As you can already see, our context map not only allows to start tackling problem space, but also enable considering the allocation of limited resources over a seemingly endless battlefield of possible projects to deal with. Same works with risk mitigation, time and long-term campaign planning. At certain moments in the course of software war, you can even identify situations, where certain projects could be worth a sacrifice, risky spike, massive refactoring (or all of these at once).&lt;/p&gt;

&lt;p&gt;It might be really boring to read all this text without any mention of cool technologies (e.g. self-rebuilding CQRS view projection host with unlimited scalability for reads), however &lt;strong&gt;technology choices are mostly irrelevant on a higher level&lt;/strong&gt;. Technology or an architecture style can be an enabling factor or even a strategic asset, but they are never the ones that drive the campaign.&lt;/p&gt;

&lt;p&gt;One of the best places to learn such things in practice is by working in a startup. Such places tend to have rapidly changing battlefield and rather low tolerance for stupid decisions. In war of startups you win or you die.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=2l-PgSy_7I0:7PR7JzC04sk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=2l-PgSy_7I0:7PR7JzC04sk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=2l-PgSy_7I0:7PR7JzC04sk:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=2l-PgSy_7I0:7PR7JzC04sk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=2l-PgSy_7I0:7PR7JzC04sk:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=2l-PgSy_7I0:7PR7JzC04sk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=2l-PgSy_7I0:7PR7JzC04sk:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/2l-PgSy_7I0" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/4/14/software-war-starts-with-a-map-context-map.html</guid>
         <pubDate>Sat, 14 Apr 2012 11:49:03 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/2l-PgSy_7I0/software-war-starts-with-a-map-context-map.html</feedburner:origLink></item>
      <item>
         <title>Out-of-shelf trilemma</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/3qCSdfa0lyw/out-of-shelf-trilemma.html</link>
         <description>&lt;p&gt;&lt;img style="float:left;" src="http://blog.lokad.com/storage/Icon-Shelfcheck-160x140.png" alt="Shopping Cart logo"/&gt;Most people are familiar with the notion of dilemma when two possibilities are offered neither of which being acceptable. &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/calculate-safety-stocks-with-sales-forecasting.ashx"&gt;Safety stock analysis&lt;/a&gt;&amp;nbsp;is a classical mathematical dilemma: you can&amp;nbsp;&lt;strong&gt;choose between more stocks or more stockouts&lt;/strong&gt;, yet both of them generate extra costs.&lt;/p&gt;
&lt;p&gt;However, it exists situations where the trade-off is more complex in the sense there are more than 2 unfavorable options to balance. When there are &lt;strong&gt;3 unfavorable options&lt;/strong&gt;&amp;nbsp;to be balanced, the situation is called a &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Trilemma"&gt;trilemma&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Out-of-shelf (OOS) monitoring,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/shelfcheck-on-shelf-availability-optimization.ashx"&gt;ala Shelfcheck&lt;/a&gt;, is facing a trilemma when it comes to the &lt;em&gt;quality&lt;/em&gt;&amp;nbsp;of the alerts being delivered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sensibility&lt;/strong&gt;, the percentage of OOS problems being captured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Precision&lt;/strong&gt;, the percentage of true alerts within all OOS alerts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency&lt;/strong&gt;, the delay between then start of the OOS problem and the alert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pick any two&lt;/strong&gt;, but you can't have them all. In fact, for any given demand forecasting accuracy, improving any of those 3 metrics come at the expense of the 2 other metrics.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:15836867</guid>
         <pubDate>Sat, 14 Apr 2012 09:05:49 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/4/14/out-of-shelf-trilemma.html</feedburner:origLink></item>
      <item>
         <title>Increase your conversion by nurturing trust</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/L--oRGOclw4/increase-your-conversion-by-nurturing-trust.html</link>
         <description>&lt;p&gt;Sales cycles in business software can range from days to multiple month and even years. Both the complexity of the product itself, and the dependency of customer value on implementation and business context, will increase the average time required for a sale.&lt;/p&gt;
&lt;p&gt;The number one challenge in this process is to not lose the prospect along the way. A key ingredient is the ability to create and maintaining the prospect&amp;rsquo;s trust in the value of your product. Expressed differently, the sales process is the exercise of &lt;strong&gt;creating and maintaining the client&amp;rsquo;s trust in a better return on investment compared to the alternatives,&lt;/strong&gt; which include not buying at all.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It is easy to underestimate the non-monetary cost&lt;strong&gt; &lt;/strong&gt;for a prospect to go through an evaluation and purchasing process. In the earlier stages of a sales process the investment of time, effort and emotions as well as the risk of failure are often far more important considerations for a prospect than the price of the product or service.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is therefore key to nurture and maintain your prospect&amp;rsquo;s trust in a competitive return on investment throughout the sales process.&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Create trust it is a &amp;lsquo;cheap&amp;rsquo; investment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make it easy to understand what your product does&lt;/strong&gt;, how it will solve your prospects problem, and how it can be evaluated. If this is not rapidly and easily understood, how much trust will your prospect have in a smooth and successful evaluation process? &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be specific and direct &lt;/strong&gt;in the description of company and products. Avoid corporate happy talk and generic messages. Switch on your &amp;lsquo;happy talk meter&amp;rsquo; and read your own website. Beware if you come acrossed things like (real life example) &lt;em&gt;&amp;ldquo;We provide IT solutions focused on the customer&amp;rsquo;s needs. We excel in the industry due to our large experience and wide business knowledge.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Distill your message &lt;/strong&gt;of all the things you would like to explain about the great functions, benefits and reasons to buy your product into the very essence to arrive at your core message. This is not always easy, but worthwhile the effort.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Create short loops of positive reinforcement. &lt;/strong&gt;Guide your prospect through an evaluation process that is broken down into smaller pieces, and that ideally will provide several &amp;lsquo;intermdiate results&amp;rsquo; that allow early feedback. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Create trust you deliver what you promise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Make the &lt;strong&gt;credibility of your messaging&lt;/strong&gt; a high priority. Avoid extraordinary claims that you cannot back up with case studies, examples or a trial. Avoid &amp;lsquo;sales speak&amp;rsquo; that sounds clich&amp;eacute; and overblown. And don&amp;rsquo;t take your prospect for a fool. Banging on about how your software is &amp;lsquo;free&amp;rsquo; (real life example) when really this only concerns your super limited &amp;lsquo;basic basic&amp;rsquo; plan is a sure way to annoy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be specific on where you excel and where the limits are&lt;/strong&gt; of what you can provide. As I mentioned in an earlier post,&lt;a rel="nofollow" target="_blank" href="http://www.matthias-steinberg.com/journal/2012/2/2/a-strong-sales-argument-the-features-i-dont-have.html"&gt; the feature you don&amp;rsquo;t have might be one of your best sales arguments&lt;/a&gt; &amp;ndash; for the simple fact that it boosts your credibility.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Know &amp;lsquo;where&amp;rsquo; to sell &lt;/strong&gt;and where to educated and inform. Of course you should toot your horn on your product, tour and homepage. Yet, in your educational and background materials, do not mix your content with blatant sales messages. Rather place a link to your product pages at the end of a piece of content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Create trust you know what you do&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s the content, again!&lt;/strong&gt;. The materials you provide on your website will have a huge impact on the trust your prospects will put in your ability to deliver.&lt;/p&gt;
&lt;p&gt;Work on &lt;strong&gt;quality over quantity&lt;/strong&gt;. Information is available anywhere and in masses, high quality information is all the more scarce. The &amp;lsquo;depth&amp;rsquo; and quality of the information concerning &amp;lsquo;your&amp;rsquo; topic will directly reflect on your company and products. And the more trust will prospects put into you as the right place to spend time and money to solve &amp;lsquo;his&amp;rsquo; problem.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Educate your customers&lt;/strong&gt;. Providing learning and educational materials covering the topics that are relevant to your prospects undertaking. Primers, how-to guides, white papers, FAQs etc. will have the double positive effect of creating trust as well as putting your prospects into a better position to determine the quality of your offering. The first quality info I ever read on lead nurturing was &lt;a rel="nofollow" target="_blank" href="http://www.marketo.com/"&gt;Marketo&lt;/a&gt;&amp;rsquo;s guide on lead nurturing. Where will I turn first if I need a lead nurturing software?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Create trust you are alive and kicking&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The closer you are to your prospects, the more comfortable they will feel in investing in the evaluation process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make it easy for prospects to contact you&lt;/strong&gt; by making phone numbers and email clearly and always visible. Get local phone numbers for your main markets. More resource intensive, but even better are life chat applications such as liveperson.com.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surprise your prospects&lt;/strong&gt; in the speed and quality of your follow-up. Use clear prioritization metrics and processes to insure your support focusses activity and provides quality where it matters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be proactive &lt;/strong&gt;by monitoring client activity. For this purpose we have built an application at Lokad that provides sales with real time information on client actions. It allows us to contact the client and provide support right at the moment when the prospect is engaged and needing support.&lt;/p&gt;
&lt;p&gt;There are many ways to nurture your client&amp;rsquo;s trust, which will vary according to your product and customers. Regardless, I believe it is a profitable undertaking to find and pursue the most efficient and powerful ones for your business.&amp;nbsp;&lt;/p&gt;</description>
         <author>Matthias Steinberg</author>
         <guid isPermaLink="false">http://www.matthias-steinberg.com/journal/2012/4/13/increase-your-conversion-by-nurturing-trust.html</guid>
         <pubDate>Fri, 13 Apr 2012 16:01:10 +0000</pubDate>
      <feedburner:origLink>http://www.matthias-steinberg.com/journal/2012/4/13/increase-your-conversion-by-nurturing-trust.html</feedburner:origLink></item>
      <item>
         <title>Lokad.CQRS is not</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/xLIcoR6rrwk/lokadcqrs-is-not.html</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://lokad.github.com/lokad-cqrs/"&gt;Lokad.CQRS Sample Project&lt;/a&gt; is NOT a framework. It also is not the only way to do CQRS. It is just sample for one of many ways to provide technical implementation for a given Bounded Context. &lt;/p&gt;

&lt;p&gt;If you have team that is friendly with all of these at once: DDD, CQRS and ES, then this specific CQRS architectural style would be cheap and reliable way for you to rapidly deliver complex domain models to continuously changing world.&lt;/p&gt;

&lt;p&gt;If this team is also enhanced with cloud computing experience and lean development practices, project deliverables could be easily evolved and deployed to various environments: starting from on-premises and up to the cloud.&lt;/p&gt;

&lt;p&gt;This brings up the most common mistake that I make in my blog posts. I forget to stress:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how important DDD is for our projects.&lt;/li&gt;
&lt;li&gt;how important it is to have people with the proper skills for such projects.&lt;/li&gt;
&lt;li&gt;how important is low-friction development for our projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CQRS architecture style that is used by Lokad is based on these principles. It will be applicable only if they match your environment.&lt;/p&gt;

&lt;p&gt;NB: please note, that I didn't mention cloud deployments and massive scalability in the list above. These are side effects of Lokad.CQRS architecture style which are valuable but less important.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=jIBjKAOcOLQ:UHow1xlezag:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=jIBjKAOcOLQ:UHow1xlezag:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=jIBjKAOcOLQ:UHow1xlezag:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=jIBjKAOcOLQ:UHow1xlezag:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=jIBjKAOcOLQ:UHow1xlezag:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=jIBjKAOcOLQ:UHow1xlezag:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=jIBjKAOcOLQ:UHow1xlezag:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/jIBjKAOcOLQ" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/4/10/lokadcqrs-is-not.html</guid>
         <pubDate>Tue, 10 Apr 2012 04:20:09 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/jIBjKAOcOLQ/lokadcqrs-is-not.html</feedburner:origLink></item>
      <item>
         <title>Bird's-eye view of a Distributed System - Context Map</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/bZBN8H7-uVI/birds-eye-view-of-a-distributed-system-context-map.html</link>
         <description>&lt;p&gt;In one of my previous posts on &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/3/31/anatomy-of-distributed-system-a-la-lokad.html"&gt;Anatomy of Distributed System à la Lokad&lt;/a&gt; we were zooming into the design of a system that could be built as a part of SaaS company. Such system was built with and around CQRS/ES concepts.&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/03/2012-03-31_anatomy_2_bc_connected.png" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;This approach looks like a nice by-the-book design: bounded contexts that are based on a uniform design and connected together to deliver some functionality. This is the kind of drawing that could be produced by an ivory tower architect or a consultant that is "too expensive to ever touch the codebase".&lt;/p&gt;

&lt;p&gt;However as we know, &lt;strong&gt;nothing exists in isolation from the real world&lt;/strong&gt;. Every entity (either biological  or digital) is always connected to much larger environment (and is affected by it). In software projects, for instance, you would have other departments to cooperate with, customers to serve and partners to integrate with. You might also have Microsoft and Apple OS to curse about. Even political rivalry between departments A and B in an organization could matter (especially if they share a database).&lt;/p&gt;

&lt;p&gt;So there is an immensely &lt;strong&gt;complex and diverse ecosystem that surrounds every single software project&lt;/strong&gt;. There are different technologies, languages, concepts, mentalities and resource constraints. These things do not necessarily belong to the project directly, but could have an extremely strong impact on risks and costs, potentially leading to the &lt;strong&gt;difference between success and failure&lt;/strong&gt;. Good software developer will always consider the most important of these strategic factors, while making tactical decisions.&lt;/p&gt;

&lt;p&gt;One of the ways to take some of these factors into consideration is by changing perspective of your system and by looking from bird's-eye view at it and other systems that it is linked to. Let's &lt;strong&gt;zoom out&lt;/strong&gt; of our CQRS/ES-based set of systems in a department (which was discussed in &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2012/3/31/anatomy-of-distributed-system-a-la-lokad.html"&gt;Anatomy post&lt;/a&gt;) and look at a bigger picture. We'll include other departments, some of the customers and partners.&lt;/p&gt;

&lt;p&gt;This view will be based on "Context Map" approach of DDD but slightly expanded to cover ecosystem within and around the company. I will keep CQRS/ES-based bounded contexts marked with orange border, while "external" ones will have borders of other colors (just like countries on a map).&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-07_context-map-2.png" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Ok, now that's a subtle change. We get a lot more variety in colors and shades, which represent differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;outside elements have technologies and context specifics that differ greatly from ours;&lt;/li&gt;
&lt;li&gt;our own elements turn out to have different shades of CQRS/ES implementations as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, each bounded context is different. These differences can be caused by a huge amount of internal and external factors. For example, consider these two contexts, which happen to be owned by different organizations:&lt;/p&gt;

&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://abdullin.com/storage/uploads/2012/04/2012-04-07_bcs.png" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Obviously, &lt;strong&gt;these differences would make different approaches more or less successful than the others&lt;/strong&gt;. And it actually is perfectly OK to have different approaches and technologies living in the same organization or a project, if this is justified by the environment. Unless, of course you are a developer from a Soviet Russia that has to employ absolutely identical set of tools everywhere (i.e. SQL everywhere, NHibernate everywhere, NServiceBus everywhere etc).&lt;/p&gt;

&lt;p&gt;A few vivid examples of ignoring the strategic context, while charging into the battle were clearly demonstrated by Napoleon and Hitler. They came over to visit Russia and stayed over for the winter with such extended and fragile supply lines. &lt;/p&gt;

&lt;p&gt;So, please, don't repeat mistakes already covered by history books (these are the most shameful ones) and: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Take into consideration real world&lt;/strong&gt; that surrounds this project, trends and risks that surround in future.&lt;/li&gt;
&lt;li&gt;Split your environment into set of bounded contexts, that could be distinguished by similar language, match with organizational boundaries or technology manifestations. &lt;strong&gt;Map the terrain&lt;/strong&gt; to make it more understandable.&lt;/li&gt;
&lt;li&gt;Before considering to apply CQRS/ES (or any other tech) to a given bounded context - &lt;strong&gt;consider and compare it with other approaches&lt;/strong&gt;, their risks and costs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delay non-essential decisions&lt;/strong&gt; as much as possible.&lt;/li&gt;
&lt;li&gt;Push for approaches that allow you to &lt;strong&gt;capture feedback from real life as fast as possible&lt;/strong&gt; (lower development friction, faster iterations, simple architectures).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep it simple and separated&lt;/strong&gt; (KISS).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me reiterate.&lt;/p&gt;

&lt;p&gt;Domain-Driven Design with its approach of bounded contexts that can be joined into a strategic context map - is one of the ways to visualize and represent environment surrounding and affecting a project. This approach can help to take into account all important factors and figure out the tactical details of most implementation, architecture and technology. Sometimes CQRS/ES approach would be the best fit, however more frequently you would have a different set of conditions that require a different solution to the challenge ahead.&lt;/p&gt;

&lt;p&gt;Pick your weapons wisely, for they might affect the outcome of the battle and war.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=yzuhpnVEZw8:PFOJXa1_Rx4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=yzuhpnVEZw8:PFOJXa1_Rx4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=yzuhpnVEZw8:PFOJXa1_Rx4:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=yzuhpnVEZw8:PFOJXa1_Rx4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=yzuhpnVEZw8:PFOJXa1_Rx4:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.abdullin.com/~ff/Shared-Libraries?a=yzuhpnVEZw8:PFOJXa1_Rx4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Shared-Libraries?i=yzuhpnVEZw8:PFOJXa1_Rx4:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Shared-Libraries/~4/yzuhpnVEZw8" height="1" width="1"/&gt;</description>
         <author>Rinat Abdullin</author>
         <guid isPermaLink="false">http://abdullin.com/journal/2012/4/7/birds-eye-view-of-a-distributed-system-context-map.html</guid>
         <pubDate>Sat, 07 Apr 2012 14:47:46 +0000</pubDate>
      <feedburner:origLink>http://feeds.abdullin.com/~r/Shared-Libraries/~3/yzuhpnVEZw8/birds-eye-view-of-a-distributed-system-context-map.html</feedburner:origLink></item>
      <item>
         <title>Bizarre pricing, does it matter? (B2B)</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/deDSzdpQw9c/bizarre-pricing-does-it-matter-b2b.html</link>
         <description>&lt;p&gt;My company has just released &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2012/3/12/quantiles-inventory-optimization-20.html"&gt;quantile forecasts&lt;/a&gt;&amp;nbsp;upgrade. It's no less than a small revolution for us, however, unless you've got some inventory to manage, it's probably not too relevant to your business.&lt;/p&gt;
&lt;p&gt;Another salient aspect is our&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/pricing.ashx"&gt;new pricing for quantiles&lt;/a&gt;&amp;nbsp;(the old pricing for classic forecasts remains untouched). Lokad is selling a monthly subscription, and if $q_i$ represents one of the actual &lt;em&gt;quantile values&lt;/em&gt; retrieved by the client during the month, then the monthly cost $C$ is given by:&lt;/p&gt;
&lt;p&gt;$$C = $0.15 &amp;#92;times &amp;#92;left(&amp;#92;sum_{i=0}^n q_i^{2/3} &amp;#92;right)^{2/3}$$&lt;/p&gt;
&lt;p&gt;&lt;del&gt;We hesitated to round 0.15 as $&amp;#92;frac{&amp;#92;pi}{2}$ because formula look better with Greek letters.&lt;/del&gt;&amp;nbsp;Obviously, it's not &lt;em&gt;simple&lt;/em&gt;, and most people would go as far as saying it's &lt;strong&gt;downright obscure&lt;/strong&gt;, but it is really a &lt;strong&gt;good pricing, or just plain insanity?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To understand a bit where Lokad is coming from, let's start with the fact that we are a &lt;strong&gt;B2B software&lt;/strong&gt; company. About 95% of competitors don't have any kind of &lt;em&gt;public&lt;/em&gt; pricing: you can only ask for a &lt;em&gt;quote&lt;/em&gt;, and then a talented sales guy will contact you to figure out your &lt;em&gt;maximum budget&lt;/em&gt;, only to get back to you with a quote at 120% of the figure you gave him.&lt;/p&gt;
&lt;p&gt;However, I strongly favor public pricing, not because it's more transparent, honest, fair, whatever, but because it's a massive&amp;nbsp;&lt;strong&gt;time saver&lt;/strong&gt;. At Lokad, we don't enter into time-consuming pricing negotiations except for the largest clients, where it does make sense to spend time negotiating.&lt;/p&gt;
&lt;p&gt;The cardinal rule of software pricing is that it should capture the &lt;strong&gt;willingness to pay&lt;/strong&gt;&amp;nbsp;of the client, which, in B2B, is typically related to the economic gains generated by the usage of the product. In the case of demand forecasting, benefits can be &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/accuracy-gains-(inventory).ashx"&gt;accurately computed&lt;/a&gt;. However, turning this&amp;nbsp;&lt;em&gt;forecasting&amp;nbsp;benefits&lt;/em&gt;&amp;nbsp;formula into a pricing formula is insaly complex in the general case.&lt;/p&gt;
&lt;p&gt;Hence, we decided to settle for&amp;nbsp;&lt;strong&gt;heuristics&lt;/strong&gt;&amp;nbsp;that somehow mimic this theoretical willingness to pay, ran many simulations over our existing customer base, and finally figured out the formula. I do not claim that this pricing formula is &lt;em&gt;optimal&lt;/em&gt;&amp;nbsp;in any way: it is not. However, it does bring a very reasonable pricing for clients ranging from 1-man companies to 100,000+ employees companies.&lt;/p&gt;
&lt;p&gt;Pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;(As far we can judge)&lt;/em&gt; It's aligned with the value Lokad creates for clients.&lt;/li&gt;
&lt;li&gt;It's still simple enough to be memorized in 20s.&lt;/li&gt;
&lt;li&gt;It does not put incentive to &lt;em&gt;game&lt;/em&gt;&amp;nbsp;the pricing by excluding slow movers (i.e. products with low sales) from the forecasting process.&lt;/li&gt;
&lt;li&gt;There is no &lt;em&gt;threshold&lt;/em&gt;&amp;nbsp;effect, where the pricing jumps to a much larger number just because the company has 1 more product than what the license would support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It certainly falls into the category of &lt;em&gt;bizarre&lt;/em&gt;&amp;nbsp;pricing.&lt;/li&gt;
&lt;li&gt;The only way to know &lt;em&gt;for sure&lt;/em&gt; the real monthly cost is to give a try (1).&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Some prospects try the pricing formula on their own, and get it wrong (2).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(1) This statement applies to most metered SaaS, even if the pricing is linear. For example, at Lokad we had very little clue about our exact bandwidth consumption until we migrated toward the cloud (with dedicated servers, bandwidth was part of the package).&lt;/p&gt;
&lt;p&gt;(2) I believe this partly explains why 95% of our competitors don't put any public price on display. That, and the fact that a very expensive pricing is likely to scare away prospects, before getting the chance of cornering them into the sales process.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I would be interested to see if other B2B niches have designed their own bizarre pricing formulas. Don't hesitate to submit them in comments.&lt;/em&gt;&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2012/3/19/bizarre-pricing-does-it-matter-b2b.html</guid>
         <pubDate>Mon, 19 Mar 2012 20:08:45 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2012/3/19/bizarre-pricing-does-it-matter-b2b.html</feedburner:origLink></item>
      <item>
         <title>SaaS pricing: Getting your pricing plan right.</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/kq69-rkIMas/saas-pricing-getting-your-pricing-plan-right.html</link>
         <description>&lt;p&gt;The other day I came across a SaaS pricing plan that stated for the most feature rich option: &amp;lsquo;Please contact us for a quote&amp;rsquo;. My buying momentum reduced instantly to something close to zero.&lt;/p&gt;
&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;img style="width:300px;" src="http://www.matthias-steinberg.com/storage/SaaS pricing.png?__SQUARESPACE_CACHEVERSION=1332316024823" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;Public pricing today is the norm for SaaS offerings, and investigating the individual prospect&amp;rsquo;s willingness to pay is largely a thing of the past. In a public pricing model, the seller is trading in pricing flexibility for lower barriers to entry, increased &amp;lsquo;self-servability&amp;rsquo; and transparency. All the more important is therefore the design of a sensible, and profitable, pricing plan.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;1. Know your pricing criterion: Customer value&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The single criterion you should use to model your pricing plan is &lt;strong&gt;customer value&lt;/strong&gt;. Think through your main customer groups. &amp;nbsp;Segmentation might be by vertical application, size, or by type of use and application. Identify your customers&amp;rsquo; primary motivation to use the product. If you are unsure, it is time you speak to prospects and customers. The reason customers bought in the first place will give it away. Ask prospective customers what main characteristic(s) would make them buy and/or switch vendors.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;2. Find the &amp;lsquo;best&amp;rsquo; proxy for customer value&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The challenge is to identify the pricing criteria that most closely tracks customer value. 'Features' and 'seats' are the usual suspects in software price lists. Yet, Software provides a lot more pricing possibilities, given the high contribution margin of each sale. Performance, throughput, number of projects, storage space, resilience and availability are a few ideas. A combination of several characteristics bundled in a subscription plan can help to more closely track different customer groups.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;3. Resist the temptation: Don&amp;rsquo;t think customer profitability&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Customer acquisition and customer service cost can be high. It is therefore tempting to think bottom up and price &amp;lsquo;cost plus&amp;rsquo;. Yet, ultimately your customers decide what they are willing to pay. Focus therefore first on approximating customer value, and work to control cost. Disregard the customer groups that will not be profitable anyway.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;4. Calibrate to reflect your market strategy&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Once you have identified your pricing criteria, you need to calibrate. Model the price for your different customer groups and then play with scenarios. Benchmark the outcome against alternative options in the market and calibrate according to your own competitive strategy.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;5. Don&amp;rsquo;t lose any sleep: Once size will not fit all&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Finding a pricing plan that fits all potential customer groups is most likely unrealistic. Know your core target customer groups and get it right for them, and don&amp;rsquo;t lose any sleep over the rest.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;6. Let your customers self-select&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Your client is the best positioned to approximate willingness to pay. A good way for you to capitalize on this is by providing to your clients with the opportunity to trade &lt;strong&gt;convenience&lt;/strong&gt; against cost. The cost insensitive clients will naturally go for the &amp;ldquo;full package&amp;rdquo; deal, the cost sensitive clients will gravitate towards painstakingly optimizing their cost, while you avoid diluting you product&amp;rsquo;s core performance.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;7. Give your customer a chance to grow&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A friend recently commented: &amp;ldquo;Salesforce.com seems cheap in the beginning, but you always end up&amp;nbsp; adding on more features until it ends up being very expensive&amp;rdquo;. Growing with and within your existing clients is a great way of growing your own business. Customers will be more likely to increase their spending with you once they are satisfied with your product and trust has been established. You should give them the chance!&lt;/p&gt;
&lt;p&gt;In addition to any amount of analysis and thought you put into devising your payment plan, it is always recommendable to take a look at the pricing of competing as well as unrelated SaaS businesses for ideas and to get a feel for the market&amp;mdash;even if it is only to identify what you don&amp;rsquo;t want to do.&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
         <author>Matthias Steinberg</author>
         <guid isPermaLink="false">http://www.matthias-steinberg.com/journal/2012/3/14/saas-pricing-getting-your-pricing-plan-right.html</guid>
         <pubDate>Wed, 14 Mar 2012 09:57:31 +0000</pubDate>
      <feedburner:origLink>http://www.matthias-steinberg.com/journal/2012/3/14/saas-pricing-getting-your-pricing-plan-right.html</feedburner:origLink></item>
      <item>
         <title>Quantiles = Inventory Optimization 2.0</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/7l0mnFkRVfk/quantiles-inventory-optimization-20.html</link>
         <description>&lt;p&gt;&lt;img src="http://blog.lokad.com/storage/tau-logo.png" alt="Quantile Logo" style="float:left;margin-right:20px;"/&gt;Getting more accurate forecasts, that &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/accuracy-gains-(inventory).ashx"&gt;turn into profits&lt;/a&gt;, is the No1 priority for Lokad. However, demand forecasting has been extensively researched for more than a half a century, and each &lt;strong&gt;0.1% of extra accuracy&lt;/strong&gt; is typically nothing less than a &lt;strong&gt;uphill battle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sometimes though, we make a breakthrough.&lt;/em&gt; Today, we are announcing the most significant &lt;strong&gt;technology upgrade&lt;/strong&gt; of Lokad since its launch &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2006/11/28/lokad-gets-live.html"&gt;6 years ago&lt;/a&gt;: the immediate availability of &lt;strong&gt;&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/quantile-forecasting-technology.ashx"&gt;quantile forecasts&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quantiles are &lt;strong&gt;disruptive&lt;/strong&gt; in the sense that in many situations they make classic forecasts &lt;strong&gt;plain obsolete&lt;/strong&gt; as far inventory optimization is concerned - for retail, wholesale and manufacturing businesses.&lt;/p&gt;

&lt;p&gt;We have identified 3 situations where quantiles really shine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/service-level-definition-and-formula.ashx"&gt;service levels&lt;/a&gt; at 90% and above.&lt;/li&gt;
&lt;li&gt;Intermittent demand (slow mover's).&lt;/li&gt;
&lt;li&gt;Bulk orders (spiky demand).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those situations, benchmarks against our own classic forecasting technology indicate that quantile forecasts typically bring either &lt;strong&gt;20% less inventory or 20% less stockouts&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Extraordinary claims require extraordinary evidence. &lt;em&gt;Carl Sagan&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, the many benchmarks that we have made so far with our prospects and clients indicate that our &lt;em&gt;classic&lt;/em&gt; forecasting technology is already ahead of the competition; but with quantile forecasts, it's whole new level of inventory optimization that can be achieved. &lt;/p&gt;

&lt;p&gt;Don't hesitate to &lt;a rel="nofollow" target="_blank" href="http://app.lokad.com/register"&gt;put quantiles to the test&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;The story behind the quantile upgrade&lt;/h3&gt;

&lt;p&gt;Quantile forecasting (also called &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/quantile-regression-(time-series)-definition.ashx"&gt;quantile regression&lt;/a&gt;) has been around for decades among academic circles. Then, in finance, analysts have been extensively using quantiles for &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Value_at_risk"&gt;Value at Risk&lt;/a&gt; (VaR) analysis since the late 1980s. &lt;/p&gt;

&lt;p&gt;At Lokad, quantiles have been around for a long time as well. For example, back in 2009, &lt;a rel="nofollow" target="_blank" href="http://www.lsta.upmc.fr/BIAU/bp.pdf"&gt;Sequential Quantile Prediction of Time Series&lt;/a&gt;. &lt;em&gt;IEEE Transactions on Information Theory, March 2011, vol. 57, n°3&lt;/em&gt; has been published by one of us. However, until very recently, quantiles were &lt;strong&gt;very mistakenly&lt;/strong&gt; considered a mathematical distraction (business-wise) rather than a &lt;strong&gt;mission critical&lt;/strong&gt; concept. &lt;/p&gt;

&lt;p&gt;What did hold us back was not lacking insights in statistics, but lacking insights in the profound relationship between &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/reorder-point-definition.ashx"&gt;quantiles and inventory optimization&lt;/a&gt;. This insight was triggered, mostly out of dumb luck, when a client did ask us to figure out a formula to compute &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/service-level-definition-and-formula.ashx"&gt;optimal service levels&lt;/a&gt; for her inventory.&lt;/p&gt;

&lt;h3&gt;A breakthrough yes, but a late one&lt;/h3&gt;

&lt;p&gt;This quantile breakthrough is only very &lt;em&gt;relative&lt;/em&gt; in the sense that quantiles have been already applied successfully for decades in other trades. However, there is one aspect that partially explains this late arrival: quantile models typically require about &lt;strong&gt;10x more processing power&lt;/strong&gt; compared to classic forecasting models. Without &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/forecasting-technology.ashx"&gt;cloud computing&lt;/a&gt;, we would not have been able to put quantiles in production, while preserving an aggressive &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/pricing.ashx"&gt;pricing&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:15386892</guid>
         <pubDate>Mon, 12 Mar 2012 08:00:35 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/3/12/quantiles-inventory-optimization-20.html</feedburner:origLink></item>
      <item>
         <title>Cloud questions from Syracuse University, NY</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/VMGx6NsXNYg/cloud-questions-from-syracuse-university-ny.html</link>
         <description>&lt;p&gt;A few days ago, I received a couple of questions from a student of Syracuse University, NY who is writing a paper about cloud computing and virtualization. Questions are relatively broad, so I am taking the opportunity to directly post here the answers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What was the actual technical and business impact of adopting cloud technology?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The technical impact was a complete rewrite of our codebase. It has been the large upgrade ever undertaken by Lokad, and it did span over 18 months, more or less mobilizing the entire dev workforce during the transition.&lt;/p&gt;
&lt;p&gt;As far business is concerned, it did imply that most of the business of Lokad during 2010 (the peak of our cloud migration) has been stalled for a year or so. For a young company, 1 year of delay is a &lt;em&gt;very&lt;/em&gt; long time.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;On the upside, before the migration to the cloud, Lokad was stuck with SMBs. Serving any mid-large retail network was beyond our technical reach. With the cloud, processing super-large retail networks had become feasible.&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What, if any, negative experience did Lokad encounter in the course of migrating to the cloud?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Back in 2009, when we did start to ramp up our cloud migration efforts, the primary problem was that none of us at Lokad had any in-depth experience of what the cloud &lt;em&gt;implies&lt;/em&gt;&amp;nbsp;as software architecture is concerned. Cloud computing is not just &lt;em&gt;any kind&lt;/em&gt;&amp;nbsp;of distributed computing, it comes with a rather &lt;a rel="nofollow" target="_blank" href="http://vermorel.com/journal/2011/4/5/a-few-design-tips-for-your-nosql-app.html"&gt;specific mindset&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hence, the first obstacle was to figure out by ourselves patterns and practices for enterprise software on the cloud. It has been a tedious journey to end-up with &lt;a rel="nofollow" target="_blank" href="http://lokad.github.com/lokad-cqrs/"&gt;Lokad.CQRS&lt;/a&gt;&amp;nbsp;which is roughly the 2nd generation of native cloud apps. We rewrote everything for the cloud once, and then we did it again to get sometime simpler, leaner, more maintainable, etc.&lt;/p&gt;
&lt;p&gt;Then, at present time, most our recurring cloud problems come from integrations with legacy &lt;em&gt;pre-Web&lt;/em&gt;&amp;nbsp;enterprise software. For example, operating through&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Virtual_private_network"&gt;VPNs&lt;/a&gt;&amp;nbsp;from the cloud tends to be a huge pain. In contrast, modern apps that offer REST API are a much more natural fit for cloud apps, but those are still rare in the enterprise.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;From your current perspective, what, if anything, would you have done differently?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tough question, especially for a data analytics company such as Lokad where it can take 1 year to figure out the &lt;a rel="nofollow" target="_blank" href="http://vermorel.com/journal/2011/10/14/oddities-of-machine-learning-software-code.html"&gt;100 &lt;em&gt;magic&lt;/em&gt; lines of code&lt;/a&gt; that will let you outperform the competion. Obviously, if we had to rewrite &lt;em&gt;again&lt;/em&gt;&amp;nbsp;Lokad from scratch, it would take us much less time. However it would be dismissing that the bulk of the effort has been the R&amp;amp;D that made our forecasting technology &lt;em&gt;cloud native&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The two technical aspects where I feel we have been hesitating for too long were SQL and SOAP.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It took us too long to decide to ditch SQL entirely in favor of some native cloud storage (basically the Blob Storage offered by Windows Azure).&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://vermorel.com/journal/2010/12/22/a-few-tips-for-web-api-design.html"&gt;SOAP was a somewhat similar case&lt;/a&gt;. It took us a long time to give up on SOAP in favor of REST.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In both cases, the problem was that we had (or maybe it was &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/aboutus.ashx"&gt;just me&lt;/a&gt;) not been fully accepting the &lt;em&gt;extent&lt;/em&gt;&amp;nbsp;of the implications of a migration toward the cloud. We remained stuck for months with older paradigms that caused a lot of uneeded frictions. Giving up on those from Day 1 would have save a lot of efforts.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2012/2/22/cloud-questions-from-syracuse-university-ny.html</guid>
         <pubDate>Wed, 22 Feb 2012 16:45:58 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2012/2/22/cloud-questions-from-syracuse-university-ny.html</feedburner:origLink></item>
      <item>
         <title>How much do you get for 1% extra accuracy?</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/5T-ix9CVGMg/how-much-do-you-get-for-1-extra-accuracy.html</link>
         <description>&lt;p&gt;&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://blog.lokad.com/storage/cristal-ball.jpg"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;One of the problems that comes with being specialists of a subject is that you tend to take for granted what is obscure for anyone but your peers. At Lokad, despite our best efforts, we are no exception, especially when it comes to forecasting...&lt;/p&gt;

&lt;p&gt;Recently, we realized that we had never provided any in-depth &lt;strong&gt;quantitative assessment of the financial gains generated by an increase of the forecasting accuracy&lt;/strong&gt;, which is about the &lt;em&gt;raison d'être&lt;/em&gt; for the company. Furthermore, after investigating the web, we realized that other forecasting vendors (&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/forecasting-software-competition.ashx"&gt;competitors&lt;/a&gt;) were rather fuzzy too about the financial rewards that could be achieved through better forecasts.&lt;/p&gt;

&lt;p&gt;However, it's not &lt;em&gt;that&lt;/em&gt; complicated. With the following variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$D$ the turnover (total annual sales).&lt;/li&gt;
&lt;li&gt;$m$ the gross margin.&lt;/li&gt;
&lt;li&gt;$&amp;#92;alpha$ the &lt;em&gt;cost of stockout to gross margin&lt;/em&gt; ratio.&lt;/li&gt;
&lt;li&gt;$p$ the service level achieved with the current error level (and current stock level).&lt;/li&gt;
&lt;li&gt;$&amp;#92;sigma$ the forecast error of the system in place, expressed in MAPE (mean absolute percentage error).&lt;/li&gt;
&lt;li&gt;$&amp;#92;sigma_n$ the forecast error of the new system being benchmarked (hopefully lower than $&amp;#92;sigma$).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;yearly benefit $B$ of going for the new forecasting system&lt;/strong&gt; is given by:&lt;/p&gt;

&lt;p&gt;$$B = D (1 - p) m &amp;#92;alpha &amp;#92;frac{&amp;#92;sigma - &amp;#92;sigma_n}{&amp;#92;sigma}$$&lt;/p&gt;

&lt;p&gt;For the proof of this result, check the &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/accuracy-gains-(inventory).ashx"&gt;full length article&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:15114498</guid>
         <pubDate>Mon, 20 Feb 2012 17:03:57 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/2/20/how-much-do-you-get-for-1-extra-accuracy.html</feedburner:origLink></item>
      <item>
         <title>A strong sales argument: The features I don't have.</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/jGVVKKXphf0/a-strong-sales-argument-the-features-i-dont-have.html</link>
         <description>&lt;p&gt;It&amp;rsquo;s obvious: The better your product, the easier the sale. If you have ever sold anything, you acted accordingly. You polished, presented, explained, praised. Talking about all the beautiful things your product can do comes naturally to most sellers. What is far more difficult is &lt;strong&gt;talking about what your product cannot do&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saying NO to prospects when you want to just say YES&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I explain product and features, quantify business value, highlight competitive advantages, and demonstrate how wonderfully my product will satisfy my prospect&amp;rsquo;s needs. It seems to go well. Then my prospect thinks, pauses, and says: &amp;ldquo;Ok, but it is important to me that your product &amp;nbsp;also does xyz, can you do that?&amp;rdquo; or &amp;ldquo;Other companies we are considering can do xyz, what about you?&amp;rdquo;. And I know we can&amp;rsquo;t. It usually feels awful. Everything inside me wants to SAY YES. Or at least something mushy like &amp;ldquo;I am sure we can make that work&amp;rdquo;. Or &amp;ldquo;I will have to check but I am confident that it can be done&amp;rdquo;. Or another of the hundreds of things I can say that are not a a no. Yet, I believe usually the best thing to say is&lt;strong&gt; &amp;lsquo;no, we cannot!&amp;rsquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it is good to explain what you can&amp;rsquo;t do.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It builds trust. &lt;/strong&gt;I believe that in making a sale, particularly a more complex sale as is typically the case in software, at least as important as features and performance or price is trust. Making a purchasing decision is always a risk, even when the price is low or zero. The buyer risks losing time, nerves, reputation, goodwill&amp;hellip; &amp;nbsp;and often money. Therefore building trust is a key element of the sale. Brand name, references, testimonials, free trials are all typical elements that help in this regard. I find that explaining clearly the limitations of my product is another great way of building trust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It calibrates what you say about your product&lt;/strong&gt;, and makes your positive claims much more credible. Imagine a sales meeting or call where all you do is talk about the brilliant properties of your product, and in which you say yes to all requests and questions. Your prospect has no way of knowing if you always say yes, or whether you just happen to have the &amp;lsquo;perfectly suited&amp;rsquo; product.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;It portrays your honesty and respect for your prospect&lt;/strong&gt;. What is more honest than saying &amp;lsquo;I cannot provide or do this&amp;rsquo;? I believe that saying honestly and clearly where the limits of my products lie has often pleasantly surprised my prospects and helped me to build relationships with prospects.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It sets you apart from many competitiors&lt;/strong&gt;&amp;nbsp;(at least in software). Particularly in enterprise software claiming too much and agreeing to every client request has been commonplace. This phenomenon has even produced terms like &amp;lsquo;Vaporware&amp;rsquo; or &amp;lsquo;Shelfware&amp;rsquo;. Vaporware is software (features) that is sold despite the fact that it only exist in the minds of, errr, software salespeople for example. Shelfware is the result of projects that never made it into production. Yesterday I was on the website of a sales forecasting provider that claims 99% forecasting accuracy. Sure. That reads like &amp;ldquo;I take my customers for stupid but I take them for a ride&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It gives you a great opportunity to educate your customer.&lt;/strong&gt; Especially in cases where the requested capability is unrealistic, and competitor claims are sales BS, explaining the reasons behind the limits of your products is a great way of educating your prospect at the same time as debunking your competition without sounding aggressive or defensive. By giving your prospect more relevant concepts to understand, and questions to ask, you will make it more difficult for your competition to sell to this prospect.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you lose them, better lose them now... &lt;/strong&gt;Unless you can and want to engage in selling Vaporware, it is in your interest to not waste time on a prospect that either has legitimate requirements or unwaveringly unrealistic expectations that your product does not meet. Particularly in SaaS where trials are the typical way customers evaluate a product, there is no hiding from the facts of what your product can deliver, even if you wanted to. It is better to bow out in a positive and constructive manner than spend your time on a low probability case.&lt;/p&gt;
&lt;p&gt;.&lt;strong&gt;...and they might just come back.&lt;/strong&gt; It might just happen that reality hits your prospect and competition sooner or later.In this case, a vendor that has truthfully outlined the scope and limitations of his product might just become much more attractive.&lt;/p&gt;
&lt;/div&gt;</description>
         <author>Matthias Steinberg</author>
         <guid isPermaLink="false">http://www.matthias-steinberg.com/journal/2012/2/2/a-strong-sales-argument-the-features-i-dont-have.html</guid>
         <pubDate>Thu, 02 Feb 2012 20:49:25 +0000</pubDate>
      <feedburner:origLink>http://www.matthias-steinberg.com/journal/2012/2/2/a-strong-sales-argument-the-features-i-dont-have.html</feedburner:origLink></item>
      <item>
         <title>Optimal service level and order quantity</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/IDHzTf_0460/optimal-service-level-and-order-quantity.html</link>
         <description>&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://blog.lokad.com/storage/lssc-v1-icon-131x114.png?__SQUARESPACE_CACHEVERSION=1327487993902" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;In the inventory optimization literature, one of the most recurring concepts is the &lt;strong&gt;service level&lt;/strong&gt;, i.e. the desired probability of not hitting a stock-out situation. The service level expresses the tradeoff between &lt;em&gt;too much inventory &lt;/em&gt;and &lt;em&gt;too many stock-outs&lt;strong&gt;.&amp;nbsp;&lt;/strong&gt;&lt;/em&gt;However, &lt;strong&gt;experts remain typically vague when it comes to choose service level values&lt;/strong&gt;; a pattern also followed by most inventory software products...&lt;/p&gt;
&lt;p&gt;That's why we have spent a bit of time to craft a formula that gives&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/service-level-definition-and-formula.ashx"&gt;optimal service levels&lt;/a&gt;. Naturally, the &lt;em&gt;optimality&lt;/em&gt;&amp;nbsp;is not obtained without assumptions. However, we believe those are reasonable enough to preserve the efficiency of the formula for most businesses.&lt;/p&gt;
&lt;p&gt;Then, another subject, that receives too little attention, is the &lt;strong&gt;optimal order quantity&lt;/strong&gt;: the quantity to be ordered in order to minimize the combination of purchase costs, carrying costs, shipping costs, etc. As of January 2012, it's fascinating to notice that &lt;strong&gt;most of the industry still relies on the Wilson formula&lt;/strong&gt; &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Economic_order_quantity"&gt;devised back in 1913&lt;/a&gt;. Yet, this formula comes with strong assumptions that do not make much sense any more for the supply chain of the 21st century.&lt;/p&gt;
&lt;p&gt;Thus, we have designed another &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/economic-order-quantity-eoq-definition-and-formula.ashx"&gt;economic order quantity&lt;em&gt; &lt;/em&gt;formula&lt;/a&gt; that emphasizes &lt;strong&gt;volume discounts&lt;/strong&gt;&amp;nbsp;(instead of a flat ordering cost) for larger purchases. The formula (or rather the approach) is fairly general, and could be applied to any pricing structure, including non-linear situations where specific quantities are &lt;em&gt;favored&lt;/em&gt;&amp;nbsp;because they matche the size of a crate or a pallet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Both situations are illustrated with Excel sheets (so you don't even need Lokad to get started).&lt;/em&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:14724031</guid>
         <pubDate>Wed, 25 Jan 2012 10:47:30 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/1/25/optimal-service-level-and-order-quantity.html</feedburner:origLink></item>
      <item>
         <title>Big data in retail, a reality check</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/izm8nnw5qeA/big-data-in-retail-a-reality-check.html</link>
         <description>&lt;p&gt;&lt;span class="full-image-float-right ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://blog.lokad.com/storage/shopping-basket.png?__SQUARESPACE_CACHEVERSION=1325585801668" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;Cloud computing being so 2011, &lt;strong&gt;big data&lt;/strong&gt; is going to be a &lt;strong&gt;key IT buzzword for 2012&lt;/strong&gt;. Yet, as far we understand our retail clients, there is one data source that holds above 90% of total information value in their possession: &lt;strong&gt;market basket data&lt;/strong&gt; (tagged with fidelity card information when available).&lt;/p&gt;
&lt;p&gt;For any mid-large retail network, the &lt;em&gt;informational&lt;/em&gt;&amp;nbsp;value of market basket data simply dwarfs about all other alternative data sources, may it be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;In-store video data&lt;/strong&gt;, which remain difficult to process, and primarily focused on security.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Social media data&lt;/strong&gt;, which are very noisy and reflect as much &lt;a rel="nofollow" target="_blank" href="http://www.cs.wm.edu/~srgian/paper/acsac10.pdf"&gt;bot implementations&lt;/a&gt;&amp;nbsp;than human behaviors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Market analyst&amp;rsquo;s reports&lt;/strong&gt;, which require the scarcest resource of all: management attention.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yet, beside basic sales projections (aka sales per product, per store, per region, per week &amp;hellip;), we observe that, as of January 2012, most retailers are &lt;strong&gt;doing very little out of their market basket data&lt;/strong&gt;. Even forecasting for inventory optimization is typically nothing more than a moving average variant at the store level. More elaborate methods are used fore warehouses, but then, retailers are not leveraging basket data anymore, but past warehouse shipments.&lt;/p&gt;
&lt;p&gt;Big Data vendors promise to bring an unprecedented level of data processing power to their clients to let them harness all the potential of their big data.&lt;em&gt; Yet, is this going to bring profitable changes to retailers?&lt;/em&gt; Not necessarily so.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;storage capacity sitting &lt;em&gt;on display&lt;/em&gt; on the shelves of an average hypermarket&lt;/strong&gt; with +20 external drives in display (assuming 500GB per drive) typically &lt;strong&gt;exceeds the raw storage needed to persist a whole 3 years of history of a 1000 stores network&lt;/strong&gt; (i.e. 10TB of market basket data). Hence, raw data storage is not a problem, or, at least, not an expensive problem. Then, data I/O (input/output) is a more challenging matter, but again, by choosing an adequate data representation (the details would go beyond the scope of this post), it&amp;rsquo;s hardly a challenge as of 2012.&lt;/p&gt;
&lt;p&gt;We observe that &lt;strong&gt;the biggest challenge posed by Big Data is simply manpower requirements&lt;/strong&gt; to do anything &lt;em&gt;operational&lt;/em&gt;&amp;nbsp;with it. Indeed, the data is primarily big in the sense that the company resources, to run the Big Data software and to implement whatever suggestions come out of it, are thin.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Producing a wall of metrics out of market basket data is easy; but it&amp;rsquo;s is much harder to build a set of metrics worth the time being read considering the hourly costs of employees.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As far we understand our retail clients, the &lt;em&gt;manpower&lt;/em&gt; constraint alone explains why so little is being been done with market basket data on an ongoing basis: while CPU has never been to cheap, staffing has never been so expensive.&lt;/p&gt;
&lt;p&gt;Thus, we believe that &lt;strong&gt;Big Data successes in retail will be encountered by lean solutions that treat, not processing power, but people, as the scarcest resource of all.&lt;/strong&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:14419897</guid>
         <pubDate>Tue, 03 Jan 2012 10:12:58 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2012/1/3/big-data-in-retail-a-reality-check.html</feedburner:origLink></item>
      <item>
         <title>Roadmap for 2012</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/YvxMejSMpOk/roadmap-for-2012.html</link>
         <description>&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://blog.lokad.com/storage/compass.jpg?__SQUARESPACE_CACHEVERSION=1322559695148" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;For the third year (see the &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/1/13/roadmap-for-2011.html"&gt;2011&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2009/10/28/roadmap-for-2010.html "&gt;2010&lt;/a&gt; editions), we will share some insights about the future developments of Lokad.&lt;/p&gt;
&lt;h3&gt;Forecasting Technology&lt;/h3&gt;
&lt;p&gt;Since the very beginning, &lt;strong&gt;forecasting accuracy&lt;/strong&gt; has been the foremost priority of Lokad. Over 2011, we have extensively leveraged Windows Azure (our cloud computing platform) to develop forecasting models that would have been completely out of reach without the capabilities of the cloud.&lt;/p&gt;
&lt;p&gt;We have made &lt;strong&gt;progress over patterns as simple as seasonality, trends or product life cycles&lt;/strong&gt;. Those patterns are supposed to be well-known for decades, but the more we learn by looking at the data of our growing customer base, the more we realize that we are only scratching the surface.&lt;/p&gt;
&lt;p&gt;In 2012, we are planning to dedicate efforts on &lt;strong&gt;forecasts at the point-of-sale level&lt;/strong&gt; for both retail networks and eCommerce. This effort will boost the development of &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/shelfcheck-on-shelf-availability-optimization.ashx"&gt;Shelfcheck&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then, we will also explore alternative ways to make &lt;strong&gt;a better use of &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/guide-for-tags-and-events.ashx"&gt;tags and events&lt;/a&gt;&lt;/strong&gt;. More and more of our clients are now capable of feeding our forecasting engine with high-quality tags and events, which offer more opportunities to refine forecasts.&lt;/p&gt;
&lt;h3&gt;Pricing&lt;/h3&gt;
&lt;p&gt;The Lokad pricing for forecast consumption hasn&amp;rsquo;t changed since November 2009, and we don&amp;rsquo;t expect any significant change for 2012 apart from minor adjustments. However Shelfcheck will benefit from a distinct pricing, not directly bound to the forecast consumption.&lt;/p&gt;
&lt;h3&gt;Salescast&lt;/h3&gt;
&lt;p&gt;Over 2011, our webapp delivering inventory optimization &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/8/18/major-ui-refresh-for-salescast.html"&gt;has grown&lt;/a&gt; to a relatively &lt;strong&gt;mature and stable product&lt;/strong&gt;. Contrary to what we announced last year, we have finally opted against the idea of importing &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/salescast-excel-as-data-repository-will-hurt-your-company.ashx"&gt;data &lt;em&gt;from&lt;/em&gt; Excel&lt;/a&gt; &amp;nbsp;Instead, the majority of our users are now using our &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/salescast-db-schema.ashx"&gt;intermediate SQL format&lt;/a&gt; which offers a simple and reliable path to achieve complete automation with a minimum of efforts.&lt;/p&gt;
&lt;p&gt;For the year to come, we will &lt;strong&gt;polish Salescast further&lt;/strong&gt;, especially around the intermediate SQL format. Indeed, we feel that database administrators still struggle too much to import their data in Salescast.&amp;nbsp;For example, we will provide better and more explicit errors messages.&lt;/p&gt;
&lt;h3&gt;Shelfcheck&lt;/h3&gt;
&lt;p&gt;Shelfcheck is our latest product, only announced &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/6/19/shelfcheck-on-shelf-availability-optimizer-announced.html"&gt;a few months ago&lt;/a&gt;&amp;nbsp;, that focuses on &lt;strong&gt;on-shelf availability optimization&lt;/strong&gt; for retail networks.&lt;/p&gt;
&lt;p&gt;At this point, a beta version of Shelfcheck is already in production on multiple stores in Europe. We plan to bring Shelfcheck &lt;strong&gt;out of its beta during 2012&lt;/strong&gt;. Processing the ongoing sales stream of a large retail network at low costs is a tremendous challenge (even with the cloud). In addition, we want to establish Shelfcheck as the technology delivering the &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/8/2/two-kpis-for-your-oos-detector.html"&gt;most accurate OOS alerts&lt;/a&gt; (out-of-shelf) of the market.&lt;/p&gt;
&lt;h3&gt;Hub&lt;/h3&gt;
&lt;p&gt;The &amp;ldquo;Hub&amp;rdquo; is the webapp in charge of managing &lt;a rel="nofollow" target="_blank" href="http://app.lokad.com/"&gt;registrations and subscriptions&lt;/a&gt;. Over 2011, we haven&amp;rsquo;t invested much effort on this webapp, and now, it feels somewhat &lt;em&gt;antiquated&lt;/em&gt;, especially when compared to the more polished user interface of Salescast. Thus, in 2012, we plan to extensively refactor the Hub to simplify the management of users and subscriptions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This roadmap isn't carved in stone. Don't hesitate to voice your opinion.&lt;/em&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:13901324</guid>
         <pubDate>Tue, 29 Nov 2011 10:00:59 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2011/11/29/roadmap-for-2012.html</feedburner:origLink></item>
      <item>
         <title>Lokad.Cloud vs Lokad.CQRS, tiny insights about the future</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/eIuc9OZfrTc/lokadcloud-vs-lokadcqrs-tiny-insights-about-the-future.html</link>
         <description>&lt;p&gt;Among the (small) community interested by the software practices of Lokad to develop entreprise software over Windows Azure, &lt;a rel="nofollow" target="_blank" href="http://lokad.github.com/lokad-cloud/"&gt;Lokad.Cloud&lt;/a&gt; vs &lt;a rel="nofollow" target="_blank" href="http://lokad.github.com/lokad-cqrs/"&gt;Lokad.CQRS&lt;/a&gt; comes as a&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="https://groups.google.com/forum/#!topic/lokad/LCLUoM2KY78"&gt;recurring question&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It's a good question, and to be entirely honest, the case is not 100% solved even at Lokad&lt;/em&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One of the core difficulty to address this question is that Lokad.Cloud and Lokad.CQRS come:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;from different &lt;strong&gt;backgrounds&lt;/strong&gt;:     
&lt;ul&gt;
&lt;li&gt;Lokad.Cloud orginates from the hard-core data analytics back-end.&lt;/li&gt;
&lt;li&gt;Lokad.CQRS originates from our&lt;em&gt;&amp;nbsp;&lt;/em&gt;behavioral apps.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;with different &lt;strong&gt;intents&lt;/strong&gt;:     
&lt;ul&gt;
&lt;li&gt;Lokad.Cloud wants to simplify hard-core distributed algorithmics.&lt;/li&gt;
&lt;li&gt;Lokad.CQRS wants to provide flexibililty, auditability, extensibility (*).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;and different &lt;strong&gt;philosophies&lt;/strong&gt;:     
&lt;ul&gt;
&lt;li&gt;Lokad.Cloud is a sticky framework, it defines pretty much how your app is architected.&lt;/li&gt;
&lt;li&gt;Lokad.CQRS is more a &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/journal/2011/6/18/lokadcqrs-framework-that-is-designed-for-farewells.html"&gt;NoFramework&lt;/a&gt;, precisely designed to minimally impact the app.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(*) without compromising scalability, however scalability is not the primary purpose.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then, historically, &lt;strong&gt;Lokad.Cloud has been developed first&lt;/strong&gt;&amp;nbsp;(which is a mixed blessing), and, as we have been moving forward, we have started to &lt;strong&gt;partition into standalone sub-projects&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="https://github.com/Lokad/lokad-cloud-storage"&gt;Lokad.Cloud.Storage&lt;/a&gt;, the O/C mapper (object to cloud), dedicated to the interactions with the Azure Storage.&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="https://github.com/Lokad/lokad-cloud-apphost"&gt;Lokad.Cloud.AppHost&lt;/a&gt;, an AppDomain isolation layer to enable dynamic assembly loading within Azure Worker roles (aka reboot a VM with new assemblies in 5s instead of 5min). (**)&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="https://github.com/Lokad/lokad-cloud-provisioning"&gt;Lokad.Cloud.Provisioning&lt;/a&gt;, a toolkit for the Windows Azure Management API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(**) Lokad.Cloud does not leverage Lokad.Cloud.AppHost yet, it still relyies on a very similar component (which was developed first, and, as such, is not as properly decoupled than AppHost)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Those sub-projects end-up combined into &lt;em&gt;Lokad.Cloud&lt;/em&gt;&amp;nbsp;but they can be used independently. Both &lt;em&gt;Lokad.Cloud.AppHost&lt;/em&gt; and &lt;em&gt;Lokad.Cloud.Provisioning&lt;/em&gt; are &lt;strong&gt;fully compatible with Lokad.CQRS&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The case of &lt;em&gt;Lokad.Cloud.Storage&lt;/em&gt; is a bit more complicated because Lokad.CQRS because &lt;strong&gt;Lokad.CQRS already has its own &lt;a rel="nofollow" target="_blank" href="https://github.com/Lokad/lokad-cqrs/tree/next/Framework/Lokad.Cqrs.Azure"&gt;Azure Storage layer&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;which focuses on CQRS-style storage abstractions. In particular, Lokad.CQRS emphasizes &lt;em&gt;interoperable storage abstractions&lt;/em&gt;&amp;nbsp;where the local file storage can be used in place of the cloud storage.&lt;/p&gt;
&lt;h3&gt;The Future&lt;/h3&gt;
&lt;p&gt;As far I can speak for Lokad.CQRS (see the &lt;a rel="nofollow" target="_blank" href="http://abdullin.com/cqrs"&gt;projet boss&lt;/a&gt;), the project will keep evolving focusing on &lt;strong&gt;enterprise software&amp;nbsp;practices&lt;/strong&gt;, aka not so much what the framework delivers, but rather how it's intended to structure the app. Then, Lokad.CQRS might be completed by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tools at some point such as a&amp;nbsp;&lt;em&gt;maintenance console&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;refined storage abstractions (probably &lt;em&gt;event-centric&lt;/em&gt; ones).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In constrast, Lokad.Cloud will continue its &lt;strong&gt;partitioning process&lt;/strong&gt; to become decoupled and more flexible. In particular,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the cloud runtime&lt;/li&gt;
&lt;li&gt;the service execution strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;are still very heavily coupled to other concepts within the execution framework, and likely candidates for sub-projects of their own.&lt;/p&gt;
&lt;h3&gt;Combining Lokad.Cloud and Lokad.CQRS?&lt;/h3&gt;
&lt;p&gt;I would not advise to combine Lokad.Cloud (execution framework) with Lokad.CQRS &lt;em&gt;within the same app&lt;/em&gt;. At Lokad, we don't have any project that adopts this pattern, and the resulting architcture seems fuzzy.&lt;/p&gt;
&lt;p&gt;However, if we consider the sub-projects of Lokad.Cloud, then the combination&amp;nbsp;&lt;em&gt;Lokad.CQRS + Lokad.Cloud.AppHost + Lokad.Cloud.Provisioning &lt;/em&gt;does make a lot of sense.&lt;/p&gt;
&lt;p&gt;Then, it's possible to adopt a SOA architecture where some &lt;a rel="nofollow" target="_blank" href="http://vermorel.com/journal/2011/10/14/oddities-of-machine-learning-software-code.html"&gt;heavy-duty functional logic&lt;/a&gt;&amp;nbsp;gets isolated, behind an API, into the Lokad.Cloud execution framework, while the bulk of the app adopt CQRS patterns through Lokad.CQRS. This pattern has been adopted to some extent at Lokad.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2011/11/23/lokadcloud-vs-lokadcqrs-tiny-insights-about-the-future.html</guid>
         <pubDate>Wed, 23 Nov 2011 22:11:38 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2011/11/23/lokadcloud-vs-lokadcqrs-tiny-insights-about-the-future.html</feedburner:origLink></item>
      <item>
         <title>Out-of-shelf can explain 1/4 of store forecast error</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/h6SgwZ-8qIE/out-of-shelf-can-explain-14-of-store-forecast-error.html</link>
         <description>&lt;p&gt;The notion of &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/9/7/video-accuracy-in-sales-forecasting.html"&gt;forecasting accuracy&lt;/a&gt;&amp;nbsp;is subtle, &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2009/4/22/overfitting-when-accuracy-measure-goes-wrong.html"&gt;&lt;em&gt;really&lt;/em&gt; subtle&lt;/a&gt;. It's common sense to say that if &lt;em&gt;the closer the forecasts from the future, the better&lt;/em&gt;&lt;strong&gt;, &lt;/strong&gt;and yet common-sense can be &lt;strong&gt;plain wrong&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;With the launch of &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/shelfcheck-on-shelf-availability-optimization.ashx"&gt;Shelfcheck&lt;/a&gt;, our on-shelf availability optimizer, we have started to &lt;strong&gt;process a lot more data at the point of sales level&lt;/strong&gt;, trying to automatically detect out-of-shelf (OOS) issues.Over the last few months, our &lt;strong&gt;knowledge about OOS pattern has significantly improved&lt;/strong&gt;, and today this knowledge is being recycled into our core forecasting technology.&lt;/p&gt;
&lt;p&gt;Let's illustrate the situation. The graph below represents the daily aggregated sales at the store level for a given product. The store is open 7/7. A seven-day forecast is produced at the end of the week 2, but an OOS occurs in the middle of the week 3. Days marked with black dots have &lt;em&gt;zero&lt;/em&gt;&amp;nbsp;sales.&lt;/p&gt;
&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://blog.lokad.com/storage/oos-impact-on-accuracy.png?__SQUARESPACE_CACHEVERSION=1318869909775" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In this situation, the forecast is fairly accurate, but because of the OOS problem, the direct comparison of &lt;em&gt;sales&lt;/em&gt;&amp;nbsp;&lt;em&gt;vs forecasts&lt;/em&gt;&amp;nbsp;look like as if the forecast was significantly overforecasting the sales, which is not the case, at least not on the non-OOS days. The overforecast measurement is an &lt;em&gt;artifact&lt;/em&gt;&amp;nbsp;caused by the OOS itself.&lt;/p&gt;
&lt;p&gt;So far, it seems that OOS can only degrade the &lt;em&gt;perceived&lt;/em&gt;&amp;nbsp;forecasting accuracy, which it does not seem too bad because &lt;em&gt;presumably&lt;/em&gt;&amp;nbsp;all forecasting methods should be equally impacted. After all, not forecasting model is able to anticipate the OOS problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Well, OOS can do a lot worse that just degrade the forecasting accuracy, OOS can also &lt;em&gt;improve&lt;/em&gt; it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let have a look at the graph to illustrate this. Again, we are looking at daily sales data, but this time the OOS problem starts on the very last day of week 2.&lt;/p&gt;
&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://blog.lokad.com/storage/oos-impact-on-accuracy-overfit.png?__SQUARESPACE_CACHEVERSION=1318957331949" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;forecast for the week 3 is zero the whole week&lt;/strong&gt;. The forecasting model is &lt;em&gt;anticipating the duration of the OOS&lt;/em&gt;. The forecast is not entirely accurate because on the last day of week 3, replenishment is made and sales are non-zero again.&lt;/p&gt;
&lt;p&gt;Obviously, a forecasting model that anticipates the duration of the OOS issue is extremely accurate as far the numerical comparison &lt;em&gt;sales vs forecasts&lt;/em&gt;&amp;nbsp;is concerned. Yet, &lt;strong&gt;does it really make sense?&lt;/strong&gt;&amp;nbsp;No, obviously it does not. We want to forecast the &lt;em&gt;demand&lt;/em&gt;&amp;nbsp;not sales &lt;em&gt;artifacts&lt;/em&gt;.&amp;nbsp;Worse, a zero forecast can lead to a zero replenishment which, in turn, extend the actual duration of the OOS issue (and increase further the &lt;em&gt;accuracy&lt;/em&gt;&amp;nbsp;of our OOS-enthusiast forecasting model). This is obviously not a desirable situation, no matter how good the forecast happens to be&amp;nbsp;from a naive numerical viewpoint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bad case of &lt;em&gt;OOS overfitting&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We have found that the situation illustrated by the 2nd graphic is &lt;strong&gt;far from being &lt;/strong&gt;&lt;em style="font-weight:bold;"&gt;unusual&lt;/em&gt;. Indeed, with 8% on-shelf unavailability (a typical figure in retail) and a rough 30% MAPE on daily forecasts, OOS situations typically account for 8% x 100 / 30 &amp;asymp;&amp;nbsp;27% &amp;asymp;&amp;nbsp;&lt;strong&gt;1/4 of the total forecast error being measured&lt;/strong&gt;. Indeed, by definition of MAPE, a non-zero forecast on zero-sale day (OOS) generates a 100% error.&lt;/p&gt;
&lt;p&gt;Because the fraction of the error caused by OOS is significant, we have found that a simple heuristic such as "&lt;em&gt;if last day has zero sales on a top seller product, then forecast zero sales for 7 days"&lt;/em&gt;&amp;nbsp;may reduce the forecast error from a few percents by directly leveraging the OOS pattern. Obviously, very few practitioners would explicitly put such a rule among their forecasting models, but even a moderately complex linear autoregressive model may &lt;em&gt;learn&lt;/em&gt;&amp;nbsp;this pattern to a significant extend, and thus overfit OOS.&lt;/p&gt;
&lt;p&gt;Naturally, &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/shelfcheck-on-shelf-availability-optimization.ashx"&gt;Shelfcheck&lt;/a&gt; is here to help on those OOS matters. &lt;em&gt;Stay tuned&lt;/em&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:13310982</guid>
         <pubDate>Thu, 20 Oct 2011 07:00:37 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2011/10/20/out-of-shelf-can-explain-14-of-store-forecast-error.html</feedburner:origLink></item>
      <item>
         <title>Oddities of machine learning software code</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/NvOim5ooW40/oddities-of-machine-learning-software-code.html</link>
         <description>&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://vermorel.com/storage/melting-wall-clock.jpg?__SQUARESPACE_CACHEVERSION=1318597564826" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;Developping machine learning software is &lt;em&gt;special&lt;/em&gt;. I did already describe a bit &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2009/5/9/machine-learning-company-whats-so-special.html"&gt;how it feels to be in a machine learning company&lt;/a&gt;, but let's be a bit more specific concerning the code itself.&lt;/p&gt;
&lt;p&gt;One of most &lt;em&gt;shocking&lt;/em&gt;&amp;nbsp;aspect of machine learning code is that it tends to be &lt;strong&gt;full of super-short cryptic 1-letter or 2-letter variable names&lt;/strong&gt;. This goes completely against the general naming conventions which emphasis &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/ms229045.aspx"&gt;readability over brievity&lt;/a&gt;. Yet, over the years, I have found that those compact names where best &lt;em&gt;for mathematical / statistical / numerical algorithms&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Indeed,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logic is typically overly &lt;em&gt;intricate&lt;/em&gt;, with tons of nested loops and seemingly random stopping conditions. Hence, even if the variables were perfectly readable, the logic would remain show-stopper for any fast-reading attempt.&lt;/li&gt;
&lt;li&gt;Variables typically hold &lt;em&gt;intermediate computational results&lt;/em&gt;, which cannot be associated with 2 or 3 English words without being extremely ambiguous at best. It's not &lt;em&gt;a = OnButtonClick&lt;/em&gt;&amp;nbsp;but rather &lt;em&gt;a = InterpolatedDetrendedDeseasonalizedQuantile90PercentsOfPromotionEffects&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, extreme variable name brievity makes the code much more compact which in turns makes it easier to understand the logic. It forces the coder digging into the code to&lt;strong&gt; learn by heart&amp;nbsp;the semantic of the variables&lt;/strong&gt;&amp;nbsp;(because names are cryptic), but this effort is only marginal compared to the amount of effort to grasp the logic itself anyway.&lt;/p&gt;
&lt;p&gt;Then, &lt;strong&gt;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Magic_number_(programming)"&gt;magic numbers&lt;/a&gt; are all over the place&lt;/strong&gt;, frequently inlined with the rest of the code. Again, for non-machine-learning, magic numbers are a big NO-NO, and a cardinal rule of sane software design consist of &lt;em&gt;clear speration between data and logic&lt;/em&gt;. Yet, in statistical algorithms, those seemingly random numerical values are the result of the incremental tuning that is necessary to obtain the desired performance and accuracy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There is no benefit in isolating the &lt;em&gt;magic number&lt;/em&gt;, because it is used only once.&lt;/li&gt;
&lt;li&gt;The actual numerical value is typically more insightful than the variable name. It helps the developer to get a &lt;em&gt;sense&lt;/em&gt;&amp;nbsp;of the behavior of the algorithm.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, it remains a good practice to add a lot of &lt;strong&gt;inline comments&lt;/strong&gt; to justify the purpose of the magic numbers, and how they have been optimized.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If your code is super fast, you're probably getting it wrong&lt;/strong&gt;. For most machine learning problems, it's better to try to take advantage of the outrageously large amount of processing power available nowadays to improve results. I am not saying that super fast code is bad in itself, but if your code is super fast, then it means that you've got room to go for more complex methods that would consume more resources in exchange for better, more accurate, results.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Unit_testing"&gt;Unit tests&lt;/a&gt; are both very handy to validate small block pure-mathematical operations, and yet,&amp;nbsp;&lt;strong&gt;quasi-useless&lt;/strong&gt;&amp;nbsp;for the bulk of the machine learning logic. Indeed, when it comes to statistical accuracy, there is no black &amp;amp; white, but only in &lt;em&gt;shades of gray&lt;/em&gt;. As long performance is acceptable, the overall accuracy is the only metric that matter. In particular, it happens, from time to time, that a &lt;em&gt;bug&lt;/em&gt;&amp;nbsp;- aka a piece of code that does not reflect the original&amp;nbsp;&lt;em&gt;intent&lt;/em&gt;&amp;nbsp;of the developer - turns out to behave well over the data. On average, &lt;em&gt;bugs&lt;/em&gt; tend to degrade accuracy, but sometime, it just stumbles upon an interesting (and counter-intuitive) behavior.&lt;/p&gt;
&lt;p&gt;Finally, &lt;strong&gt;Object-Oriented Programming is still around, but seldom used&lt;/strong&gt;:&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://www.nicollet.net/2011/10/functional-programming/"&gt;Functional Programming&lt;/a&gt; is king. This pattern reflects the fact that the machine learning problem itself, either &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Classifier_(mathematics)"&gt;classification&lt;/a&gt; or &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Regression_analysis"&gt;regression&lt;/a&gt; is nothing but trying to build a big complex function to tackle real-world data.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2011/10/14/oddities-of-machine-learning-software-code.html</guid>
         <pubDate>Fri, 14 Oct 2011 13:24:05 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2011/10/14/oddities-of-machine-learning-software-code.html</feedburner:origLink></item>
      <item>
         <title>Video: introduction to Salescast</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/XGaGjQmGGFg/video-introduction-to-salescast.html</link>
         <description>&lt;p&gt;Since Salescast now benefits from an &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2011/8/18/major-ui-refresh-for-salescast.html"&gt;extensively improved user interface&lt;/a&gt;, we have decided to produce a new video introduction as well.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Again, special thanks to Ray Groover for the voice over.&lt;/em&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:12815113</guid>
         <pubDate>Mon, 26 Sep 2011 10:00:43 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2011/9/26/video-introduction-to-salescast.html</feedburner:origLink></item>
      <item>
         <title>Seasonality illustrated</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/783h74rhYBg/seasonality-illustrated.html</link>
         <description>&lt;p&gt;Seasonality is one of the &lt;strong&gt;strongest statistical pattern&lt;/strong&gt; that can be leveraged to refine forecasts. Below, 4 time-series aggregated at the weekly level (159 weeks). Historical data are in red and forecasts are in purple. Vertical gray markers indicate January 1st.&lt;/p&gt;
&lt;p&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://www.lokad.com/GetFile.aspx?File=/Support/Glossary/seasonality-small.png&amp;amp;__SQUARESPACE_CACHEVERSION=1315822588899" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When illustrating seasonality, everyone (Lokad's included) tend to use &lt;strong&gt;long time-series&lt;/strong&gt;, much like the first three series here above. Indeed, it's more &lt;em&gt;visual&lt;/em&gt; and more &lt;em&gt;appealing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;However, long time-series do not represent your&amp;nbsp;&lt;em&gt;usual&lt;/em&gt;&amp;nbsp;situation. On average consumer goods have a lifespan of no more than 3 or 4 years. Thus, long time-series are typically a small minority in your dataset. Worse, those long time-series might be &lt;em&gt;outliers&lt;/em&gt;&amp;nbsp;that do not reflect the behavior of other &lt;em&gt;shorter-lived&lt;/em&gt; products.&lt;/p&gt;
&lt;p&gt;Here above, the&amp;nbsp;&lt;strong&gt;short 4th time-series&lt;/strong&gt;&amp;nbsp;is a&amp;nbsp;&lt;strong&gt;much more representative case&lt;/strong&gt;&amp;nbsp;with less than 1 year of data. In such a situation, however, it's much less clear how seasonality can be leveraged. The Lokad trick to do that consists of using multiple time-series analysis.&lt;/p&gt;
&lt;p&gt;Learn more on our &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/definition-seasonality.ashx"&gt;seasonality definition&lt;/a&gt; article.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:12814220</guid>
         <pubDate>Mon, 19 Sep 2011 10:00:41 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2011/9/19/seasonality-illustrated.html</feedburner:origLink></item>
      <item>
         <title>Video: How the Forecasting Engine works?</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/ft1vnUEH-Gc/video-how-the-forecasting-engine-works.html</link>
         <description>&lt;p&gt;Questions about &lt;em&gt;under the hood&lt;/em&gt;&amp;nbsp;details of Lokad are &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2009/7/7/favorite-forecasting-models.html"&gt;frequent&lt;/a&gt;. We have recently added a big &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/forecasting-technology-faq.ashx"&gt;FAQ&lt;/a&gt; to our &lt;em&gt;Forecasting Technology&lt;/em&gt;&amp;nbsp;section. Today, we are releasing a new video that give the &lt;strong&gt;big picture on how our forecasting engine is working&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;Again, special thanks to Ray Grover for the voice over.&lt;/p&gt;</description>
         <guid isPermaLink="false">106266:941347:12786011</guid>
         <pubDate>Tue, 13 Sep 2011 07:00:08 +0000</pubDate>
      <feedburner:origLink>http://blog.lokad.com/journal/2011/9/13/video-how-the-forecasting-engine-works.html</feedburner:origLink></item>
      <item>
         <title>Understanding a business better by asking simple questions</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/aoVyw3zF--o/understanding-a-business-better-by-asking-simple-questions.html</link>
         <description>&lt;p&gt;I love reading about and trying to understand new businesses. The fast pace of technology innovation especially in internet, cloud, SaaS and social media technologies has provided the basis from which a large number of &lt;strong&gt;new businesses and business models&lt;/strong&gt; are emerging. &lt;a rel="nofollow" target="_blank" href="http://en.vente-privee.com/vp4/Login/IntlMap.aspx"&gt;Vente Privee&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.groupon.com/subscriptions/new?division_p=st-johns"&gt;Groupon&lt;/a&gt; come to mind when thinking about successful European and US examples.&lt;/p&gt;
&lt;p&gt;Understanding these businesses and their business models is not always easy. Start-ups tend to be protective of IP and key figures for obvious reasons. For example, one of the best kept secrets in European eCommerce is &lt;strong&gt;Vente Privee&amp;rsquo;s profit margin&lt;/strong&gt;, and &lt;strong&gt;Groupon&lt;/strong&gt; only recently let down the pants on profit, cash flow and other KPIs in the run-up to the IPO. Yet, even when transparency is given, it is easy to get caught up in thinking about market, strategy, competition and other contextual business elements without ever fully understanding the &lt;strong&gt;core workings and quality of the business model&lt;/strong&gt;. A similar situation can occur in a young company that is still working on finding the right business model and in the process pursues and tests several distribution channels, products, client segments, etc. During this process, such companies can similarly miss the important and basic economics related to their choices, while focusing only on high-level strategies. I suggest approaching the analysis of a business and business model by asking the simple questions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Asking simple questions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What works well for me is to understand in detail &lt;strong&gt;how a business makes money&lt;/strong&gt; (not including internet start-ups that defy profit and cash logic in their early years). Essentially, I &amp;lsquo;follow a Euro&amp;rsquo; in accounting and cash terms from start-to-finish. &amp;nbsp;A good way of doing this is &lt;strong&gt;by looking at the &amp;lsquo;client economics&amp;rsquo; of an average customer&lt;/strong&gt; from the time of acquisition to end of the customer lifetime and figuring out the&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;step-by-step process&lt;/li&gt;
&lt;li&gt;profitability and&amp;nbsp;&lt;/li&gt;
&lt;li&gt;cash flow.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This process is the backbone of any business, and by dissecting it I get to the core of how a business (model) works. It also provides a good &lt;strong&gt;basis from which to derive further analysis&lt;/strong&gt;. A former investment colleague gave this piece of advice to me, and it can be applied to almost any business. Here is an example of an analysis made by asking the simple questions using a fictional, simplified eCommerce.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step-by-step process&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The typical new customer starts as a visitor in the eCommerce's webshop. This website traffic is &amp;lsquo;acquired&amp;rsquo; exclusively via Google Adwords and a fraction of this traffic is converted into paying customers.&amp;nbsp;Once a customer purchases a product, eCommerce fulfils the order completely in-house. This means that order handling, product inventory, packaging and dispatch, as well as service and support are handled in-house. Product is kept in stock for fast delivery. Customers can only pay by credit card, and returns are handled in-house.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profits (and losses)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The contribution margin (revenue minus variable cost directly attributed to the purchase) of a purchase minus the customer acquisition cost is the profitability of the first purchase; if a certain average number of repeat purchases is given their contribution margins are added to result in the customer life time value. My average order size is 50&amp;euro; at 20% &lt;strong&gt;contribution margin &lt;/strong&gt;and the &lt;strong&gt;customer acquisition cost&lt;/strong&gt; is 20&amp;euro; (0.2&amp;euro; per hit on Adwords, traffic conversion 1%). As a result, eCommerce looses 10&amp;euro; (50*20% - 20) on the first purchase of a new customer, which would be a terrible business, were it not for repeat purchases. The average customer of eCommerce makes 2.5 purchases, breaks even on the second purchase (50*20% - 20 + 50*20%), and has a &lt;strong&gt;&amp;lsquo;life time value&lt;/strong&gt;&amp;rsquo; of 10&amp;euro;. Now these 10&amp;euro; contribute to covering the fixed cost such as running the website, leasing the warehouse and machines, general marketing, company overhead, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cash cycle&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is arguably the most relevant view on the business, especially for young companies. Businesses die because they are out of cash, not profits.&lt;/p&gt;
&lt;p&gt;eCommerce&amp;rsquo;s product is purchased for cash from a supplier (cash out), the customer is acquired on Google (cash out) and pays for the item with credit card (cash in). All the while eCommerce is paying fix costs for warehousing, operations (incl. order fulfilment), overhead, financing, marketing, etc. All these costs are assumed in this example as fixed, but might also be (partly) variable in practice. By placing this sequence on a timeline we can understand the cash profile of a customer. It becomes clear that we&lt;strong&gt; first have to invest cash &lt;/strong&gt;in products and customer acquisition before we see the first Euro back from the customer, and need to wait for repeat purchases to &lt;strong&gt;recoup the cash&lt;/strong&gt; invested. The result of this analysis is the cash cycle, i.e. the time it takes to recoup a Euro that can then be reinvested.&amp;nbsp;It becomes clear that even if a new customer is profitable over its lifetime, eCommerce will need cash to invest in products and customer acquisition as it grows.&lt;/p&gt;
&lt;p&gt;Using this framework to assess a business will point to, and answer some important questions, including:&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cash need (to grow)&lt;/li&gt;
&lt;li&gt;Vulnerabilities/defensibility&lt;/li&gt;
&lt;li&gt;Core skills and assets (e.g. very low customer acquisition cost, efficient order fulfilment, high contribution margins etc.)&lt;/li&gt;
&lt;li&gt;Sustainability&lt;/li&gt;
&lt;li&gt;Margin potential&lt;/li&gt;
&lt;li&gt;KPIs that can be benchmarked against the industry (e.g. &amp;nbsp;customer acquisition cost, inventory turns, customer profitability, gross margins, cash cycle.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Competitive advantages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While by far not covering all aspects relevant to the business, knowing the answers to such questions can help you when making important decisions related to a company, such as whether to 'back' a business with your money, time or even name.&amp;nbsp;Groupon is a good example of a business where a close look at the economics of a single deal along the lines outlined above is extremely revealing. It is particularly interesting to do this from Groupon&amp;rsquo;s perspective (the client is the merchant) and from the perspective of the merchant (Groupon is the supplier, the consumer is the client) - especially when thinking of buying stock as an investor, or when considering selling a deal for one&amp;rsquo;s own business on Groupon.&lt;/p&gt;</description>
         <author>Matthias Steinberg</author>
         <guid isPermaLink="false">http://www.matthias-steinberg.com/journal/2011/8/10/understanding-a-business-better-by-asking-simple-questions.html</guid>
         <pubDate>Wed, 10 Aug 2011 15:14:43 +0000</pubDate>
      <feedburner:origLink>http://www.matthias-steinberg.com/journal/2011/8/10/understanding-a-business-better-by-asking-simple-questions.html</feedburner:origLink></item>
      <item>
         <title>Cold Calling: It's tough, but it works</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/U-SJgyu2tFw/cold-calling-its-tough-but-it-works.html</link>
         <description>&lt;p&gt;One day our business will have sufficient &amp;lsquo;gravitational&amp;rsquo; pull to sell by itself. Web visibility and traffic will be significant, conversion high, coverage in industry media extensive and the name part of the industry&amp;rsquo;s ABC. My phone will ring constantly.&lt;/p&gt;
&lt;p&gt;Until then, If we do not proactively establish the contact with prospective large customers, investors, advisors, no one will. Surely, we are pushing heavily an in-bound marketing strategy which is successful in the SMB market, but the industry top 100 has not called yet.&lt;/p&gt;
&lt;p&gt;Calling is still a powerful method and &amp;lsquo;center&amp;rsquo; around which to build a targeted approach. The good news is: it works. I would make the claim that &lt;strong&gt;you can get people on the phone far beyond your wildest expectations&lt;/strong&gt;. The fine print: It sucks. Are there &amp;lsquo;silver bullet&amp;rsquo; tricks that can be passed on: I don&amp;rsquo;t think so. Success is 50% hard work, 40% psychology, 10% technique. Here are a few gotchas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Getting ready to labor&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cold approaches are very hard work. They require dozens to hundreds of phone calls, emails, letters, research, ideas. The better prepared I am the higher the chances of success. The more relevant to the individual the more noticeable my communication is. It is repetitive, it is often boring. It takes blood, sweat and tears.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Building up patience&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If anything, it will take time. It is not that I am at the bottom of my targets&amp;rsquo; priority list, I don&amp;rsquo;t even exist on it when I begin. Patience is a key ingredient of persistence. It helps me stand out and to be there at the right moment. I try to learn about the individual, the organization, what is happening and what is on his mind. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Embracing rejection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Forget fame and money &amp;ndash; let&amp;rsquo;s face it, the single most powerful motivation for me to work hard has always been praise. Interestingly, it seems only secondary from whom and for what, my system will purr happily as long as it is praise. And I believe I am no different from most people &amp;ndash; I have seen this pattern constantly in my friends and colleagues.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Rejection is roughly the opposite of that. It is a cold, wet place. Unfortunately cold approaches deliver a good dose of it in the form of unreturned calls, deleted emails, negative feedback, and forgotten promises.&lt;/p&gt;
&lt;p&gt;It helps me to&lt;strong&gt; &lt;em&gt;know and expect &lt;/em&gt;this&lt;/strong&gt;. The trick is to think positive and believe that it will work, while having a realistic benchmark on what to expect. Experience and practice definitively helps calibrate this benchmark. And, it will help in growing a thicker skin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keeping the moral high&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I brace myself for a long feedback loop and savior the successes, as small as they might be. I know that I will not win them all &amp;ndash; it is in the end a numbers game.&lt;/p&gt;
&lt;p&gt;&amp;lsquo;NOs&amp;rsquo; are frequent and I try not to take it personal &amp;ndash; it very seldom is. Secondly, I keep in mind that there is no universal &amp;lsquo;NO&amp;rsquo;. Situations can change rapidly. A &amp;lsquo;no&amp;rsquo; today from a company is a &amp;lsquo;no&amp;rsquo; from an individual, in a given situation and with changing priorities. A promotion, a new CEO, unexpected financial results &amp;hellip; there are millions of reasons why the situation might change. A &amp;lsquo;no&amp;rsquo; today is therefore rather a &amp;lsquo;no for now&amp;rsquo;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thinking small steps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A main challenge is to&lt;strong&gt; &amp;lsquo;legitimatize&amp;rsquo; myself&lt;/strong&gt;. Initially I will be filtered out by my contact&amp;rsquo;s physical and mental filters. Spam folders, secretaries, front-desks, trash cans and the depth of voice-mail and inbox are the playground. It often requires many small steps to increasingly gain legitimacy and mind-share of my contact.&lt;/p&gt;
&lt;p&gt;Getting a personal recommendation or introduction is ideal, learning the name and building a relationship with the secretary is important, referring to these people in my communications helps, being persistent but polite, relevant (research) and timely is required. The better I understand what is on my contact&amp;rsquo;s mind, the more relevant and convincing I will be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enjoying it&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the top game. When I enjoy it, my morale, style, work ethic, and conversion rate get a boost. And being in a good mood is the best of armors. Not all days are the same &amp;ndash; I put more time into it on the good ones and will do something else on others. So: Smile while you dial.&lt;/p&gt;</description>
         <author>Matthias Steinberg</author>
         <guid isPermaLink="false">http://www.matthias-steinberg.com/journal/2011/6/16/cold-calling-its-tough-but-it-works.html</guid>
         <pubDate>Thu, 16 Jun 2011 22:09:00 +0000</pubDate>
      <feedburner:origLink>http://www.matthias-steinberg.com/journal/2011/6/16/cold-calling-its-tough-but-it-works.html</feedburner:origLink></item>
      <item>
         <title>A simple, non-technical definition of cloud computing</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/egtBLkDLouM/a-simple-non-technical-definition-of-cloud-computing.html</link>
         <description>&lt;div id="_mcePaste"&gt;&lt;/div&gt;
&lt;div id="_mcePaste"&gt;&lt;/div&gt;
&lt;div id="_mcePaste"&gt;&lt;span class="full-image-block ssNonEditable"&gt;&lt;img src="http://www.matthias-steinberg.com/storage/in_search_of_yeti_863255.jpg?__SQUARESPACE_CACHEVERSION=1307112158774" alt=""/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;Last year, I found myself researching the market for investment opportunities in &amp;lsquo;cloud computing companies&amp;rsquo;, driven by the insight that this was a rapidly growing market. Yet, it felt a bit like hunting the &lt;strong&gt;Yeti&lt;/strong&gt; as I was having a hard time understanding &lt;em&gt;what exactly cloud computing is&lt;/em&gt;, and what it is not. Realizing that I shared this confusion with a lot of my peers, I thought it is worth sharing some insights I gained in the last month. I probably better emphasize that the following aims at explaining cloud computing purely from a &lt;em&gt;market perspective&lt;/em&gt;; I leave the technical explanation (and heated discussion) to technology experts.
&lt;div&gt;
&lt;h3&gt;&lt;strong&gt;&lt;em&gt;'Computing services sold through the internet like a utility&amp;rsquo; &lt;/em&gt;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/h3&gt;
&lt;div id="_mcePaste"&gt;There it is. Let&amp;rsquo;s take a closer look at this statement.&amp;nbsp;&lt;strong&gt;&amp;lsquo;Computing services&amp;rsquo;&lt;/strong&gt; describes infrastructure such as computing power, storage and bandwidth but also ready to use applications. A programmer &amp;lsquo;renting&amp;rsquo; servers in the cloud is an example of the former, Gmail an example of the latter. In both cases the user replaces a &amp;lsquo;physical&amp;rsquo;, on-premise resource such as physical servers or an email application (e.g. Outlook).&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Yet, what really differentiates cloud computing from other technologies are its &lt;strong&gt;low cost, flexibility and scale.&amp;nbsp;&lt;/strong&gt;&lt;/div&gt;
&lt;h3&gt;The scale of the underlying, accessible infrastructure is unprecedented&lt;/h3&gt;
&lt;div id="_mcePaste"&gt;Let&amp;rsquo;s start with what cloud computing &amp;lsquo;physically&amp;rsquo; actually is: The underlying infrastructure of cloud platforms provided by vendors such as Google, Amazon and &amp;nbsp;Microsoft are &lt;strong&gt;massive, high security data centers&lt;/strong&gt;. Each vendor has built a network of these datacenters around the world.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="_mcePaste"&gt;&lt;/div&gt;
&lt;div&gt;When data usage and bandwidth exploded in the 90s, companies invested massive sums in equipping their data centers with extremely expensive &amp;lsquo;supercomputers&amp;rsquo;. Google, who was a driving force in the development of cloud computing, set out to develop a cost effective way of building and running data centers. I the process the company developed basic principles of cloud computing infrastructure. Core ideas include t&lt;strong&gt;he use of thousand) of cheap standard servers&lt;/strong&gt; instead of a few supercomputers which reduces equipment cost significantly, and the reduction of operating cost through &lt;strong&gt;a massive scale of each datacenter&lt;/strong&gt;. Managing, maintaining and running applications on this infrastructure is part ot the technological challenge, and several complex software layers on top of this &amp;lsquo;army&amp;rsquo; of small servers form part of the technology.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div id="_mcePaste"&gt;The massive scale of the underlying infrastructure does not only reduce cost but&lt;strong&gt; gives users access to an unprecedented amount of computing power and storage&lt;/strong&gt;.&amp;nbsp;&lt;/div&gt;
&lt;h3&gt;Competitive cost is the key to &amp;lsquo;mass market&amp;rsquo; adoption&amp;nbsp;&lt;/h3&gt;
&lt;div id="_mcePaste"&gt;The most important achievement of this technology from a market perspective is the &lt;strong&gt;low cost &lt;/strong&gt;at which cloud computing is available. While it has a number of heavyweight &amp;lsquo;selling points&amp;rsquo;, the primary driving force behind the adoption of cloud computing are ultimately its attractive economics. Cloud computing is not a specialized &amp;lsquo;niche&amp;rsquo; technology; it rather serves the &amp;lsquo;mass market&amp;rsquo; of companies and private individuals and therefore competes directly with the corporate data center and desktop computer. Today already cloud ressources are often significantly cheaper.&lt;/div&gt;
&lt;h3&gt;&amp;lsquo;Elasticity&amp;rsquo; provides a whole new way of &amp;lsquo;consuming&amp;rsquo; IT&lt;/h3&gt;
&lt;div id="_mcePaste"&gt;The term &amp;lsquo;elasticity&amp;rsquo; is often used to describe the ability of the cloud computing user to&lt;strong&gt; adjust consumption to the actual need&lt;/strong&gt; at any point in time, which in combination with a &lt;strong&gt;consumption based pricing &lt;/strong&gt;adds to the economy of the resource from a user perspective. For example, Windows Azure charges for its services by the hour and/or megabyte. In contrast, corporate data centers for example must be built for peak times, and average capacity usage is extremely low.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div id="_mcePaste"&gt;The term &lt;strong&gt;&amp;lsquo;utility style&amp;rsquo;&lt;/strong&gt; is often used when describing the delivery model of cloud computing: The user chooses timing and amount of consumption matching his need, and is billed on usage &amp;ndash; just like electricity. &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;My guess is when Steve Jobs presents the iCloud on Monday it will prove to be flexible, cheap and quite powerful - and I hope it won't be the name alone that tells you it's cloud.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
         <author>Matthias Steinberg</author>
         <guid isPermaLink="false">http://www.matthias-steinberg.com/journal/2011/6/3/a-simple-non-technical-definition-of-cloud-computing.html</guid>
         <pubDate>Fri, 03 Jun 2011 14:36:29 +0000</pubDate>
      <feedburner:origLink>http://www.matthias-steinberg.com/journal/2011/6/3/a-simple-non-technical-definition-of-cloud-computing.html</feedburner:origLink></item>
      <item>
         <title>LinkedIn DirectAds, early thoughts</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/WZagYZ7wojo/linkedin-directads-early-thoughts.html</link>
         <description>&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.lokad.com"&gt;&lt;img src="http://vermorel.com/storage/linkedin-directads-lokad.png?__SQUARESPACE_CACHEVERSION=1288705434444" alt=""/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;I just started my first &lt;a rel="nofollow" target="_blank" href="https://www.linkedin.com/directads/"&gt;LinkedIn DirectAds&lt;/a&gt; campaign a few days ago. I had significant previous experience with Google Adwords, and I was interested to see how DirectAds could perform compared to Adwords.&lt;/p&gt;
&lt;p&gt;From an outsider perspective, LinkedIn looks the perfect marketplace for a niche B2B software technology such as &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/"&gt;Lokad&lt;/a&gt; which specializes in demand forecasting. Indeed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I know exactly the profile of the people I am trying to reach: vertical, job description, company size, location, etc.&lt;/li&gt;
&lt;li&gt;My willingness to pay for each &lt;em&gt;super-targeted&lt;/em&gt; lead is rather high.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DirectAds are extremely similar in their format with AdWords. The only minor difference is the presence of small 50x50 icon along your add (the illustration of this post is a screenshot of one of my DirectAds).&lt;/p&gt;
&lt;p&gt;The core difference with Adwords is that instead of betting on keywords,&lt;strong&gt; DirectAds are selected based the profile of the audience&lt;/strong&gt; you want to reach. The criteria available for audience filtering are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Company Size&lt;/li&gt;
&lt;li&gt;Job Function&lt;/li&gt;
&lt;li&gt;Industry&lt;/li&gt;
&lt;li&gt;Seniority&lt;/li&gt;
&lt;li&gt;Gender&lt;/li&gt;
&lt;li&gt;Age&lt;/li&gt;
&lt;li&gt;Geography&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yet, it must be noted at that, &lt;em&gt;at present time&lt;/em&gt;, only 4 (out of the 7 available) can be selected at the same time within a campaign. This restriction is rather odd and annoying. In my case, company size, job function, industry and seniority are good enough, but geography would have been a bonus too - especially for localized ads.&lt;/p&gt;
&lt;p&gt;Then, the &lt;em&gt;job function&lt;/em&gt; offers only 18 categories which is a very &lt;em&gt;rough&lt;/em&gt; granularity. Again, I would have preferred to be able to directly specify keywords listed in job description entered by the LinkedIn members.&lt;/p&gt;
&lt;p&gt;Finally, my initial selection is giving me about 14k members as my target audience. After 48h of display, I have 2k impressions for a single $2 click ($2/click is the minimal bid).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Very low traffic&lt;/strong&gt;&lt;strong&gt; is probably the downside of LinkedIn DirectAds&lt;/strong&gt;. With such a limited audience, even assuming a good conversion rate, but it will take months to recover the 2h spent initializing the campaign.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2010/11/2/linkedin-directads-early-thoughts.html</guid>
         <pubDate>Tue, 02 Nov 2010 14:08:53 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2010/11/2/linkedin-directads-early-thoughts.html</feedburner:origLink></item>
      <item>
         <title>Wish list for Relenta CRM</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/BK98lO5m32c/wish-list-for-relenta-crm.html</link>
         <description>&lt;p&gt;At Lokad, we have using the &lt;a rel="nofollow" target="_blank" href="http://www.relenta.com/"&gt;Relenta CRM&lt;/a&gt; for nearly two years. It's an excellent lean CRM that comes with &lt;strong&gt;a core focus on emails &lt;/strong&gt;which happen to represent about 90% of our interactions with clients and prospects.If you happen to be an ISV, Relenta is worth having a closer look.&lt;/p&gt;
&lt;p&gt;Although, I have been missing a few key features in Relenta for a long time. Hence, I taking the time here to post my wish list for Relenta.&lt;/p&gt;
&lt;h3&gt;1. Accounts&lt;/h3&gt;
&lt;p&gt;Relenta only deals with &lt;em&gt;Contacts&lt;/em&gt; yet, when prospecting larger companies, many contacts are typically involved. It would be much nicer if it was possible to create &lt;em&gt;1-to-many&lt;/em&gt; relationships between &lt;em&gt;Accounts&lt;/em&gt; and &lt;em&gt;Contacts&lt;/em&gt;. In particular, this would let the Relenta user browse at a glance all the latest interactions related to a particular account, instead of jumping from one contact to the next.&lt;/p&gt;
&lt;h3&gt;2. Recent updates&lt;/h3&gt;
&lt;p&gt;One of the feature that I like the most in wikis are their abilities to display the &lt;em&gt;recent changes&lt;/em&gt;. Through &lt;em&gt;recent change&lt;/em&gt;, you can gain immediate insights in what other people are doing, without having to bother to actually ask them.&lt;/p&gt;
&lt;p&gt;Presently, there is no way to easily figure out who has been doing what in Relenta.&amp;nbsp; It would much nicer if a stream of &lt;em&gt;recent updates&lt;/em&gt; was available for browsing. In particular, display could be made more or less compact by aggregating updates per contact (or per account). Eventually, the stream could even be made available as RSS.&lt;/p&gt;
&lt;h3&gt;3. Activity capture API&lt;/h3&gt;
&lt;p&gt;The Lead Capture API of Relenta is a killer feature due to its simplicity. For an ISV, it's a super simple way to collect all trial registrations that keeps flowing through our online apps with extremely limited integration grunt-work.&lt;/p&gt;
&lt;p&gt;Yet, although it's very simple to automate the &lt;em&gt;Contact&lt;/em&gt; creation in Relenta, it's not possible to automate the insertion of &lt;em&gt;Activities&lt;/em&gt; later on the very same contact. This feature would be extremely handy to automatically report payments, or any kind of noticable activities (in the case of Lokad that would be large forecasts retrieval for example).&lt;/p&gt;
&lt;h3&gt;4. Refined tagging&lt;/h3&gt;
&lt;p&gt;Tagging is one of the best idea of the &lt;em&gt;Web 2.0 wave&lt;/em&gt;. It's a great way to organize complex yet little structured content.&lt;/p&gt;
&lt;p&gt;Relenta already provide a minimal tagging system, yet there is no tag auto-completion (killer feature) and it's not possible to search against multiple tags. Pushing a bit more work on tags would be a great move forward to make the most of them.&lt;/p&gt;
&lt;h3&gt;5. iCalendar support&lt;/h3&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/ICalendar"&gt;iCalendar&lt;/a&gt; is a very nice and popular format to send meeting request. Presently, Relenta does not support .ics attachments and meeting requests appears as completely garbled. It would be really nice if Relenta was support iCalendar with the possibility to acknowledge meeting requests.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2010/7/27/wish-list-for-relenta-crm.html</guid>
         <pubDate>Tue, 27 Jul 2010 08:25:53 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2010/7/27/wish-list-for-relenta-crm.html</feedburner:origLink></item>
      <item>
         <title>BIG award for a TINY company (Lokad)</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/0s7ly_6s4Tw/big-award-for-a-tiny-company-lokad.html</link>
         <description>&lt;p&gt;Lokad just won the &lt;a rel="nofollow" target="_blank" href="http://blog.lokad.com/journal/2010/6/23/honored-by-the-windows-azure-partner-award-of-2010.html"&gt;Windows Azure Partner award of 2010&lt;/a&gt;. That's an extremely big award for an exceptionally small company. The last French company to get such as an award was no less than Dassault Syst&amp;egrave;mes, the largest software company in France. I am proud of the work done by the &lt;a rel="nofollow" target="_blank" href="http://www.lokad.com/AboutUs.ashx"&gt;Lokad team&lt;/a&gt;.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2010/6/23/big-award-for-a-tiny-company-lokad.html</guid>
         <pubDate>Wed, 23 Jun 2010 13:13:37 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2010/6/23/big-award-for-a-tiny-company-lokad.html</feedburner:origLink></item>
      <item>
         <title>Strategies Logistique event in Paris</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/g9R1frn_5UY/strategies-logistique-event-in-paris.html</link>
         <description>&lt;p&gt;I have been giving a talk at the &lt;a rel="nofollow" target="_blank" href="http://www.strategielogistique.com/rencontres-experts-la-prevision,2960"&gt;&lt;em&gt;Strategies Logistique&lt;/em&gt; event&lt;/a&gt; in Paris last week about cloud computing, supply chain and Lokad. Beyond forecasting, I believe that supply chain will be one of the entreprise area that will benefit the most in the next decade of the migration toward the cloud.&lt;/p&gt;
&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/38737012@N04/4688643660/in/set-72157624121318451/"&gt;&lt;img src="http://farm5.static.flickr.com/4063/4688643660_04533b0ca9_m_d.jpg?__SQUARESPACE_CACHEVERSION=1276601046408" alt=""/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="full-image-inline ssNonEditable"&gt;&lt;span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/38737012@N04/4687946155/in/set-72157624121318451/"&gt;&lt;img src="http://farm5.static.flickr.com/4015/4687946155_976f652a48_m_d.jpg?__SQUARESPACE_CACHEVERSION=1276601014478" alt=""/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &lt;span class="full-image-inline ssNonEditable"&gt;&lt;span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/38737012@N04/4687990531/in/set-72157624121318451/"&gt;&lt;img src="http://farm5.static.flickr.com/4005/4687990531_d83fabb774_m_d.jpg?__SQUARESPACE_CACHEVERSION=1276600998353" alt=""/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;More &lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/38737012@N04/sets/72157624121318451/"&gt;pictures&lt;/a&gt;. Special thanks to &lt;a rel="nofollow" target="_blank" href="http://www.strategieslogistique.com/gilles-solard,2"&gt;Gilles Solard&lt;/a&gt; for the smooth organization of this great event.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2010/6/15/strategies-logistique-event-in-paris.html</guid>
         <pubDate>Tue, 15 Jun 2010 11:31:02 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2010/6/15/strategies-logistique-event-in-paris.html</feedburner:origLink></item>
      <item>
         <title>O/C mapper for TableStorage</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/vGZQYf8g70Q/oc-mapper-for-tablestorage.html</link>
         <description>&lt;p&gt;&lt;span class="full-image-float-left ssNonEditable"&gt;&lt;span&gt;&lt;img src="http://vermorel.com/storage/table-storage.png?__SQUARESPACE_CACHEVERSION=1259847593126" alt=""/&gt;&lt;/span&gt;&lt;/span&gt;The &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/dd179423.aspx"&gt;Table Service API&lt;/a&gt; is the most subtle service provided among the cloud storage services offered by Windows Azure (with also include Blob and Queue Series for now). I did &lt;a rel="nofollow" target="_blank" href="http://vermorel.com/journal/2009/9/14/thinking-the-table-storage-of-windows-azure.html"&gt;struggle&lt;/a&gt; a while to eventually &lt;a rel="nofollow" target="_blank" href="http://vermorel.com/journal/2009/9/17/table-storage-or-the-100x-cost-factor.html"&gt;figure out&lt;/a&gt; what was the unique specificity of Table Storage from a &lt;strong&gt;scalability perspective &lt;/strong&gt;or rather from a &lt;em&gt;cost-to-scale&lt;/em&gt; perspective as the cloud charges you according to your consumption.&lt;/p&gt;
&lt;p&gt;Since the scope of the Table Storage remained a fuzzy element for me for a long time, the beta version of &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/lokad-cloud/"&gt;Lokad.Cloud&lt;/a&gt; does not include (yet) support for Table Storage although. Rest assured that this is definitively part of our roadmap.&lt;/p&gt;
&lt;h3&gt;TableStorage vs. others&lt;/h3&gt;
&lt;p&gt;Let's start by identifying the specifics of TableStorage compared to other storage options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compared to Blob Storage, &lt;br /&gt; 
&lt;ul&gt;
&lt;li&gt;Table Storage provides a much &lt;strong&gt;cheaper fine-grained access&lt;/strong&gt; to individual bits of information. In terms of I/O costs, Table Storage is up to 100x cheaper than Blob Storage through &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/dd894038.aspx"&gt;Entity Group Transaction&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Table Storage will (in a near feature) provides &lt;a rel="nofollow" target="_blank" href="http://www.mygreatwindowsazureidea.com/pages/34192-windows-azure-feature-voting/suggestions/396314-support-secondary-indexes?ref=title"&gt;secondary indexes&lt;/a&gt; while the Blob Storage only provide 1 single hierarchical access to blobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Compared to SQL Azure,       
&lt;ul&gt;
&lt;li&gt;Table Storage &lt;strong&gt;lacks about everything you would expect from a relational database&lt;/strong&gt;. You cannot perform any Join operation or establish a Foreign key relationship and this is very unlikely to be ever available. &lt;/li&gt;
&lt;li&gt;yet, while SQL Azure is limited to 10GB (this value might increase in the future, this is really not the way to go), &lt;strong&gt;Table Storage is expected to be nearly infinitely scalable&lt;/strong&gt; for its own limited set of operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The StorageClient library shipped with Azure SDK is nice as it provides a first layer of abstraction against the raw REST API.&amp;nbsp; Nevertheless, coding your app directly against the ADO.NET client library seems painful due to the many implementation contraints that comes with the REST API. Further separation of concerns is needed here.&lt;/p&gt;
&lt;h3&gt;The Fluent NHibernate inspiration&lt;/h3&gt;
&lt;p&gt;TableStorage has way much less expressivity than relational databases, nonetheless, classical O/R mappers are great source of inspiration, especially nicely designed ones such as &lt;a rel="nofollow" target="_blank" href="http://nhforge.org/"&gt;NHibernate&lt;/a&gt; and its must-have addon &lt;a rel="nofollow" target="_blank" href="http://fluentnhibernate.org/"&gt;Fluent NHibernate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Although, the mapping entity-to-object isn't that complex in the case of TableStorage, I firmly believe that a proper mapping abstraction ala Fluent NH could considerably ease the implementation of cloud apps.&lt;/p&gt;
&lt;p&gt;Among &lt;strong&gt;key scenarios&lt;/strong&gt; that I would like to see addressed by Lokad.Cloud:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A seamless &lt;strong&gt;management of large entity batches when no atomicity is involved&lt;/strong&gt;: let's say you want to update 1M entities in your Table Storage. Entity Group can actually reduce I/O costs by 100x. Yet, Entity Group comes with various constraints such as no more than 100 entities per batch, no more than 4MB by operation, ... Fine-tuning I/O from the client app would have to be replicated for every table, it really makes sense to abstract that away.&lt;/li&gt;
&lt;li&gt;A seamless &lt;strong&gt;overflowing management toward the Blob Storage&lt;/strong&gt;. Indeed, Lokad.Cloud already natively push &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/lokad-cloud/wiki/ScalableCloudServices"&gt;overflowing queued items&lt;/a&gt; toward the Blob Storage. In particular, Table Storage assume than no properties should weight more than 64kb, but manually handling the overflow from the client app seems very tedious (actually a similar feature is already considered for blogs in SQL Azure).&lt;/li&gt;
&lt;li&gt;A more customizable mapping from &lt;strong&gt;.NET type to native property types&lt;/strong&gt;. The amount of property types supported by the Table Storage is &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/dd179338.aspx"&gt;very limited&lt;/a&gt;. Although a few more types might be added in the future, Table Storage won't (ever?) be handling native .NET type. Yet, if you have a &lt;a rel="nofollow" target="_blank" href="http://vermorel.com/journal/2009/12/3/serialization-in-the-cloud-sharedcontract-vs-sharedtype.html"&gt;serializer at hand&lt;/a&gt;, problem is no more. &lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;better versioning management&lt;/strong&gt; as .NET properties may or may not match the entity properties. Fluent NH has an &lt;a rel="nofollow" target="_blank" href="http://wiki.fluentnhibernate.org/Getting_started#Mappings"&gt;exemplary approach&lt;/a&gt; here: by default, match with default rule, otherwise override matching. In particular, I do not want the .NET client code to be carved in stone because of some legacy entity that lies in my Table Storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entity access has to be made through indexed properties&lt;/strong&gt; (ok, for now, there isn't many). With the native ADO.NET, it's easy to write Linq queries that give a false sense of efficiency as if entities can be accessed and filtered against any property. Yet, as data grow, performance is expected to be abysmal (beware of &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/dd135718.aspx"&gt;timeouts&lt;/a&gt;) unless entities are accessed through their indexes. If data is not expected to grow, then you go for SQL Azure instead, as it's way more convenient anyway.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any further aspects that should be managed by the O/C mapper? Any suggestion? I will be coming back soon with some more implementation details.&lt;/p&gt;</description>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2009/12/3/oc-mapper-for-tablestorage.html</guid>
         <pubDate>Thu, 03 Dec 2009 15:46:37 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2009/12/3/oc-mapper-for-tablestorage.html</feedburner:origLink></item>
      <item>
         <title>Serialization in the cloud: SharedContract vs. SharedType</title>
         <link>http://feedproxy.google.com/~r/lokad/~3/Vr_ekYQa0v0/serialization-in-the-cloud-sharedcontract-vs-sharedtype.html</link>
         <author>Joannes Vermorel</author>
         <guid isPermaLink="false">http://vermorel.com/journal/2009/12/3/serialization-in-the-cloud-sharedcontract-vs-sharedtype.html</guid>
         <pubDate>Thu, 03 Dec 2009 10:00:31 +0000</pubDate>
      <feedburner:origLink>http://vermorel.com/journal/2009/12/3/serialization-in-the-cloud-sharedcontract-vs-sharedtype.html</feedburner:origLink></item>
   </channel>
</rss><!-- fe1.yql.bf1.yahoo.com compressed/chunked Thu May 31 22:07:43 UTC 2012 -->

