Status Report for martinfowler.com at the end 2014

28 January 2015



Running the martinfowler.com site is a large part of my job at Thoughtworks. Traditionally it has got more traffic than our main site, although that is happily set to change as our main site improves. My site is a vehicle for us to influence the industry as part of our pillar 2 work.

One of the nice things about running a website, rather than writing for magazines, is that with analytics data you can get some feedback. It's easy to get too enamored of tracking numbers, but I find it useful to keep an eye on them, primarily to gauge what kind of material gets the most attention.

At the beginning of this year, I decided to spend a bit more time than usual reviewing traffic information so I could better understand what was happening. I took advantage of this effort to share information with our content strategy folks, but I believe in sharing this more widely, so I'm making this available more widely in Thoughtworks too (I may mention it publicly too later on.)

Goals for the site

My primary goal for martinfowler.com is to spread knowledge of techniques that improve software development. I hope to find useful techniques, primarily via my Thoughtworks colleagues, and explain them clearly enough that other people an try and expand on them.

While this goal is primarily a pillar 2 effort there is a significant pillar 1 impact too. On the demand side, it helps generate leads and/or raise our credibility when looking for work. Recruiting claims that many people come to Thoughtworks because they were made aware of us by my site, or the writing there helps people consider Thoughtworks to be the right place to move to. In delivery, sometimes a post can help our consultants convince clients of a better path to take, or just help educate our clients to do a better job and appreciate what we're up to.

With pillar 3 I've been doing some writing and speaking on diversity issues and freedom of the internet. Most of my site's readers come to me for technical information, but I think it's also important to ensure they are aware of the important social issues that we face, particularly those that technologists can have an impact on.

As well as my own writing, I think it's important for me to help develop others who have an inclination. For example, a couple of years ago I spent a fair bit of time doing joint talks with Jez Humble, both to raise his profile and spread the ideas of Continuous Delivery. Although I'm sad to see Jez move on, I'm happy to continue doing this. When I started at Thoughtworks, many people saw me as the primary spokesperson for Thoughtworks in the profession, but I'm really happy to see that now Thoughtworks is known for many people, not just me. Many of the popular articles on martinfowler.com are written by people other than me, often but not always ThoughtWorkers.

As well as these professional goals for the site, it also helps with some personal goals in leading a satisfying life. I hate giving talks, and push hard to minimize them. Similarly I've been an elite member of some airline's frequent flier program since 1992, and prefer time in my own office than in an airline seat. The more influential the website is, the more I can justify spending my time writing for it, rather than travelling to yet another talking gig.

2014 Overall Traffic

Let consider some broad vanity metrics.

Figure 1: Comparing monthly unique visitors 2012-2014

In terms of simple visitors, the site did well in 2014, with a firm increase on the previous two years, with 186-249K visitors per month. Page views had a similar performance (historically the two track each other pretty closely on my site.) 1

1: There is a wrinkle in this data. My Google analytics reports separately for martinfowler.com and refactoring.com, even though I think of them as the same site. As a result, this visitor figure excludes anyone who visited refactoring.com and did not visit martinfowler.com.

Figure 2: Comparing unique page views 2012-2014

Figure 3: The long term picture of visitors since I started collecting analytics

Popular Articles

I tend to be a bit suspicious of broad page view information like this. After all, does worrying about this number just result in click-bait titles that don't have any real usefulness to my readers?

So I've been focusing on a different measure - how many popular articles do I have. For the moment, I'm defining a popular article as one that gets over 1000 unique page views in a month.

Figure 4: Comparing number of articles getting more than 1000 unique page views per month

The trend is pretty similar to that for total page views and visitors, each year a steady gain on the prior years. Such aggregates give me a warm, fuzzy, feeling. But if I want to figure out more I need to look at the actual articles.

The first thing to point out is that there's kinds of popular article. An article can get lots of traffic if it's new.

Figure 5: Histogram of total unique page views for the first seven days after launching an article. Bin size is 500. Articles are those published from 2012 to 2014.

As you can see from the histogram, most articles will get more than 1000 views in the first seven days, with a few well north of 10,000 views (usually due to the attention of Hacker News). But if we look at the results after six months, we see a different picture.

Figure 6: Histogram of total unique page views for the month that falls six months after launching an article. Bin size is 500.

After six months, most articles get less than 1000 views a month. I suspect it is the articles that are both suitably aged and popular which are the ones that are most valuable. The hip term for these articles is “evergeen”. (Since it's natural to wonder, the far outlier is the article on microservices by James Lewis and myself.)

Evergreen articles in 2014

To determine the aged, popular URLs in 2014, I came up with the following definition

  • The median of the page views per month during 2014 must be greater than 1000
  • There must be at least four months where it garners more than 1000 page views

The second rule should remove most of the ephemerally popular articles, while allowing me to look at relatively new articles. (The shape of the 3 month histogram is pretty close to that of the 6 month one, but at some point I should do some proper correlation analysis of early to late page view scores).

Given that criteria, I end up with 86 evergreen URLs in 2014.

rankpathtypemediannumlaunch date
1/articles/microservices.htmlarticle32391102014-03-10
2/articles/injection.htmlarticle2894612
3/nav2245612
4/articles/mocksArentStubs.htmlarticle1155512
5/articles/continuousIntegration.htmlarticle1141212
6/bliki/CQRS.htmlbliki1061412
7/refactoring/nav779812
8/books/eaa.htmlbooks766712
9/eaaDev/uiArchs.htmlarticle745012
10/design.htmlnav717212
11/articles/richardsonMaturityModel.htmlarticle685412
12/articles/is-tdd-dead/nav622582014-05-19
13/articles/itsNotJustStandingUp.htmlarticle596612
14/eaaDev/EventSourcing.htmlarticle582812
15/nosql.htmlnav5645122012-08-22
16/eaaCatalog/catalog552712
17/articles/lmax.htmlarticle5327122011-07-12
18/eaaCatalog/repository.htmlcatalog465812
19/articles/collection-pipeline/article465762014-07-21
20/eaaCatalog/unitOfWork.htmlcatalog423512
21/intro.htmlnav404512
22/agile.htmlnav401912
23/bliki/AnemicDomainModel.htmlbliki378712
24/articles/newMethodology.htmlarticle362412
25/aboutMe.htmlnav357712
26/refactoring/catalog/catalog350412
27/articles/designDead.htmlarticle320512
28/bliki/TwoHardThings.htmlbliki315912
29/eaaDev/PresentationModel.htmlarticle304712
30/books/refactoring.htmlbooks294212
31/bliki/FeatureToggle.htmlbliki293012
32/eaaCatalog/index.htmlcatalog279912
33/bliki/nav275712
34/bliki/PolyglotPersistence.htmlbliki2617122011-11-16
35/books/nav258912
36/eaaCatalog/dataTransferObject.htmlcatalog253712
37/eaaCatalog/dataMapper.htmlcatalog253212
38/articles/consumerDrivenContracts.htmlarticle251310
39/eaaCatalog/domainModel.htmlcatalog249312
40/articles/enterpriseREST.htmlarticle2488122013-10-21
41/delivery.htmlnav246612
42/articles/testing-culture.htmlarticle229882014-05-12
43/bliki/TestPyramid.htmlbliki228512
44/bliki/PageObject.htmlbliki2244122013-09-10
45/articles/evodb.htmlarticle219912
46/bliki/BoundedContext.htmlbliki212712
47/bliki/CircuitBreaker.htmlbliki2101102014-03-06
48/articles/rake.htmlarticle208012
49/dsl.htmlnav206912
50/books/nosql.htmlbooks2038122012-08-17
51/bliki/FeatureBranch.htmlbliki203712
52/bliki/MicroservicePrerequisites.htmlbliki201652014-08-28
53/books/dsl.htmlbooks196112
54/bliki/TechnicalDebt.htmlbliki194912
55/bliki/BlueGreenDeployment.htmlbliki190312
56/bliki/FluentInterface.htmlbliki188212
57/bliki/InversionOfControl.htmlbliki184412
58/eaaCatalog/serviceLayer.htmlcatalog183512
59/eaaCatalog/activeRecord.htmlcatalog179212
60/articles/distributed-objects-microservices.htmlshort176052014-08-13
61/articles/asyncJS.htmlarticle1712122013-09-03
62/bliki/ContinuousDelivery.htmlbliki1675122013-05-30
63/bliki/UnitTest.htmlbliki163782014-05-05
64/eaaCatalog/transactionScript.htmlcatalog160612
65/articles/useOfMetrics.htmlarticle1580102013-02-19
66/bliki/TolerantReader.htmlbliki152110
67/tags/domain driven design.htmlnav150210
68/eaaDev/PassiveScreen.htmlarticle146912
69/articles/agileFluency.htmlarticle1441122012-08-08
70/bliki/RulesEngine.htmlbliki141812
71/eaaCatalog/singleTableInheritance.htmlcatalog140312
72/eaaDev/SupervisingPresenter.htmlarticle133012
73/articles/vagrant-chef-rbenv.htmlarticle132742014-09-04
74/bliki/DeploymentPipeline.htmlbliki128392013-05-30
75/bliki/BusinessReadableDSL.htmlbliki125512
76/articles/enterprisePatterns.htmlcatalog124712
77/bliki/UbiquitousLanguage.htmlbliki119310
78/books/continuousDelivery.htmlbooks11889
79/bliki/GivenWhenThen.htmlbliki1169102013-08-21
80/books/buying.htmlbooks111310
81/articles/nonDeterminism.htmlarticle110492011-04-14
82/articles/agileOffshore.htmlarticle10717
83/bliki/BranchByAbstraction.htmlbliki106982014-01-07
84/bliki/OrmHate.htmlbliki104382012-05-08
85/bliki/DDD_Aggregate.htmlbliki101482013-04-23
86/eaaDev/EventAggregator.htmlarticle10128

I've classified the URLs I'm examining into the following types:

  • article: long form article, typically with several sections, would run to more than a couple of pages
  • short: a shorter article, typically without sections and running under 1500 words.
  • bliki: entry in the bliki, these are usually short 2 and take the form of defining the concept that is its title
  • 2: 80% of bliki entries are less than 1000 words, with only a dozen more than 1500 words (out of 464 bliki entries).

  • deck: An infodeck
  • nav: navigation page - things like my home page and the various guide and tags pages
  • books: a page describing a book of mine (or in my series)
  • catalog: pages that are part of catalogs like the EAA patterns catalog or the refactoring catalog.

Figure 7: Stripchart of the evergreen articles, categorized by type.

One, rather sobering, thing stood out to me from this analysis. Over the last couple of years I put a fair bit of effort into creating a new form of content: infodecks. I'd hoped they would provide an engaging medium that would help explain topics, yet not one of the evergreen 86 are infodecks. 3

3: There may be hope for next year, Toby Clemsons's deck on microservice testing has had a very solid first couple of months (both around 14,000 views).

How recent posts have fared

Another way of looking at this is reviewing the URLs I've posted in the last few years, and seeing how many of them have made the evergreen list. I keep a note when I launch a new article, if nothing else to track its progress in page views after it launches.

pathlaunch datetypedec viewsrankevergreen?
1/articles/microservices.html2014-03-10article372491T
2/nosql.html2012-08-22nav524815T
3/articles/is-tdd-dead/2014-05-19nav389023T
4/bliki/OrmHate.html2012-05-08bliki266736T
5/bliki/PageObject.html2013-09-10bliki232945T
6/bliki/TestCoverage.html2012-04-17bliki228847F
7/articles/enterpriseREST.html2013-10-21article221750T
8/bliki/CircuitBreaker.html2014-03-06bliki211454T
9/books/nosql.html2012-08-17books200855T
10/articles/agileFluency.html2012-08-08article198956T
11/articles/collection-pipeline/2014-07-21article185662T
12/articles/asyncJS.html2013-09-03article173566T
13/bliki/ContinuousDelivery.html2013-05-30bliki163168T
14/bliki/UnitTest.html2014-05-05bliki161869T
15/articles/useOfMetrics.html2013-02-19article156870T
16/bliki/DeploymentPipeline.html2013-05-30bliki132677T
17/bliki/GivenWhenThen.html2013-08-21bliki129378T
18/bliki/MicroservicePrerequisites.html2014-08-28bliki126979T
19/articles/testing-culture.html2014-05-12article120782T
20/articles/vagrant-chef-rbenv.html2014-09-04article114684T
21/bliki/DDD_Aggregate.html2013-04-23bliki113485T
22/articles/distributed-objects-microservices.html2014-08-13short107594T
23/bliki/TellDontAsk.html2013-09-05bliki102996F
24/bliki/BranchByAbstraction.html2014-01-07bliki922102T
25/bliki/ImmutableServer.html2013-06-13bliki776113F
26/bliki/CanaryRelease.html2014-06-25bliki743118F
27/bliki/ReportingDatabase.html2014-04-02bliki743119F
28/articles/dipInTheWild.html2013-05-01article701125F
29/articles/workflowsOfRefactoring/2014-01-08deck684128F
30/bliki/SnowflakeServer.html2012-07-10bliki652131F
31/bliki/SelfTestingCode.html2014-05-01bliki613138F
32/bliki/CannotMeasureProductivity.html2013-08-29bliki588141F
33/bliki/StranglerApplication.html2014-06-30repost546150F
34/bliki/PhoenixServer.html2012-07-10bliki501162F
35/articles/schemaless/2013-01-07deck460172F
36/bliki/FlaccidScrum.html2014-01-29bliki459173F
37/bliki/AggregateOrientedDatabase.html2012-01-19bliki458174F
38/articles/nosqlKeyPoints.html2012-09-12nav425180F
39/bliki/SegregatedDOM.html2014-01-16bliki351199F
40/bliki/ParallelChange.html2014-05-13bliki326205F
41/articles/badri-hexagonal/2014-06-05nav305212F
42/bliki/MaturityModel.html2014-08-26bliki284216F
43/articles/eurogames/2013-10-02article282217F
44/articles/go-interview.html2014-03-25short263225F
45/articles/multiMobile/2012-06-19deck237235F
46/articles/bigQueryPOC.html2012-09-04article231238F
47/bliki/UserDefinedField.html2013-07-23bliki218246F
48/bliki/OpportunisticRefactoring.html2014-07-30bliki197263F
49/bliki/Datensparsamkeit.html2013-12-12bliki190266F
50/bliki/UserStory.html2013-04-22bliki178275F
51/articles/modernMockingTools.html2012-09-10article162286F
52/bliki/PurposeOfEstimation.html2013-02-27bliki162288F
53/bliki/BroadStackTest.html2013-04-22bliki160290F
54/bliki/InternalReprogrammability.html2013-01-10bliki159292F
55/bliki/NosqlDefinition.html2012-01-09bliki138326F
56/articles/bigData/2013-01-29deck128350F
57/articles/gap-scms-po/2013-04-23deck124357F
58/bliki/ComponentTest.html2013-04-22bliki123359F
59/articles/mobileImplStrategy.html2012-05-21article111372F
60/bliki/ComposedRegex.html2014-07-31repost104384F
61/bliki/EnterpriseApplication.html2014-03-24bliki102389F
62/bliki/SoftwareDevelopmentAttitude.html2014-03-11bliki101391F
63/bliki/ExtremeProgramming.html2013-07-11bliki96400F
64/bliki/BusinessFacingTest.html2013-04-23bliki89417F
65/bliki/ExpositionalArchitecture.html2013-04-23bliki89419F
66/bliki/JavascriptPromise.html2013-04-22bliki88421F
67/bliki/PrimingPrimeDirective.html2012-10-23bliki79446F
68/articles/eliminatingSalesCommissions/2013-02-18deck73459F
69/bliki/EmbeddedDocument.html2013-06-04bliki71466F
70/bliki/UserJourneyTest.html2013-04-23bliki56510F
71/bliki/PreferFunctionalStaffOrganization.html2014-08-04repost52522F
72/bliki/ThrownEstimate.html2014-06-26repost46543F
73/bliki/HistoricallyDiscriminatedAgainst.html2013-10-10bliki43554F
74/bliki/StoryPoint.html2013-07-16bliki42561F
75/bliki/AlienatingAtmosphere.html2014-02-11bliki40568F
76/bliki/CloudComputing.html2013-07-11bliki38582F
77/bliki/StoryTest.html2013-04-23bliki33617F
78/bliki/ConfigurationSynchronization.html2013-06-13bliki30639F
79/bliki/NoDBA.html2013-02-25bliki29644F
80/bliki/FaultyTechniqueDichotomy.html2014-08-06repost27660F
81/articles/bothersome-privacy.html2013-07-25short26666F
82/bliki/CourtesyImplementation.html2014-08-27bliki26667F
83/bliki/DiversityImbalance.html2012-01-11bliki26668F
84/bliki/StoryCounting.html2013-07-16bliki24685F
85/bliki/TransparentCompilation.html2013-02-12bliki18757F
86/bliki/CharityCodeJam.html2012-01-25bliki17767F
87/bliki/ThresholdTest.html2013-09-12bliki16785F
88/bliki/TransMediaApplication.html2012-11-01bliki16786F
89/bliki/CommunalDashboard.html2012-08-22bliki15794F
90/bliki/PresentationSmells.html2012-02-09bliki10870F
91/bliki/ProbabilisticIlliteracy.html2012-11-05bliki10871F
92/bliki/gotoAarhus2012.html2012-10-16bliki9897F
93/bliki/Nexus7.html2013-10-08bliki6979F
94/bliki/API_Copyright.html2013-05-31bliki51008F
95/bliki/IdealTime.html2013-07-16bliki51020F
96/articles/201402-call-congress.html2014-02-11short41051F
97/bliki/Saba.html2013-02-01bliki41081F

The type classification is the same as earlier, except I've added the repost type for reposts of older articles, which I've been doing on 5th and 10th anniversaries. I haven't recorded all of these reposts in this table, as I've not been consistent in tracking their publication.

This table summarizes how many of each type I've published and how many are in the evergreen list.

all2014
typeallevergreenallevergreen
article13844
bliki6410164
books1100
deck6010
nav4221
repost5050
short4131

Looking at this table, I feel less concerned about the lack of evergreen infodecks. I've only published six infodecks, and only one-sixth of bliki posts published in that time have become evergreen. So not having any evergreen decks yet isn't any evidence that the medium is less inclined to become evergreen.

On the other hand the long-form articles do seem to do rather better, although I haven't determined whether this difference is significant.

The Microservices Article

The biggest impact article this year on the site, without any doubt, is the article on Microservices that was written by James Lewis and me. It has immediately become the number 1 article on the site, with a median of 32K views per month, netting 345K in 2015.

More important than any statistics on martinfowler.com, however, is this graph.

Figure 8: Google's plot of interest in the term “microservices”.

We published the article (in installments) during March of 2014 and you see at that time a huge increase in interest in the term as tracked by Google. I'm not claiming that all credit/blame for the microservices hype should be put at our feet, the term has been around for a while - first appearing in our Tech Radar in early 2012. I'm sure the various people talking about the subject would have significantly raised its profile without our contribution, but I do think we had a significant catalytic effect on it.

Sadly it's hard to put the google graph in perspective with other software development trends, so to do so, here is one compared with another term I've tried to help popularize in recent years: “Continuous Delivery”.

Page view counts, and the corresponding google interest level, are interesting measurements of the impact of the article, but fundamentally not those I see as a true measure of the article's value. That would lie in its longer term impact - primarily in how it puts down a reasonable definition of the term, which we hope will help reduce the semantic diffusion that gripped SOA so heavily from the start. Sadly, that's rather harder to plot pretty graphs about.

Word counts and enduring popularity

From time to time I hear that short articles are more popular in our ADD-infected, modern society. Some of the earlier sections suggested this may not be the case, at least once you look to the long term. To dig into this a bit further, I took all the articles (short and long) and bliki posts in the last couple of years (Jan 2012­Sep 2014) and did a scatterplot against recent page views.

Figure 10: Scatterplot comparing word counts of articles published between Jan 2012 and Sep 2014 and their unique page views for Dec 2014. (I removed two outliers, the microservices article (37,249 : 5,746) and the testing culture article (1,207 : 27,596))

If you can see any correlation on this graph, let me know, for I certainly can't. It does reinforce that there seems to be a greater proportion of successful longer articles than short posts, but my statistics skills are too limited to analyze this further.

Contributing Authors

As well as writing articles myself, I'm keen to get articles from others. Many of these contributed articles come from my colleagues in Thoughtworks, but some of them come from other contacts within the profession. Editing articles like this is often considerable work, sometimes it feels like more work than writing them myself, but I think it's important for me to use the platform I have to help amplify other worthwhile voices.

Figure 11: Scatter plot of articles published since 2012 showing their december page views, kind of authorship, and type of article.

Nine articles involving contributors are on the evergreen list.

PathCreditsviewsrank
/articles/microservices.htmlJames Lewis and Martin Fowler323911
/articles/itsNotJustStandingUp.htmlJason Yip596613
/articles/consumerDrivenContracts.htmlIan Robinson251338
/articles/enterpriseREST.htmlBrandon Byars248840
/articles/testing-culture.htmlMike Bland229842
/articles/evodb.htmlMartin Fowler and Pramod Sadalage219945
/articles/asyncJS.htmlPete Hodgson171261
/articles/useOfMetrics.htmlPat Kua158065
/articles/agileFluency.htmlDiana Larsen and James Shore144169

Footnotes

1: There is a wrinkle in this data. My Google analytics reports separately for martinfowler.com and refactoring.com, even though I think of them as the same site. As a result, this visitor figure excludes anyone who visited refactoring.com and did not visit martinfowler.com.

2: 80% of bliki entries are less than 1000 words, with only a dozen more than 1500 words (out of 464 bliki entries).

3: There may be hope for next year, Toby Clemsons's deck on microservice testing has had a very solid first couple of months (both around 14,000 views).

Significant Revisions

28 January 2015: Published to Thoughtworks Town Hall mailing list

13 January 2015: Circulated to Thoughtworks content strategy group