jump to navigation

Meta-Data Mismatch December 15, 2008

Posted by Simeon Simeonov in Uncategorized.
Tags:
4 comments

Sometimes getting the meta-data wrong can lead to unpredictable results as demonstrated at Café del Doge in Palo Alto.

wild-scottish-salmon-chocolate-cake1

The Anti-Patterns of Bootstrapping December 6, 2008

Posted by Simeon Simeonov in VC, Venture Capital, startups.
Tags: ,
3 comments

Ugh–shoot. WordPress’s WYSIWIG HTML editor freaked out in the publishing step & lost half of my post. So, rather than “The Art and Anti-Patterns of Bootstrapping” you get the second half only… Not sure when I’ll be motivated to re-create the first half…

The three most common bootstrapping mistakes I’ve observed:

  • Setting the wrong bootstrapping objectives. Prototype? First paying customer? CFBE? I often meet with startups that are bootstrapping to a particular objective with the expectation that it will allow them to achieve something. For example, get a first paying customer and raise venture capital or get to CFBE and then you can recruit an amazing team to take you to $100M in revenue. The problem is that often achieving the objective doesn’t enable the follow-on result. For example, VCs may appreciate that you have paying customers but may not be interested in investing if your market opportunity is small or if the team is not strong. One particularly common mistake is failing to build strategic value. Cash, customers and revenues are important but often it takes something else to build strategic value. It may be critical mass. It may be achieving particular positioning.
  • Miscalculating the opportunity cost of bootstrapping. Every additional month of bootstrapping generates some benefits but also has an associated opportunity cost. It’s another month of selling without a sales guy. It’s another month of delaying the roadmap. It’s another month of traction for your well-funded competitors. It is very difficult to accurately estimate the cost of bootstrapping. My first startup, Allaire, bootstrapped on $18K to being funded by Polaris the following year. We got a great deal but in retrospect, we should have raised venture capital sooner. One insidious form of miscalculating the opportunity cost of bootstrapping is ignoring the market. You started bootstrapping four years ago. You are now at CFBE with $5M in revenue. How happy are you? The answer should depend on what has happened in the market you are in. Many bootstrapped companies have a very internally-oriented, sales-driven perspective. They are focused on specific customers, active deals and bringing in cash. What they don’t have is a market-oriented perspective. As a result they end up poorly positioned for growth or, in extreme cases, becoming irrelevant in the grand scheme of things, living dead despite their happy customers, revenues, etc.
  • Getting the wrong type of customers. There is such a thing as bad revenue. It comes from customers and partners who you decide to deal with because you are so focused on cash. I don’t disagree with the importance of bringing in cash but there are consequences for dealing with folks who are not aligned with your long-term objectives. They can be a distraction. They cause friction. They force you to make changes to your roadmap. This is a particularly common and dangerous issue for service businesses. The best startups, bootstrapped or not, know the power of saying “no” to customers that are not a good fit. In order to do this and survive, startups need to focus on demand discovery (making it easy for the right customers to find you) more than demand generation (convincing people who you think should be your customers to buy).

Saving Trees December 5, 2008

Posted by Simeon Simeonov in Life.
Tags: ,
1 comment so far

We’ve been trying to save some trees by reducing the amount of junk mail we receive. Most junk mail never made it into our house–the recycling bins are in the garage. My wife started using CatalogChoice to stem the flood of junk mail. In the last three weeks she has stopped the delivery of 116 catalogs. Wow! I had no idea we were getting this many.

Please, follow her lead.

Startup #5 & Future Forward Tidbits November 19, 2008

Posted by Simeon Simeonov in VC, Venture Capital, startups.
Tags: , , , , ,
4 comments

My blog rank is in the drain. I have been busy creating a new startup company, the fifth I’ve done at Polaris and the second (after Plinky) I’ve co-founded since I shifted roles to spending 100% of my time on working with entrepreneurs to help launch new companies.

I’m taking the opportunity to blog this while at the Future Forward’08 event put together by Scott Kirsner and the tireless team from Future Forward Events. I enjoy the event because of the intimate atmosphere and the chance to engage in deeper conversations that what’s possible at larger venues.

A comment caught my attention. Thornton May, who moderated an interesting panel with of the heads of IT for the Sox, Pats, Celts and Bruins, made a side comment about the role of government in innovation and technology. He was at the IBM Business Leadership Forum in Istanbul last week. Apparently, in past years, when times were better, the message with respect to government had been, essentially, “please, stay out of the way of business”. This year, the tone had changed dramatically and multiple speakers pushed for a greater government involvement. It’s even in Sam Palmisano’s speech:

So leaders will need to:

  • Hone their collaboration skills, because we will need leadership that pulls across systems.
  • We will need to bring together stakeholders and experts from across business, government and academia, and all of them will need to move outside their traditional comfort zones.

For instance, governments know how to wield power—how to regulate, how to provide stimulus and incentives.

I guess in good times business is happy to go it alone but in down markets everyone looks for an extra hand… Now, it’s time to test the new polling features of WordPress.com…

Taxing the Net November 5, 2008

Posted by Simeon Simeonov in Industry News.
Tags:
add a comment

In the latest in a series of moves to figure out how to make money off of Net commerce, China levies a 20% tax on virtual goods. Governments, even if they are racking up huge reserves as China is, but especially when they are in a tax revenue crunch (think USA) will be exploring these options. For example, I live in Massachusetts and every year I pay state tax on what I purchase out of state on the Net.

Embracing Students in High-Tech November 4, 2008

Posted by Simeon Simeonov in Uncategorized.
Tags: , , ,
add a comment

Scott Kirsner looked at how trade associations in the Boston deal with student membership/participation in a recent post. I’m on the board of The Massachusetts Innovation and Technology Exchange (MITX), which he gives a B-. While I’m sure I agree with Scott’s rating system which compares apples to oranges, I am in total agreement with him that we need more focus on engaging students in and around entrepreneurial activities. In fact, this was a topic that led to a good discussion at the last MITX board meeting and we have some good ideas on how to make things better both through the work we do and through partnering with other organizations.

More on RIA Debugging October 17, 2008

Posted by Simeon Simeonov in Web 2.0.
Tags: , , , , ,
1 comment so far

A month ago a wrote about one approach for debugging RIAs across platforms such as Flash/Flex, AJAX, SilverLight, etc. Mike Nimer has a post soliciting ideas for the common UI to do this. If you have any ideas, share them.

Three Generations of SEO (Part II) September 17, 2008

Posted by Simeon Simeonov in Digital Media, Web 2.0, startups.
Tags: , , , , , , , , , , , , , ,
8 comments

This is part II in a series of posts on SEO-driven businesses. Part I is here.

I see three generations of SEO optimization in the wild that build upon each other. Below are their distinguishing characteristics.

  • SEO 1.0: human-driven SEO. This is primarily about people tweaking content and linking structure. The main distinguishing characteristic of an SEO 1.0 company is that there are people on staff who spend a portion of their time optimizing content for SEO. The best example is probably About.com, with its 750+ experts and dozens of editors. The experts and editors choose which topics to write on and know how to write to drive rank. They know how to format titles and what words they should avoid and what’s the “right” length of an article, etc. They also know how to build a strong link internal structure, albeit mostly by hand. Our own TechTarget and THCN are pretty expert at SEO 1.0. For Internet marketing, HubSpot is a great resource which helps many companies get on the SEO 1.0 train. The biggest problem of SEO 1.0 is scale–it takes humans to optimize content.
  • SEO 1.5: adding UGC for scale. What you may not be able to do with a dozen or a few hundred experts you may be able to do with lots of contributors. Blogging sites are the main examples. They key here is to get to scale and avoid “poisonous” SEO–the type of content that actually can drive your rank down.
  • SEO 2.0: machine-driven SEO. If SEO 1.0 is about the human touch, SEO 2.0 is about software crunching through content databases. What SEO 2.0 lacks in human skill it gains in scale. The key is having good meta-data. WordPress.com is a good example. Although the content is UGC, nobody is teaching WP bloggers how to write for SEO. However, the smart folks at Automattic are taking the meta-data from blog posts, including but not limited to titles, tags, linking and visit histories, and using them to generate both new pages (for example, using the SEO tag) and new links in content (as in the auto-generated possibly related posts at the bottom of blog posts). E-commerce sites are great candidates for SEO 2.0 because products carry a lot of meta-data allowing new pages to be built by brand, price and other features. Many also do SEO 1.0 through on-staff experts/marketers writing about the products and SEO 1.5 by adding (or syndicating) reviews. Another good example is EveryZing, run by my friend Tom Wilde, which can add meta-data to media assets (podcasts, videos) and make them search-friendly by doing speech-to-text. Yet more examples are what BitPipe (now owned by TechTarget) or Scribd are doing.
  • SEO 2.5: content enhancement. I’m noticing an increasing effort, particularly with UGC, to use software tools to enhance the quality of content  that is produced as opposed to try to add value around it (such as through additional reading links, etc.). The idea is simple: the better the content and the more relevant links in it, the more interesting it is for the search engines and potentially for visitors. One player in this space is Zemanta (which Fred Wilson recently invested in), whose widget I’m staring at now as I write this post. I like what these guys are doing. At Plinky, we are taking a very different approach with the same goal–help people create better UGC.
  • SEO 3.0: it’s all about back links. If you have a lot of content with good meta-data you can create an amazing internal linking structure within the sites you control. But you need to have back links to drive rank. Domain squatters for years have built link farms across the domains they own and have tried to hide the coordinated nature of their linking from search engines. Then came the comment and review spammers who essentially poisoned much of that pool of UGC for search. On the legitimate side, businesses have struck content partnerships that increase back links for years. But it wasn’t until the last couple of years that many companies approached the problem of building legitimate, value-added back links with scale and automation in mind. We first saw this through site templates (MySpace or WordPress, for example) and widgets and the back links to their creators. I am now seeing a next generation of startups innovating in this area. The delicate balance is to add tons of back links that add value to visitors as opposed to look like a link farm.

The majority of SEO experts and consultants built their fame doing SEO 1.0. Some have experience with SEO 1.5 and can suggest manual widget distribution strategies to help with SEO 3.0. These people tend to be focused much more on content than on software. In my own experience and in talking to heads of marketing and CTOs at Polaris portfolio companies I get the sense that very few SEO gurus have any experience with building the foundational software systems that drive SEO 2.0-3.0. This is a big problem. It is not easy to build an SEO-optimized content management + publishing system driven by a large content database with largely automated editorial processes. If you want to take your business to scale, you have to think about your SEO strategy and architect your service for this from the ground up. This is not something you can bolt on. Also, unless you already have an SEO-knowledgeable architect on your team, expect to spend a long time finding one and consider building an SEO advisory board to augment the knowledge/experience of the person you’ll end up with.

The next part in the series will look at the economics of “free” traffic.

Debugging RIA Services September 16, 2008

Posted by Simeon Simeonov in Flex.
Tags: , , , , , , , , , , , , , , , , , , , ,
17 comments

Introduction

This is a call to action to everyone building clients, servers and frameworks for rich internet applications (RIAs) to improve the life of RIA developers by improving the debugging of backend services RIAs depend on.

I’d like to thank the people who’ve offered valuable feedback + additional information that I’ve integrated here.

Motivation

The relationship of an RIA to its backend is quite different than that of a traditional Web application. In a traditional, dynamic HTML generation Web app, the output stream is under the control of the developer and the application server. Developers can freely mix application output with diagnostic information. By contrast, RIAs have a narrow communication channel with the server, typically using a service-oriented architecture (SOA). Because the output format is typically XML or JSON (and because there are no established standards for augmenting message payloads) there is no opportunity to include any additional information. This is particularly problematic during debugging.

Consider the following with Adobe Flex as the example frontend and ColdFusion (CF) as the example backend although the discussion applies to any RIA:

  • An exception on the server would cause a service request to fail without providing any useful information to the developer. In particular, there is no way to see the exception information or the server-side stack trace, despite the fact that CF would generate ample information useful for debugging.
  • Turning on debug information output on the server would break the service by adding HTML at the end of the XML output. Developers have no good way of consuming that debugging information other than test-driving the service in an HTML test harness.
  • CFDump is a one of the most beloved tags in CFML. Almost every developer uses it in every application because it provides great debugging efficiency. There is no way to use CFDump in RIA development.
  • There is no way to generate any auxiliary, Flash trace()-like output in service responses, something any HTML developer is used to doing. Again, when using services with RIA front-ends, developers are flying blind.
  • Conversely, RIA developers have no good mechanism of creating any persistent application output. For example, while writing a message to a log takes one line with CFLog, an RIA developer would have to implement a logging service in order to achieve this capability and store some information for future analysis.

Debuggers are not the answer

Every backend environment has its own debugging capabilities. Also, there many ways to debug AJAX and Flex applications:

However, debuggers do not address the problem of efficiently debugging backend services for RIAs. Most Web developers don’t use or don’t know how to use debuggers effectively. Debuggers are good for step execution and occasional variable inspection. They are poor at displaying a lot of specific information efficiently. Also, using both a client-sde and a server-side debugger often slows down the develop-test-fix cycle. In short, using debuggers are no substitute for having flexible and powerful diagnostic output from backend services.

As an example, consider the actions a developer must take in a CF debugger to get the information equivalent to seeing the output generated by a CFQuery exception with stack trace enabled or a CFDump of a query with 200 rows. There is simply no comparison in terms of productivity.

The closest approaches I’ve found to what I’m proposing here are FirePHP and the ability of ColdFusion to return page debug data to the Flash player through FlashRemoting using ActionScript Message Format (AMF, a binary protocol) server debug response headers. (Mike Nimer pointed me to the CF-AMF capability and to a FlexDebugPanel that he built to better display the information.) Both approaches use response headers, which limits their ability to deal with large amounts of data. I also think the industry needs a broader and more standardized solution.

A personal tangent

A recent experience underscored these problems and was the personal motivation for me to write this. The latest RIA I built had a Flex 3 frontend with a CF8 backend. Despite its simplicity-one component (CFC) on the backend and only a couple of thousand lines of MXML-I constantly had to work around the lack of visibility when I was invoking services from the client. Before long, I found myself installing Fiddler to see the HTTP traffic and logging WDDX packets and CFDump output which I then crudely displayed in a browser window using a quick’n'dirty Web page. When using the client-side and server-side debuggers I was frustrated by the number of clicks it took to get to data I cared about and the amount of irrelevant information presented, e.g., tons of underscore-prefixed internal variables for unnamed controls I had to scroll through to get to variables I cared about.

When I pinged a few people building AJAX and Flex apps I heard the very same feelings about their debugging experience and the difference between building RIAs vs. traditional Web applications.

Many of the ideas proposed in this document are not new. Back in the spring of 2001, I built what may have been the first prototype of Flash communicating to servers using SOA. For the backend I used CF with a dynamic dispatch layer to custom tags (CFCs weren’t there yet). In testing the prototype I hit the same debugging problems. I implemented a feature that took diagnostic output from the server and displayed it as trace() output in the player. It made my life easier but it wasn’t a generic solution because it relied on a particular response format. The FlashRemoting team later on generalized the concept via the amf_server_debug response header, which is not an HTTP response header but a payload response header (think SOAP).

Some years ago I would have jumped to code the solution I propose here and open-source it, like I did a decade ago with WDDX. For better or worse, I don’t code that much these days. Instead, I’m focusing on helping entrepreneurs start companies. I hope this post inspires someone to tackle this problem and share their work with the RIA developer community.

Proposed solution

Improving the debugging of RIA service backends requires a multi-faceted approach that spans clients, servers and tools. In order of importance, there are four inter-related pieces:

  1. Establishing a diagnostic output channel from the server to the client. The goal here is to give Web developers familiar capabilities such as the ability to see exception diagnostics, to display diagnostic output and dump complex variables.
  2. Providing a persistent output channel from the client to the server. The goal here is to enable structured logging from the client to the server so that important diagnostic output can be preserved for future analysis.
  3. Implementing structured logging on the server. The goal here is to improve the power of logging by building the kind of logging system that makes developers more productive during the debugging cycle.
  4. Improving debuggers. There is no such thing as a true RIA debugger out there. Since this part of the solution has much broader scope, it is not covered here.

Architecture

There are multiple ways to implement the proposed solution. The approach outlined here is probably one of the simplest. It involves a single diagnostic output specification, three new services on the backend for server-side diagnostic output, client-to-server logging and log viewing, and a reusable viewer of diagnostic output. These capabilities are exposed in an appropriate manner through the frontend and backend programming models and frameworks.

Figure 1. RIA diagnostic output architecture

Diagnostic output specification

The diagnostic output specification has three parts:

  • A schema for identifying the output format
  • A mechanism for identifying specific output stored remotely
  • A mechanism for passing diagnostic output identifiers from the server to the client

Diagnostic information is provided in “documents” (chunks, payloads, etc.) according to the schema. Each such document must be URI-addressable during its lifetime. The exact format of the URI is specific to a particular server environment. For example, in a ColdFusion deployment it can be a URL to the diagnostic output service. The URL will be parameterized such that the right diagnostic information is returned to the client. Let’s call this a DebugURI (dURI).

For performance reasons, the URI must be able to address sub-parts of any single pile of diagnostic information. For example, if the diagnostic information includes a reference to a 10,000 record query it wouldn’t make sense to either arbitrarily restrict how many rows the client can have access to or to ship all 10,000 lines with the diagnostic information request. However, to simplify implementation, the URI format need not be exposed to the client. For example, the client shouldn’t necessarily be able to request rows 9,212 - 9,532 of the query. Instead, the server can simply put a placeholder in a document saying “there is more data here and if you want it, request this URI and I’ll get it to you”. Let’s call this particular type of dURI a ContinuationURI (cURI).

The specific mechanism for passing diagnostic output identifiers from the server to the client is protocol and environment specific. An HTTP response header carrying the dURI is a simple choice that works well across languages and platforms and does not modify the response payload.

The diagnostic output schema is a format (not necessarily a formal XML Schema) for describing the information typically encountered while debugging applications, including but not limited to:

  • Exception information
  • Call stack information
  • Data structure dumps
  • Application state information
  • Service requests & responses
  • External service interactions, e.g., database queries and responses
  • Performance-related information
  • Developer-created diagnostics messages

There are trade-offs in the amount of detail in the schema. With more detail, providing support across environments will take a little more time but, on the other hand, the output viewer can be more capable, e.g., allowing dynamic expansion of data structures, etc. With minimal detail, developers will only be able to look at volumes of text in the viewer.

The schema should have built-in extensibility features.

Last but not least, the schema must specify the format of the cURI placeholder discussed above.

Backend support

Backend support includes a persistent and a transient store for diagnostic information and three new services.

Data stores

The backend must implement two data stores, one for run-time diagnostic information and one for persistent diagnostic information.

The runtime information store can leverage the traditional app server state management capabilities, in particular, session management. The information model is simple. Diagnostic information generated during the processing of a request can be maintained as an aggregate object indexed by dURIs. There needs to be a purging policy for efficient resource management.

The persistent information store can leverage the existing logging architecture of a server. However, a more efficient implementation may want to use an embedded database. See the following discussion on the log viewer.

Services

The debug output service is invoked via dURIs passed with a server response or generated by the log viewing service (see below) or with cURIs. It generates a diagnostic information document. It can use a default or user-configured policy governing the size and detail in these documents, adding cURIs where appropriate. The debug output service can pull information from both the transient and persistent stores.

The remote logging service takes a diagnostic information document and some additional meta-data describing where, when and how the diagnostic information was created and persists that information.

The log viewing service has two functions. It monitors the log for changes to know when new data is available. It also allows the log viewer to list and query (and potentially search inside) the available diagnostic information documents. Every available document is identified by a dURI that the client can pass to the debug output service to retrieve the document.

Client-side support

Client-side support comes via a pre-packaged viewer application. The viewer is an RIA that provides rich functionality for working with diagnostic output documents such as:

  • Communicating with the application running on the client, allowing it to deliver diagnostic output that can be displayed richly. For example, this would be substantial improvement compared to basic trace() output in Flash or Log4Ajax.
  • Listing of available information. Some information can be provided by the client. Transient information from multiple server interactions may be available. In addition, all the persisted information is available. The viewer should also be able to open a file in the diagnostic output format.
  • Allowing some information to be persisted for future analysis. This becomes particularly interesting if there is support for annotations and sharing of the information with team members (via a URL to the debug output service or as an email attachment).
  • Supporting flexible data structure navigation and basic search across the data structures and messages.
  • Providing appropriate formatting for exceptions, call stack information, performance information, etc.

An ideal implementation of the viewer would be as an AJAX or Flex application component that can communicate with both Flash/Flex and other AJAX applications independent of the server environment. Client-side debuggers can add the viewer capability also. Perhaps the FireBug Working Group can take this on?

From a user-experience standpoint, the viewer should be able to run next-to an application as a docked component as well as a pop-up in a separate window, which would be particularly useful for developers with multiple monitors.

Specific environment support

These capabilities should be supported as appropriate by specific RIA environments. Ideally, support should be implemented at the application server level for maximum performance, efficiency, etc. As a second option, it can be provided as native or side-along extensions to common frameworks.

Specifying invocation intent

In some such environments it may be helpful to know whether a server request is made by a browser for the purposes of HTML display or as a service call. In the case of service calls, certain display-oriented capabilities such as debug output or the output of the CFDump tag in ColdFusion can be automatically redirected to contribute data to the transient diagnostic output store. In some cases the context of request can be determined directly from the HTTP-level information, e.g., a POST with Content-Type application/XML. In other cases, such as a simple HTTP GET to a RESTful service, it is difficult to do this without knowing a priori that the URL is a service. Some server components such as ColdFusion CFCs can be addressed in a number of different ways. It therefore may be helpful to consider having RIA clients optionally send a custom HTTP request header to identify the intent of the request.

Additional considerations

Managing diagnostic information in this way adds substantial overhead to application processing. It should only be enabled in debugging scenarios.

Exposing detailed server state information to remote clients poses a security risk. The backend services should require authentication and they should be able to run over a secure connection to prevent data snooping and man-in-the-middle attacks.

Manipulating diagnostic information with such ease can benefit traditional HTML application development also. Therefore, it is worth thinking about ways to integrate the view application with traditional HTML applications.

Conclusion

This document outlines a simple approach to improving the debugging backend RIA services across languages and platforms. The approach is amenable to standardization as it includes a common format for diagnostic output and a common viewer application.

These could be developed with open extensibility in mind and remotely-hosted viewer extensions allowing, for example, Ruby-on-Rails (RoR) to provide some special RoR-specific structured output that can be natively viewed via an extension (implemented as a JavaScript or Flex component) hosted on rubyforge.org.

Postscript

The discussion here points out some of the fundamental differences between RIAs and traditional HTML applications. Beyond improving the debugging of RIA services, there are many more opportunities to provide better support for RIA applications. After all, the first Web application server shipped a dozen years ago. Too much of what app servers do assumes dynamic HTML generation as opposed to Flex/AJAX clients. I’m surprised I haven’t seen more innovation in this area from large platform vendors. Smaller players such as Aptana (with Jaxer) and JackBe are pushing the boundary but their lack of distribution on the backend limits the effects of their innovation.

Building an SEO-Driven Business (Part I) September 15, 2008

Posted by Simeon Simeonov in Digital Media, startups.
Tags: , ,
5 comments

I’m no SEO guru but over the past couple of years I’ve talked to enough entrepreneurs who are leveraging SEO to develop a perspective on the impact of making SEO a big part of a startup’s future. I plan on doing a few posts on this topic in the coming days.

It helps to mention some of the key ingredients of the SEO value chain.

action = f1(user_intent, traffic)
traffic = f2(search_query, rank, url)
search_query = f3(user_intent)
rank = f4(content, internal_links, back_links)
internal_links = f5(content, meta-data)
back_links = f6(content, meta-data, partnerships)

There are many complex variables here. SEO has quickly evolved from being a craft to being both an art and a science practiced by some of the best and some of the worst people on the Net. The search engines have evolved in turn not to be duped. However, old habits die hard and the one bad habit I keep seeing in the SEO world is the overwhelming focus on content.

Content, be it expert-generated articles or user-contributed product reviews or the “yo, buddy, what’s up?” on Myspace, is very important but is just one piece of the puzzle. I’m surprised more startups are not focused on scalable approaches for adding value on two other fronts:

  • User intent. Everything stems from that. The search engine marketers know this cold. They know that different search queries lead to different conversions after a paid click. On the SEO side, however, I haven’t seen great examples of recognizing the importance of user intent and the fact that different search queries often indicate different intent. By focusing too much on the content that drives traffic and not enough on the dynamism and adaptability of the user experience visitors get after they land through a natural search link, businesses are leaving value on the table.
  • Meta-data. My friend Glen Daniels says “It’s just metadata.” In most situations we’d be better off by trading off data for meta-data, or volume of content for understanding about the content. There is a reason why e-commerce product reviews are so valuable for SEO. Not only do they provide content but they are organized in context and have all the meta-data associated with the product they are about. Notice how Amazon is smart to display the same reviews for items with different colors, or for the hardcover vs. the paperback version of the same book, or for a newer version of a pair of headphones, etc. They couldn’t do that without meta-data associating the review with a product and then some smarts that associate similar products together. The other reason why meta-data is so important is that it allows for links created through software. For example, WordPress.com is smart to enhance the value of blog posts for both readers and search engines through an auto-generated set of possibly-related posts. I see too many businesses invest to generate a large volume of content but not enough to add great meta-data to the content, which ultimately limits both SEO and monetization.

The next post will be on the three generations of SEO.