Twitter Feed: @definition6

DEFINING INSIGHTS

Architectural Diary - Refactoring Minefields

Monday, March 28, 2011 by Jonathan Taylor

Change sucks. I’ve heard the glib rhetoric and seen the shiny happy bumper stickers proclaiming the staunch opposite. They're often paired with an equally shiny sticker of a cat skeleton with a smiley face stuck to the front of it. "Change is good," but apparently not for the cat.

Now, I’ll admit, for some things, change is a genuinely welcome event – underwear, socks, cat litter, and most immediately my empty pint glass come to mind. However, with web application development change sucks! Change means long nights rolling in new code to replace old. Change means endless cycles refactoring someone else’s code, often on shoestring documentation and littered with dependencies you don’t know about until you trip over them. How often have you fixed one bug and 3 more pop up? Poorly written code, like it or not, is a fact of life.

Blame it on too many requirements in not enough time, or whatever you want to, but the sad truth is most developers build what they have to without thought of what it takes to support it once it’s running. If it’s your task to have to go back in and add a new feature or change existing functionality, yeah, change sucks. And the number one culprit in contributing to code sucky-ness is dependency. Updating heavily dependent code is like planting corn in a minefield, you might get a few new stalks in ok, but it’s only a matter of time before something’s going to blow up.

So, how can we, as developers, do eachother right and make sure the code we write won’t blow somebody’s refactoring effort to smithereens? Especially if it might actually be us doing the refactoring? Limit dependency in our own code! Right! Ok, so how exactly do we do go about building projects that aren’t refactoring minefileds? Glad you asked.

The easiest way to reduce dependency between two pieces of code is through a façade. Let’s go with an example. Take a look at the code in Segment 1.

Code Segment 1.

    class Example

    {

        //Default constructor

        public Example()

        {

 

        }   

        //Public method

        public void DoSomething(String thing)

        {

            //process thing

        }

    }

    public class Caller

    {

        String stuff = "stuff that needs to be done";

        Example xmpl = new Example();

        xmpl.DoSomething(stuff);

    }

 

Pretty standard stuff, right? A simple Caller class that instantiates a version of our Example class, then calls the Example class’ DoSomething() method. Pretty standard, you’ve probably written hundreds of similar code sets. But what if we had to update DoSomething()’s code to include some new functionality once it had been pushed into production? We’d have to change both our Example class, our Caller class, and anybody else that was dependent on Example to do something. Total pain.

Now, there are lots of ways we can reduce our caller class dependency in our example class. We could setup a factory to handle the instantiation of the example class, throw in some dependency injection, or heck, even define an interface we could program all our caller classes to [Love interfaces. Love them. Separate declaration from implementation in one easy step. But sadly, it’s another post…JT], but our intent here is relate to you just how easy it is to separate the declaration of our DoSomething() method from its processing through a simple façade, and in so doing significantly reduce the dependency any class implementing our Example class has to deal with. Let’s get to it.

What we’re going to do is use a really easy implementation of the Façade Pattern which Microsoft itself uses extensively throughout its .NET framework – a Non-Virtual Interface (NVI).

Oooo. Aaaahh.

Ok, big name for really simple solution to break dependency between entities. Basically what an NVI is a public method declaration that calls a private internal method to carry out its processing. I know, sounds too easy right? Right! It is! But what it does for us is cleanly separate declaration from implementation.

Oooo. Aaaahh.

Ok, I’ll stop, but this is wicked cool stuff. Check out Segment 2

Code Segment 2

    class Example

    {

        //Default constructor

        public Example()

        {

 

        }   

        //Public method

        public void DoSomething(String something)

        {

            DoSomethingElse(something);

        }

        //Private method to do processing

        public void DoSomethingElse(String somethingElse)

{

            //process something else

}

    }

 

    public class Caller

    {

        String stuff = "stuff that needs to be done";

        Example xmpl = new Example();

        xmpl.DoSomething(stuff);

    }

 

Again, it looks too easy, doesn’t it? In fact, if you don’t stop to think about what this code is doing for us, you’ll miss it, it’s that easy. Say we had to support some new corporate mandate in our DoSomething() method once it had already been released? [We have to log everytime someone does something! Log it! Log it I say!] Well thanks to our tidy NVI, all we have to do is go into our code, and add the new logging functionality to the private DoSomethingElse() method, and we’re done. Done! Our Caller class doesn’t have to be touched because its method call into DoSomething() hasn’t changed!

It’s starting to make sense, right?

So, exposing a public interface which calls a private implementation is the core of what a Façade Pattern is, and a Non-Virtual Interface is a neat trick you can use to keep your own code separated and dependency-Free.

Oooo. Aaaahh.

Sorry, couldn’t resist. Imagine how much easier your refactoring efforts would be if all your existing projects implemented NVIs throughout their codebase? Would certainly reduce the number of senseless refactoring minefield injuries, wouldn’t it? Oh yes it would.

Life might acutally be pretty good. Change would still definitely suck though.

Architectural Diary - The Future of Web Development

Monday, March 21, 2011 by Jonathan Taylor

Web application development is on the precipice of a revolution; through a confluence of independent practices and technologies, the way in which web applications are built and consumed is about to change radically.

What is happening is a fundamental shift away from the current state-heavy, page-based processing model to a loose collection of lightweight web-based services that an empowered client can consume to provide full functionality in a composite fashion. It started with AJAX, grew substantially with MVC, took shape with REST, and is now about to break wide open.

Web development up to this point has been tied very closely to processing HttpRequests on a page-by-page level. Remember classic ASP and ColdFusion with code intermixed with html on the page? [Honestly, was there ever a worse language to work with than VBScript? If…EndIf…Next? Please. Microsoft still owes the development community a sincere apology for making us suffer through the miserable excuse for a language that was VBScript – JT] Nightmare! ASP.NET brought the separation of code and markup, which was a huge advancement, but brought along with it a heavy page-processing model and cumbersome state management tied to the server, or worse, hashed and embedded in the page itself. [He’s using ViewState! Grab your torch and pitchforks! Raah!]

AJAX was the emancipation proclamation that freed web development from the confines of postback processing. Utilizing the substantially overlooked XMLHttpRequest object [Thank you Microsoft for developing the XmlHttpRequest in 2000 but not incorporating it into a browser until 2006], developers were suddenly free to call back into their server for processing without having to post an entire page’s content and wait for it to come back. In its entirety. Which took time. Like reading this. OK, you get the point. AJAX did more to enliven the web than any plugin had ever done previously, [sounding the death knell for Flash and similar technologies, R.I.P] and was the timely injection of functionality and responsiveness the web desperately needed. AJAX, however, despite its freedom from the page processing lifecycle, is still inherently tied to a page – its whole intent was to be able to refresh parts of a page without having to throw the whole page back to the server, so no matter how you implement it, Ajax is fundamentally tied to a page. Figure 1 is a good representation of the current state of web development, with different clients requiring dedicated applications to process information over the web

Figure 1 - The current state of web development

Web2
MVC changes how we even think about web processing by changing the url from pointing to a physical file sitting in a directory on a server somewhere to a call to a method in the code of our application. This is a huge change; the url doesn’t point to another page or image or even another site, it fires off functionality on demand.

Now, combine this url-based functionality with a robust client-side library such as jQuery, which is capable of consuming and populating services of various types, and you have the basis for a new processing model for web applications. Consider, free from the duty of page DOM processing, jQuery can intercept a click on the page and call any service we want instead. In this scenario, jQuery acts as a controller of our base page, synchronizing calls to a myriad of distributed lightweight service endpoints to deliver full functionality as a composite set. Incorporating the capabilities of HTML5, we’re free from supporting multiple plug-ins to support media, which we can also stream in from services as required.

So what’s really happening here is a combination of the extensibility of service oriented architecture (SOA) with AJAX-style web client processing for the purposes of delivering web applications as outlined in Figure 2.
 
Figure 2 - Composite Web Application Development

Web3

This model offers significant benefits over previous web development techniques including, but not limited to:

·         Extensibility: need a new feature? Build a new service and .js file to consume it. You’re done. And you can implement both to the live app without disruption of service.

·         Scalability: services can be provisioned collectively or separately to address performance concerns – which fits perfectly with modern virtualization practices.

·         Performance: by relieving the server from redundant page postback processing, and moving a large portion of processing onto the client, the server is free to dedicate more resources to handling dedicated lightweight service calls, significantly speeding overall responsiveness.

·         Maintainability: encapsulating functionality into independent services means if changes or added features are required by the application, only one service needs to be updated, not the entire application. And as it’s the service that will be altered in most cases, production environments will not have to be impacted by the service refresh.

·         Client Agnostic: Implementing this model frees processing from the page, meaning the same services which feed our web application can easily be consumed by a mobile or platform-specific client, extending the development effort in a parallel fashion.

Service based applications have been highly regarded for quite some time due to their clear separation of concerns and inherent benefits of such an implementation, but the challenge thus far in utilizing a Service Oriented Architecture with web applications has been the limitations of the page/postback processing model. Combining the capabilities of url-based method calls with AJAX-style lightweight service consumption, a composite web application model is emerging which will change the way web application development is considered and pursued. The revolution is coming.

The Architectural Diary: Understanding the Drivers for Search Architecture

Thursday, March 17, 2011 by Ric Williams

Many application development companies regadless of web development or windows development want or need to implement search functionality. However, it is a commonly underestimated function and it continues to evolve over time. Interestingly users want search to have minimal to no interaction while having a maximum result. With data and collection systems becoming more and more complex this becomes and increasingly difficult challenge. I remember a system I was architecting for a customer where the customer wanted to enter a DNA result that consisted of an 800 to 1600 character string into a web application and have it search a database using an algorithm providing scored search results. The customer was convinced that a basic desktop machine would act as a server and be able to conduct the search against a large database efficiently. The production architecture needed to support the customers’ performance requirements was a High Performance Computing hardware environment.  Like many customers they didn’t understand the complexity of certain functions. Thinking through this topic recently had me researching how functions in systems and their architectures evolved.

Architecting a system today has many facets, and search certainly is a prominent one. Searching for information is not a new concept but a heavily evolving one. Once computers evolved beyond just basic mathematics and started capturing, storing and manipulating other data the need for search began. Early systems collected data that was somewhat structured in files and databases. Search functions found data quickly within those structures. With the development of relational databases and more complex data capture search the tools for search had to grow. Also the acceptance and use of computers was growing and more and more.
Architecting search within a system has consistently had to recognize simultaneous evolutions. Database tools added the ability to index tables to help search perform better. Search appliances like Wizards emerged for more technically savvy users to pull data from a data source. Multiple levels of searching complexity were emerging. While these searches largely dealt with structured data stored in systems, at the same time this evolution was occurring what cannot be ignored is the emergence of the internet and its impact on search. 

Early on companies like Yahoo profited on the simple concept of locating content. While this wasn’t structure data as in databases internet standards of things like meta-tag’s and other items made it possible for users to find content early on. Searching on the internet allowed users to enter terms and content related to those terms would be returned. Later companies like Google would improve the algorithms and set that industries standard for a time. E-commerce companies were also integrating user shopper experiences with search as a means of driving revenue. So while a user shopped for shoes, related items and previous shopping items would appear in the links and advertising throughout the system. While the motives were different the capture of information and providing relevant data back is essentially an implied search. The evolution of the internet and its potential was impacting local systems.

Users’ expectations were changing as the interaction was to enter in a few terms and that brought back content they wanted to see. At the same time computers continued advancing in hardware and use. Pictures, Videos, art, music files evolved to become more common to be stored on systems. In fact digital has become so big that companies like Kodak have stopped producing film based cameras. Users have embraced and ran with the lower cost and portability of digital media. This new media has presented a new challenge and forced search to evolve in multiple ways again.

Architects and systems were faced with growing use for search.  Users were searching as an exploratory exercise as more complex data and more types of data were being captured. Allowing for the advancement of tools like Online Analytical Processing (OLAP) and reporting tools. Users weren’t looking for specific data as much as looking to see what trends might appear in the data. These tools while technically complex have easy to use interfaces that allow users to review and analyze data. The complexity lies in the architecture and backend. The emergence and development of these tools was a move from appliance parts of a system to search to a full blown system of its own.

Users now expect applications to be able to search both structured and unstructured data. They want to give as little information as possible and quickly find very relevant search results. Algorithms and techniques for searching continue to advance because they must--including incorporating e-commerce like changes in the system and having subtle changes help the customer get to the results they want more quickly. One of the many reasons unstructured data evolved was not only digital media but mobile devices.

This latest evolution has occurred simultaneously with the acceptance of mobile devices. Now users have a high level of portability and connectivity to data. These mobile tools work quickly using touch screen technology and other key changes that impact the user experience for working with data. This has resulted in a need for better performance and system architectures that incorporate different devices, connectivity, and desired results.

Today’s cutting edge searches involve grabbing information from a part of a picture and searching for related information. Searches that work from audio files or live audio and provide related information quickly on portable devices is another technology that has been developed. Users want more with less required of them, resulting in more complex algorithms and models for searching.

Successfully architecting a system means taking a lot of factors into consideration. A successful solution can't overlook what the implementation's search functionality has within an enterprise system. Architecting search as a part of a system today means taking many factors into account. Understanding the user’s expectations and desired results has become critical to the successful use of a system. What devices are targeted for use, what is the complexity of the data, what type of data, and other questions like these are all key to get answered to develop a successful search system. Working with customers to identify the business rules that lead to implicit and explicit searches is important as systems more and more are expected to show relevant data.


Architectural Diary - Build a better FTP Drop Box

Monday, March 14, 2011 by Jonathan Taylor

The other day I was discussing the finer points of flat file conversion in Application Development (or lack thereof) with one of my colleagues on the Definition 6 Architecture team, and we got into a rather interesting conversation regarding how much of today’s data still gets transmitted via data documents of some kind. Modern programming practice is to transfer data via on-demand services, it's faster, easier, and in most cases much more secure. The truth of the world we live in is that most older systems, and an uncomfortably large number of new systems still  transmit data to business partners across the world using plain old text files filled with data in whatever standard they were supporting when the system was built. How's that for communcation planning? [Note: this practice has a name – Electronic Data Interchange, or EDI, and Microsoft has an exceptional tool for optimizing and synhcronizing these efforts, Biztalk 2010, but that's another post entirely – JT]

Now, my colleague, who shall remain nameless, pointed out that these systems have been functioning without problem for years, so something must be said for the persistence of such file transfer processes. My carefully worded retort was that this perceived stability was the direct result of poor sods like myself working my tail off to keep them going. At this point I feel it is my duty to disclose that while it doesn’t seem to have affected him personally, my colleague was once a long-time employee for an organization many would lay the finger of blame at for the creation and continued use of this file-based data transfer silliness, even in the face of more reliable, efficient alternatives (I won’t disclose the name of this much maligned organization, but it rhymes closely with "aye, be them"). And conceding to my colleagues’ point, this is surely the reasoning why these processes still exist today. (A clearer case of ‘if it ain’t broke, don’t fix it’ you’ll never find)

Thus, like them or not, we as developers are stuck with these processes, and it is up to us to implement solutions that accommodate them as best as possible. Now, a simply staggering majority of these systems rely on FTP transfer to distribute their data files, and typically it is up to the receiving party to pick up these files from an ftp "dropbox" and process them in a timely manner. FTP transfer has its own peculiarities that do not help this process, however, the most prominent of which being unpredictable transfer times and the disparity between the file arriving at the destination dropbox and the file completely downloading in its entirety from its origin. Aha! Herein lays our opportunity.

The problem of uncertain FTP delivery schedules causes file recipients to either delay retrieving the files from the dropbox until a time when they are certain the file will be there, "nightly file transfers," etc., or resort to "polling" to periodically spin up a process to look for the file being in the dropbox, and if it is, begin processing of the received file or pass it along to another process for further manipulation. These practices are inherently flawed and incur extensive overhead in time and system resources while constantly checking to see if the file has arrived, then locking resouceswhile the file finishes downloading before the processing of the files data can finally take place.

With .Ne however, these problems can be solved easily enough – if we can’t change the process, at least we can make it better, right? Let’s get started.

The key to our solution is a little-known member of the .NET System.IO namespace, the FileSystemWatcher class. The FileSystemWatcher does exactly what its name implies – it’s a lightweight object that monitors a directory and raises events to any changes that occur. We’re going to build a small console application and use a FileSystemWatcher to monitor our ftp directory for any new files that get created. Code Segment 1 details our System.IO.FileSystemWatcher implementation.

Code Segment 1

class Program

    {

        static void Main(string[] args)

        {

            //This should be an actual ftp directory path,

     //preferably from an App.Config file      

            String ftpPath = "path-to-ftp-directory";

 

            //Our watcher! 

            FileSystemWatcher watcher = new FileSystemWatcher(ftpPath);

 

            // Add event handlers for file created event

            watcher.Created += new FileSystemEventHandler(OnCreated);

 

            //Begin watching.

     //you need to set this to enable the FileSystemWater to raise events

            watcher.EnableRaisingEvents = true;

 

            // Code to shutdown the console if the user hits 'q'

            Console.WriteLine("Press 'q' to quit the sample.");

            while (Console.Read() != 'q') ;

        }

 

 

Right, so pretty straight-forward so far, a simple console app in which we setup the directory to be watched, implement a new instance of the FileSystemWatcher class then enable it to raise events whenever anything occurs in that directory. Now, the event we’re clearly interested in here is the Created event, which will fire every time a new ftp transfer arrives in our directory. To react to this Created event we wire up an instance of the FileSystemEventHandler to the watcher’s created event and point it to our method OnCreated, which is outlined in Segment 2.

Code Segment 2

        // Define the event handler

        private static void OnCreated(object source, FileSystemEventArgs e)

        {

            // write file name and arrival time out to the console when new files arrive

            StringBuilder sb = new StringBuilder();

 

            sb.Append("File: ");

            sb.Append(e.FullPath);

            sb.Append(" arrived @");

            sb.Append(DateTime.Now.ToShortTimeString());

            sb.Append(". Processing...");

 

            Console.WriteLine(sb.ToString());

 

            //now route the file to where it needs to go.

            ProcessFile(e.FullPath);           

        }

 

Again, fairly straight-forward, the OnCreated method simply reacts to the watcher’s Created event, and allows us to kick off whatever further processing we need to, namely writing out to the console the name and arrival time of the new file, then handing the file off to another method for further processing. Notice the FileSystemEventArgs object in the OnCreated method’s signature – we need to implement this class in order to capture the event, but it also allows us to work with a number of key parameters regarding the watcher.Created event, in particular the e.FullPath property which we’ll use to programmatically work with the newly arrived ftp file. The ProcessFile method is outlined in Segment 3.

Code Segment 3

private static void ProcessFile(String filepath)

    {

        FileInfo file = new FileInfo(filepath);

       

        //Switch to handle different file types

        switch (file.Extension)

        {

            case "txt":                   

                //process text logic here

                break;

 

            case "xml":

                //process xml logic here

                break;

 

            case "csv":

                //process csv logic here

                break;

 

                default:

                    break;

 

            }

 

Ok, so this is the final piece of our solution; we want our console app to be running constantly on our ftp server to watch our ftp dropbox at all times, so we need to be sure it’s as lightweight as possible and doesn’t maintain any internal state whatsoever, otherwise we’re adding extra load to our ftp server, and that’s entirely against what we set out to do in the first place, isn't it?. So let’s not do that.

The ProcessFile method is our routing method to move the file or notify any further services down the line that the file has arrived [an exceptional opportunity to implement the .NET Event Pattern, discussed in my previous post - JT]. We declare a FileInfo class to derive the extension of the file and route the file to a final destination based on file type.  By doing so, our console app never opens the file, never reads it into memory or maintains anything that would drain resources away from our server’s memory or processing pool, so it can run quietly alongside the rest of the server’s workload catching every new file that arrives in our FTP directory, and routing them to their final destination.

Ooo, Aahh.

Now, as simple as this solution is, we need to recognize what this implementation saves us – every time a typical FTP polling process started up, it would need to first gain access to the FTP directory, declare the directory reference in memory, then enumerate all the child directories (even if there weren’t any) followed by enumerating all the files contained in the directory to check if the file the batch process is looking for is there, and because the file transfer cannot be guaranteed to arrive at a specified time, the process would have to execute repeatedly until the file was finally found. Our FileSystemWatcher class, on the other hand simply responds to events that occur within the FTP dropbox, consuming substantially less resources.

So the key for gracefully processing FTP files without having to wait for the entire file to arrive is to process the file asynchronously. Doing so allows the main program to continue receiving file processing requests without having to wait for the code that actually processes the file. .NET provides a number of different avenues to finish that thought with, particularly in .NET 4.0, but that’s a bigger topic I’ll save for a later post. (Oh yes I did)

So to recap, yes we still have to deal with flat file transfers, but at least we can do so in a better manner, can’t we? Oh yes we can.


Architectural Diary - The .NET Observer Pattern

Tuesday, March 8, 2011 by Jonathan Taylor

Web application development can get tricky. Not only are we, as developers, charged with constructing brilliant websites that address every requirement each project entails, we also have to be concerned with the things not explicitly listed in our requirements document - things like how do we secure it? How do we know it's working at peak performance? How can we make sure people are entering in the data they're supposed to? On top of all that, if we're doing business website development, be sure to stay abreast of current application development technologies, the best ways to improve search engine optimization and last but not least, be sure to address brand experience strategy in everything you do.

See? Tricky. Fortunately, developers are weird. We like the challenges each web application development project presents. Really. We're weird.

Now despite this apparent quirkiness, in any software project we're working on, if there's something someone's built before that can help speed the development process along, we're likely going to use it. Design patterns represent tried and true ways to accomplish certain tasks in code - they're structures that solve problems common to many different project types. Confronted by a massive project with a tight deadline? Spot a process that can be handled by a design pattern? Sign me up! Design patterns to the rescue.

One of the most common design patterns which has been implemented time and time again is the Observer pattern, which is basically a structure that allows you to setup one or more entities (the observers) that react to changes in another entity (the subject). Not an uncommon scenario, right? Think RSS news readers that display news items as they are posted on the remote server. The observer pattern has solid grounding in real-world scenarios too; think of the iconic "hot doughnuts now" sign from your doughnut shop of choice – they light it up, people come running. Ok, maybe not the best of examples, as people still have the choice to grab a doughnut or not, but hey, it’s a vice, what can I say?

Traditionally the Observer pattern is implemented by using a set of objects derived from a common set of interfaces, namely the IObserver interface for objects we want to be notified of changes in another object, and the ISubject interface for the object we want to be watched. Basically, the ISubject interface defines a set of public methods to manage observer signup and notifications as outlined in code segment 1:

Segment 1

    interface ISubject

    {

        public List<IObserver> RegisteredObservers { get; set; }

        public Boolean state { get; set; }

       

        public void RegisterObserver(IObserver observer)

        {

            RegisteredObservers.Add(observer);

        }

 

        public void RemoveObserver(IObserver observer)

        {

            RegisteredObservers.Remove(observer);

        }

 

        public void UpdateRegisteredObservers()

        {

            foreach(IObserver observer in RegisteredObservers)

            {

                observer.Update(state)

            }

        }

 

So a set of methods to add and remove any objects derived from the IObserver interface to an internal list of IObserver objects which is used in the Update method to notify the observers of any change to the ISubject object, in this case a simple Boolean field called state (ugh, brutally obvious, I realize, but prudent..) . The observer objects implement their own interface outlined in segment 2:

Segment 2

    interface IObserver

    {

        public void Update(Boolean state)

        {

            //update status to reflect change in subject

        }

    }

 

And as expected, IObserver contains just one method to update itself to reflect any change in the subject object.

Not so difficult, right? A handy mechanism to handle distributed subscriber-based notifications for a number of different circumstances; if you haven’t found yourself in a situation where you needed to distribute multiple updates based off one event, trust me you will, and you’ll be happy you know about your friendly neighborhood Observer Pattern

Now while you are more than welcome to implement the Observer pattern using this traditional dual-interface manner, in .NET, there really is a better way. (You knew I was getting to it at some point, didn’t you?) Because the Observer pattern is so heavily entrenched in object-oriented development these days, and since the maintenance of registered observers can get pretty tricky pretty quickly in a traditional Observer pattern implementation, Microsoft went ahead and built its own short-hand version directly into the C# language from the very first version (yup, C# 1.0, don’t see that much anymore do you?) through the simple use of events and delegates. Microsoft uses it so much in their own internal coding, they even went so far as to rename it the Event Pattern (Oooo, Aaahh..)

OK, so here’s how it’s done: we’re going to build a subject class to expose an event whenever it changes internally, then we’re going to define a delegate to handle that event, which we’ll use to link all our observers to the subject– and we’ll transmit the subject’s change in state through a custom EventArgs class. Now, if that sounds like a lot, don’t freak out just yet, if you’ve ever wired up code to an event in .net, you’re already well acquainted with how events and delegates work through the standard signature of an event handler – think of a button click event handler like the one outlined in code segment 3.

Segment 3

public void Button1_Click(Object sender, EventArgs e)
{
    //button event code goes here
}

See that EventArgs parameter? That’s how .Net passes parameter values to event processors. So the cornerstone of implementing our own .net observer is by overriding the default System.EventArgs class with our own version to hold the information we need to pass to our observers from our subject class. Sound like a plan? Let’s get started.

Code Segment 4 lists a custom event class which contains two readonly properties, oldvalue and newvalue – we’ll use this class to notify all our observer objects whenever there’s a change in our Subject’s values.

Segment 4

public class SubectChangedEventArgs : EventArgs

    {

        //these values will hold values our observers want to know about

        private readonly int oldvalue;

        private readonly int newvalue;

 

        //constructor that sets old & new values

        public SubectChangedEventArgs(int oldval, int newval)

        {

            oldvalue = oldval;

            newvalue = newval;

        }

 

        //readonly properties to return Subject values

        public int OldValue { get { return oldvalue; } }

        public int NewValue { get { return newvalue; } }

    }

 

Ok, so now that we have a custom EventArgs class, we need to declare the event handler which our observers will mimic to receive subject change events – our delegate:

Segment 5

 

public delegate void SubjectChangedEventHandler(Object sender, SubectChangedEventArgs e);

 

 

The SubjectChangedEvenHandler defines a method signature which all our observers will implement to receive notifications from our subject; two parameters are defined – an object and an instance of our SubjectChangedEventArgs. When declared as a method in one of our observer classes, the object parameter will be a reference to the Subject object the Observer is watching, and changes to its values will be held in our readonly SubjectChangedEventArgs class; code segment 6 lists a typical observer object implementation.

Segment 6

    public class SubjectObserver

    {

        //int to list change in value

        int change;

 

       //subject change even handler to match our delegate and use our custome EventArgs class

        public void SubjectChange(Object sender, SubectChangedEventArgs e)

        {

            change = e.NewValue - e.OldValue;

        }

       

        //constructor that requires a subject to observe

        public SubjectObserver(Subject s)

        {

            //Register our delegate-based method to the subject instance

            //This is how we link our observers to the subject

            s.SubjectChanged += this.SubjectChange;

        }

    }

 

So, the SubjectObserver class has one method that matches our delegate defined to handle any changes in the subject, and we wire up the observer to the subject by linking our delegate-based SubjectChange method to our subject’s ‘SubjectChanged’ event as an event handler. Nice, huh? .Net baked-in goodness. The final piece of our puzzle is the Subject class itself. The Subject class has two responsibilities – to expose an event for changes to its internal value (which we’ll use to hook all our observers to as event handlers), and to ensure it raises this event any time a change to its internal value occurs. Code Segment 7 lists how our Subject class is structured.

Segment 7

public class Subject

    {

        //private int to hold the current subject's value

        private int subjectValue = 0;

 

        //public property to set the subject value,

        //the set method is where we capture the value change and

        //notify all the registered observers of the change

        public int SubjectValue

        {

            get { return subjectValue; }

 

            set

            {

                // new eventargs class to pass the current subjectValue and the new value

                SubjectChangedEventArgs e = new SubjectChangedEventArgs(subjectValue, value);

 

                //update the subjectValue

                subjectValue = value;

 

                //Signal all the observers

                OnSubjectChanged(e);

            }

        }

 

        //declare the event using our SubjectChangedEventHandler delegate

// to handle changes to the subjectValue

        //we'll also use this to attach our list of delegate-based observers to.

        public event SubjectChangedEventHandler SubjectChanged;

 

        //method to trigger our subject change event

        //Note: events can only be triggered from within their respective types,

        // thus we marked the scope as virtual protected to allow the method

        //to be over-ridden while still being able to raise the default event

        virtual protected void OnSubjectChanged(SubjectChangedEventArgs e)

        {

            SubjectChanged(this, e);

        }

    }

 

So there we have it, a public property with its setter calling a protected function to raise its own event to notify all our registered eventhandler observers. Any time the subject changes, the SubjectChanged event gets raised, and all our observers can react to the new value enclosed in our own custom SubjectChangedEventArgs class.

Now, admittedly that seems like a lot of work compared to the traditional ‘I only need two interfaces’ Observer pattern implementation, but the payoff is in the use of the pattern, as shown in Segment 8 which outlines the process of using the classes we detailed previously to gain our .Net Observer pattern sweetness.

Segment 8

    Subject subj = new Subject();

 

    SubjectObserver observer = new SubjectObserver(subj);

    SubjectObserver anotherObserver = new SubjectObserver(subj);

 

    subj.SubjectValue = 33;

 

    //both observer and anotherObserver both update immediately

    int observerValue = observer.Change;

    int anotherObserverValue = anotherObserver.Change;

 

Ok, now seriously, how freakin’ cool is that? No messy ‘I’m an observer, add me to the list of registered observers’ calls, no ‘ok, I’ve changed, let’s loop through the list of registered observers and let them know’ routines, just wicked fast event-based programming. And did I mention the wicked-fast-ness of this .net Observer implementation? Oh yeah.

Again this is a .Net-specific implementation of a widely recognized and utilized design pattern of modern object-oriented programming, the Observer Pattern. Microsoft uses this pattern extensively in their own class structure for the .Net framework – so much so, they’ve come to call it the Event Pattern. 

Oooh, Aaah…

Regardless, if you haven’t had the need to implement a similar pattern in your own coding projects, you probably will run into it sometime in the future, and when you do, you are now armed with the powerful and pervasive .Net Event Pattern.

Price or Differentiation

Thursday, October 15, 2009 by Jasdeep Jaitla
With new businesses and new business models popping up on the Internet like a bag of microwave popcorn, differentiation is far more transitory these days than it once used to be.

Let's take this summary of the 21st Century Corporation from Business Week in August, 28, 2000*, over 9 years ago:

1. Everything gets cheaper faster. The Internet commoditizes every new service or product idea so rapidly by providing the ability to not just compare one or two sources, but 100 or 1,000 sources, that price reduction has accelerated almost out of control.

2. Cutting costs is the answer. With significant downward pressure of margins it is imperative to reduce expenses to maintain profitability.

3. Innovation builds profits. Since you cannot raise prices, and must consistently reduce prices, innovation is required accompanied with rapid expertise development and ingenuity. This advantage is temporary, so innovation must be constant, reflexive and accelerate (rather than coast forward) to address #1 above.

Adaptability

That article was almost a decade ago, and is still relevant, if not even more significant now than it was then. It was published prior to the dot com crash.  Unlike 100 years ago as the Industrial Revolution and the Carnegie's, Rockefellers' and Fords' were taking assembly line production to it's maximum potential, we clearly know it's weaknesses and limitations. One of the most significant limitations is adaptability. Workers specialize so much on their individual task that they cannot readily adapt to other tasks or provide generalization or see the whole picture.

The transition from the assembly line mentality of large deparments and silo style development is a slow one. Integrating departments and collaborating by increasing communication between sales, project managers, creative development, application development, product managers, production and delivery is not as simple as it may sound. Your value chain may involve a very large set of people and keep communication clear requires expertise and training.

New Models for Development

In application software development and internet software development, the models over the last 20 years have evolved considerably. Agile methodologies are gaining traction as a way to create adaptable solutions and modular approaches. This keeps the customer focus as well as the requirements together, and allows flexibility with solution delivery as the landscape changes. Social Media strategy is a fabulous example of this, requirements change so quickly that modular frameworks are developed so that new quick features can be added onto the framework rapidly to meet social change and social needs and Facebook is a fantastic example of this type of structure and development.

Clearly, to stay on top and to consistently provide value, you must value education exponentially, foster creative thinking, be vigilant with the technological landscape, and be able to generate ideas and critical thinking. In Interactive Media Agencies such as Definition6, we constantly strive towards an integrative approach, with all skillsets and all mindsets sharing information and cross-pollinating ideas. We dedicate ourselves to innovation through cross-department research and landscape analysis. Our Innovation Team is specifically dedicated to meeting the demands of the 21st Century business.

"Twenty-First Century Corporation," Business Week, August 28, 2000, p. 278.

Innovation and Cost Drivers

Wednesday, October 14, 2009 by Jasdeep Jaitla
Intuition can guide you to the place of innovation, and analysis guides you to the method of innovation.

Driving down costs is the goal of every business in every industry. Identifying and nailing down Cost Drivers in a Interactive Media Agency is one of the most challenging aspects of Innovation due to the service model and diversity of projects. The more diverse the services and the more capabilities an organization has, the harder the cost drivers are to innovate. This is the challenge.

Create Measurability

In order to analyze data, you need to collect data. The first step is to establish a normalized set of information, and discover commonalities that you measure over time. It's difficult in service business models to identify measurable practices since commonality between projects may not exist. In contrast, it is much easier to find measurable actvities within consistent services. For example, in the realm of public service such as law enforcement, response times can be measured which can lead to innovation in terms of communication technologies, route mapping, and routine patrolling route generation to optimize the response times and measure improvements. In the same light, commonality and metrics need to be put in place so that you can innovate. Without this baseline set of metrics, most improvements are subjective and can be hit and miss.

Measurability and Interactive Marketing

Interactive marketing strategies and improved search engine optimization follow the same metaphorical principle. Because optimization is always a moving target, you have to establish a control on your marketing practices and only change a few independent variables at a time, such as keyword density, or keyword targeting in ads, in order to see their effect. In the case of organic search results, the effect of changes may take weeks or even months before they actually show results. To top it off, search algorithms and prioritization change "without notice." To discover these changes requires a scientific mindset for the search engine optimization consultants.

The cost drivers in Search Engine Marketing involve keyword market prices. Camping a commonly used keyword for PPC can cost you a fortune. Using longtail strategies and finding ways to effectively identify your product, service or company is the innovation point, and only good analysis and keyword research will get you there. Consistency is the rule of the game to establish and maintain hold of brand loyalty, market share, market segment, and also online in terms of keyword ownership, and search engine rankings.

Internet Application Development

With Internet Services, the identification of cost drivers needs to be built into the process by abstracting out parts of the process that show commonality and measurability. This should be the starting gate through which your innovation charges. Like online marketing, application development is a moving target. New technologies explode onto the marketplace on a regular basis, tempting you to change how you do business. Again by using a scientific approach, by controlling your process and making sure you change a few things at a time, you can drive changes from the right point of view rather than hype, and effectively make improvements on your cost drivers.

Visualizing Innovation

E-Commerce for Hispanics: Right and Wrong

Wednesday, August 12, 2009 by Lance King
I read an article on MediaPost that showed how 2 major retailers, The Home Depot and Best Buy, targeted the U.S. Hispanic community.  One company failed while the other is gaining more sales.  What is interesting to me is that it appears that they both took the same approach, got back the same unexpected results, and then went in two different directions.

Both companies created a "U.S. Spanish" website.  Their target was U.S. Spanish speaking consumers.  What they discovered was that they were getting a lot of non-U.S. Spanish speaking visitors to their websites.  These visitors wanted to buy online just like U.S. consumers.  In many cases, the non-U.S. consumers were either visiting relatives or friends in the U.S. or were Mexicans crossing the border to shop.  The prices in the U.S. were cheaper than in their country and so they wanted to get their items in the U.S. and then bring them back home.  So what is the problem with that?

For Home Depot, the problem is that they did not take the foreign credit cards on the U.S. Spanish site.  Best Buy on the other hand embraced the additional and unexpected consumers and did allow the foreign credit cards.  Best Buy is finding that, even though they don't ship overseas, people will order online and ship to friends or family where they will pick up the items later.  They also have found that U.S. Hispanics are using the website to print out information before they go to the stores to purchase the items.  In many cases it is easier for them to understand the information in Spanish.

One of the more interesting sides to this story is that The Home Depot has stores in Mexico, they have a Mexican website (in Spanish, of course), they have an English Canadian website and they have a French Canadian website.  So they are marketing to everone across North America except the the growing number of Spanish speaking Hispanics in the U.S. and those Spanish speaking visitors who wish to purchase in the U.S.

Not knowing the full details of the costs involved, it would be interesting to see the cost for Home Depot to maintain the U.S. Spanish site and the revenue the site could bring in (if they allowed foreign credit cards) and the revenue brought in by those in the U.S. who used the site to gain more information about products they wanted.  It seems to me that 4 months of running the U.S. Spanish site is not enough time to determine its impact and that if Best Buy can make it work for them, The Home Depot should be able to make it work, too.  Besides, if a French Canadian site can work for Canada, why can't a Spanish U.S. site work here?  I wonder if Home Depot is looking for a way to recreate the U.S. Spanish site in a way that will embrace those consumers that liked having the site available.

Are you looking to build a website to market your products or services to the fast growing U.S. Hispanic community?  Definition 6 is an Atlanta interactive marketing agency that can help you.  Besides doing website development and web application development, we can manage your Search Engine Optimization, your Search Engine Marketing and your email marketing campaigns while providing web analytics that ties everything together.  As we gather more and more valuable information about your consumers, we can tweak all methods of marketing to maximize your dollars.  Contact us and let's get a plan in place for you.

Making transactions memorable, in a good way

Wednesday, August 5, 2009 by Lynn Moss

In a recent Sales Caffeine email newsletter from Jeffrey Gitomer, there is an article by Michelle Joyce on Making Transactions Memorable.  She had a pleasant experience at the McDonald’s drive thru in Huntersville, North Carolina, and summarized what made the transaction memorable.
 
These three simple steps can be considered website redesign tips to improve user experience at your eCommerce websites and in all your interactive marketing efforts.

1.  Start with a smile and engage your prospect in a friendly manner.  Would you do business with someone you didn’t like?  Well, neither would your prospect.  This guy made me like him – immediately.  When he made that connection, the transaction became enjoyable and personal.  It was all about me, not just my order. 

2.  Offer alternative solutions.  People want choices.   Don't assume that your customer is aware of them.  Uncover their needs and help them make a choice.  McDonald's already mastered the upsell technique with their famous line, “Do you want fries with that?”  What kind of additional features and services can you upsell?  What kind of additional revenue are you leaving on the table at every sale?

3.  End the transaction with something memorable.  When is the last time that a fast food worker told you to “drive safely”?  Usually, it is the perfunctory "thank you” and “have a nice day”; but this guy made me feel like he was genuinely concerned about my personal safety.  What are you saying to your customers that make them remember you personally?

Michelle ends by saying:  The reality is that people are still buying products and services in this economy.  The only question is "Will they buy them from you?"

Definition 6 is an interactive marketing agency that can help you make a connection to your users, whether customers or prospective ones.  We are experts in website development and custom application development.  Even though we are an Atlanta Ad Agency, we have clients across the US that we help differentiate themselves from their competition.


TwitterINGO: When a Social Media Game Provides Real Value

Monday, August 3, 2009 by Paul Hernacki
Twitteringo Game Board

Last week Interactive Marketing Agency Definition 6 launched TwitterINGO, an online game of sorts that leverages Twitter. I won’t go into all the details of how it works in this post, but essentially it’s a free downloadable desktop widget you run in the background while working (or at least trying to work… the game is a bit addictive to watch) as the game is played each Tuesday at 3PM EST. The tweets of all the people you follow stream down the left hand side while you get a 5x5 game board of keywords. When someone you follow posts a tweet containing a term you have on your board the square will highlight and fill in with that person’s tweet.

I am a bit biased of course in thinking the game is cool, I helped create TwitterINGO. The idea came from watching multiple columns of twitstreams in Tweetdeck and thinking how it almost felt like modern-day BINGO card. After a couple of brainstorming sessions we arrived at the current design. It has several premises.

1.       If you use Twitter to really, effectively follow the pulse of news and information that you care about you typically have to follow a fairly large number of people (typically at least in the hundreds and often in excess of that) and learn how to organize those people into groups in addition to creating effective searches for subjects.

2.       Finding the right people to follow who discuss the subjects of interest to you beyond your immediate circle of friends and colleagues takes some time and can be a bit of an art form as you sort through the clutter

3.       One of the real powers of social media is in how we help each other to find great people, pearls of wisdom, diamonds in the rough, etc.

4.       It can be really hard to identify the holes in your Following (you often don’t realize that you aren’t following certain subjects that interest you as well as you could be).

With this in mind we created TwitterINGO. With over 100 keywords “baked in” to the cards (all of them relating to popular and highly relevant subjects in the areas of interactive marketing, technology, media and advertising, application development, and social media), plus 20 current “terms of the week” on trending subjects sent out at the beginning of each weekly game, your card populates with a randomized selection of 24 of those terms, the middle square is free of course. Then you can simply sit back, have some fun and see what happens.

If you follow only a handful of people you will invariably become quickly disappointed as you realize none or few of your squares are populating. This can be a quick hint that you aren’t yet following the global conversations on tech and interactive or current events very well. On the other hand, if you follow a few hundred people who do talk about these subjects you’ll likely have a very different experience. I found myself fascinated watching my squares fill in (and unfortunately being less productive than I should be). It was amazing to see who I follow that randomly starting giving me the keywords I needed as I sought to get a row, column or diagonal completed to win. Every 5-10 minutes I’d get a square. First I got my “SharePoint” square filled by SharePoint Samurai @Gannotti. Then my “Brand” square filled by a post from @TobyDiva. Then Sun Microsystem’s Social Media guru @Sumaya posted a tweet with the term “open source”. I was off to a great start and saw another 4-5 squares fill in. And I came close to winning. But as I looked at what terms I needed to win (without cheating), I stared at the empty square with the word “Linux” in it. Why was nobody that I follow mentioning the word Linux? Hmmmm… there it was. A hole in how and who I Follow. I realized that I follow a lot of people on a lot of subjects but perhaps only a few that talk about Linux. To quickly rectify this I searched on the term Linux on Twitter and looked to see who the major contributors were and began following them. It was too late for me to win TwitterINGO this week, but it helped me do a better job of following that rather important part of the global technology conversation. The same can be said of many other terms I saw on my card that sat empty, I set out to see who was talking about the terms and found some really great people to start following.

While the game itself was rather fun, the real value was in seeing how it could help me. Plus I could then go look at the Leaderboard to see who the major Tweet Contributors were and who won and who they are following. The game is helping me to be a better user of social media to benefit my professional and personal interests and awareness. And I found a few extremely interesting people who played the game and won, people I’d never met before but that I certainly follow now. That's a game worth playing.

Believe The Hype: Open Source Web CMS

Friday, July 10, 2009 by Mike Reese
If you were involved in a CMS (or WCM - Web Content Management) purchase decision 5 years ago, you likely heard about the "open source" phenomenon. And, you probably cringed at the thought of supporting your revenue-producing, lead-generation website with low cost alternative to the Interwoven and Vignette giants. Cringe no more, open source solutions not only provide very similar features, the good ones are now fully supported as well.

Here's a recent article written by JT Smith on Website Magazine. (Choosing An Open Source Web Content Management System) He successfully details the differences between closed and open source systems (without bashing the Big Guys). Ultimately, every company has their own decision to make, their own contstraints, processes and budget concerns. A WCMS solution has to adhere to these points, so open source may not be for everyone. But it's certainly worth taking a look at some of JT's points:

As your business grows, your needs will change. The open source model provides a mechanism for adapting to that change without relying on proprietary software to catch up to evolving trends and new technologies.

Budget...Budget. If budget is a concern, and likely it is these days, open source makes sense. Period. Save the budget for your other interactive marketing strategies.

Fully supported. Lack of support used to be a pitfall of open source solutions. That has changed. You'll find that well established, reputable solutions offer not only support, but also a vast community of developers and end users.

Somewhere in between. Open source CMS does not necesitate custom application development. Nor does it necesitate costly professional services contracts. It really falls in the middle. The benefit of open source becomes the ability to lean in either direction.

I love JT's quote: "Using closed source CMS can be likened to buying a new car with the hood welded shut, the wheels permanently attached, and your only maintenance option is a visit to the dealership."

Give open source a look. At Definition 6, we utilize one of the "good ones", Umbraco. We've been through several (> 20), successful implementations for a variety of clients. Including websites in the travel, telecommunications and online retail industries. I'm proud to say that we're also the first certified solutions developer in North America.


Combine Social Media with Traditional Tactics: Real Campaign Example

Thursday, July 9, 2009 by Cecilia Barella

As social media channels become more and more powerful they also seem to become more and more varied, it feels like every day we learn about a new cool tool, as an interactive marketer, it can be challenging to figure out which one is the best fit for which marketing strategy. I read an article in Marketing Sherpa on how to use social media in a more effective way. The article gives specific examples from IBM on how they have combined social media strategy with traditional tactics for application development, event promotion and demand generation. I have highlighted here one of them, where social media was used to promote SOA’s events and tools. 

Social Media Marketing for Event Promotion and Lead Generation

IBM wanted to bring together the SOA community and generate leads for its SOA tools and solutions. So the Marketing team organized a road show that included 100 cities. To complement the traditional marketing methods of promotion for the event which included direct mail and one-to-one invitations, IBM used an animated 3D person on the SOA website, a Twitter campaign, blogs and a widget.

- 3D Animated Character

The animated 3D character was added to the SOA website, it walked with an invitation in its’ hand, when users clicked on the character or on the invitation they were taken to a registration page. Visits to the registration page increased by 600%.

- Twitter

Messages were sent on Twitter with a promo code, users that signed up with that promo code were allowed to talk directly with one of IBM’s CTO for 30minutes. Within 3 days, over 40 people registered in Amsterdam alone.

- Blogs

The marketing team blogged about the conference on multiple development oriented blogs. The buzz created around the event caused many developers to mention the conference in their own blogs, feeds, profiles… Customers even created Facebook and LinkedIn groups supporting the event. The buzz caused by the social media ‘add-ons’ increased their event registration by 10% at no cost to the company.

- Online Community

For connecting customers after the event the team used a third-party company to build an online community website called SOAsocial. They let the third-party host the community as the goal was to make it less company/IBM focused and let it grow on its own.

- Consumer generated content

They encouraged customers to take pictures at the events and post them on Flickr afterwards. This not only increased engagement through user-generated content, but it also helped the company save thousands of dollars on hiring a photographer.

- Widget

Since the attendees of the events were potential customers for the SOA tools. The marketing team built a widget that supplied the events’ presentations. The widget could be added to a blog, website or downloaded to a computer. The widget was driven by RSS feeds, so the company could push news and products demos to potential and existing customers. 67% of the conferences’ attendees downloaded the widget.

One of the “key lesson learned” for Interactive Ad Agencies is that social media is a channel and not a strategy in itself, it is most effective when used to complement other marketing initiatives, including offline and traditional marketing.

Auto-Generated Emails Need Love Too

Friday, June 12, 2009 by Mike Reese
As an interactive marketing agency, we deal in both the email marketing and the application development arena. Most of the time these two items go hand-in-hand. A company builds or enhances their website while marketing that website through emails, offering special deals, newsletters, subscription services and a variety of other services and products to its users. The combination of these can show impactfull and bottom-line results. But what often gets lost is auto-generated emails from the website or application. Marketing departments tend to create silos of activities, there's email marketing, and then there's website creation and management. Time and money is spent on creating an effective email marketing program that supports online activities. Auto-generated email should fall into this category as well.

There are various reasons this important form of communication get overlooked, but why are they important in the first place:

Branding - Any email generated from your domain represents your brand. Guess what, users aren't always left with an impression of your brand based on their website visit, they're often left with a confirmation, newsletter or subscription email based on their website activities. Why let that confirmation email negatively impact how you're perceived? It's just as important as that promotion email you're gearing up to send them next week.

Call-to-action - Auto-generated emails are often utilized to seek verification or ask users to continue the process started at the website.

Communication - If a user feels strongly enough about your website or your company in general, they're going to seek more information and allow you to keep in touch with them through automated emails. Keep them enganged and thinking about your products or services.

So where do most companies fall short? The biggest thing that we see is that auto-generated emails simply are not given much thought during the website enhancement or build process. As an afterthought, it will never be an adequate means of communication or engagment with your customers. Spend some time with the design. You spent time reviewing comps and making adjustments for various ESP's for standard email marketing initiatives, do the same for your auto-generated emails. ExactTarget provides a great reference for do's and don'ts conerning email marketing. Spend some time and follow as many best practices as possible. Make your calls-to-action precise and easy to comprehend (even 2 months later). Represent your brand, make sure your emails maintain company branding standards.

People tend to hold onto emails. Why not? Storage capacity is longer an issue at most ESP or client programs. If they're going to hold onto something that represents your business, make it worthwhile for them when they open it again 2 months later. It is still a representation or your company and they can still act on something you wanted them to previously. Don't be afraid to give auto-generated emails some love.

Why target Hispanics with mobile ads?

Tuesday, May 5, 2009 by Lance King
Here is an article I found about targeting Hispanics with mobile ads and apps.  Why you should target them specifically?  Well, it turns out that many younger generation Hispanics in the US will get their first internet experience on their cell phone, not on a computer.  And some recent surveys have shown that Hispanics are more likely to view mobile advertisements and respond to them than other groups.  One company mentioned in the article is targeting Hispanics by offering English training on their cell phones in exchange for them watching a short 2 - 3 second advertisement.  With the responses offered up by Hispanics, it can become quite easy to figure out what different demographics are doing and what they respond best to.  Given that Hispanics will be in a better spending position once the recession settles, it seems like a great opportunity now to start planning your mobile campaigns that are directed toward Hispanics.

Definition 6 is an Interactive Marketing company in Atlanta that can help you with your mobile marketing strategies and help you tie them in with application development consulting, web 2.0 applications, email marketing and search engine optimization.  Contact us and let us help you market to this growing community of consumers.

Hispanics beat out the deleveraged consumer

Friday, April 24, 2009 by Lance King

Lately I've been reading articles related to the Hispanic consumers.  I think most of us have read or heard about how the Hispanic population is growing so much in the U.S.  It seems to me companies that have products or services to sell should be paying more attention to this and shifting some (or a lot) of their marketing efforts toward the Hispanic consumer.

In an article on MediaPost by Jose Villa (http://www.mediapost.com/publications/index.cfm?fa=Articles.showArticle&art_aid=98883#comments), he talks about a very good reason to shift some focus to the Hispanic community.  Put plainly, they may be in better shape after the recession than any other ethnic sector.  In his article, he points out that unlike the previous recession, most consumers will not be able to go back to their old spending habits because they won't be able to get the same credit that they received before.  And we all know how our society loved to spend money on credit.  In the article, this is referred to as the "deleveraged consumer".  The Hispanic community, on the other hand, typically stayed away from spending on credit.  So when the economy recovers, they'll be more likely to continue their same spending habits they had before the recession while others will have to learn to cut back on their excessive spending.  Their lack of debt means that "the Hispanic market represents a beacon of opportunity as a truly deleveraged consumer" according to Jose.

I really like the idea of spending some marketing focus on the Hispanic community because I think there are a lot of potential buyers in that group that are untapped.  The three top ideas I can think of would be:

1. update your websites to offer a spanish version.  Although many of today's Hispanics that are online speak both English and Spanish, it is a welcoming gesture to let them choose their language of choice.  But don't forget to update imagery and styles of the Spanish website and not just the text (Jose has another article that addresses that: http://www.mediapost.com/publications/index.cfm?fa=Articles.showArticle&art_aid=103345)

2. allow your users to decide which language to receive their emails in.  You'll want to be sure you have proper tracking tools in place so that you can see how well your Spanish emails work and compare that to your English emails.

3. advertise in places where Hispanics spend more of their time.  In a previous blog post I discuss what some of those websites are.

Definition 6 is an interactive marketing agency that can help you analyze and plan a course of action to market to this untapped group.  As an application development company and online marketing company we can also implement your web applications and email marketing campaigns as well as provide analytics of both.  So take advantage now and don't leave out this important ethnic group.


Process Driven Integration in Application Software Development

Sunday, November 16, 2008 by Gary Braswell

Frequently, in larger-scale Custom Application Development, a good architectural approach is to model the processes for the application using Business Process Modeling (BPEL). and Business Process Execution Lanaguage (BPEL).

BPEL actually stands for BPEL4WS (BPEL for Web Services)

Other Business Process technology includes:
Workflow&Rules Engines
* Business Rules can dictate flow of control
* Long running transactions - where completion can take days or weeks (think telephone company)

Business Activity Monitoring (BAM)
* Alerts and information for management dashboards
* Allows management by exception
* Frequently integrated with portals and BPM
* Still in the Early adoption stages

Collaboration Software
* Examples: Groupware Portals, Web 2.0 collaboration, B2B exchanges
MS Project (Enterprise) & PM Tools

There are also:
Process Driven Integration (PDI) Best Practices
* Make an organizational commitment to continuous process improvement
* It is a discipline and a journey, and the highest rewards require the highest investment.
* Measure Process Performance.
* Time / Cost, Profitability, Customer Satisfaction.
* Reward Process Improvement.
* Provide Real-time Dashboards
* Promote Reuse

Twitter Beats Facebook

Monday, October 20, 2008 by Michael Kogon

Gary Braswell, a Definition 6 Senior Architect, reported on an article he recently read on Clint Boulton's Google Watch blog...

Users are trending from Facebook to Twitter and this opens up an opportunity for Google Services.

Gary focused on a few eye opening points from the article:

1. If users are trending towards Twitter from Facebook/MySpace, this is a bad omen for social advertising.
2. Upcoming solutions may be best served by taking advantage of Google's OpenSocial Services.
3. If a killer app could be built using the Google services, it could very well be stickier than any social networking site in existence today.

Gary's closing thoughts were that as an interactive media agency we need to keep tracking industry trends in social media because users are incredibly fickle in this area.  The application development community for Social Media and Social Networking technologies is in a state of perpetual innovation which must be tracked efficiently to maximize the business return.  The full article can be viewed at: http://googlewatch.eweek.com/content/social_networks/can_google_capitalize_on_facebooks_fade.html

Interactive is the key

Tuesday, October 7, 2008 by Chris Thornton

I've been in the online marketing space for almost a decade now.  I still remember the days of of brochure-ware and when the website was just an afterthought.  Today, the web has become the hub for most marketing efforts.  In the world of online marketing and website development, one area that marketers still fall short is embracing the real power of interactive...the constant exchange of value for action taken by the end user.  This ebb and flow of reward for activity is where the real power of interactive marketing lies.

As an interactive media agency, it becomes critical to not only understand where the target is and how to find them, but to understand the context in which the message will be delivered.  Only then can a real value exchange be created where the user is reward for taking the desired actions.   Search Engine Optimization solutions are the simplest example of this...creating targeted landing pages designed to be more relevant to the end user based on the specific search made.  Web Application Development also needs to take this into consideration...when asking a user to fill out a form of personal, specific information, that user should get a result that is personal and relevant to them.  Each exchange of information should reward the user and open up the possibility of taking another action with even more reward.

 
The Business Blogging Platform Powered by Compendium  |  Sitemap