Thursday, March 08, 2012

SDL Innovate - what a blast!

This year's SDL Innovate conference was certainly one of the highlights of my career with SDL. What a great event we had (leave a comment if you agree!) with many interesting sessions, partner demos, guest speakers, and more importantly, good networking.

As promised in my previous post, here's a run-through of my short session on Tuesday afternoon about Targeting and your content.

The topic of the session I was involved in was "SDL Tridion Roadmap and Community Panel", with our VP of Products Ian Truscott getting us started by sharing the release plan for 2012, with the highlights being a new Tridion user interface (previously known as SiteEdit) for content editors, Enterprise Content Libraries for external systems integration and a new Tridion release towards the end of the year - more on these topics at a later date sometime soon.

While we were preparing for this session, me & Frank decided that rather than discuss what's coming up in products we should talk about what our current products already do but not all customers are doing:
  • Social
  • Targeting
  • Mobile
Here's what I had to say about Targeting.

We've been targeting (and targeted) for a long time
Ever since humans started trading, targeting has been done by everyone. From the butcher that tries to sell you his "best" meats, to the baker, there has always been an element of targeting, so it is certainly not a surprise that we do it on the web.

Targeting is always about getting something from you
We are always trying to sell something - content you're interested in (increase my views!), a visit to the closest store, a product, a return visit to the site. The objective of targeting is always to convince you of something you may be interested in.

There's many ways to target visitors
Almost everything on the web today involves targeting of some sort. We can always think about good old Amazon.com as the grandfather of targeting, and one of the things about Amazon is that they don't even try to be subtle about it - You bought this before, so you're likely to want this now.

Other sites also target you, but in subtler ways - LinkedIn regularly shows me job ads for jobs with the same Job Title I currently have, and google will show you a map in the search results page if you search for "walmart" or "starbucks" - all of that is targeting.

So, let's take a tour of how Targeting evolved in the past 10 years
10 years ago we could already target visitors (yes, Tridion had it!) based on 2 types of information we could retrieve from you:
  • Data you would tells about you on a registration form (Explicit)
  • Your click behavior browsing our site (Implicit)
We could do quite a lot of targeting based on this data, but the only data source we had for this behavior was our own website.

Fast forward 5 years to 2007
By 2007 most enterprises had finally sorted out their back end integrations, and we could start merging information from your "real" life and your virtual life. I suddenly knew that you were now at my site, and just had bought 5 cans of beer on one of our supermarkets this afternoon, and that perhaps you were trying to get some more delivered (long live loyalty cards!).

So now my data sources about a visitor were certainly growing - but still mostly confined to my own space.

Targeting in 2012
Now we have SO much information about visitors that the challenge becomes a "data management" challenge rather than an operational one. We (can) have access to so much data - your twitter streams, your facebook profile (and your friends'), your LinkedIn profile, your stack overflow, your blog, and this coupled with Social Intelligence tools can give us such a fine grained view of who you are, where you live, which products you like (and dislike) that the visitor becomes its own marketing segment.

What does it mean to content?
The biggest challenge for content creation teams is that with targeting comes content explosion. We have to start having a LOT more content than we ever did before if we want to cater to all possible variations of a user's preferences, history, Twitter opinions, frequent flier program, job title, etc, and a strong usage of taxonomy for your content is definitely recommended.

Key take away points:
  • More data than ever before about your visitors - and this will only increase
  • Customers want targeting. They want you to know who they are
  • Your content model must evolve from being page-centric to being customer-centric
  • Tools help execute - but cannot define your strategy

Monday, March 05, 2012

More targeting

Wow, this has been a great event so far - and we're not even half way through it.

The message seems to be clear - be relevant, be relevant, be relevant.

My session tomorrow is 100% about targeting. I have made a promise (mostly to myself, definitely not to our Sales team) to not mention a single product name, since I want to focus on the impact on your organization for content targeting instead of what product X does better than Y, and it seems that in every session so far content relevancy has been high up in the list of questions and topics.

Tahzoo's Brad Heidemann, during his presentation of how KeyBank is implementing Targeting for the 21st century, redirected some of the questions towards "my" session tomorrow so I can definitely start feeling the pressure.

[edits some slides]

Time to go back to the floor and listen to some more of the great stuff coming out of SDL Innovate - be sure to follow #sdlinnovate for the latest updates.

Sunday, March 04, 2012

Targeting

This week I'm at SDL Innovate as part of the WCM Roadmap session with fellow Tridionauts Julian Wraith, Ian Truscott, Frank van Puffelen and Tridion MVP Chris Summers, and will be talking about how Targeting and providing relevant content to your visitors is not a scary task anymore - as long as you know what you're doing, and can cope with the impact on how you develop content.

More importantly, I will be trying to drive the message that targeting your audience is not something that relies only on technology, and that simply by the fact of using a CMS like Tridion you already have the ability to make your content relevant to your visitors - as long as you have a strategy.


Stay tuned, I'll post my presentation and notes here after delivering it on Tuesday afternoon.


Saturday, February 11, 2012

SweetEdit

I've spent the last week in SDL's office in Amsterdam with some of the Tridion masters (including Alvin Reyes and Mihai Cadariu) for some knowledge transfer from R&D regarding our soon-to-be-launched re-vamped, re-thought, re-designed and re-super-improved SiteEdit 2012.

As typically happens in this type of Knowledge Transfer, the information flow always goes both ways - we learn from R&D on what the tool is expected to do while showing back to R&D how we expect it to behave under the blueprint abuse that we constantly put Tridion through.

And while it was clear that the tool is still in development (a couple of buttons were not enabled yet on the build we used) it was also clear that what is in place really works amazingly well.

I really don't even know where to start when it comes to SiteEdit, there's just so much being added and/or modified that it's hard to start.

So I'll start with the simple improvements I've seen.
  1. Defining Page Types (a prototype from which you can create a new page) is as simple as checking a box on _any_ existing page.
  2. Adding an image to Tridion's "content library" is as simple as dragging & dropping it into your existing library
  3. SessionPreview architecture shows changes to pages dynamically without the need to republish the page or any of component presentations (and avoiding any publishing queue bottleneck).
  4. The whole wording of this interface is much user-friendlier than Tridion's language in general, which tends to be very technical - Content instead of Components, "Edit everywhere" instead of "Edit parent"
  5. Ability to associate component templates with page templates - so that users will only see the options that make sense to use in any given page - and present these to the user as "Content Types"
Well, there's just so much! So, why don't I shut up and let some pictures speak a few thousand words?

Editing a "shared" component:
Selecting a page type for a new page:
 Editing Content:
Selecting an image from the library:

Absolutely amazing and surprisingly stable and fast. Can't wait for it to come out.


Monday, January 30, 2012

The content blues

Editors are very hard to keep happy. From where I stand, most of my direct interaction points with our customers are usually System Administrators, Architects and/or Developers.

These people are "easy" to satisfy when you're dealing with a system with so many Enterprise features and extension points as SDL Tridion. The questions or scenarios I get asked to expand on will typically boil down to either something that Tridion does already, or something that we can extend Tridion to do.

I have however found the hardest Tridion user of all. The content editor. And that person, my friends, is none other than myself.

Since August last year I started publishing (with Bart Koopman's help) a weekly review of all activities that are in anyway Tridion-Community-related. The schema for this content, as you may expect if you look into it, is rather simple and made up of a few RTF fields alternated with some (limited) taxonomy and multimedia links to the images displayed.

So far nothing abnormal. Content creation is relatively painless, since I have my RTF and I put in it whatever I want.

The problem is when I start thinking about what to do now that I beat my own expectations and this weekly review is becoming an actual important starting point of every week, and there's quite a lot of data in it begging to be mined. To start with, I will need to start archiving this data in an easy to browse archive. Having all content together will eventually become unwieldy (some may argue it's already the case).

The 2nd problem is my own demands on my own data. I want, for instance, to rapidly know which week was the busiest week (week with the highest number of links to blogposts/content). Well, I can't, because I'm using RTF.

I also wanted to do a "Top 10" for the great people in the community that contribute so much every week. Again - almost impossible to do other than counting manually, since the content is in RTF.

Next, I may want to dig into all posts that relate to Event System. Or Deployer Extensions. Or Storage Extensions. Or WCF. You catch my drift, right?

What's the solution?

The solution is in making the Editor's life a living hell. Instead of the ~15 minutes it takes me now to create a weekly review (mostly it's Bart), it will probably turn into an hour long exercise at least. Every entry mentioned in there should actually be its own component, and this component should be classified by Author, Publish/Creation Date, Topic(s), Source. I would normally have no problems presenting to my customer the fact that if you want your content to be rich, YOU need to enrich it.

But it hurts when the customer is me...

Thursday, January 12, 2012

It's the little things: Creating a page breadcrumb in Tridion

Your mileage may vary, but in most cases (> 90%) pages published from Tridion will include a breadcrumb that is linked to the page's location in the site (i.e., Structure Groups).

Typically I see this breadcrumb being generated in the front-end from the Sitemap, which is not a very expensive operation but still a very silly approach. If an editor creates a page in a given Structure Group and publishes it, we already know the page's location at publish time, so why would we waste some CPU cycles on the front-end determining this?

Since I had to write this Building Block just now I thought I could share it with you.

using System.Text.RegularExpressions;
using System.Xml;
using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;

namespace TridionTemplates
{
    public class GetPageBreadcrumb : ITemplate
    {
        private const string _separator = " » ";
        private const string RegexPattern = @"^[\d]* ";
        private const string indexPagePattern = "index";
        private readonly Regex _regex = new Regex(RegexPattern, RegexOptions.None);

        public void Transform(Engine engine, Package package)
        {
            TemplatingLogger log = TemplatingLogger.GetLogger(GetType());
            if (package.GetByName(Package.PageName) == null)
            {
                log.Info("Do not use this template building block in Component Templates");
                return;
            }

            Page page = (Page)engine.GetObject(package.GetByName(Package.PageName));

            string output = StripNumbersFromTitle(page.OrganizationalItem.Title);
            foreach (OrganizationalItem parent in page.OrganizationalItem.GetAncestors())
            {
                output = GetLinkToSgIndexPage((StructureGroup)parent, engine.GetSession()) + _separator + output;
            }

            package.PushItem("breadcrumb", package.CreateStringItem(ContentType.Html, output));
        }

        private string StripNumbersFromTitle(string title)
        {
            return Regex.Replace(title, RegexPattern, string.Empty);
        }

        private string GetLinkToSgIndexPage(StructureGroup sg, Session session)
        {
            OrganizationalItemItemsFilter filter = new OrganizationalItemItemsFilter(session);
            filter.ItemTypes = new[] { ItemType.Page };
            string title = StripNumbersFromTitle(sg.Title);
            string pageLinkFormat = "<a tridion:href=\"{0}\">{1}</a>";
            string result = null;
            foreach (XmlElement page in sg.GetListItems(filter).ChildNodes)
            {
                if (page.Attributes["Title"].Value.ToLower().Contains(indexPagePattern))
                {
                    result = string.Format(pageLinkFormat, page.Attributes["ID"].Value, title);
                    break;
                }
            }
            if (string.IsNullOrEmpty(result))
            {
                result = title;
            }
            return result;
        }
    }
}

Yes, it does quite a lot more than just create a breadcrumb, I'll leave it up to you figure that out :)

PS - I am using OrganizationalItem.GetAncestors() in this code, which means it will only work with SDL Tridion 2011 SP1.

Thursday, November 03, 2011

Pimping out the Tridion 2011 Service Pack 1

We're getting ready to launch Service Pack 1 in the coming weeks, so I thought it would be a good time to start pimping it out.

What's new with Service Pack 1
New & improved installer (with flashy images while installing :))
User Generated Content (aka Community Builder) is integrated into the platform
Translation Manager is also integrated into the platform, and now includes support for both World Server and Translation Management System

Content Manager Changes
Grouping of items in CM calls - You can now read multiple items from the database with a single TOM.NET or CoreService call, instead of having to retrieve them individually.
Description fields are now included in GetItems and GetListItems calls, not requiring you to load the full objects before reading this property.
New "Ancestors" calls: You can get the whole hierarchy of "parent" items with one simple call: GetAncestors or GetListAncestors


Content Delivery Changes
The Content Delivery layout is much simplified, so you don't have to pick-and-mix files from here and there. Instead there are 7 roles for Content Delivery that are pre-defined for you:
  • API
  • Cache Channel Service
  • Content Deployer
  • Monitoring
  • User Generated Content
  • HTTP Upload
  • Content Delivery Web Service
Just add water, and your soup is ready. Speaking of Content Delivery Web Service, there is also a native .NET oData Web Service that runs on top of IIS in this release.

There are a gazillion little changes more though, like showing breadcrumbs on items in Tridion, consistency of RTF behaviors across browsers, and quite a few fixes to other issues that have been fixed before.

Interested in knowing more? Check it out here.

Tuesday, November 01, 2011

SmartTargeting

Since the acquisition of Fredhopper and the launch of SmartTarget, I have been taking a keen interest on the development of the product, as I've always liked the concepts behind Fredhopper.

This puts me in a rather interesting position, as I have to interact very often with the technical teams when we discuss SmartTarget implementations, at any of the different stages - Pre-Sales, Proof of Concept or actual implementation.

And one thing that always strikes me as odd, is that technical teams just don't get it. Ask any developer about SmartTarget's targeting abilities and he will say "I could do it better". Without realizing that this is exactly why SmartTarget is so valuable to a marketing department: they don't need you to do it better.

Another thing that technical teams always ask for is the "generic", "magic button", "configuration based" personalize this page switch. Why would you want generic personalization? Actually, how can you do generic personalization? That's a contradiction in terms.

So, here's some examples of what you can do, out-of-the-box (meaning no custom code), with SDL SmartTarget:

  • Show a specific promotion if visitor comes from google.com and searched for term "holidays"
  • Show a specific promotion if day of the week is tuesday
  • Show a specific promotion if geo-location says you're coming from New York
  • Show a specific promotion if your profile says you have kids
  • Show a specific promotion if you're browsing the site with an iPad
  • Show a specific promotion if you're coming from "our-affiliate-site.com"

All of these are really easy to do with custom code too, any run-of-the-mill developer can do this.

What is really hard to do is:
  • Show a specific promotion if ALL OF THE ABOVE are true.
and
  • Let me change that 1st condition to be if visitor comes from Google OR Bing and the 3rd condition to be anywhere in the US except California
Which you can with out-of-the-box triggers provided in SmartTarget.

The possibility to target a specific individual is priceless in today's world, and Personalization is not about targeting "Large groups of individuals". We could do that in the past rather "easily" with Tridion Target Groups already.

And, of course, you can also use Predictive Targeting (or Personal Recommendations as our Fredhopper colleagues name it) to go that one step further and recommend a product based on YOUR visitors' past behaviors.

One of my latest stints discussing SmartTarget with a prospect was particularly enlightening in this respect. After being flooded with quite a few technical questions and remarks on how the system should automagically personalize everything, someone who had been quiet throughout most of the session asked:
"So, with this system I can tell it to show my promotions to <product X> only if it is Monday morning, the visitor has not purchased it before, the visitor has purchased a competing product in the same category, I have too much of <product X> in stock, push it to a live system, and change my mind 3 times about which promotion to show without ever asking IT for help?"

Yes, you can. Interesting times ahead of us.

Wednesday, October 19, 2011

You think you got what it takes?

My evolution in Tridion knowledge is a repeating (and repeatable) pattern:
  1. Looks cool, and pretty easy
  2. God what the hell is that?
  3. I hate you Tridion
  4. Why on earth is it working now?
  5. Hmm. That actually makes perfect sense
  6. WOW, look at all the shiny stuff I can do. Seriously, this is sooo coool!
Enjoy the glory for a few months, go back to square one.
    • It was like this with Infrastructure knowledge and deployer configuration and broker xml files and Tomcat and IIS 6.5 years ago.
    • It was like this with VBScript and Component Templates and XSLT and Metadata and Dynamic XSLT templates 6 years ago.
    • It was like this with c# and Event Systems with Interops and marshalling and unmarshalling of COM and multithreading TDSE objects 5.5 years ago (hey Robert, remember this one?)
    • It was like this with Compound Templating when it came out in February 2008.
    • It was like this with complex Taxonomies when it came out in mid 2009.

    So why would it be any different with the new Anguilla Framework introduced in 2011?

    I think I'm on the transition between steps 3 and 4, where I do get things to work but in many cases I am not really sure why. It has first and foremost to do with my lack of knowledge and any practical experience on _proper_ JavaScript development. Heck, other than simple carousels and show/hide stuff I don't think I had ever written more than 10 lines of JavaScript in one go.

    Here's a few tips on some of the things I've done so far too keep me somewhat sane, I hope this will help others:

    DISABLE CACHE ON YOUR BROWSER. Seriously, get the Firefox Web Developer extension, and turn the cache off while developing.

    Get used to a javascript console. I use Firebug mostly, and the messages it logs are priceless! Some people prefer Chrome, others IE. I don't really care. Just use one.

    Backtrack what the CME is doing when it fails. When your extension breaks Tridion completely (believe me, it will happen a LOT of times) Tridion will gracefully half-load and not show you any error. Luckily you had your Javascript console when the CME was loading, and you can clearly see what request broke it. Copy the url that it tried to load (it will look more or less like this: http://localhost/WebUI/Editors/CME/Views/Dashboard/Dashboard_v6.0.0.39607.6_.aspx?mode=js) and now you'll probably get a very useful ASP.NET error message instead (typically along the lines of "File X does not exist") which will point you in the right direction.

    And, most important, keep believing you CAN do it. You'll get there.

    Tridion Publisher and Custom Resolvers

    Back in the day, we used to disable Tridion's link resolving (aka "Link Propagation") at publish time by using the old and venerable Event System (for more details about link resolving, check this page).

    Recently I had to write some code to disable link resolving only under certain conditions for Tridion 2009, and started going down the true-and-tried road of Event System and "OnComponentPublishPre" events. Shortly after deployment in the test environment we started getting some really angry error messages from COM saying that my code was trying invalid casts.

    Obviously offended by the suggestion that my code wouldn't work, I tried to understand what the **** was going on, and eventually figured out that it was all down to this: MSXML cannot be used in .NET code. And since the Event System in pre-2011 days is still based on COM and the Publish Instruction is an MSXML document... it would never work.

    I could have re-written my Event System in VB6... but let's not even go down that path.

    After scratching my head for about half a second, and some nudging from @puf on the right direction, I decided to try writing a Custom Resolver for the Tridion Publisher.

    And I was so amazed with the results that I thought I should share it with you.

    There's quite a few differences between a Custom Resolver and the Event System approach, the main ones being that you write your code in native .NET (using TOM.NET objects) and that you do not completely disable link resolving - you just fiddle with the results instead.

    Another great advantage of a Custom Resolver is that it is forwards-compatible: the code you write for Tridion 5.3 or 2009 will also work with Tridion 2011(*).

    So, let's get to the code, shall we?

    Create a class library, add references to Tridion.Common, Tridion.ContentManager and Tridion.ContentManager.Publishing.

    Create a class that implements the Tridion.ContentManager.Publishing.Resolving.IResolver interface.

    Create a void method as follows:
    public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, Tridion.Collections.ISet <ResolvedItem> resolvedItems)

    The resolvedItems collection is exactly what it looks like: this is the list of items that will be published unless we interfere with it. It's just a collection, so feel free to iterate through it, determine its type, remove items from it, etc. There's a reasonably good sample on the Tridion docs, just search for Custom Resolver.

    Just a few more words on the deployment:
    • The assembly you create must go into the GAC
    • You have to add your assembly to the Tridion.ContentManager.Config file in the "resolvers" section AFTER the default resolver from Tridion
    • Restart the publisher and you're in business

    (*) Hotfix CM_2011.0.1.74870 required in this pre-Service Pack 1 world.

    Sunday, October 16, 2011

    PowerTools 2011

    After some hard work from (mostly) Peter Kjaer, Chris Summers and Yoav Niran, the Power Tools project is finally under way.

    As from yesterday, there is a guide outlining the steps required to create a power tool, so I thought it is about time to start recruiting more cooperation from the community.

    The previous Tridion PowerTools were mostly a collection of ASP pages with some VBScript and Javascript helpers that provided a series of common functionalities:
    • Progress bars for long-running processes
    • Logging and debugging information
    • Item Pickers
    With the new Tridion 2011 UI and API (aka the Anguilla Framework) most of this functionality either broke or became obviously out-dated. Rather than taking the approach of making the power tools compatible with the new API (which would have been a monstrous task anyway) some people (Yoav and Chris mostly) had the guts to start this project from scratch.

    Though some of the common functionalities are still "undeveloped", there is enough in place to start playing. We do have now a common progress bar (pretty impressive btw), a nice and mostly clean WebService-based framework, a common set of javascript tools to handle the webservice responses, etc.

    The main missing point right now is an Item Picker, but there is some work happening on that one too.

    As it is clear if you read the No-nonsense guide to creating a Power Tool, there's a whole bunch of files to create per PowerTool, and each file has a very specific - and required - purpose. As the platform evolves we will be merging more and more of these features into a Common library, but for now you have to live with it...

    If you want to collaborate in this project - as we all hope you do - here's some of the things you may want to do:
    1. Join the powertools discussion 
    2. Join the IRC channel (yes! IRC! like in 1988) on freenode/#tridion
    3. Design the behavior of the next powertools. As it is now, this project is full of development geeks, but severely lacking on usability experts or actual powertool users. We could certainly use some help from a Functional point of view
    4. If you're dev-inclined, try out the guide mentioned above, and start playing with it. You may also want to write a better version of it, which we would ALL appreciate.
    5. Finally - determining icon sets for the tools would be a great contribution too.
    And hopefully someone will get around creating an installer for it...

    Sunday, September 25, 2011

    The art of knowledge sharing

    I've been recruited to help my daughter write a paper about Isotopes today. During our discussion about how the paper should or shouldn't be structured an idea bubbled through my mind regarding why some people do not share the knowledge they have - or perhaps just struggle to - while others insist on sharing it. As usual when you have a great idea at the wrong time, some sub-conscious thread of my brain kept on mulling on it, until it evolved into lots of analogies and anecdotal evidences that map directly to my life... So I thought I'd share it with you...

    Why don't you share knowledge?

    Here are some of the reasons I have used to avoid sharing knowledge:
    1. The concept that my knowledge equates to my value to an organization
    2. The concept that it takes me less time to do something than to teach it to others
    3. The idea that - god forbid! - someone else will claim to have reached a given conclusion without giving me proper credit.
    OK, number 3 can be a real reason to avoid sharing knowledge, but if you do work with someone that would do that to you, perhaps you should re-think the environment where you work in: join us.


    The impact of not sharing knowledge is probably hidden in plain sight for all those individuals that have worked in the same organization for more than 5 years just to find themselves still working in the same position they were hired for, with a very high reputation for what they do, and unable to progress in their careers. Fact is, they made themselves extremely valued at their line of work, and they can work miracles - being in fact so high above everyone else that works with them, that they are looked upon as almost demi-gods. But nobody really likes to work with them, and everyone else knows that these persons will do their job better when left alone.


    These are tell-tale signs of someone that for years accumulated knowledge and did not spread it throughout the organization - and now realizes that the reasons why nobody else can do his/her job is simply because he/she never took the time to explain how he/she does it. And therefore, nobody else can do it like he or she can, and therefore he/she must remain in his/her current position, because nobody else can do it.


    Sounds familiar?


    I am certainly oversimplifying many of the concepts involved in Knowledge Sharing, Knowledge Transfer and the much bigger discipline of Knowledge Management, but in my professional experience through life, knowledge sharing is rarely a result of using a given tool. Actually, I think the usage of a tool will only help if the knowledge sharing culture already exists.

    Why do you share knowledge?
     
    So, now that I have completely over-simplified why people will not share knowledge (knowing or unknowingly), here's some of the reasons why I think other people do share:
    1. Recognition - to be known as a guru, you have to - well - be known. Sharing your knowledge about a given topic, especially when it is something very specialized, will help establishing you as a point of reference about this topic
    2. Scalability of results - being able to reproduce the same quality of results while using different resources
    3. Being able to move up in the organization
    Reason #1 is usually the most visible reason, and also why some people criticize awards, like our MVP program - the fact that the person getting the award is only in it for himself. If that's the case, then I love it. Please go all be ambitious and parade your knowledge on Tridion so that I run out of my budget for MVPs. (I mean it).

    Reason #2 is the reason that logic and/or your management will ask from you. Professional organizations produce consistent, high-quality results. If only you are able to produce that same result, then your organization has failed.

    Reason #3 is not very apparent at first. Of course, you bask in the knowledge that you are the most successful executor of a given strategy, you positively glow when someone you just met mentions how your reputation precedes you, and you love the fact that people come out of their way to talk to you about something extremely technical. And then you go home, and realize you are doing exactly the same thing you did 5 years ago - except that you're even more arrogant about it now. And you're still being asked to do that same job, instead of being asked to create more people like you.


    Impact on Professional Services

    Professional Services organizations (excluding on purpose all the off-shore/body-shop organizations from this list) have learned a long time ago that their main asset is the most intangible of all: Knowledge. Working for the Professional Services branch of a Software company puts me often in a position where Knowledge Sharing is the _only_ way forward. My job is to assist you in unlocking the potential of the tool you bought, not to show you how good I am.

    If you don't work for the Software Vendor you may be very interested in maintaining the knowledge within your own organization (rather than the client that hired you), but as the software vendor I want you to learn it. The least services you need from us in the future - while happy and supportive of the tool - the more successful I have been. And our team can focus on what it's usually best at: introducing new customers to the amazing flexibility of the tool they chose to buy.

    Promoting Knowledge Sharing

    So, with all these things in mind - which pretty much sums up what my brain went through in the discussion I had with my daughter - how do you make sure you're making yourself redundant?

    If I knew the exact way to do this, I'd be a billionaire. So here's some things that I think will work.
    Promote knowledge sharing by rewarding the attitude.
    Remember reason #1 why people share knowledge? Promote it. Give the person a public recognition of their great job at knowledge sharing. It does not need to be monetary, and it certainly should not be a contest (no "employee of the month" please). Anything as simple as nod to that person (or group of persons) in the company's internal newsletter will do miracles to that person's willingness to share knowledge.
    Give that person additional responsibilities within the realm of sharing knowledge.
    Assign a junior resource to tag along with the person, not "to learn and become like you", but to "help you move on by taking care of the more mundane aspects of your job". If you read it attentively, you will see that both sentences carry the exact same result: someone will learn by tagging along, but the second sentence puts more emphasis on the benefit to the person with the highest knowledge, which may also make them more pre-disposed to assist in a mutually beneficial way.

    If both conditions are in place, you will naturally progress in your organizations - sometimes without even noticing it.

    If you don't do it, nobody will do it for you: start sharing knowledge now, or risk doing the same job forever.