<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Thomas Jaeger</title>
	<atom:link href="http://thomasjaeger.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://thomasjaeger.wordpress.com</link>
	<description>Creating Great Software</description>
	<lastBuildDate>Fri, 10 May 2013 22:12:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='thomasjaeger.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Thomas Jaeger</title>
		<link>http://thomasjaeger.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://thomasjaeger.wordpress.com/osd.xml" title="Thomas Jaeger" />
	<atom:link rel='hub' href='http://thomasjaeger.wordpress.com/?pushpress=hub'/>
		<item>
		<title>The State Design Pattern vs State Machine</title>
		<link>http://thomasjaeger.wordpress.com/2012/12/13/the-state-design-pattern-vs-state-machine-2/</link>
		<comments>http://thomasjaeger.wordpress.com/2012/12/13/the-state-design-pattern-vs-state-machine-2/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 18:04:24 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=139</guid>
		<description><![CDATA[Background Design patterns in software development are an essential tool to excellent software creation. Being able to identify patterns while observing source code, is an essential skill that is acquired over a period of years of object oriented software development practices. Over the years, I’ve seen patterns being implemented that only have the name of [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=139&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><strong>Background</strong></p>
<p>Design patterns in software development are an essential tool to excellent software creation. Being able to identify patterns while observing source code, is an essential skill that is acquired over a period of years of object oriented software development practices. Over the years, I’ve seen patterns being implemented that only have the name of the pattern in file names but hardly represent the actual pattern the way they were intended to be used. Also, I have seen state machines being used instead of state design patterns at the costs of horribly complicated software that is hard to maintain. There is no reason to use state machines anymore when you are using an object oriented programming language.</p>
<p>One of the best sources about software design patterns is the “<i>Design Patterns: Elements of Reusable Object-Oriented Software</i>” book by the Gang of Four. Still, it is the bible of design patterns after all these years. There are many other sources and books but the blue book by the Gang of Four is the fundamental one that all seasoned architects and developers should have mastered.</p>
<p>Design patterns are programming language neutral. What they convey and solve are concepts that can be applied in any object oriented programming language such as C#, C++, Delphi, Java, Objective-C, etc. It is these concepts that one should master. Once the concepts are mastered, it is fairly straightforward to identify opportunities to use and apply them. At that point, it is simply a matter of language syntax.</p>
<p>In this article, I will discuss the State Design Pattern. I will discuss the state design pattern on how it can be used in a fairly complex scenario and demonstrating this with sample C# code. I will also discuss using the state design pattern instead of using a state machine. I will not go into the details of how to create state machines, rather I will concentrate on the much more modern State Design Pattern. I picked a complex scenario because I believe that a more complex scenario can teach several things at once. It will demonstrate the combination of different scenarios and answer more questions this way.</p>
<p><strong>The State Design Pattern:</strong></p>
<p>I would summarize the State Design Pattern as follows:</p>
<p style="text-align:center;"><i>“The state design pattern allows for full encapsulation of an unlimited number of states on a context for easy maintenance and flexibility.”</i></p>
<p>From a business side of things, this is worth a lot of money. There is no reason anymore NOT to use the state design pattern even in very simple state scenarios. You can get rid of switch statements (C#), for example. It buys you flexibility because you won’t be able to predict the future and requirements changes (I’m pretty sure about that).</p>
<p>The State Design Pattern allows the context (the object that has a certain state) to behave differently based on the currently active ConcreteState instance.</p>
<p><a href="http://thomasjaeger.files.wordpress.com/2012/12/statedesign1.gif"><img class="size-full wp-image aligncenter" id="i-141" alt="Image" src="http://thomasjaeger.files.wordpress.com/2012/12/statedesign1.gif?w=383" /></a></p>
<p>Let’s take a closer look into the parts that make up the state design pattern.</p>
<p><strong>Context Object</strong></p>
<p>Context is an instance of a class that owns (contains) the state. The context is an object that represents a thing that can have more than one state. In fact, it could have many different states. There is really no limit. It is perfectly fine to have many possible state objects even into the hundreds. It is coming to have context objects with only a handful of possible states, though.</p>
<p>The context object has at least one method to process requests and passes these requests along to the state objects for processing. The context has no clue on what the possible states are. The context must not be aware of the meaning of these different states. It is important that the context object does not do any manipulation of the states (no state changes). The only exception is that the context may set an initial state at startup and therefore must be aware of the existence of that initial state. This initial state can be set in code or come from an external configuration.</p>
<p>The only concern that the context has is to pass the request to the underlying state object for processing. The big advantage of not knowing what states the context could be in is that you can add as many new states as required over time. This makes maintaining the context super simple and super flexible. A true time saver and a step closer to being rich beyond your wildest dreams (almost).</p>
<p><strong>State</strong></p>
<p>The state class is an abstract class. It is usually an abstract class and not an interface (IInterface). This class is the base class for all possible states. The reason why this class is usually an abstract class and not an interface is because there are usually common actions required to apply to all states. These global methods can be implemented in this base class. Since you can’t do any implementation in Interfaces, abstract classes are perfect for this. Even if you do not have any initial global base methods, use abstract classes anyways because you never know if you might need base methods later on.</p>
<p>The State class defines all possible method signatures that all states must implement. This is extremely important to keep the maintenance of all possible states as simple as possible. Since all states will implement these methods signatures and if you forget to implement a new method, the compiler will warn you at compile time. An awesome safety net.</p>
<p><strong>ConcreteState</strong></p>
<p>The ConcreteState object implements the actual state behavior for the context object. It inherits from the base State class. The ConcreteState class must implement all methods from the abstract base class State.</p>
<p>The ConcreteState object has all the business knowledge required to make decisions about its state behavior. It makes decisions on when and how it should switch from one state to another. It has knowledge of other possible ConcreteState objects so that it can switch to another state if required.</p>
<p>The ConcreteState object can even check other context objects and their states to make business decisions. Many times, an object may have more than one context object. When this happens, a ConcreteState object may need to access these different states and make a decision based on active states. This allows for complicated scenarios but fairly easy to implement using the state design pattern. You will see an example later in this article that shows multiple context objects and their states and the need to work together.</p>
<p>The ConcreteState object also is capable of handling before and after transitioning to states. Being aware of a transition about to happen is an extremely powerful feature. For example, this can be used for logging, audit recording, security, firing off external services, kicking of workflows, etc. and many other purposes.</p>
<p>The ConcreteState object allows the full use of a programming language when compared to state machines. Nothing is more powerful in abstract logic and conditionals   coupled with object orientation as a computer programming language compared to state machines and their implementations.</p>
<p>As you add new methods to the abstract base class over time, each ConcreteState class will need to implement that method. This forces you to think from the point of view of the current state.</p>
<p>“<i>How should state ConcreteStateA react when this method is called?”</i></p>
<p>As you implement the behavior for a method, you can be rest assured that this is the only place in the entire system that will handle this request when ConcreteStateA is the active state. You know exactly where to go to maintain that code. Maintainability is king in software development.</p>
<p><strong>Summary</strong></p>
<p>To summarize, you will need a context and a few states that ideally derive from an abstract base class to create a flexible state solution. If you got switch statements or a lot of If statements in your code, you got opportunities to simplify by using the state design pattern. If you are using state machines, you got an awesome opportunity to simplify your code and safe time &amp; money. Just do it!</p>
<p><strong>Example</strong></p>
<p>The example I created demonstrates the use of the State Design Pattern and how it can be used with multiple context objects working together. It is a fictitious hardware device with a door.</p>
<p>The device can be powered on or off. Specifically, the device has an operations mode that can be in the following states:</p>
<ol>
<li>Idle</li>
<li>Busy</li>
<li>Powering Down</li>
<li>Powering Up</li>
</ol>
<p>The door represents a physical door on the device. The door can be in the following states:</p>
<ol>
<li>Opened</li>
<li>Closed</li>
<li>Locked</li>
<li>Unlocked</li>
<li>Broken</li>
</ol>
<p>To make it a little more complicated, the device can be in different hardware configurations. These configurations can be changed at run-time of the device. The following configurations are available:</p>
<ol>
<li>Production Configuration</li>
<li>Test Configuration</li>
</ol>
<p>The operation of the device depends on the different individual states as well as a combination of the states listed above. The more combinations that are possible, the more complicated it would be to maintain this using traditional Switch or If statements. You could use a state machine as well but it will not buy you the flexibility and ease of use when compared to the state design pattern. Feel free to add brand-new states and try to experiment with it.</p>
<p><strong>Breaking it Up</strong></p>
<p>No matter how complicated software projects are, the way to tackle them successfully is to break them up. This is especially true in object oriented software development. Breaking things up into smaller, manageable pieces allows a focused effort in understanding the problem domain. It is coming to zoom into the smaller parts and then zoom back out again to a 10,000 foot view and vice versa. You do this many times. Look at the big picture, then break up the picture into smaller parts, look at the smaller part and so forth. Object orientation is a natural fit to model real-life scenarios that contain things, people, processes and their behaviors to interact with each other.</p>
<p>Let’s break up the things that we do know in this example. It looks like we have 3 things:</p>
<ol>
<li>Device</li>
<li>Door</li>
<li>Configurations</li>
</ol>
<p><strong>Behavior</strong></p>
<p>It is important to recognize that there is most likely a certain behavior between these things. This behavior is probably driven by certain business or operational rules. The power of object orientation is being able to capture this behavior inside classes. Since an object generally consists of roughly 50% data and 50% behavior, we must take care of the behavior part of objects. Over time, this behavior might change because requirements may have changed. Again, this is where object orientation shines when it is done correctly.<i> </i></p>
<p><a href="http://thomasjaeger.wordpress.com/2012/12/13/the-state-design-pattern-vs-state-machine-2/typicalobjectcomposition-2/" rel="attachment wp-att-161"><img class="size-full wp-image-161 aligncenter" alt="TypicalObjectComposition" src="http://thomasjaeger.files.wordpress.com/2012/12/typicalobjectcomposition1.png?w=480"   /></a></p>
<p>So, we can assume that Device is on its own. It represents a physical device from the real world. The door is part of the device and can’t live on its own. The device has a door. So, it looks like we have this:</p>
<ol>
<li>Device with a Door</li>
<li>Configurations</li>
</ol>
<p>We also have a set of configurations. These configurations change the operation of the device but are not necessarily part of the physical device. So, we could model configurations on a class by itself. However, since we know that a device can be either in a test configuration or a production configuration, these actually represent operational states. We also know that certain operations or states of the door might behave differently based on the current configuration. So, there is no need to create a separate configuration class and instead model the configurations as states themselves. If we decide to add another type of configuration later on, it will be easy to add.</p>
<p>We have two major parts: Devices and their configurations. We will model each part with their own class. The Device class will contain a Door class (Device has a door):</p>
<p>Both the Device and Door classes inherit from the DomainObject class. The DomainObject class is a convention that I’ve accustomed to use over the years. A base domain object class contains behaviors and features that are shared across all domain objects. For example, my DomainObject class usually implement a read/write string Name property. This name can also be optionally passed into the constructor. When you model real world things, it is very common that these things have names. So, I end up having a Name property in my base DomainObject class. You will see later how this is used.</p>
<p><strong>Code</strong></p>
<p>Let’s start writing some code and implement everything. The example we are building is a console application that sets several states to test the Device’s behavior. It will look like this once the output displays on the screen:</p>
<p><a href="http://thomasjaeger.files.wordpress.com/2012/12/consoleoutput1.png"><img class="size-full wp-image aligncenter" id="i-144" alt="Image" src="http://thomasjaeger.files.wordpress.com/2012/12/consoleoutput1.png?w=580" /></a></p>
<p>First, lets create the DomainClass, the base class for all domain objects.</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;&lt;/pre&gt;
/// &lt;summary&gt;
 /// Base class for domain objects that provides basic
 /// functionality across all objects.
 /// &lt;/summary&gt;
 public class DomainObject
 {
 public string Name { get; set; }

public override string ToString()
 {
 return Name;
 }

public DomainObject()
 {
 }

public DomainObject(string name)
 {
 Name = name;
 }
 }
&lt;pre&gt;</pre>
<p>The DomainObject class implements a Name property of type string that allows you to conveniently give an object a name since most objects in real life have names. This is the base class for all domain classes.</p>
<p>Next, we implement the Device class. The Device class contains a Door object. In this scenario, the Device class is the context (the owner) to the operations mode and the possible configurations. The operations mode is represented with the ModeState class. The different kind of configuration states are kept track in the ConfigurationState class.</p>
<p>The Initialize() method is used to setup the different kind of states for the current instance of a device. This is the place where the context (the Device) now needs to be aware of what states are actually available. Notice also that within the method we are setting the operations mode to Powering Up and at the end of the method we set it to Idle.</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
/// &lt;summary&gt;

/// The Device class is the owner of the different states

/// that the Device can be in. The Device is alos the

/// owner of actions (methods) that can be applied to the

/// states. In other words, Device is the thing we are

/// trying to manipulate through outside behavior.

/// &lt;/summary&gt;

public class Device : DomainObject

{

// Device has a physical door represented by the

// Door class.

private Door _door;

&amp;nbsp;

// Device only knows about generic actions on

// certain states. So, we use the base classes of

// these states in order execute these commands.

// The base classes are abstract classes of the

// states.

private ConfigurationState _configurationState;

// The current mode that the device is in.

private ModeState _modeState;

&amp;nbsp;

public Device(string name) : base(name)

{

Initialize();

}

&amp;nbsp;

public Device()

{

Initialize();

}

&amp;nbsp;

private void Initialize()

{

// We are starting up for the first time.

_modeState = new ModePowerUpState(this);

&amp;nbsp;

_door = new Door(this);

&amp;nbsp;

// The initial configuration setting for the

// device. This initial configuration can come

// from an external configuration file, for

// example.

_configurationState = new ProductionConfigurationState(this);

&amp;nbsp;

// The door is initially closed

_door.DoorState = new DoorClosedState(_door);

&amp;nbsp;

// We are ready

_modeState.SetModeToIdle();

}

&amp;nbsp;

public Door Door

{

get { return _door; }

set { _door = value; }

}

&amp;nbsp;

public ConfigurationState Configuration

{

get { return _configurationState; }

set { _configurationState = value; }

}

&amp;nbsp;

public ModeState Mode

{

get { return _modeState; }

set { _modeState = value; }

}

}
&lt;pre&gt;</pre>
<p>The ModePowerUpState class is one of the ConcreteClass implementations of the State Design Pattern. Let’s take a closer look on how it is implemented.</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
public class ModePowerUpState : ModeState

{

public ModePowerUpState(ModeState modeState)

{

Initialize();

this.Device = modeState.Device;

}

&amp;nbsp;

public ModePowerUpState(Device device)

{

Initialize();

this.Device = device;

}

&amp;nbsp;

private void Initialize()

{

Name = &quot;Powering Up&quot;;

}

&amp;nbsp;

public override void SetModeToPowerUp()

{

// We're in powerup state already

}

&amp;nbsp;

public override void SetModeToIdle()

{

// Switch to Idle state

this.Device.Mode = new ModeIdleState(this);

}

&amp;nbsp;

public override void SetModeToBusy()

{

// Can't set mode to busy, we're still powering up

}

&amp;nbsp;

public override void SetModeToPowerDown()

{

// We're busy, but we allow to power down.

&amp;nbsp;

// Cleanup any resources and then set the state

this.Device.Mode = new ModePowerDownState(this);

}

}
&lt;pre&gt;</pre>
<p>The first thing to notice is that it inherits from the ModeState abstract base class. This would be the abstract base class for all mode states in state design pattern. The following operation modes are possible for this device:</p>
<ol>
<li>Powering Up</li>
<li>Powering Down</li>
<li>Busy</li>
<li>Idle</li>
</ol>
<p>Each of these possible modes are represented as individual ConcreteState classes.</p>
<p>An important fact is that one of the constructors takes an abstract representation of a mode: public ModePowerUpState(ModeState modeState)</p>
<p>This constructor is very important since it will allow the object to set the context (the owner) by using polymorphism. Setting the owner via:</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
this.Device = modeState.Device;
&lt;pre&gt;</pre>
<p>allows the pass in different kind of modes and always have access to the context. Once we have access to the context, this instance can now manipulate the Device’s mode. It can also manipulate any other properties or call methods on the Device.</p>
<p>Since the ModePowerUpState class inherits from the abstract ModeState class, it needs to implement all abstract methods that are declared in the ModeState class. The abstract ModeState class declares the the following abstract methods:</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
public abstract void SetModeToPowerUp();

public abstract void SetModeToIdle();

public abstract void SetModeToBusy();

public abstract void SetModeToPowerDown();
&lt;pre&gt;</pre>
<p>The ConcreteClass ModePowerUpState only needs to actually implement the methods that would make sense. Here the Idle and PowerDown state would make sense.</p>
<p>Lets look at the states for the Door of the Device. Remember that the door can be in the following states:</p>
<ol>
<li>Open</li>
<li>Closed</li>
<li>Locked</li>
<li>Unlocked</li>
<li>Broken</li>
</ol>
<p>The abstract State class for the door states looks like this:</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
public abstract class DoorState : DomainObject

{

protected Door _door;

&amp;nbsp;

public Door Door

{

get { return _door; }

set { _door = value; }

}

&amp;nbsp;

public abstract void Close();

public abstract void Open();

public abstract void Break();

public abstract void Lock();

public abstract void Unlock();

&amp;nbsp;

/// &lt;summary&gt;

/// Fix simulates a repair to the Door and resets

/// the initial state of the door to closed.

/// &lt;/summary&gt;

public void Fix()

{

_door.DoorState = new DoorClosedState(this);

}

}

</pre>
<p>The possible states are represented in the abstract methods:</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
public abstract void Close();

public abstract void Open();

public abstract void Break();

public abstract void Lock();

public abstract void Unlock();
&lt;pre&gt;</pre>
<p>We can also find a global base method named:</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
public void Fix()
&lt;pre&gt;</pre>
<p>This Fix() method is meant to be called by any of the derived ConcreteState classes in order to bring the Door to an initial Closed state (when it has been been fixed after it was broken).</p>
<p>When you download this example source code, you can take a closer look at all files. But, let’s take a look at the more interesting DoorUnlockedState concrete state class:</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
public class DoorUnlockedState : DoorState

{

public DoorUnlockedState(DoorState doorState)

{

Initialize();

this.Door = doorState.Door;

}

&amp;nbsp;

public DoorUnlockedState(Door door)

{

Initialize();

this.Door = door;

}

&amp;nbsp;

private void Initialize()

{

Name = &quot;Unlocked&quot;;

}

&amp;nbsp;

public override void Close()

{

// We can't close an already locked door.

}

&amp;nbsp;

public override void Open()

{

// Can't open a locked door.

}

&amp;nbsp;

public override void Break()

{

// To simulate production vs test configuration

// scenarios, we can't break a door in test

// configuration. So, we need to check the

// Device's ConfigurationState. We also want to

// make sure this is only possible while the

// device is Idle.

//

// Important:

// ==========

// As you can see in the If statement, we can

// now use a combination of different states to

// check business rules and conditions by simply

// combining the existence of certain class

// types. This is allows for super easy

// maintenance as it 100% encapsulates these

// rules in one place (in the Break() method in

// this case).

if ((this.Door.Device.Configuration is ProductionConfigurationState) &amp;&amp;

(this.Door.Device.Mode is ModeIdleState))

{

this.Door.DoorState = new DoorBrokenState(this);

}

}

&amp;nbsp;

public override void Lock()

{

this.Door.DoorState = new DoorLockedState(this);

}

&amp;nbsp;

public override void Unlock()

{

// We are already unlocked

}

}

</pre>
<p>Take a close look at the Break() method. This is where it gets interesting and demonstrates the use of more than one set of states that are not related to each other. In this case, the state needs to check that the device is in a certain configuration as well as in a certain operations mode before it can set the door state. In order to access these conditions, the state needs access to both contexts,</p>
<p>Because this scenario only allows to break the door when the device is in a production configuration and the operations mode is idle, both conditions are verified by using the state class definitions:</p>
<pre class="brush: csharp; title: ; notranslate">&lt;/pre&gt;
if ((this.Door.Device.Configuration is ProductionConfigurationState) &amp;&amp;

(this.Door.Device.Mode is ModeIdleState))

{

this.Door.DoorState = new DoorBrokenState(this);

}
&lt;pre&gt;</pre>
<p>By simply chaining class definitions in your comparisons, you get clean compile time validations when compared to string or similar comparisons. The code is fairly easy to read and to expand upon.</p>
<p>Remember that one of your goals is encapsulation when you use object orientation. You have one central place to maintain your code for a certain state that you need to modify or when you need to create a brand new state.</p>
<p><strong>Conclusion</strong></p>
<p>Using a State Design Pattern over Switch and If statements and over State Machines is a powerful tool that can make your life easier and save your employer time &amp; money. It’s that simple.</p>
<p>You can download the source code <a title="DeviceWithStateDesign.zip" href="https://s3.amazonaws.com/StateDesignPattern/DeviceWithStateDesign.zip">here</a>. (<a href="https://s3.amazonaws.com/StateDesignPattern/DeviceWithStateDesign.zip">https://s3.amazonaws.com/StateDesignPattern/DeviceWithStateDesign.zip</a>)</p>
<p><strong>About the Author</strong></p>
<p><i>Thomas Jaeger is a Solutions Architect and an industry expert for over 21 years in 7 different industries when it comes to software development in general, cloud-based computing, and iOS development. He is a passionate, fanatic, software designer and creator. He lives against the status quo because, in his opinion, creative and innovative solutions are not created following a linear approach but come, in part, from broad experiences in ones life and from an innovative mind. </i></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/139/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=139&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2012/12/13/the-state-design-pattern-vs-state-machine-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>

		<media:content url="http://thomasjaeger.files.wordpress.com/2012/12/statedesign1.gif?w=383" medium="image">
			<media:title type="html">Image</media:title>
		</media:content>

		<media:content url="http://thomasjaeger.files.wordpress.com/2012/12/typicalobjectcomposition1.png" medium="image">
			<media:title type="html">TypicalObjectComposition</media:title>
		</media:content>

		<media:content url="http://thomasjaeger.files.wordpress.com/2012/12/consoleoutput1.png?w=580" medium="image">
			<media:title type="html">Image</media:title>
		</media:content>
	</item>
		<item>
		<title>B7 Tool Update &#8211; Backup on Amazon S3 and 7-Zip</title>
		<link>http://thomasjaeger.wordpress.com/2012/04/09/b7-tool-update-backup-on-amazon-s3-and-7-zip/</link>
		<comments>http://thomasjaeger.wordpress.com/2012/04/09/b7-tool-update-backup-on-amazon-s3-and-7-zip/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 18:15:56 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[B7]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Compression]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=98</guid>
		<description><![CDATA[I updated my B7 tool for Amazon S3 and 7-Zip. You can now create buckets and upload files. You can still use it as a command line tool as well. I also re-did the user interface to what I believe a more user friendly version. This tool is free. Please let me know what you [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=98&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I updated my B7 tool for Amazon S3 and 7-Zip. You can now create buckets and upload files. You can still use it as a command line tool as well. I also re-did the user interface to what I believe a more user friendly version. This tool is free. Please let me know what you think.</p>
<p>Download B7 <a title="Download B7" href="https://s3.amazonaws.com/SBI-B7/setupb7.exe">here</a>.</p>
<p>To get started with Amazon S3 storage, click <a title="Amazon Simple Storage Service (S3)" href="http://aws.amazon.com/s3/" target="_blank">here</a>.</p>
<div id="attachment_103" class="wp-caption alignleft" style="width: 310px"><a href="http://thomasjaeger.files.wordpress.com/2012/04/b7screenshot2.png"><img src="http://thomasjaeger.files.wordpress.com/2012/04/b7screenshot2.png?w=300&#038;h=152" alt="B7 - Backup to Amazon S3 and 7-Zip" title="B7 - Backup to Amazon S3 and 7-Zip" width="300" height="152" class="size-medium wp-image-103" /></a><p class="wp-caption-text">B7 - Backup to Amazon S3 and 7-Zip</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=98&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2012/04/09/b7-tool-update-backup-on-amazon-s3-and-7-zip/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>

		<media:content url="http://thomasjaeger.files.wordpress.com/2012/04/b7screenshot2.png?w=300" medium="image">
			<media:title type="html">B7 - Backup to Amazon S3 and 7-Zip</media:title>
		</media:content>
	</item>
		<item>
		<title>The HTML5 Hype vs. Native Application Performance (Again)</title>
		<link>http://thomasjaeger.wordpress.com/2012/03/20/the-html-5-hype-vs-native-application-performance-again/</link>
		<comments>http://thomasjaeger.wordpress.com/2012/03/20/the-html-5-hype-vs-native-application-performance-again/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 23:59:31 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Steve Jobs]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=87</guid>
		<description><![CDATA[The latest buzz is all about HTML 5 and how it will improve our lives as architects, developers, companies, consumers of HTML5 applications and whoever else is getting sucked into this. I’ve been doing professional software development for over 21 years now.  Over those years, I’ve used many different technologies. HTML 5 is just another [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=87&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The latest buzz is all about HTML 5 and how it will improve our lives as architects, developers, companies, consumers of HTML5 applications and whoever else is getting sucked into this.</p>
<p>I’ve been doing professional software development for over 21 years now.  Over those years, I’ve used many different technologies. HTML 5 is just another “technology”. First of all, let me clarify in simple terms: HTML 5 is NOT a new technology. HTML 5 is based on existing technology called JavaScript, CSS 3 and HTML. None of these are new. What is new is the way it is being presented and marketed.</p>
<p>You see, I take the stand of delivering the best user experience to the consumer. What I mean by best user experience is this:<br />
1.    Your users should “love” to use your software<br />
2.    Your users should feel connected to your software<br />
3.    Your software should accomplish what it said it would do for them, all the time<br />
4.    Your software should do all things extremely fast<br />
5.    Your software should look and feel top notch and professional, nothing less</p>
<p>As you can see from the list above, there are emotional connections between great software and their users. When you have human feelings involved with something as technical as software, you have subjective views on what great software means depending on who you ask. In addition, since most software is created for consumers, you will have to deal with emotional connections of your software and the consumers. You cannot afford to ignore your consumers’ feelings and perceptions of your software.</p>
<p>When you look at the industrial industry, physical objects such as a piece of furniture, a toaster oven, a recording device, etc. have aesthetics to them that triggers an emotional connection between the consumer and the physical object. Some consumers like a particular furniture and some others don’t. But, what is common between the different types of consumers is that they have a emotional connection or not. They like or don’t like a certain type of couch, for example. The design efforts that went into creating a successful piece of furniture maybe based on many factors.  Great designs are aesthetically pleasing and functional at the same time.</p>
<p>For example, look at the success of the iPhone or iPad. Here are devices that not necessarily have brand new technology inside them; but, they are packaged and presented in a way that is aesthetically pleasing to a lot of consumers. Moreover, they perform really fast and do it well all the time (disclaimer: nothing is perfect).  They both feel snappy. They both are easy to use and the content layouts (the user interface) are well thought out. They both are a total hit for Apple.</p>
<p>What would the iPhone or iPad be like if it had an Android or a Windows user interface? Would it still be a hit? Would consumers still love them? Would they buy them? Even worse, what if, both, the iPhone and iPad only had a Web Browser interface? How would consumers have reacted with their purchasing power?</p>
<p>What the iPhone and iPad have both in common is “fast” user feedback. This fast user feedback is, for the most part, is accomplished with native applications that take advantage of the device’s hardware. By native applications, I mean applications that are compiled into machine code for ultimate performance. In case of iPhone and iPad applications, this means that these applications have been developed with Objective-C on the Cocoa framework for iOS.</p>
<p>I’m certain that Steve Jobs had his hands in the user interface design decisions. I’m also certain that he would NEVER accept slow performing applications. If this is the case, I agree with Steve Jobs 100%. I agree because I believe that performance of software is even more important today than it was 20 years ago.</p>
<p>Software is created for people, most of the time. Consumers are spoiled with instance gratification. Consumers expect software to be fast. Consumers expect to get results, fast! People have less time and are doing more at the same time. Slow performing software is bad quality software, period. As a software creator, why would I want to settle for bad quality software? If you create the best software and want to make a living at the same time, you must create software that allows consumers to feel that emotional connection.</p>
<p>With that being said, when I hear things like HTML 5, I see Deja vu. I have seen this with Java, Visual Basic, .Net, ActiveX, Silverlight, etc.<br />
These “new” technologies were created for many reasons and not one of them was created with the consumers in mind. These technologies such as HTML 5 were created with the intention to make things easier for the developers and the companies these developers work for.</p>
<p>The more abstract these technologies are, the more layers there are between the device and the output or user interfaces. The more layers there are, the slower the performance of the software. This principle has not changed in decades no matter how fast the hardware becomes.</p>
<p>At the end, the consumer can clearly see a difference in natively compiled software that was created for that native operating system and software that has these layers of translations that made it so simple for the developer.</p>
<p>This convenience for the developers costs dearly for the company who is selling the software in the long run. If a company truly cares for its target audience, then they better make sure that the emotional connection between the software and the consumer exists. The best way to do this is not to go the easy and lazy route but go the extra mile and develop the software in a computer programming language that has a native compiler. I can think of C++ or <a href="http://www.embarcadero.com/products/delphi" title="Delphi XE2" target="_blank">Delphi</a>, for example.</p>
<p>Update 2012-04-09: Betting $1 Billion On Instagram, Facebook Backs Away From HTML5</p>
<p><a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/g/a/2012/04/09/businessinsiderbetting-1-billion-on.DTL" rel="nofollow">http://www.sfgate.com/cgi-bin/article.cgi?f=/g/a/2012/04/09/businessinsiderbetting-1-billion-on.DTL</a></p>
<p><a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/g/a/2012/04/09/businessinsiderbetting-1-billion-on.DTL" title="Betting $1 Billion On Instagram, Facebook Backs Away From HTML5" target="_blank"></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/87/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=87&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2012/03/20/the-html-5-hype-vs-native-application-performance-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>
	</item>
		<item>
		<title>Backing up with 7-Zip compression and Amazon S3 with the B7 Tool</title>
		<link>http://thomasjaeger.wordpress.com/2012/01/26/backing-up-with-7-zip-compression-and-amazon-s3-with-the-b7-tool/</link>
		<comments>http://thomasjaeger.wordpress.com/2012/01/26/backing-up-with-7-zip-compression-and-amazon-s3-with-the-b7-tool/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 20:43:34 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[B7]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Compression]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=75</guid>
		<description><![CDATA[There are cases when I want to automate backing up certain file and folders with 7-zip but never found a good tool to do so. There are plenty of backup systems out there. I just want to backup a folder, compress it with 7-zip, and then send it off to Amazon S3 as the backup [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=75&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>There are cases when I want to automate backing up certain file and folders with 7-zip but never found a good tool to do so. There are plenty of backup systems out there. I just want to backup a folder, compress it with 7-zip, and then send it off to Amazon S3 as the backup medium. All this automatically and on a regular basis.</p>
<p>So, I created my own backup tool to do just that. I call it B7 for “Backup with 7-Zip”. You can run this tool via command line only to automate the process. If you do not specify any command parameters, the Windows GUI will display. In the GUI mode, you can see all of your Amazon S3 buckets (folders) and their contents. You can do simple management of these buckets and bucket items.</p>
<p>B7 is still work in progress and I may make changes and improvements as time goes on and if I have time available to do so. I hope you find this tool useful. It surely helped me with managing some simple backups.</p>
<p>Download B7 <a title="Download B7" href="https://s3.amazonaws.com/SBI-B7/setupb7.exe">here</a>.</p>
<p>To get started with Amazon S3 storage, click <a title="Amazon Simple Storage Service (S3)" href="http://aws.amazon.com/s3/" target="_blank">here</a>.</p>
<div id="attachment_79" class="wp-caption alignleft" style="width: 310px"><a href="http://thomasjaeger.files.wordpress.com/2012/01/b7_screenshot.png"><img class="size-medium wp-image-79" title="B7 Main Screen" src="http://thomasjaeger.files.wordpress.com/2012/01/b7_screenshot.png?w=300&#038;h=179" alt="B7 Main Screen" width="300" height="179" /></a><p class="wp-caption-text">B7 Tool</p></div>
<p>IMPORTANT:<br />
==========<br />
Make sure you update B7.ini with your access and private keys from Amazon S3 before using B7.</p>
<p>Usage<br />
=====<br />
To run B7 via command line parameters, do this:</p>
<p>B7 bucketName folderAndFilePattern [outputFile]</p>
<p>bucketName = the name of the Amazon S3 bucket where the backup file should be uploaded to<br />
folderAndFilePattern = the full path e.g.: C:\APPFOLDER\DATA\*.*<br />
[outputFile] = the compressed output file (optional). If you do not specify an output file, a unique backup file is created for you. It looks similar to this: 2012_01_25_11_38_F00684EE-6C03-4462-885F-4A6B2E95DE48.7z<br />
The output file can be opened with 7-Zip or any other tool that supports the 7-Zip compression.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/75/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=75&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2012/01/26/backing-up-with-7-zip-compression-and-amazon-s3-with-the-b7-tool/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>

		<media:content url="http://thomasjaeger.files.wordpress.com/2012/01/b7_screenshot.png?w=300" medium="image">
			<media:title type="html">B7 Main Screen</media:title>
		</media:content>
	</item>
		<item>
		<title>Steve Jobs &#8211; A passionist for the details of perfecting masterpieces in the 21st century technology era</title>
		<link>http://thomasjaeger.wordpress.com/2011/10/06/steve-jobs-a-passionist-for-the-details-of-perfecting-masterpieces-in-the-21st-century-technology-era/</link>
		<comments>http://thomasjaeger.wordpress.com/2011/10/06/steve-jobs-a-passionist-for-the-details-of-perfecting-masterpieces-in-the-21st-century-technology-era/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 05:12:48 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Passion]]></category>
		<category><![CDATA[Steve Jobs]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=69</guid>
		<description><![CDATA[Steve Jobs was and always will be an important part of my inspiration of creating the best software possible. The best software that people really love to use. Not just love, but, happy to use because it will make them happy to use and get their jobs done. Steve Jobs was a unique genius. I [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=69&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<div id="attachment_72" class="wp-caption alignleft" style="width: 310px"><a href="http://thomasjaeger.files.wordpress.com/2011/10/tumblr_lqhr46trpa1qz9917o1_5001.png"><img class="size-medium wp-image-72" title="Steve Jobs - RIP" src="http://thomasjaeger.files.wordpress.com/2011/10/tumblr_lqhr46trpa1qz9917o1_5001.png?w=300&#038;h=300" alt="Steve Jobs - RIP" width="300" height="300" /></a><p class="wp-caption-text">Steve Jobs - RIP</p></div>
<p>Steve Jobs was and always will be an important part of my inspiration of creating the best software possible. The best software that people really love to use. Not just love, but, happy to use because it will make them happy to use and get their jobs done. Steve Jobs was a unique genius. I have learned so much from him. So much to be thankful about. He understood that it is about the people, about the users, that is so important to know them, really know them. Steve Jobs had passion for his creations. Steve Jobs was a passionist for the details of perfecting masterpieces of the 21st century technology era. I will miss him; but, his inspirations will live on in his creations, his motivational lectures and lessons, he will never be forgotten. It has been a rough 2 days. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=69&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2011/10/06/steve-jobs-a-passionist-for-the-details-of-perfecting-masterpieces-in-the-21st-century-technology-era/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>

		<media:content url="http://thomasjaeger.files.wordpress.com/2011/10/tumblr_lqhr46trpa1qz9917o1_5001.png?w=300" medium="image">
			<media:title type="html">Steve Jobs - RIP</media:title>
		</media:content>
	</item>
		<item>
		<title>What is Cloud Computing?</title>
		<link>http://thomasjaeger.wordpress.com/2011/08/25/what-is-cloud-computing/</link>
		<comments>http://thomasjaeger.wordpress.com/2011/08/25/what-is-cloud-computing/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 22:36:10 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=62</guid>
		<description><![CDATA[Over the last few months I’ve been asked more and more this question: “What is Cloud Computing?” It seems the interest in cloud computing is a lot higher in 2011 when compared to last year. So, I decided to put some of my thoughts down in a series of posts and explain what I think [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=62&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Over the last few months I’ve been asked more and more this question: “What is Cloud Computing?” It seems the interest in cloud computing is a lot higher in 2011 when compared to last year. So, I decided to put some of my thoughts down in a series of posts and explain what I think cloud computing is all about and how you can take advantage of it. I’m very heavily involved in cloud computing and see cloud computing as the way to go despite a few hick-ups you might hear in the news.</p>
<p>First, let me explain my background in cloud computing. I started to explore cloud computing capabilities back in 2006 when Amazon first announced their set of <a title="Amazon Web Services (AWS)" href="http://aws.amazon.com/" target="_blank">Amazon Web Services (AWS)</a>. Later on, companies such as Google and Microsoft followed. The first time I heard about Amazon’s Simple Storage Service (S3), I was so excited about the possibilities. I was also excited about the cost. It is extremely inexpensive to start developing powerful cloud services and solutions.</p>
<p>As time went by, I explored most of Amazon’s AWS services with amazement as they were updated and new ones were released. I also briefly dabbled with Microsoft’s Azure and Google’s services; but, to this day, it is my strong believe that Amazon is the clear leader in providing the best cloud services and infrastructure in the market today. In fact, I go as far as to say that Amazon is much further ahead of Microsoft and Google combined. Amazon is the clear leader if you develop on a Microsoft stack or LAMP stack. Either way, I will try to explain a little more by what I mean in the following posts.</p>
<p>So, what is Cloud Computing then? From an architecture point of view, I would sum up cloud computing this way:</p>
<ol>
<li>A cloud computing solution is partitioned logically end-to-end</li>
<li>A cloud computing solution offers an infinite storage capacity</li>
<li>A cloud computing solution offers an infinite computing capacity</li>
<li>A cloud computing solution can handle an infinite number of users at the same time</li>
<li>A cloud computing solution is always available 24/7</li>
<li>A cloud computing solution is available anywhere in the world with low latency</li>
<li>And yes, a cloud computing solution offers certain tasks to be completed when connections are down</li>
<li>A cloud computing solution offers multiple ways to access the information such as different devices and user interfaces (platform independent on the consuming side)</li>
<li>A cloud computing solution expands and contracts with resources as demand increases or decreases</li>
<li>A cloud computing solution offers very fast and native execution times on the user interfaces to provide the best user experience</li>
<li>A cloud computing solution offers automatic backup and recovery options for consumers</li>
</ol>
<p>These points above should be available in a modern cloud computing solution. Consider the points above the goals of a great cloud computing solution. The planning and designing of a cloud computing architecture makes the above assumptions. For example, a cloud computing solution acts like it has an infinite storage capacity available.</p>
<p>I’m coining the term “Cloud Computing Partitioning Pattern (CCPP)” and will explain next time what I mean by being able to partition a cloud computing solution in order to provide fast and successful operations from the time a request is received through a domain model all the way to persistence and back.</p>
<p>Until next time.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=62&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2011/08/25/what-is-cloud-computing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>
	</item>
		<item>
		<title>Designing Software</title>
		<link>http://thomasjaeger.wordpress.com/2009/11/01/designing-software/</link>
		<comments>http://thomasjaeger.wordpress.com/2009/11/01/designing-software/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 14:51:49 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=49</guid>
		<description><![CDATA[I have been using computers for over 24 years now. In those years, I have seen and used many operating systems and applications that run on these operating systems. I have seen software from a users point of view and software from a designers point of view when I created software solutions. In those years [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=49&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I have been using computers for over 24 years now. In those years, I have seen and used many operating systems and applications that run on these operating systems. I have seen software from a users point of view and software from a designers point of view when I created software solutions. In those years and up to including today, good software design seems to suffer a severe lack of attention. This results in poor quality software that is hard to use and just plain frustrating for the user. Poor software design can have serious financial impact on anyone who uses it. Poor software design makes people loose time and efficiency. Poor software design makes people wanting to cut corners or worse avoid using it all together if the opportunity allows it.</p>
<p>I strongly believe that when designing software, the human aspect, or the end-user, the one who is actually using the software, is the center of an application. By that I mean, every software design should be centered around the user, the woman or man who will be spending a lot of time with it. Good software design is designed around a person who is using it for a particular purpose.</p>
<p>I wanted to express my thoughts about software design and started thinking how I can express my thoughts and ideas in a way that others can understand. I have an intense passion of creating high-quality software. Almost to a point where you can say I have an obsessive passion of creating the best software it could possibly be. But, what is high-quality software? I have come to learn that high-quality software must be coupled with greatly designed software.</p>
<p>Over the decades, the art of creating software has been influenced by several industries including but not limited by the construction industry, the electronics, industry, and the industrial industry. Design principles and ideas leaked from these industries into the software industry.</p>
<p>Designing successful software, in my opinion, can be guided by the 10 Design Principles from the Industrial design principles by <em><a title="Dieter Rams" href="http://en.wikipedia.org/wiki/Dieter_Rams" target="_blank">Dieter Rams</a></em>, an amazing industrial designer and an industry icon who has an extensive and important influence over modern industrial design. I have applied his industrial design principles to the software industry the way I see these principles can be applied. Lets first take a look at what these principles are:</p>
<ol>
<li><strong>Good design should be innovative.</strong></li>
<li><strong>Good design should make a product useful.</strong></li>
<li><strong>Good design is aesthetic design.</strong></li>
<li><strong>Good design will make a product understandable.</strong></li>
<li><strong>Good design is honest.</strong></li>
<li><strong>Good design is unobtrusive.</strong></li>
<li><strong>Good design is long-lived.</strong></li>
<li><strong>Good design is consistent in every detail.</strong></li>
<li><strong>Good design is environmentally friendly.</strong></li>
<li><strong>Good design is as little design as possible.</strong></li>
</ol>
<p>All 10 design principles can be applied when architecting and designing great software. Each one of these principles above are very true and tested over the decades because they center around a person using a product. The industrial industry has been around for many decades now and we better learn from it.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=49&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2009/11/01/designing-software/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>
	</item>
		<item>
		<title>Is There a Problem?</title>
		<link>http://thomasjaeger.wordpress.com/2008/09/08/is-there-a-problem/</link>
		<comments>http://thomasjaeger.wordpress.com/2008/09/08/is-there-a-problem/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 00:38:20 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[Persistence]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=40</guid>
		<description><![CDATA[  The fact that you are using objects in your project or product does not mean that the software development process will be any easier. Essentially, you will run into issues that you need to address. In general, some problems will come up before you start designing your solution, some challenges will come up while [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=40&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<div><span style="font-family:Times;"> </p>
<div>
<div class="snap_preview">
<div>
<div><span style="font-family:Times;"></p>
<div>
<p>The fact that you are using objects in your project or product does not mean that the software development process will be any easier. Essentially, you will run into issues that you need to address. In general, some problems will come up before you start designing your solution, some challenges will come up while you are developing your solution, and others issues will need constant attention.</p>
<p class="MsoNormal"> These issues can be summarized into three categories:</p>
<ul type="disc">
<li class="MsoNormal">How Object Persistence has been done in the past</li>
<li class="MsoNormal">Technical Challenges</li>
<li class="MsoNormal">Political / Social Hurdles</li>
</ul>
<h2><a name="_Toc201045550">How Object Persistence Has Been Done in the Past</a></h2>
<p class="MsoNormal">When you ask a developer about a system that he created and then drill-down into the details such as the “data”, many times you will find a “data-centric” thinking in that person even though he is knowledgeable about object-orientation. You will hear that person talk about stored procedures, SQL’s, datasets, even the term entities, etc. Unfortunately, you will discover that the data model is actually driving the entire application. There may or may not be a domain model; but, there will be a database model.</p>
<div>
<p class="Tip"><span><span>In a domain driven system, the Domain Model must always drive the Data Model.</span></span><span><span><span>  </span></span></span><span><span>Never, must the Data Model drive the Domain Model.</span></span></p>
</div>
<p class="MsoNormal">The Domain Model dictates when and how the database schema needs to change. If you need to make a design change in your domain model, the database model needs to be updated accordingly so that it can support the domain model. No compromises in the Domain Model must be taking place to support the database model in any way.</p>
<div>
<p class="Tip"><span><span>The Domain Model should be designed without any regard to object persistence or user interface exposure.</span></span></p>
</div>
<p class="MsoNormal">Think of it like this: Design your domain model as if you have unlimited storage space available and all the horsepower in the world to support your object model. Concentrate on solving the domain problems. Concentrate on solving the use cases. Concentrate on learning the business and your users tasks. You can always re-factor your domain model later. Since you most likely will use a layered or tiered approach, the domain model should have no clue about how to save and retrieve itself from persistence.</p>
<p class="MsoNormal">Let me emphasize the importance of the Domain Model driving the solution including a Data Model. Consider the Domain Model or Applications in general as being Nature. Consider the Data Model as being human beings. Human beings need nature to survive and live in this world whereas nature does not need human beings to survive. Databases need applications but applications certainly do not need databases. A database without an application is rendered useless whereas an application without a database can still be extremely useful to the user. An application can use different ways to persist the object model or information in general. It does not have to be a database, necessarily.</p>
<h2><a name="_Toc201045551">Technical Challenges</a></h2>
<h3><a name="_Toc201045552">Impedance Mismatch</a></h3>
<p class="MsoNormal">You can also call Impedance Mismatch a desperate move of old technology trying to survive in an ever-changing world of rapid delivery and instant gratification.</p>
<p class="MsoNormal">Object-Relational Impedance Mismatch is the difficulty of mapping a Domain Model to a Data Model and vice versa. If you chose to use a relational database as your data storage, you will need to deal with the Impedance Mismatch.</p>
<p class="MsoNormal">There are several reasons why there is an Impedance Mismatch. The Domain Model is a three dimensional model that includes behavior and data, whereas a Data Model is a flat, two-dimensional model without any behavior. Relational databases do not support inheritance, a crucial feature of object orientation.</p>
<p class="MsoNormal">On the software development side, impedance mismatch describes the huge differences between the world of objects and the world of databases. Both worlds are also worlds apart where the database world is stuck in a world without much progress and not much innovation. For example, the SQL querying language has not seen any improvements or innovation in the last 20 years.</p>
<p class="MsoNormal">In the world of objects, it is a thriving world with innovations towards ease of development, productivity, creativity, and automation.</p>
<h3><a name="_Toc201045556">Political / Social Hurdles</a></h3>
<p class="MsoNormal">The biggest drawback of using Object Persistence is not so much technical but rather political. When you are developing a solution and you are pretty much in control of the entire design and have the freedom to explore different Object Persistence solutions, you might not be faced with the political ramifications. But, if you are in a corporate environment where most corporate environments are hindered to be productive by red tape and personal agendas, introducing an Object Persistence can be somewhat “challenging” to say the least.</p>
<p class="MsoNormal">Even if you have created the “perfect solution” including an Object Persistence that works, you will still have to potentially face your boss, any cross-team impact including a database team, a mindset of people doing it the “old way” or “the way things have always been done”. You will encounter all kinds of excuses from people even from your boss to convince you, and in many cases order you to do it the old way. By the old way and by the way the database team would want you to do it is that the Database Model is driving the Object Model. Remember, in a domain driven system, it must always be that the Object Model is driving the Data Model (if there is one).</p>
<p class="MsoNormal">There is hope, though.</p>
<p class="MsoNormal">Despite the grim outlook when you face the database team, there is a chance that you may be able to introduce an Object Persistence strategy that can work for both teams. Communicating the difficulty of persisting objects and the challenges faced from the software development point of view, for example, can be a pleasant surprise.</p>
<h3><a name="_Toc201045560">Managers / Directors / Executives</a></h3>
<p class="MsoNormal">Even if some managers try to improve the software development process and the issues around object persistence in the corporate world, it comes down to the executive(s) running the IT department or the people in charge of software development. The ideal scenario is that a CIO fully supports productivity and that he concentrates his efforts in the execution and operation of the IT department and being able deliver to the stakeholders.</p>
<p class="MsoNormal">You may not be faced with the issues of large corporations if you are working for a smaller company or even if you are self-employed. You will most likely still have to deal with political issues no matter how big or small your company is. </p>
<h3><a name="_Toc201045560">Summary</a></h3>
<p class="MsoNormal">Depending on your situation, you may or may not be able to introduce the perfect persistence strategy. But, in todays solutions, you have to deal with persistence one way or another. Architecture is all about compromise. Try to find a compromise that will allows developers to be productive and yet adhere to company guidelines such as a data strategy that a company might already have in place. I welcome very much your feedback and encourage you to so. I future posts I will go into examples and provide possible solutions to this core problem.</p>
</div>
<p></span></div>
</div>
</div>
</div>
<p> </p>
<p></span></div>
<p><!--EndFragment--></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/thomasjaeger.wordpress.com/40/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/thomasjaeger.wordpress.com/40/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/40/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=40&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2008/09/08/is-there-a-problem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>
	</item>
		<item>
		<title>Update on my book</title>
		<link>http://thomasjaeger.wordpress.com/2008/09/03/update-on-my-book/</link>
		<comments>http://thomasjaeger.wordpress.com/2008/09/03/update-on-my-book/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 17:14:23 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[Book]]></category>
		<category><![CDATA[Persistence]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=33</guid>
		<description><![CDATA[I have increased my efforts to complete my draft for my book &#8220;The Abundance of Object Persistence&#8220;. The increased efforts are mostly through additional time provided by my current employer RDA Corporation. I will continue small blog posts around the object persistence topic based on my book. I will post these entries at the RDA Architecture Evangelist [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=33&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I have increased my efforts to complete my draft for my book &#8220;<em>The Abundance of Object Persistence</em>&#8220;. The increased efforts are mostly through additional time provided by my current employer <a title="RDA Corporation" href="http://www.rdacorp.com" target="_blank">RDA Corporation</a>. I will continue small blog posts around the object persistence topic based on my book. I will post these entries at the <a title="RDA Architecture Evangelist Team Blog" href="http://rdaarchitecture.blogspot.com" target="_blank">RDA Architecture Evangelist Team Blog</a> which I am part of as well.</p>
<p>If you have ideas or comments, please provide them. I welcome different point of views as this is usually a hot topic in the IT community.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/thomasjaeger.wordpress.com/33/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/thomasjaeger.wordpress.com/33/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=33&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2008/09/03/update-on-my-book/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>
	</item>
		<item>
		<title>Funny wrap &#8211; Mac vs PC</title>
		<link>http://thomasjaeger.wordpress.com/2008/08/29/funny-wrap-mac-vs-pc/</link>
		<comments>http://thomasjaeger.wordpress.com/2008/08/29/funny-wrap-mac-vs-pc/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 16:25:51 +0000</pubDate>
		<dc:creator>Thomas Jaeger</dc:creator>
				<category><![CDATA[Funny]]></category>

		<guid isPermaLink="false">http://thomasjaeger.wordpress.com/?p=30</guid>
		<description><![CDATA[I was laughing so hard. You have to see and hear this one.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=30&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I was laughing so hard. You have to see and hear this one.</p>
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='480' height='300' src='http://www.youtube.com/embed/Jkrn6ecxthM?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/thomasjaeger.wordpress.com/30/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/thomasjaeger.wordpress.com/30/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thomasjaeger.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thomasjaeger.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=thomasjaeger.wordpress.com&#038;blog=304782&#038;post=30&#038;subd=thomasjaeger&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://thomasjaeger.wordpress.com/2008/08/29/funny-wrap-mac-vs-pc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/220359b359ee0f5867d62feb44a359da?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Thomas Jaeger</media:title>
		</media:content>
	</item>
	</channel>
</rss>
