Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!
Software Development Blogs: Programming, Software Testing, Agile Project Management
Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!

In NoSQL: Past, Present, Future Eric Brewer has a particularly fine section on explaining the often hard to understand ideas of BASE (Basically Available, Soft State, Eventually Consistent), ACID (Atomicity, Consistency, Isolation, Durability), CAP (Consistency Availability, Partition Tolerance), in terms of a pernicious long standing myth about the sanctity of consistency in banking.
Myth: Money is important, so banks must use transactions to keep money safe and consistent, right?
Reality: Banking transactions are inconsistent, particularly for ATMs. ATMs are designed to have a normal case behaviour and a partition mode behaviour. In partition mode Availability is chosen over Consistency.
Why? 1) Availability correlates with revenue and consistency generally does not. 2) Historically there was never an idea of perfect communication so everything was partitioned...
This morning we released the v2.0 update of the Windows Azure SDK for .NET. This is a major refresh of the Windows Azure SDK with some really great new features and enhancements. These new capabilities include:
All of these SDK enhancements are now available to start using immediately and the SDK can now be downloaded from the Windows Azure .NET Developer Center. Like all of the other Windows Azure SDKs we provide, the Windows Azure SDK for .NET is a fully open source project (Apache 2 license) hosted on GitHub.
Below are more details on the new features and capabilities released today:
Web Sites: Improved Visual Studio PublishingWith today’s release we’ve made it even easier to publish Windows Azure Web Sites. Just right-click on any ASP.NET Web Project (or Web Site) within Visual Studio to Publish it to Windows Azure:
This will bring up a publish profile dialog the first time you run it on a project:
Clicking the import button will enable you to import a publishing profile (this is a one-time thing you do on a project – it contains the publishing settings for your site in Windows Azure).
With previous SDK releases you had to manually download the publish profile file from the Windows Azure Management Portal. Starting with today’s release you can now associate your Windows Azure Subscription within Visual Studio – at which point you can browse the list of sites in Windows Azure associated with your subscription in real-time, and simply select the one you want to publish to (with no need to manually download anything):
Then just select the Web Site on Windows Azure that you want to deploy your app to, hit ok, and your app will be live on Windows Azure in seconds. You can then quickly republish again (also in seconds) without having to configure anything (all of the publish profile settings are persisted for later use).
Web Sites: Management Support within the Visual Studio Server ExplorerToday’s SDK release also adds new support for managing Web Sites, deployed in the cloud with Windows Azure, through the Visual Studio Server Explorer. When you associate your Windows Azure subscription with Visual Studio, you’ll now see all of your running web sites within Windows Azure in the Visual Studio Server Explorer:
In addition to listing your sites, you can also perform common operations on them like Starting/Stopping them (just right click on one to do this). You can also use the View Settings command on a site to retrieve the live site configuration settings from Windows Azure:
When you do this you’ll be able to view and edit/save the live settings of the Web Site directly within Visual Studio. These settings are being pulled in real-time from the running Web Site instance in the cloud within Windows Azure:
Changes you save here will be persisted immediately into the running instance within Windows Azure. No need to redeploy the application nor even open the Windows Azure Management Portal.
Web Sites: Streaming Diagnostic LogsOne of the really awesome new features in today’s release is support that enables you to stream your Windows Azure Web Site’s application logs directly into Visual Studio. This is a super useful feature that enables you to easily debug your Web Site when it is running up in the cloud in Windows Azure.
How to Enable Live Streaming of Diagnostic Logs
To try out this feature, we’ll first add a Trace statement to an ASP.NET Web application and publish it to Windows Azure (as a Web Site). We’ll add the trace statement to our app using the standard System.Diagnostics tracing API in .NET. We’ll use the Trace.TraceError() method to write out an error:
By default when we hit the Web Site this method will do nothing – because tracing is disabled by default on Web Sites.
If we want to enable tracing on our Web Site (in order to debug something) we can do that through the Windows Azure Management Portal (click the Configuration tab within a Web Site to enable this in the portal). Or alternatively we can now do this directly within Visual Studio using the View Settings command within Server Explorer (like we saw above):
Notice above how we are enabling Application Logging for our Web Site, and turning it on so that it logs all “Error” trace events. Make sure “Error” is selected and then click the “Save” button to persist the setting to Windows Azure – at which point we can hit our Web Site again and this time our Trace Error statements will be saved.
To view the trace statements inside Visual Studio we then simply need to click on our Web Site within the Server Explorer and select the View Streaming Logs in Output Window command:
This will open our Visual Studio output window – which will display the Trace.TraceError() statements as they execute in our live site (there is only a ~2 second delay from the time it executes to the point it shows up in our Visual Studio output window – which is super convenient when trying to debug something):
When you are done debugging the issue, just right-click on the Web Site again and choose the Stop Viewing Logs command to stop the logs being sent to VS (and when you are done with the issue itself make sure to turn off logging entirely by going back to the settings window and disabling it):
The above support is super useful and makes it much easier to debug issues that only occur in a live Windows Azure environment. For more information on this feature (and how to use it from the command-line) check out this blog from Scott Hanselman.
Note: You must have a /LogFiles/Application directory in your Windows Azure Web Site before you can stream the application logs to Visual Studio. This gets created the first time a trace statement gets written to disk – so you’ll want to make sure you execute a Trace statement first before opening up the log streaming view inside Visual Studio. We’ll be making an update to Windows Azure Web Sites in the next week or two which will cause this directory to be automatically created for you – both for existing and new web sites. This will enable you to start streaming the logs even before a trace operation has occurred. Until then just make sure you have written one trace statement before you start the log streaming window in VS.
Cloud Services: Support for High Memory VM InstancesTwo weeks ago we announced the general availability of our Windows Azure IaaS release. Included as part of that release was support for creating large memory IaaS VMs using our new 4 core x 28GB RAM (A6) and 8 core x 56GB RAM (A7) VM sizes.
Starting with today’s Windows Azure SDK 2.0 for .NET release, you can also now deploy your Cloud Services to these same VM sizes:
For details on the VM sizes please refer to: http://msdn.microsoft.com/en-us/library/windowsazure/dn197896.aspx
Cloud Services: Faster Deployment Support with Simultaneous Update OptionToday’s release includes a number of enhancements to improve the deployment and update times of Cloud Services.
One of the new deployment options we now support is the ability to do a “Simultaneous Update” of a Cloud Service (we sometimes also refer to this as the “Blast Option”). When you use this option we bypass the normal upgrade domain walk that is done by default with Cloud Services (where we upgrade parts of the Cloud Service sequentially to avoid ever bringing the entire service down) and we instead upgrade all roles and instances simultaneously. With today’s release this simultaneous update logic now happens within Windows Azure (on the cloud side). This has the benefit of enabling the Cloud Service update to happen much faster.
Note that because it updates all roles simultaneously you want to be careful about using it in production for normal updates (otherwise users will experience app downtime). But it is great for scenarios where you want to quickly update a dev or test environment (and don’t care about a short period of downtime between your updates), or if you need to blast out a critical app update fast in production and you are ok with a short availability impact.
To perform a Simultaneous Update using Visual Studio, select the “Advanced Settings” tab within the Cloud Service Publish wizard and choose the “Settings” link next to the Deployment Update checkbox:
This will launch a new dialog. Within it you can now select the new “Simultaneous Update” option:
Once saved, the updates to this Cloud Service will be performed using this option and all roles and instances will be updated simultaneously.
Cloud Services: Improved Diagnostics SupportToday’s release also includes some major enhancements to our diagnostics support with Cloud Services.
Easily Configure Diagnostics
Visual Studio has enabled Windows Azure Diagnostics for several versions. With today’s Windows Azure .NET SDK release we are making it even easier to start with the right diagnostics collection plan and leverage the data it provides to find errors and other useful information about your live service.
You can right-click on a Cloud Service role within Visual Studio’s Solution Explorer to pull up Configuration about it:
Today’s SDK release includes an updated Diagnostics section within it:
You can use this updated Diagnostics section to configure how you want to collect and store errors captured by the default .NET trace listener and your Trace.TraceError() code – all without having to write any glue code to setup or initialize. You can specify the collection plan you want to use at runtime: Errors Only [default], All Information or a Custom Plan. The custom plan is pretty rich and enables fine grain control over error levels, performance counters, infrastructure logs, collection intervals and more.
The diagnostics plan you configure through the configuration UI above is persisted in a diagnostics.wadcfg XML file. If you open the Cloud Service role node within the Server Explorer you can find it and optionally edit the settings directly within the text editor:
Because the file is saved with your source code it can be managed under source control. It is also deployed with your cloud service and can be changed post deployment without requiring an application redeploy (I cover how to enable this live update below).
View Diagnostics on a Live Service
With today’s release we are also making it really easy for developers to review the live diagnostics data from their Cloud Services directly within Visual Studio – as well as dynamically turn on or off more detailed diagnostic capturing on their Cloud Services without having to redeploy the Cloud Service (which makes it much easier to quickly debug live production issues).
For any published Cloud Service, you can now view a quick summary of live service errors and other important status by clicking the View Diagnostics Data command in Visual Studio – which is surfaced off of each role node within a Cloud Service in the Visual Studio Server Explorer:
Executing this command will query the diagnostics table for the Cloud Service within Windows Azure and list a quick summary view of recent data within it. In the example below we can see that we forgot to update the app’s configuration pointing to our SQL DB and therefore our stored procedure calls are failing in the deployed service:
Even more detailed diagnostics data has been gathered and stored in the Cloud Service’s Diagnostics Storage account. Click the View all Data link to drill into it. This loads a new Windows Azure Storage Table viewer. You can make use of the Query Builder support in it to refine your view over the diagnostics data. In the following example we are filtering a window of time occurring after 5:48pm by querying over the TimeStamp(Virtual). This refers to the time it occurred in the service rather than the time the data was collected and transferred.
This makes it much easier for you to look through historical logs to try and identify what the issue is.
Update Diagnostics Settings on a Live Service
Visual Studio also now enables you to configure and update the diagnostics settings for running Cloud Service directly from Server Explorer. Diagnostic configuration can be updated at any time without the need to add code to your project and without having to redeploy the Cloud Service (which makes it much easier to quickly debug live production issues).
To do this, use the Server Explorer –> Windows Azure Compute node to select a running role instance in Windows Azure, and then click the Update Diagnostics Settings command on it to configure the runtime diagnostics settings for it:
Selecting this command will bring up a dialog that allows you to view and edit the Diagnostics Settings for the role. Note that we can dynamically change the application log collection settings, event logs, performance counters, Infrastructure logs (like IIS, etc), and more:
In this example we will collect information about available memory + CPU + Requests/sec on the role from a performance counter. We’ll do this by selecting the Performance Counters tab and selecting the appropriate counter within it. In addition to selecting the performance counters we want to track, we also need to set a Transfer period (in minutes) and Buffer size (MB). We’ll set these to be 1 minute and 1024 MB (if we don’t set these then the logs won’t be copied to our storage account):
When we click OK, the collection plan will immediately be applied to the live role instances, and we’ll start collecting the new data we specified. Within about a minute we’ll see a new WADPerformanceCountersTable created in our storage account, and our performance monitor data will start to be collected in it:
Double clicking the above table would enable us to browse and review the performance monitor data.
Being able to dynamically turn on/off this functionality at runtime (without having to redeploy the Cloud Service) is super useful. If we wanted to change the collection plan long term for every subsequent deployment, we can just apply the configuration changes we make at runtime back in the role designer for the cloud service project (or check it into source control). That way new Cloud Service deployments will get it by default.
More Information
The above diagnostics support is really powerful, and can be used to capture diagnostic data from any number of roles and instances within a Cloud Service (including both web and worker roles). And it makes it even easier to debug and analyze issues within multi-tier deployments.
Note that the .NET Diagnostics Listener support to output trace statements to Windows Azure’s diagnostics agent is enabled by default when you create new Cloud Service projects within Visual Studio. If you start with an existing ASP.NET Web Project and then later convert it to be a Cloud Service you’ll want to manually add the below trace listener registration code to your web.config file in order to enable the above diagnostics support:
<system.diagnostics>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiagnostics">
<filter type="" />
</add>
</listeners>
</trace>
</system.diagnostics>
With the previous Windows Azure SDK 1.8 release we revamped the Visual Studio tooling support for Windows Azure Storage. This previous release focused on read/write features for the Windows Azure Storage Blob and Queue services.
With today’s Windows Azure SDK 2.0 release, you can also now create and delete Windows Azure Tables, and add/edit/delete table entities in them from the Visual Studio Server Explorer. This saves you time and allows you to easily use Visual Studio to build apps that use Windows Azure Storage Tables.
Within the Visual Studio Server Explorer, simply right-click within the Windows Azure Storage node to create and name a new Table:
Once you have the table created, you can then optionally add entities to it directly within Visual Studio (just click the “Create Entity” button on the table designer):
You can also edit/delete existing entities within Tables:
We also now make it much easier to build Table queries - without requiring expertise with OData syntax - using a new Query Builder available as part of the Table tooling:
The above features make it much easier to use Windows Azure Storage Tables.
Service Bus: Updated Client LibraryToday’s release also includes an updated Service Bus client library with several great new features:
With today’s release, Windows Azure PowerShell (which is a separate download) has moved to support PowerShell 3.0. Today’s release also includes numerous new PowerShell cmdlets that enable you to automate Windows Azure Web Sites, Cloud Services, Virtual Machines, as well as application services including Service Bus and the Windows Azure Store. You can find the full change log here.
Below are a few examples of some of the new functionality provided:
Web Sites
You can now get streaming logs for both http and application logs from your PowerShell console via the following command:
>>> Get-AzureWebsiteLog <your website> –Tail
Cloud Services
You can now use a faster deployment option by opting into a simultaneous upgrade option which will upgrade all web and worker roles in parallel:
>>> Set-AzureDeployment –Mode Simultaneous
Virtual Machines
You can now use the new high memory virtual machine A6 & A7 images with these two commands:
>>> New-AzureVM
>>> New-AzureQuickVM
We also enabled PowerShell Remoting by default when you create a VM via PowerShell to enable you to easily run your PowerShell cmdlets or scripts against your newly created virtual machines in Azure.
Service Bus
You can now manage Service Bus namespaces via newly added cmdlets which allow you to create, list and remove Service Bus namespaces.
Windows Azure Store
You can now manage your Azure Store add-ons from PowerShell. You can list the available add-ons, purchase an add-on, view your purchased add-ons and also upgrade the plan on a purchased add-on.
For example, the below command would create and deploy a MongoDB service from MongoLab (one of our Windows Azure Store partners):
>>> New-AzureStoreAddOn myMongoDB –AddOn mongolab –plan free –Location “West US”
Storage
We now support blob CRUD operations via PowerShell which allow you to manage Storage blob containers, upload/download blob content, and copy blobs around. This enables you to create scripts to seed some initial data for your applications or check what is in your storage account quickly when you are developing your application.
Scaffolding cmdlets for Web/Worker Role
We have also added new cmdlets for scaffolding. You can now use Add-AzureWebRole and Add-AzureWorkerRole to create projects for general web/worker role. You can use New-AzureRoleTemplate to generate a customized role template which you can use in Add-AzureWebRole or Add-AzureWorkerRole via the –TemplateFolder parameter.
More InformationA few other updates/changes with today’s release:
You can also learn more about today’s SDK release, and see some demos of it in action, from my visit to this week’s latest Cloud Cover Show on Channel9:
SummaryToday’s release includes a bunch of great features that enable you to build even better cloud solutions. If you don’t already have a Windows Azure account, you can sign-up for a free trial and start using all of the above features today. Then visit the Windows Azure .NET Developer Center to learn more about how to build apps using today’s SDK release.
Hope this helps,
Scott
P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: twitter.com/scottgu

If any of these items interest you there's a full description of each sponsor below. Please click to read more...
What do Bill Gates, Steve Jobs, and Walt Disney teach us about building a culture of innovation?
A lot.
I put together a comprehensive collection of innovation quotes. And by comprehensive, I mean more than 100 of the greatest thoughts on innovation, all at your finger tips. You’ll hear from Edison, Mozart, Michael Porter, Peter Drucker, Seth Godin, and more.
And, to make the innovation quotes more meaningful, I’ve grouped them into useful categories, so you can flip through the sections you care about the most. There’s a section on Action, Birthing Ideas, and Continuous Learning and Growth. You’ll also find a section on Fear and Failure. After all, success in innovation is often a numbers game. Remember what Edison taught us.
Just because it’s a comprehensive collection of innovation quotes, doesn’t mean it’s complete, or that it’s a done deal. There’s always room for improvement (and innovation.) So if you have some favorite innovation quotes that I’ve left out, please let me know. I want this collection to be truly insightful, and most importantly, actionable.
After all, what good are good ideas, if you can’t turn them into results.
And that’s the truth about innovation.
Enjoy.

This is a repost of part 2 (part 1) of an interview I did for the Boundary blog.
Boundary: There’s another battle coming down the pike between Amazon (AWS) and Google (GCE). How should the CTO decide which one’s best?
Hoff: Given that GCE is still closed to public access we have very little common experience on which to judge. The best way to decide is as always, by running a few experiments. Pick a few representative projects, a representative team, implement the projects on both infrastructures, crunch some numbers, figure out the bigger picture and then select the one you wanted in the first place
.
Sebastian Stadil, founder of Scalr, recently wrote about his experiences on both platforms and found some interesting differences: AWS has a much richer set of services; GCE is on-demand only, so AWS can be cheaper; GCE has faster disk and faster network IO, especially between datacenters; GCE has faster boot times and can mount read-only partitions across multiple machines; and GCE shares images across regions...
In the last few years, we see the advent of highly distributed systems. Systems that have clusters with lots of servers are no longer the sole realm of the googles’ and facebooks’ of the world and we begin to see multi-node and big data systems in enterprises. e.g. I don’t think a company such as Nice (the company I work for) would release an hadoop based analytics platform and solutions, something we did just last week, 5-6 years ago.
So now that large(r) clusters are more prevalent, I thought it would be a good time to reflect on the fallacies of distributed computing and how/if they are relevant; should they be changed.
If you don’t know about the fallacies you can see the list and read the article I wrote about them at the link mentioned above. In a few words I’d just say that these are statement, originally drafted by Peter Deutsch, Tom Lyon and others in in 1991-2, about failed assumptions we are tempted to make when working on distributed systems which turn out as fallacies and cost us dearly.
So the fallacies help keep in mind that distributed systems are different, and they do seem to hold, even after the 20 years that passed. I think, however, that working with larger cluster we should also consider the following 3 as fallacies we’re likely to assume
Instances are free
A lot of the new technologies of the big-data and noSQL era bring with them the promise of massive scalability. If you see a performance problem, you can just (a famous lullaby word) add another server. In most cases that is even true, you can indeed add more servers and get better performance. What these technologies don’t tell you is that instances have costs. More instances mean increased TCO starting from management effort monitoring, configuring etc, as well as operations cost either for the hardware; the rented space and electricity in a hosted solution or the usage by hours in a cloud environment. So from the development side of the fence the solution is easy – add more hardware. In reality sometimes it is better to make the effort and optimize your code/design. Just the other week we had a more than a 10 fold improvement in query performance by removing query parts that were no longer needed after a change in the data flow of the system – that was way cheaper than adding 2-3 more nodes to achieve the same results.
Instances have identities
I remember, sometime in Jurassic age, when I set up a network for the first time (A Novell Netware 3.11 if you must ask) it had just one server. Naturally that server was treated with a lot of respect. It had a a printer connected, it had a name, nobody could touch it but me. One server to rule all them clients. Moving on I had server farms, so just a list of random names began to be a problem so we started to use themes like gods, single malts (“can you reboot the Macallan please”) etc. Anyway, that’s all nice and dandy and if you are starting small with a (potentially) big data project you might be tempted to do something similar. If you are tempted – don’t. When you have tens of servers (and naturally even worst when you have hundreds or thousands) you no longer care about the individual server. You want to look at the world as pools of server types. you have a pool of data nodes in your hadoop cluster, a pool of application servers , a pool of servers running configuration x and another with configuration y. You’d need tools like abiquo and/or chef and/or ansible or similar products to manage this mess. But again, you won’t care much about XYZ2011 server and even it runs tomcat today, tomorrow it may make more sense to make it part of the cassandra cluster. What matters are the roles in the pools of resources and that the pool sizes will be enough to handle the capacity needed.
Map/Reduce is a panacea
Hadoop seems to be the VHS of large clusters. It might not be the ultimate solution, but it does seem to be the one that gets the most traction – a lot of vendors old (like IBM, Microsoft, Oracle etc.) and new (Hortonworks, Cloudera, Pivotal etc.) offer Hadoop distros and many other solutions offer Hadoop adaptors (Mongodb, Casandra, Vertica etc.) and Hadoop, well hadoop is about the distributed file system and, well, map/reduce.
Map/Reduce, which was introduced in 2004 by Google is an efficient algorithm for going over a large distributed data set without moving the data (map) and then producing aggregated or merged of results (reduce). Map/Reduce is great and it is a very useful paradigm applicable for a large set of problems.
However it shouldn’t be the only tool in your tool set as map/reduce is inefficient when there’s a need to do multiple iterations on the data (e.g. grpah processing) or when you have to do many incremental updates to the data but don’t need to touch all of it. Also there’s the matter of ad-hoc reports (which I’ll probably blog about separately) Google solved these in pregel, percolator and dremel in 2009/2010 and now the rest of the world is playing catchup as it did with map/reduce a few year ago – but even if the solutions are not mature yet, you should keep in mind that they are coming
Instances are free; Instances have identities; and map/reduce is a panacea – these are my suggested additions to the fallacies of distributed computing when talking about large clusters. I’d be happy to hear what you think and/or if there are other things to keep in mind that I’ve missed
This past January, more than 20,000 people got the book that’s changing lives, and changing the workplace:
Getting Results the Agile Way: A Personal Results System for Work and life
You’re going to want to read this if you want to level up in work and life, or share it with a friend you know that you want to help give the edge.
I’m going to walk through how I use Agile Results to show you how YOU can seriously and significantly amplify your impact, get better performance reviews, and spend more time doing what YOU enjoy. (So, while this post might seem all about me, it’s really about you.)
I’m not going to make it look easy. I’m going to make it real. I care way more that you get the full power of the system in your hands so you can do amazing things and get exponential results. Agile Results is not a fly-by-night. It was more than ten years in the making.
Keep in mind, it’s an ultra-competitive world, and what you don’t know can hurt you. On the flip side, what you do know can instantly boost your creativity, productivity, and impact in unfair ways.
Use Agile Results as your unfair advantage.
Now then, let’s roll up our sleeves and get to it. But first, some context …
I use Agile Results as a personal productivity and time management system.
In one line, it's my "personal results system for work and life."
I also use it to lead distributed teams around the world. I use it to drive high-impact projects, and for projects at home.
This post is a detailed walkthrough of how I use Agile Results as a time management and productivity system for making things happen.
Before we dive into the details, I want to make an important point ...
The simplest way I use Agile Results is as follows:
I write down Three Wins that I want to accomplish for the day on paper.
Yes, that’s it, and it is that simple (to at least, that’s how simple it is to start using Agile Results.)
If ever I get off track (and I do), the simple way I get back on track with Agile Results, is I simply write down my three wins for the day, down on a piece of paper. Agile Results is both forgiving and instantly useful.
The main goal of Agile Results is to help me spend more time where it counts. I needed a light-weight and flexible system that I could use for myself or for others. For several years, I had to build up a new team every six months. I needed to build high-performance teams under the gun, as quickly as possible. And, at the same time, I wanted work to be a place of self-expression, where you live your values, give your best where you have your best to give, and experience flow and continuous learning on a regular basis.
I needed to get "Special Forces" results, from individuals, and from the larger team. So I needed a system that could stretch to fit ... either scale up for a team, or simply help an individual get exponential results. I wanted it to be based on timeless and self-evident principles, rather than tools or fads. And I wanted it to "play well with others" ... where if somebody already had an existing system, or favorite tools, Agile Results could just ride on top and help them get more of what they already use.
Above all, it had to be as simple as possible.
Having a system that’s as simple as possible, helps support you while you do the impossible.
With that in mind, let's dive in. So here is how I use Agile Results ...
Daily Startup RoutineMy favorite startup routine is:
It's a simple routine. I've learned that one of the keys is carving out time for what's important, first thing in the morning. What I like about this routine is that it's not chaotic. It's serene by design. I've had chaotic startup patterns. This is the one that I purposefully made the morning about exercising, eating, and setting the stage for a great day. I don't turn on the TV. I don't watch the news. I don't check my computer. All of that can wait until I'm in the office.
It's how I charge up.
Monday VisionMonday is all about vision for the week.
For example, if the week were over, and you were looking back, what would be the three big things you want under your belt?
It's such a simple thing, but I make the most of the week, by starting with what I want out of the week. On Monday mornings, my main starting point is Three Wins for the Week. I identify the top Three Wins that would make this week great. To do so, I jump ahead and imagine that if this was Friday, what would I want to rattle off as my three wins under my belt. I do this on my way to work, while listening to my favorite songs. I play around with possibilities. I think of what big wins would look like. I also think about the big, hairy problems need attention. I try to balance between addressing pain, and acting on opportunities.
If I really get stuck, I try to think of the top three things that are top of mind that really need my attention. If I'm going to invest the next week of my life, I want to make sure that I'm nailing the things that matter.
The key is that I use very simple words. I'm effectively choosing labels for my wins. For example, "Vision is draft complete" is simple enough to say, and simple enough to remember. If I can't say it, it's not sticky.
When I get to work, I scan my mail. I think of my inbox as a stream of *potential* action. I walk the halls to beat the street. I absorb what I learn against what I set out to do for the week. If necessary, I readjust. If I catch my manager, I do a quick sanity check to find out his Three Wins for the Week, and how I'm mapping to what's on the radar.
For each project on my plate, I have a simple list of work items. This gives me "One Place to Look." This also helps me identify the "Next Best Thing" to do. It's this balance of the lists with what's top of mind, that keeps me grounded. I try to support my mind, with just enough scaffolding, but let it do what it does best. If I can identify the big outcomes for the week, I don't have to get caught up in the overhead of tracking minutia.
On my computer, I keep notepad open so that I can list my three wins at the top for the week, list my three wins for the day, any tasks or things on my mind below that. It's important that I keep my mind fresh and ready for anything. It's also where I do my brain dump at the end of the day ("Dump Your State"), which is simply a dump of anything on my mind or pending issues, so that I don't take work home with me, and I can pick up from where I left off, or start fresh the next day.
Daily WinsEach day of the week, the most important thing I do at the start of the day, is identify Three Wins that I want for that day. I write them down. I cross-check them against the Three Wins that I want for the week.
First I brainstorm on what I want or need to achieve for the day. This is just a rapid brain dump. If I'm at my desk, I write it down on paper. When I hone in on what seems to be my three key wins for the day, I say them out loud. Verbalizing them is important, because it's how I simplify and internalize them. Being able to say them, keeps them at my mental finger tips. It's like having the scoreboard right in plain view. I want them front and center so that I can use them to help me prioritize and focus throughout the day.
Worst Things FirstI try to put my "Worst Things First", either in the start of the week, or the start of the day. The worst thing is to have something looming over me all day or all week. The other way I look at this is, if I jump my worst hurdle, then the rest of the day or the week is a glide-path.
If my worst thing is time consuming, then I might need to "Timebox" it, such as spend no more than an hour max on it. If the work is intensive, I might tend to split it up, and work through it in 20 minute batches, and take 10 minute breaks. If I'm on a roll, I might go straight for an hour. If this is regular work that I need to do, that I really don't enjoy doing, then I try to either get it off my plate, or find a way to make it fun, or "Pair Up" with somebody. I find somebody who loves to do what I hate doing, and see if they might like to show me, either why they love it, or how to do it better, faster, and easier. This practice has taught me so many new tricks, and it's also helped me appreciate some of the deep skills that others are good at.
Power HoursI know my peak times and my down times during the day. For example, at around 11:00 AM, I have lunch on my mind, and 3:00 PM is effectively siesta time.
My best hours tend to be 8:00, 10:00, 2:00, and 4:00.
They are the hours where I am in the zone and firing on all cylinders. I’m generally more “productive” earlier in the day, and more “creative” later in the day. I don’t know all the reasons why, but what I do know is it’s a pattern. And by knowing that pattern, I can leverage it.
What I do is I push my heaving lifting into those hours as best as I can. I use my best horse-power to plow through my work and turn mountains into mole-hills. When I don’t use those peak hours, somehow mole-hills turn into mountains, and it’s slow going. It’s the difference in feeling between riding a wave, and pushing rocks uphill.
To get to this point, I simply had to notice during the week, when my best hours really are, not just when I want them to be. Now that I know my best times for peak performance, I have to defend those hours as best I can, or at least know what I am trading off.
When it comes to defending your calendar, you need to know what’s worth it. Once you know your best Power Hours, you know what’s worth it.
Aside from spending more time in my high ROI activities, and playing to my strengths, my Power Hours amplify my productivity more than any other way.
Creative HoursThis is the space of creative breakthroughs and innovation. It’s not that I’m not creative throughout the day, but I generally have a pattern where I’m more creative at night, or in the quiet hours of the morning. I’m also more creative on Fridays and Saturdays.
I can try to change the pattern, but I can also first notice the pattern and leverage what already exists. If I know the times when I’m most creative, I can start to use this time to think and brainstorm more freely.
And, I do.
That’s how I come up with ways to do things better, faster, and cheaper. It’s how I figure out ways to change the business, or ways to change my approach, and ways to take things to the next level.
When I’m in my creative zone, I do more exploration. I follow my thoughts and play out “what if” scenarios. I value the fact that my Creative Hours lead the ideas that help me learn and improve whatever I do.
A simple check, if I’m not flowing enough ideas or if I’m feeling too much nose-to-the grindstone, is I ask myself, “How many Creative Hours did I spend this week?” If it’s not at least 2, I try to up the count.
Create Hours are my best way to decompress, absorb and synthesize, which ultimately leads to my greatest breakthroughs.
Daily Shutdown Routine
Day is done, gone the Sun. From the lakes, from the hills, from the sky.
But how do you put it to rest?
I like a deliberate switch from work-mode to home-mode. I don’t want to bring my work home with me, and have it seep into everything I do. When I’m at work, I work hard (and play hard, too … especially because I treat work like play, and drive it with a passion.)
But when I shut down my work day, I need a way to unwind.
I found the best way to free my mind, is dump it down. So I simply dump it to notepad, or my little yellow sticky pad. Any open issues or challenges or things on my mind. I can always pick them back up. Or, I can let them go.
But the last thing I want is for a bunch of problems to be swirling around in my head.
Besides, if you stop swirling problems around in your head, you make space for creative insights, and the answers start to pop out of the woodwork.
Another pattern I’ve adopted is to use a metaphorical tree in my mind to hang my hat of problems on. Again, I can always pick them up again tomorrow, but for now, I’ll stuff my problems in this hat, hang them on the tree, and free my mind.
Friday ReflectionWhat if every Friday you could get smarter about your productivity and effectiveness?
You can.
I know it sounds simple, and it is, but remember that one of the big keys in life is not just knowing what to do, but doing what you know.
Friday Reflection is a perfect chance to ask myself two simple questions:
That’s how it starts.
I keep a simple recurring 20-minute appointment with myself for each Friday morning. It’s often the most valuable 20 minutes I spend each week. It’s where I actually reflect on my performance. Not in a critical way, but a constructive way. I explore with simple questions:
Friday Reflection is how I learn to master my capacity and be more realistic about my own expectations. I tend to over-estimate what’s possible in a week (and underestimate what’s possible in a month.) This little feedback loop, helps me see the good, the bad, and the downright fugly.
The most important outcome of my Friday Reflection is, three things to try out next week to do a little better.
The little better adds up.
The main thing to keep in mind is that Friday Reflection gives you deeper insight into your strengths and weaknesses in a way that you instantly benefit from. The key is to carry the good forward, and let the rest go, and to treat it as a continuous learning loop.
You only fail when you give up or stop learning or stop trying.
Monthly FocusTo make my month more meaningful and to add a dash of focus to it, I identify my Three Wins for the Month. At the month level, I can take a step back and look at the bigger picture. Asking myself, “What do I want under my belt when the month is over?” is a powerful and swift way to create clarity, and identify compelling outcomes.
Since I'm leading a team, I go a step further. I think of Three Wins for the team. Based on everything that's on our plate, I try to identify what the Three Wins for the team should be. I try to figure out things that would be easy to share with my manager. This makes it easy to check alignment, and it makes it easy for them to sell our impact up the management chain. (Read – It helps you get better performance reviews.)
When I get to work, I send out a short mail to the team, with the subject line: WEEKLY WINS: 2012-07-23. It's simply WEEKLY WINS, plus the current date. I briefly summarize the drivers, the threats, and hot issues on our plate, then list the Three Wins identified. I follow this by asking the team for their input, and whether we need to recalibrate. At the bottom, I simply do an A-Z list of bulleted items to dump the full working set of work in flight. It both helps people see what the full scope is, as well as help us rationalize whether we bit off the right things, and it helps people stay on top of all the work. It's like a team To-Do list. Sometimes it's a crazy list, but the three wins at the top, help keep our sanity and focus at all times.
It's a simple approach, but it works great for distributed teams, and it gives us something to go back and check at the end of the week, or throughout the week to remind ourselves of what we set out to do.
Since my manager adopted Agile Results too, he shares his three wins for the week to the team in a simple mail. Folks across the team, simply add their wins for the week. It's nothing formal ... it's more like a simple assertion of our intended victories.
During our team meeting, our manager goes around the team, and we share our three wins from last week, and our three wins we plan for this week. This helps everybody across the team stay connected to what's going on.
Ten at TenI need to throw in this tip, because it’s the single most effective way I’ve found to get a team on the same page, and avoid a bunch of email. And, it’s a simple way to create clarity, and avoid confusion.
It also builds the discipline of execution.
All you do is meet for ten minutes each day, Monday through Thursday. I call it, Ten at Ten.
I found ten at ten to be one of the most effective times in the day to do a sync. That said, because I always have distributed teams, I’ve had to vary this. But for the most part, I like Ten at Ten as a reminder to have a quick sync up with the team, focused on creating clarity, debottlenecking any issues, and taking note of small wins and progress.
The way it works is this:
You’d be surprised at how quickly people start to pay attention to what they’re working on and on what’s worth working on. It also helps team members very quickly see each other’s impact and results. It also helps people raise their bar, especially when they get to hear and experience what good looks like from their peers.
Most importantly, it shines the light on little, incremental progress. Progress is the key to happiness in work and life.
One thing I’ll point out is that the Monday meeting is actually 30 minutes, not 10 minutes, since it’s more of a level set for the week, and it’s a chance to figure out the Three Wins for the Week.
Well, there it is.
It might not look like a simple system for meaningful results, but when you think of all the synthesis it is effective.
The way to keep it simple is to always start simple. Whenever you forget what to do, go back to the basics. Simply ask yourself,
“What are Three Wins I want for today?”
- OR -
“What are Three Wins I want for this week?”
- OR -
“What are Three Wins I want for this month?”
- OR -
… if you’re feeling really bold, and want to go for the gold, “What are Three Wins I want for this year?”
Hopefully, this little walkthrough helps you easily see how you can apply Agile Results to your workflow, and get more out of the time you already spend. If nothing else, remember this:
Value is the ultimate short-cut.
When you know what’s valued, you can target your effort. When you know the high value activities, you can focus on those.
What Agile Results does is streamline your ability to flow value, for yourself and others.
Pure and simple.
And that’s how getting results should be … elegance in action.
You Might Also LikeThis morning we released some great enhancements to Windows Azure. These new capabilities include:
All of these improvements are now available to start using immediately (note: some services are still in preview). Below are more details on them:
Virtual Networks: New Point-to-Site Connectivity and Software VPN Device supportLast week we announced the general availability of Virtual Network support as part of our IaaS release.
Virtual Networking allows you to create a private, isolated network in Windows Azure and treat it as an extension of your on-premises datacenter. For example, you can assign private IP addresses to virtual machines inside a virtual network, specify a DNS, and securely connect it to your on-premises infrastructure using a VPN device in a site-to-site manner.
Here’s a visual representation of a typical site-to-site scenario through a secure Site-To-Site VPN connection:
Today, we are excited to announce that we’re expanding the capabilities of Virtual Networks even further to enable three new scenarios:
New Point-To-Site Connectivity
With today’s release we’ve added an awesome new feature that allows you to setup VPN connections between individual computers and a Windows Azure virtual network without the need for a VPN device. We call this feature Point-to-Site Virtual Private Networking. This feature greatly simplifies setting up secure connections between Windows Azure and client machines, whether from your office environment or from remote locations.
It is especially useful for developers who want to connect to a Windows Azure Virtual Network (and to the individual virtual machines within it) from either behind their corporate firewall or a remote location. Because it is point-to-site they do not need their IT staff to perform any activities to enable it, and no VPN hardware needs to be installed or configured. Instead you can just use the built-in Windows VPN client to tunnel to your Virtual Network in Windows Azure. This tunnel uses the Secure Sockets Tunneling Protocol (SSTP) and can automatically traverse firewalls and proxies, while giving you complete security.
Here’s a visual representation of the new point-to-site scenarios now enabled:
In addition to enabling developers to easily VPN to Windows Azure and directly connect to machines, the new Point-to-Site VPN support enables some other cool new scenarios:
How to Enable the Point-to-Site Functionality
With today’s release we’ve updated the Virtual Network creation wizard in the Portal so that you can now configure it to enable both ‘Site-to-Site’ and ‘Point-to-Site’ VPN options. Create a Virtual Network using the “Custom Create” option to enable these options:
Within the Virtual Network Custom Create wizard you can now click a checkbox to enable either the Point-To-Site or Site-To-Site Connectivity options (or both at the same time):
On the following screens you can then specify the IP address space of your Virtual Network. Once the network is configured, you will create and upload a root certificate for your VPN clients, start the gateway, and then download the VPN client package. You can accomplish these steps using the “Quick Glance” commands on the Virtual Network dashboard as well as the “Create Gateway” button on the command-bar of the dashboard. Read this tutorial on how to “Configure a Point-to-Site VPN in the Management Portal” for detailed instructions on how to do this.
After you finish installing the VPN client package on your machine, you will see a new connection choice in your Windows Networks panel. Connecting to this will establish a secure VPN tunnel your Windows Azure Virtual Network:
Once you connect you will have full IP level access to all virtual machines and cloud services hosted in your Azure virtual network! No hardware needs to be installed to enable it, and it works behind firewalls and proxy servers. Additionally, with this feature, you don’t have to enable public RDP endpoints on virtual machines to connect to them - you can instead use the private IP addresses of your virtual private network to RDP to them through the secure VPN connection.
For details instructions on how to do all of the above please read our Tutorial on how to “Configure a Point-to-Site VPN in the Management Portal”
Software VPN Device support for Site-to-Site
With today’s release we are also adding software VPN device support to our existing ‘Site-to-Site VPN’ connectivity solution (which previously required you to use a hardware VPN device from Cisco or Juniper). Starting today we also now support a pure software based Windows Server 2012 ‘Site-to-Site’ VPN option. All you need is a vanilla Windows Server 2012 installation. You can then run download and run a PowerShell script from the Windows Azure Management Portal that enables the Routing and Remote Access Service (RRAS) on the Windows Server and configures a Site-To-site VPN tunnel and routing table on it. Sandrino Di Mattia has a step-by-step tutorial on how to do this here.
This allows you to enable a full site-to-site VPN tunnel that connects your on-premises network and machines to your virtual network within Windows Azure - without having to buy a hardware VPN device.
Dynamic DNS Support
With today’s release we have also relaxed restrictions around DNS server setting updates in virtual networks. You can now update the DNS server settings of a virtual network at any time without having to redeploy the virtual network and the VMs in them. Each VM in the virtual network will pick up the updated settings when the DNS is refreshed on that machine, either by renewing the DNS settings or by rebooting the instance. This makes updates much simpler.
If you’re interested further in Windows Azure Virtual Networks, and the capabilities and scenarios it enables, you can find more information here.
Virtual Machines: Remote PowerShell and Linux SSH provisioning enhancementsLast week we announced the general availability of Virtual Machine support as part of our IaaS release. With today’s update we are adding two nice enhancements:
Support for Optionally Enabling Remote PowerShell on Windows Virtual Machines
With today’s update, we now enable you to configure whether remote PowerShell is enabled for Windows VMs when you provision them using the Windows Azure Management Portal. This option is now available when you create a Virtual Machine using the FROM GALLERY option in the portal:
The last step of the wizard now provides a checkbox that gives you the option of enabling PowerShell Remoting:
When the checkbox is selected the VM enables remote PowerShell, and a default firewall endpoint is created for the deployment. This enables you to have the VM immediately configured and ready to use without ever having to RDP into the instance.
Linux SSH Provisioning
Previously, Linux VMs provisioned using Windows Azure defaulted to using a password as their authentication mechanism – with provisioning Linux VMs with SSH key-based authentication being optional. Based on feedback from customers, we have now made SSH key-based authentication the default option and allow you to omit enabling a password entirely if you upload a SSH key:
Cloud Services: Enabling Dynamic Remote Desktop for a Deployed Cloud ServiceWindows Azure Cloud Services support the ability for developers to RDP into web and worker role instances. This can be useful when debugging issues.
Prior to today’s release, developers had to explicitly enable RDP support during development – prior to deploying the Cloud Service to production. If you forgot to enable this, and then ran into an issue in production, you couldn’t RDP into it without doing an app update and redeploy (and then waiting to hit the issue again).
With today’s release we have added support to enable administrators to dynamically configure remote desktop support – even when it was not enabled during the initial app deployment. This ensures you can always debug issues in production and never have to redeploy an app in order to RDP into it.
How to Enable Dynamic Remote Desktop on a Cloud Service
Remote desktop can be dynamically enabled for all the role instances of a Cloud Service, or enabled for an individual role basis. To enable remote desktop dynamically, navigate to the Configure tab of a cloud service and click on the REMOTE button:
This will bring up a dialog that enables you to enable remote desktop – as well as specify a user/password to login into it:
Once dynamically enabled you can then RDP connect to any role instance within the application using the username/password you specified for them.
Windows Azure SDK for RubyWindows Azure already has SDKs for .NET, Java, Node.js, Python, PHP and Mobile Devices (Windows 8/Phone, iOS and Android). Today, we are happy to announce the first release of a new Windows Azure SDK for Ruby (v0.5.0).
Using our new IaaS offering you can already build and deploy Ruby applications in Windows Azure. With this first release of the Windows Azure SDK for Ruby, you can also now build Ruby applications that use the following Windows Azure services:
If you have Ruby installed, just do a gem install azure to start using it. Here are some useful links to learn more about using it:
Like all of the other Windows Azure SDKs we provide, the Windows Azure SDK for Ruby is a fully open source project hosted on GitHub. The work to develop this Ruby SDK was a joint effort between AppFog and Microsoft. I’d like to say a special thanks to AppFog and especially their CEO Lucas Carlson for their passion and support with this effort.
SummaryToday’s release includes a bunch of nice features that enable you to build even better cloud solutions. If you don’t already have a Windows Azure account, you can sign-up for a free trial and start using all of the above features today. Then visit the Windows Azure Developer Center to learn more about how to build apps with it.
Hope this helps,
Scott
P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: twitter.com/scottgu
Hey, it's HighScalability time:
Don't miss all that the Internet has to say on Scalability, click below and become eventually consistent with all scalability knowledge...

Joe Armstrong is a co-inventor of Erlang and general all around renaissance software tinkerer as shown by his excellent work on writing a C Compiler and his voluminous work on GitHub.
Given the success of Erlang it's probably no surprise that he wrote his thesis on the ground breaking ideas behind Erlang: Making reliable distributed systems in the presence of software errors.
Even if you have yet to join the cult of Erlang the principles behind Erlang are universal and well worth exploring for your own designs. Highly recommended.
Introduction:
If you find you can't keep up with the world around you, then break things down. Breaking things down is the key to finishing faster.
Breaking things down is also the key to agility.
One of the toughest project management lessons I had to learn was breaking things down into more modular chunks. When I took on a project, my goal was to make big things happen and change the world.
After all, go big or go home, right?
The problem is you run out of time, or you run out of budget. You even run out of oomph. So the worst way to make things happen is to have a bunch of hopes, plans, dreams, and things, sitting in a backlog because they're too big to ship in the time that you've got.
Which brings us to the other key to agility ... ship things on a shorter schedule.
This re-trains your brain to chunk things down, flow value, chop dependencies down to size, learn, and, move on.
Best of all, if you miss the train, you catch the next train.

Solving problems while saving money is always a problem. In Nobody ever got fired for using Hadoop on a cluster they give some counter-intuitive advice by showing a big-memory server may provide better performance per dollar than a cluster:

This is a repost of part 1 of an interview I did for the Boundary blog.
Boundary: What is Facebook’s secret sauce for managing what’s got to be the biggest Big Data project, if you will, on the Web?
Hoff: From several presentations we’ve learned what Facebook insiders like Aditya Agarwal and Robert Johnson, both former Directors of Engineering, consider their secret sauce:
I’m always on the lookout for the best insight and action you can use for work and life. I especially enjoy when I find somebody who is truly a thought leader, a giant in their space.
After all, I’m a big fan of helping everyone “stand on the shoulders of giants.”
Elizabeth is a giant (actually, more like a Titan) in the field of management. She brings to the table more than 30 years of experience in the art and science of management. She’s a former McKinsey partner, a holds a PhD from the Massachusetts Institute of Technology’s Sloan School of Management, and she is the author of McKinsey’s Marvin Bower, and The Definitive Drucker.
She knows her stuff.
So I asked her to share her stuff.
Elizabeth has written a powerful guest post for me on her best lessons learned in the art and science of management:
Management Lessons of a Lifelong Student, by Elizabeth Edersheim.
She reveals the secrets of the best managers and best leaders, and puts it right at your fingertips. Every now and then you read something that changes your breadth or depth on a topic. This is one of those posts.
It’s a wealth of insight and action.
Keep in mind that Elizabeth operates at multiple levels of management, so whether you are a line-leader or a CEO, Elizabeth has distilled some key insights you can immediate apply, or refine your thinking, or perhaps lead to a new “ah-ha” moment.
Enjoy, and may the best practices for management serve you well, whether you’re shaping your own business or the business around you.
This Tuesday, April 23, we’ll be hosting Windows AzureConf – a free online event for and by the Windows Azure community. It will be streamed online from 9:00 AM - 5:00 PM PST via Channel 9, and you can watch it all for free.
I’ll be kicking off the event with a Windows Azure keynote in the morning (a great way to learn more about Windows Azure if you haven’t used it yet!). Following my talk the rest of the day will be full of excellent presentations from members of the Windows Azure community. You can ask questions from them live and I think you’ll find the day an excellent way to learn more about Windows Azure – as well as hear directly from developers building solutions on it today.
Last year’s Windows AzureConf was a great success, and brought some awesome community members together to deliver some great content around Windows Azure. All of the sessions are available for on-demand viewing on the Windows AzureConf 2012 event page on Channel 9. Sessions from Windows AzureConf 2012 are still available for viewing online.
For more information including a schedule, speaker list or to register visit the Windows AzureConf website.
Hope to see you there!
Scott
P.S. We will also make the presentations available for download after the event in case you miss them.
A few years ago I was asked by one of our customers to help them make better use of their integration layer. Ever since then me and my team have been working on a framework in support of that. This is the fourth in a series of blogs on the development of our framework, and discusses the features it provides. The one that was announced last time, about building blocks, is momentarily postponed.
So far I’ve discussed the goals & challenges surrounding the development activities, but I’d like to focus more on the framework itself now, and what it brings to those that are using it.
As soon as a new party (be it service consumer or service provider) connects to our framework, it can profit directly from the wealth of functionality we deliver out-of-the-box. These ‘generic features’ are exactly what one would expect from a (logical) ESB, and are partly based on the Expanded Enterprise Service Bus Pattern.
As our project was scrum driven, features were developed only when they were needed. Sometimes, during the design & build phase, we discovered a better way of doing things, and sometimes the problem a feature was supposed to address was solved in a completely different way, outside of our scope. But in the end we managed to implement about 20 features, which can roughly be divided into five types: routing, robustness, security, transformation and data storage.
RoutingOne of our main objectives is to get messages from A to B without A having to know where B is currently residing. To do this, we make extensive use of the WS-Addressing standard. One of the components in our framework, the routing service, uses the information in the message headers to decide what the next hop will be (hop in this case being another framework component). Most of the times a message is delivered to the backside as soon as it enters the integration layer, something we call simple routing.
However, as soon as some special activity needs to be performed (like data model transformation for example), the message is detoured to one of the framework components not connected to the outside world. We classify those as intermediate services, and they are agnostic of nature – which means they have no clue about the context in which they are called. The necessary information for the message to continue its path is part of the addressing headers as well, making this advanced routing.
A special kind of advanced routing is distribution, which makes it possible to send one message to several subscribers at the same time, using WS-Notification in its most basic form. Finally prioritized routing is a feature which makes sure that a message gets ahead of the rest so to speak – very useful when dealing with a customer waiting for service at a counter while there’s also a bulk load being processed.
RobustnessOf course it’s of eminent importance that nothing goes wrong when delivering the message, or that when it does we can at least deal with the situation (exception management). First thing that happens when we receive a message is that we check to see if it complies with the industry & design standards we enforce (technical validation). Sometimes the consumer/publisher doesn’t want to wait for the (functional) answer but still wants to be informed if his message was technically valid, in which case we send him a response stating just that (technical acceptance).
Two of our features deal with peak load: throttling makes sure the integration layer only takes in what it can handle, while buffering guarantees we don’t overwhelm the applications we connect to. Similar to the second one is postponed delivery which is used when we know beforehand the backside is not available.
But by far the most important of these types of feature is guaranteed delivery. We played around with a bidirectional variant (using WS-RM) but finally settled on an unidirectional implementation, meaning that before we send the message we first store it, and if we receive an HTTP error code we send it again.
Last (and actually least, as it’s hardly used) it’s also possible to have syntactic validation of outgoing messages. But as we like to follow Postel’s law (also known as the robustness principle) we feel it’s the consumer’s responsibility to make sure the message was valid to begin with (you can imagine this took some selling from our part). The only exception is when the payload is altered by the framework.
SecurityEvery application that wants to connect to the integration layer needs to make itself known using the WS-Security UsernameToken (authentication). For most of the services we expose that’s enough, in a few rare cases such an application has to have explicit permission (authorization).
Not used internally (only when we receive requests from certain external customers) is integrity, where we demand that certain parts of the message headers and payload are signed.
TransformationGiven the fact that not all applications connected to the framework ‘speak the same language’ (as mentioned in the previous blog), there’s an evident need for data model transformation – one of our most used features. A lot less popular is the split feature, which makes it possible to divide a big message into smaller parts.
Data storageThe last few features play a more supportive role to the ones already mentioned. We provide logging to be used during testing & bug-finding sessions and persistence when there’s a need to store the complete message. The latter is frequently used in combination with resending (which is necessary for the guaranteed delivery feature described above), but also in case of auditing requirements.
ConclusionMost of these features have been around since the first version of our framework, and have proven their generic qualities over time. In a few cases we had to make some alterations and even now there are one or two features which we might implement differently in the future. There’s also a list of additional features but it’s rather short, which I take as a sign that what we have here is pretty complete.
That’s number four; next time I’ll talk a bit about the more specific deliverables we provide our project teams.
I was watching a video on Google Glass with Robert Scoble, and I couldn’t help but wonder about all the possibilities that technology can bring to the table.
Wearable computing bridges the gap between the real world and the things we see in Sci-Fi movies.
Of course, when we overlay information on our world, the key will be turning information into insight and action. All change isn’t progress, and the market will flush out things faster than ever before. And, to the victor go the spoils.
In the video, you can see how the Google Glass does a few basic things so far:
The big limit in what it’s capable of, so far, seems to be the batter power. And of course, a key concern was security. It’s another reminder how in the software space, security and performance always play a role, even if they are behind the scenes. In fact, that’s the irony of software security and performance, they are at their best when you don’t notice them.
Security and performance are often unsung heroes.
The big take away for me is that the game is on warp speed now. By game, I mean, the business of software. You can go from idea to market pretty fast. So the big bottlenecks range from the right ideas, to the right people, to the right strategy, to the right execution.
But more importantly, the reminder is this:
Companies with smart people, data-driven insights, a culture of innovation, great software processes, customer focus, and reach around the world, can change the world -- at a faster pace than ever before.
Who knows what we’ll be wearing next?
override_attributes(
:keepalived => {
:global => {
:router_ids => {
'node1' => 'MASTER_NODE',
'node2' => 'BACKUP_NODE'
}
}
}
)