Status Report for martinfowler.com at the end 2014

:

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]

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.

rank path type median num launch date
1 /articles/microservices.html article 32,391 10 2014-03-10
2 /articles/injection.html article 28,946 12
3 / nav 22,456 12
4 /articles/mocksArentStubs.html article 11,555 12
5 /articles/continuousIntegration.html article 11,412 12
6 /bliki/CQRS.html bliki 10,614 12
7 /refactoring/ nav 7,798 12
8 /books/eaa.html books 7,667 12
9 /eaaDev/uiArchs.html article 7,450 12
10 /design.html nav 7,172 12
11 /articles/richardsonMaturityModel.html article 6,854 12
12 /articles/is-tdd-dead/ nav 6,225 8 2014-05-19
13 /articles/itsNotJustStandingUp.html article 5,966 12
14 /eaaDev/EventSourcing.html article 5,828 12
15 /nosql.html nav 5,645 12 2012-08-22
16 /eaaCatalog/ catalog 5,527 12
17 /articles/lmax.html article 5,327 12 2011-07-12
18 /eaaCatalog/repository.html catalog 4,658 12
19 /articles/collection-pipeline/ article 4,657 6 2014-07-21
20 /eaaCatalog/unitOfWork.html catalog 4,235 12
21 /intro.html nav 4,045 12
22 /agile.html nav 4,019 12
23 /bliki/AnemicDomainModel.html bliki 3,787 12
24 /articles/newMethodology.html article 3,624 12
25 /aboutMe.html nav 3,577 12
26 /refactoring/catalog/ catalog 3,504 12
27 /articles/designDead.html article 3,205 12
28 /bliki/TwoHardThings.html bliki 3,159 12
29 /eaaDev/PresentationModel.html article 3,047 12
30 /books/refactoring.html books 2,942 12
31 /bliki/FeatureToggle.html bliki 2,930 12
32 /eaaCatalog/index.html catalog 2,799 12
33 /bliki/ nav 2,757 12
34 /bliki/PolyglotPersistence.html bliki 2,617 12 2011-11-16
35 /books/ nav 2,589 12
36 /eaaCatalog/dataTransferObject.html catalog 2,537 12
37 /eaaCatalog/dataMapper.html catalog 2,532 12
38 /articles/consumerDrivenContracts.html article 2,513 10
39 /eaaCatalog/domainModel.html catalog 2,493 12
40 /articles/enterpriseREST.html article 2,488 12 2013-10-21
41 /delivery.html nav 2,466 12
42 /articles/testing-culture.html article 2,298 8 2014-05-12
43 /bliki/TestPyramid.html bliki 2,285 12
44 /bliki/PageObject.html bliki 2,244 12 2013-09-10
45 /articles/evodb.html article 2,199 12
46 /bliki/BoundedContext.html bliki 2,127 12
47 /bliki/CircuitBreaker.html bliki 2,101 10 2014-03-06
48 /articles/rake.html article 2,080 12
49 /dsl.html nav 2,069 12
50 /books/nosql.html books 2,038 12 2012-08-17
51 /bliki/FeatureBranch.html bliki 2,037 12
52 /bliki/MicroservicePrerequisites.html bliki 2,016 5 2014-08-28
53 /books/dsl.html books 1,961 12
54 /bliki/TechnicalDebt.html bliki 1,949 12
55 /bliki/BlueGreenDeployment.html bliki 1,903 12
56 /bliki/FluentInterface.html bliki 1,882 12
57 /bliki/InversionOfControl.html bliki 1,844 12
58 /eaaCatalog/serviceLayer.html catalog 1,835 12
59 /eaaCatalog/activeRecord.html catalog 1,792 12
60 /articles/distributed-objects-microservices.html short 1,760 5 2014-08-13
61 /articles/asyncJS.html article 1,712 12 2013-09-03
62 /bliki/ContinuousDelivery.html bliki 1,675 12 2013-05-30
63 /bliki/UnitTest.html bliki 1,637 8 2014-05-05
64 /eaaCatalog/transactionScript.html catalog 1,606 12
65 /articles/useOfMetrics.html article 1,580 10 2013-02-19
66 /bliki/TolerantReader.html bliki 1,521 10
67 /tags/domain driven design.html nav 1,502 10
68 /eaaDev/PassiveScreen.html article 1,469 12
69 /articles/agileFluency.html article 1,441 12 2012-08-08
70 /bliki/RulesEngine.html bliki 1,418 12
71 /eaaCatalog/singleTableInheritance.html catalog 1,403 12
72 /eaaDev/SupervisingPresenter.html article 1,330 12
73 /articles/vagrant-chef-rbenv.html article 1,327 4 2014-09-04
74 /bliki/DeploymentPipeline.html bliki 1,283 9 2013-05-30
75 /bliki/BusinessReadableDSL.html bliki 1,255 12
76 /articles/enterprisePatterns.html catalog 1,247 12
77 /bliki/UbiquitousLanguage.html bliki 1,193 10
78 /books/continuousDelivery.html books 1,188 9
79 /bliki/GivenWhenThen.html bliki 1,169 10 2013-08-21
80 /books/buying.html books 1,113 10
81 /articles/nonDeterminism.html article 1,104 9 2011-04-14
82 /articles/agileOffshore.html article 1,071 7
83 /bliki/BranchByAbstraction.html bliki 1,069 8 2014-01-07
84 /bliki/OrmHate.html bliki 1,043 8 2012-05-08
85 /bliki/DDD_Aggregate.html bliki 1,014 8 2013-04-23
86 /eaaDev/EventAggregator.html article 1,012 8

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
  • 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]


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.

path launch date type dec views rank evergreen?
1 /articles/microservices.html 2014-03-10 article 37,249 1 T
2 /nosql.html 2012-08-22 nav 5,248 15 T
3 /articles/is-tdd-dead/ 2014-05-19 nav 3,890 23 T
4 /bliki/OrmHate.html 2012-05-08 bliki 2,667 36 T
5 /bliki/PageObject.html 2013-09-10 bliki 2,329 45 T
6 /bliki/TestCoverage.html 2012-04-17 bliki 2,288 47 F
7 /articles/enterpriseREST.html 2013-10-21 article 2,217 50 T
8 /bliki/CircuitBreaker.html 2014-03-06 bliki 2,114 54 T
9 /books/nosql.html 2012-08-17 books 2,008 55 T
10 /articles/agileFluency.html 2012-08-08 article 1,989 56 T
11 /articles/collection-pipeline/ 2014-07-21 article 1,856 62 T
12 /articles/asyncJS.html 2013-09-03 article 1,735 66 T
13 /bliki/ContinuousDelivery.html 2013-05-30 bliki 1,631 68 T
14 /bliki/UnitTest.html 2014-05-05 bliki 1,618 69 T
15 /articles/useOfMetrics.html 2013-02-19 article 1,568 70 T
16 /bliki/DeploymentPipeline.html 2013-05-30 bliki 1,326 77 T
17 /bliki/GivenWhenThen.html 2013-08-21 bliki 1,293 78 T
18 /bliki/MicroservicePrerequisites.html 2014-08-28 bliki 1,269 79 T
19 /articles/testing-culture.html 2014-05-12 article 1,207 82 T
20 /articles/vagrant-chef-rbenv.html 2014-09-04 article 1,146 84 T
21 /bliki/DDD_Aggregate.html 2013-04-23 bliki 1,134 85 T
22 /articles/distributed-objects-microservices.html 2014-08-13 short 1,075 94 T
23 /bliki/TellDontAsk.html 2013-09-05 bliki 1,029 96 F
24 /bliki/BranchByAbstraction.html 2014-01-07 bliki 922 102 T
25 /bliki/ImmutableServer.html 2013-06-13 bliki 776 113 F
26 /bliki/CanaryRelease.html 2014-06-25 bliki 743 118 F
27 /bliki/ReportingDatabase.html 2014-04-02 bliki 743 119 F
28 /articles/dipInTheWild.html 2013-05-01 article 701 125 F
29 /articles/workflowsOfRefactoring/ 2014-01-08 deck 684 128 F
30 /bliki/SnowflakeServer.html 2012-07-10 bliki 652 131 F
31 /bliki/SelfTestingCode.html 2014-05-01 bliki 613 138 F
32 /bliki/CannotMeasureProductivity.html 2013-08-29 bliki 588 141 F
33 /bliki/StranglerApplication.html 2014-06-30 repost 546 150 F
34 /bliki/PhoenixServer.html 2012-07-10 bliki 501 162 F
35 /articles/schemaless/ 2013-01-07 deck 460 172 F
36 /bliki/FlaccidScrum.html 2014-01-29 bliki 459 173 F
37 /bliki/AggregateOrientedDatabase.html 2012-01-19 bliki 458 174 F
38 /articles/nosqlKeyPoints.html 2012-09-12 nav 425 180 F
39 /bliki/SegregatedDOM.html 2014-01-16 bliki 351 199 F
40 /bliki/ParallelChange.html 2014-05-13 bliki 326 205 F
41 /articles/badri-hexagonal/ 2014-06-05 nav 305 212 F
42 /bliki/MaturityModel.html 2014-08-26 bliki 284 216 F
43 /articles/eurogames/ 2013-10-02 article 282 217 F
44 /articles/go-interview.html 2014-03-25 short 263 225 F
45 /articles/multiMobile/ 2012-06-19 deck 237 235 F
46 /articles/bigQueryPOC.html 2012-09-04 article 231 238 F
47 /bliki/UserDefinedField.html 2013-07-23 bliki 218 246 F
48 /bliki/OpportunisticRefactoring.html 2014-07-30 bliki 197 263 F
49 /bliki/Datensparsamkeit.html 2013-12-12 bliki 190 266 F
50 /bliki/UserStory.html 2013-04-22 bliki 178 275 F
51 /articles/modernMockingTools.html 2012-09-10 article 162 286 F
52 /bliki/PurposeOfEstimation.html 2013-02-27 bliki 162 288 F
53 /bliki/BroadStackTest.html 2013-04-22 bliki 160 290 F
54 /bliki/InternalReprogrammability.html 2013-01-10 bliki 159 292 F
55 /bliki/NosqlDefinition.html 2012-01-09 bliki 138 326 F
56 /articles/bigData/ 2013-01-29 deck 128 350 F
57 /articles/gap-scms-po/ 2013-04-23 deck 124 357 F
58 /bliki/ComponentTest.html 2013-04-22 bliki 123 359 F
59 /articles/mobileImplStrategy.html 2012-05-21 article 111 372 F
60 /bliki/ComposedRegex.html 2014-07-31 repost 104 384 F
61 /bliki/EnterpriseApplication.html 2014-03-24 bliki 102 389 F
62 /bliki/SoftwareDevelopmentAttitude.html 2014-03-11 bliki 101 391 F
63 /bliki/ExtremeProgramming.html 2013-07-11 bliki 96 400 F
64 /bliki/BusinessFacingTest.html 2013-04-23 bliki 89 417 F
65 /bliki/ExpositionalArchitecture.html 2013-04-23 bliki 89 419 F
66 /bliki/JavascriptPromise.html 2013-04-22 bliki 88 421 F
67 /bliki/PrimingPrimeDirective.html 2012-10-23 bliki 79 446 F
68 /articles/eliminatingSalesCommissions/ 2013-02-18 deck 73 459 F
69 /bliki/EmbeddedDocument.html 2013-06-04 bliki 71 466 F
70 /bliki/UserJourneyTest.html 2013-04-23 bliki 56 510 F
71 /bliki/PreferFunctionalStaffOrganization.html 2014-08-04 repost 52 522 F
72 /bliki/ThrownEstimate.html 2014-06-26 repost 46 543 F
73 /bliki/HistoricallyDiscriminatedAgainst.html 2013-10-10 bliki 43 554 F
74 /bliki/StoryPoint.html 2013-07-16 bliki 42 561 F
75 /bliki/AlienatingAtmosphere.html 2014-02-11 bliki 40 568 F
76 /bliki/CloudComputing.html 2013-07-11 bliki 38 582 F
77 /bliki/StoryTest.html 2013-04-23 bliki 33 617 F
78 /bliki/ConfigurationSynchronization.html 2013-06-13 bliki 30 639 F
79 /bliki/NoDBA.html 2013-02-25 bliki 29 644 F
80 /bliki/FaultyTechniqueDichotomy.html 2014-08-06 repost 27 660 F
81 /articles/bothersome-privacy.html 2013-07-25 short 26 666 F
82 /bliki/CourtesyImplementation.html 2014-08-27 bliki 26 667 F
83 /bliki/DiversityImbalance.html 2012-01-11 bliki 26 668 F
84 /bliki/StoryCounting.html 2013-07-16 bliki 24 685 F
85 /bliki/TransparentCompilation.html 2013-02-12 bliki 18 757 F
86 /bliki/CharityCodeJam.html 2012-01-25 bliki 17 767 F
87 /bliki/ThresholdTest.html 2013-09-12 bliki 16 785 F
88 /bliki/TransMediaApplication.html 2012-11-01 bliki 16 786 F
89 /bliki/CommunalDashboard.html 2012-08-22 bliki 15 794 F
90 /bliki/PresentationSmells.html 2012-02-09 bliki 10 870 F
91 /bliki/ProbabilisticIlliteracy.html 2012-11-05 bliki 10 871 F
92 /bliki/gotoAarhus2012.html 2012-10-16 bliki 9 897 F
93 /bliki/Nexus7.html 2013-10-08 bliki 6 979 F
94 /bliki/API_Copyright.html 2013-05-31 bliki 5 1008 F
95 /bliki/IdealTime.html 2013-07-16 bliki 5 1020 F
96 /articles/201402-call-congress.html 2014-02-11 short 4 1051 F
97 /bliki/Saba.html 2013-02-01 bliki 4 1081 F

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.

all 2014
type all evergreen all evergreen
article 13 8 4 4
bliki 64 10 16 4
books 1 1 0 0
deck 6 0 1 0
nav 4 2 2 1
repost 5 0 5 0
short 4 1 3 1

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.

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.

Path Credits views rank
/articles/microservices.html James Lewis and Martin Fowler 32,391 1
/articles/itsNotJustStandingUp.html Jason Yip 5,966 13
/articles/consumerDrivenContracts.html Ian Robinson 2,513 38
/articles/enterpriseREST.html Brandon Byars 2,488 40
/articles/testing-culture.html Mike Bland 2,298 42
/articles/evodb.html Martin Fowler and Pramod Sadalage 2,199 45
/articles/asyncJS.html Pete Hodgson 1,712 61
/articles/useOfMetrics.html Pat Kua 1,580 65
/articles/agileFluency.html Diana Larsen and James Shore 1,441 69

For articles on similar topics…

…take a look at the tag: website