Site Report for 2018
10 July 2019
At the start of 2019, it seems like a good idea to review the state of martinfowler.com. I did a brief review of the site back in 2014, so it's well past time to take another look at the traffic it generates.
Overall traffic
I'll start off the with overall site traffic over the last years
year | monthly views | monthly visits | monthly visitors | total visits | total views |
---|---|---|---|---|---|
2011 | 302,732 | 207,684 | 138,972 | 2,557,703 | 3,671,818 |
2012 | 354,282 | 226,270 | 153,204 | 2,802,101 | 4,238,904 |
2013 | 408,182 | 254,515 | 173,062 | 3,047,046 | 4,848,783 |
2014 | 491,761 | 339,570 | 222,800 | 3,984,246 | 5,855,504 |
2015 | 575,146 | 404,062 | 263,646 | 4,991,161 | 7,058,432 |
2016 | 626,873 | 453,887 | 298,182 | 5,594,010 | 7,657,711 |
2017 | 647,714 | 480,498 | 312,314 | 5,867,257 | 7,916,532 |
2018 | 713,802 | 519,731 | 334,260 | 6,256,374 | 8,457,847 |
Monthly figures are the median month totals for the year. Total figures are the total for the year.
There's been a steady increase in traffic over the last few years.
Looking at it by year provides one perspective, but it's also handy to look at daily views.
This gives a better sense of the day-to-day volatility in the traffic. It also clearly shows a general pattern - the site gets significantly more traffic on weekdays (when people are working) than weekends. It's pretty consistent that traffic drops by about half on weekends.
There's another regular pattern in the traffic here that's harder to see on that graph, but is much more obvious when I only show the weekday views.
There's a notable drop off at the change of year, due to the christmas holidays, which drop weekday traffic down to weekend levels.
Focusing on evergreen articles
Overall traffic numbers are one thing, but are they a good measure of what I really care about? My goal is to write (and publish) articles that are useful to my readership over an extended period of time. I feel I have a success when an article gets a sustained amount of traffic, and so I think it's useful to plot how many of those I have. I've picked 1000 unique page views per month as my round-numbered cut off.
This shows a more troubling trend. There was a rapid increase in such popular articles until around 2016, when things have plataued. That isn't too surprising, as that corresponds to when I started to focus on the refactoring book. Hopefully as I start putting more attention to the website, I can begin to see some of the increase that I saw before 2016.
When I'm looking for articles that get this kind of traffic, I'm looking at articles that have been around a while. Most articles follow a very steep exponential drop off in traffic, getting a lot of traffic in the first few days, then progressively less over time.
Median views versus age of article in weekdays, for all articles launched since 2018
Notice that sharp exponential drop-off is visible even with a square root scale on the y axis!
Although the median article drops below 50 page views a day a month or so after it's published, the articles I'm interested in here are those that don't. (An article that gets 28 views per weekday, roughly corresponds to a 1000 views per month.)
I thus came up with a personal definition of an evergreen article. An article that's had at least one year where their median monthly unique page views is more than 1000, and have had at least four months with views over 1000. If I apply that test to the articles on my site I come up with 170 qualifying articles.
path | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
---|---|---|---|---|---|---|---|---|
/ | 20746 | 19635 | 20590 | 22456 | 25014 | 27853 | 27763 | 30201 |
/aboutMe.html | 3273 | 3280 | 3546 | 3576 | 3600 | 3370 | 3288 | 3786 |
/agile.html | 4104 | 3714 | 4156 | 4018 | 3896 | 3923 | 3847 | 4691 |
/articles.html | 1968 | 1220 | 796 | 518 | 482 | 354 | 64 | 48 |
/articles/201701-event-driven.html | 3314 | 3748 | ||||||
/articles/201708-tw-sale.html | 1911 | 339 | ||||||
/articles/201803-refactoring-2nd-ed.html | 2006 | |||||||
/articles/agile-aus-2018.html | 16243 | |||||||
/articles/agileFluency.html | 1541 | 1970 | 1441 | 1604 | 1441 | 1496 | 3522 | |
/articles/agileOffshore.html | 1748 | 1258 | 1106 | 1071 | 905 | 748 | 494 | 392 |
/articles/apple-notes-restore.html | 1161 | 1302 | 909 | 326 | 180 | |||
/articles/architect-elevator.html | 2194 | 530 | ||||||
/articles/asyncJS.html | 2324 | 1712 | 2364 | 1540 | 714 | 484 | ||
/articles/bigData/ | 198 | 1030 | 187 | 150 | 144 | 86 | 99 | |
/articles/break-monolith-into-microservices.html | 10945 | |||||||
/articles/collection-pipeline/ | 4657 | 1522 | 1605 | 1844 | 2208 | |||
/articles/consumerDrivenContracts.html | 540 | 682 | 653 | 2512 | 4286 | 4596 | 5547 | 5395 |
/articles/continuousIntegration.html | 13439 | 10974 | 11057 | 11412 | 10780 | 10604 | 10278 | 9868 |
/articles/designDead.html | 3353 | 3168 | 3356 | 3205 | 3086 | 1947 | 1949 | 1754 |
/articles/dipInTheWild.html | 1606 | 810 | 793 | 960 | 919 | 900 | ||
/articles/distributed-objects-microservices.html | 1760 | 1000 | 1026 | 856 | 825 | |||
/articles/enterprisePatterns.html | 1036 | 923 | 905 | 1247 | 1244 | 1252 | 1248 | 1402 |
/articles/enterpriseREST.html | 16391 | 2488 | 2368 | 1692 | 1549 | 1214 | ||
/articles/evodb.html | 2605 | 2338 | 2554 | 2198 | 1974 | 1800 | 2914 | 3026 |
/articles/extract-data-rich-service.html | 4350 | |||||||
/articles/feature-toggles.html | 6501 | 8466 | 12780 | |||||
/articles/injection.html | 30212 | 26616 | 29019 | 28946 | 25110 | 24720 | 23528 | 21862 |
/articles/is-tdd-dead/ | 6224 | 3080 | 2246 | 1720 | 1482 | |||
/articles/itsNotJustStandingUp.html | 4646 | 6096 | 5624 | 5966 | 5395 | 8468 | 7578 | 7514 |
/articles/languageWorkbench.html | 1162 | 858 | 636 | 600 | 548 | 470 | 376 | 346 |
/articles/lean-inception/ | 1155 | 1153 | ||||||
/articles/lmax.html | 11982 | 5920 | 5788 | 5327 | 4587 | 3684 | 3503 | 3752 |
/articles/microservice-testing/ | 14506 | 5456 | 8220 | 10759 | 9480 | |||
/articles/microservice-trade-offs.html | 3015 | 2972 | 2975 | 3164 | ||||
/articles/microservices.html | 32391 | 45709 | 48779 | 43557 | 38270 | |||
/articles/mobileImplStrategy.html | 1094 | 421 | 169 | 139 | 82 | 62 | 42 | |
/articles/mocksArentStubs.html | 9760 | 10314 | 11002 | 11554 | 12416 | 11939 | 10748 | 10919 |
/articles/modernMockingTools.html | 2160 | 262 | 244 | 204 | 134 | 98 | 88 | |
/articles/multiMobile/ | 2744 | 1216 | 370 | 178 | 113 | 68 | 39 | |
/articles/newMethodology.html | 7532 | 4480 | 4054 | 3624 | 3692 | 2818 | 2140 | 1830 |
/articles/nonDeterminism.html | 1061 | 830 | 906 | 1104 | 1112 | 1160 | 1260 | 1282 |
/articles/nosqlKeyPoints.html | 1820 | 720 | 502 | 470 | 345 | 241 | 260 | |
/articles/practical-test-pyramid.html | 11192 | |||||||
/articles/products-over-projects.html | 17666 | 3200 | ||||||
/articles/rake.html | 2648 | 2156 | 1889 | 2080 | 1866 | 1190 | 1077 | 980 |
/articles/refactoring-2nd-changes.html | 1444 | |||||||
/articles/refactoring-2nd-ed.html | 10851 | |||||||
/articles/refactoring-dependencies.html | 2605 | 542 | 543 | 521 | ||||
/articles/refactoring-pipelines.html | 2207 | 840 | 870 | 823 | ||||
/articles/refactoring-video-store-js/ | 2634 | 1142 | 814 | |||||
/articles/replaceThrowWithNotification.html | 11672 | 814 | 874 | 891 | 1047 | |||
/articles/richardsonMaturityModel.html | 2490 | 3584 | 4926 | 6854 | 9357 | 10976 | 12346 | 13037 |
/articles/rise-test-impact-analysis.html | 2338 | 606 | ||||||
/articles/serverless.html | 24514 | 19247 | 21276 | |||||
/articles/talk-about-platforms.html | 1314 | |||||||
/articles/testing-culture.html | 2298 | 803 | 584 | 412 | 421 | |||
/articles/useOfMetrics.html | 920 | 1580 | 1401 | 1338 | 964 | 772 | ||
/articles/vagrant-chef-rbenv.html | 1327 | 836 | 264 | 148 | 65 | |||
/articles/web-security-basics.html | 10800 | 5034 | 4404 | |||||
/bliki/ | 2914 | 2684 | 2855 | 2757 | 2839 | 2462 | 1958 | 1646 |
/bliki/AnemicDomainModel.html | 2754 | 3040 | 3464 | 3787 | 4194 | 4529 | 4396 | 4806 |
/bliki/AntiPattern.html | 1006 | 148 | 124 | 138 | ||||
/bliki/BlueGreenDeployment.html | 313 | 544 | 849 | 1903 | 3724 | 6300 | 7164 | 7304 |
/bliki/BoundedContext.html | 2126 | 3916 | 5106 | 6612 | 8450 | |||
/bliki/BranchByAbstraction.html | 207 | 204 | 334 | 1068 | 1174 | 1359 | 1339 | 1650 |
/bliki/BusinessReadableDSL.html | 625 | 893 | 1095 | 1254 | 1316 | 772 | 823 | 510 |
/bliki/CanaryRelease.html | 722 | 1412 | 2803 | 3806 | 5420 | |||
/bliki/CircuitBreaker.html | 2101 | 3583 | 5409 | 7581 | 8850 | |||
/bliki/CodeSmell.html | 320 | 576 | 664 | 696 | 822 | 916 | 811 | 1012 |
/bliki/CommandQuerySeparation.html | 460 | 738 | 780 | 910 | 1013 | 1073 | 1330 | 1524 |
/bliki/ContinuousDelivery.html | 893 | 1675 | 2590 | 3120 | 2953 | 2332 | ||
/bliki/ContinuousIntegrationCertification.html | 1880 | 546 | ||||||
/bliki/ContractTest.html | 1904 | |||||||
/bliki/CQRS.html | 5380 | 6878 | 6903 | 10614 | 14153 | 15796 | 19373 | 21914 |
/bliki/DataLake.html | 1215 | 1228 | 1305 | 946 | ||||
/bliki/DDD_Aggregate.html | 354 | 1014 | 1486 | 1879 | 2292 | 2924 | ||
/bliki/DeploymentPipeline.html | 645 | 1282 | 1496 | 1904 | 1582 | 1428 | ||
/bliki/DevOpsCulture.html | 1017 | 1318 | 1366 | 1408 | ||||
/bliki/DomainSpecificLanguage.html | 1267 | 1012 | 822 | 771 | 748 | 755 | 689 | 591 |
/bliki/FeatureBranch.html | 1426 | 1494 | 1636 | 2037 | 2402 | 2247 | 2360 | 2476 |
/bliki/FeatureToggle.html | 908 | 1356 | 1913 | 2930 | 3842 | 3612 | 2536 | 2047 |
/bliki/FluentInterface.html | 1706 | 1632 | 1892 | 1882 | 1886 | 1820 | 1798 | 1776 |
/bliki/GivenWhenThen.html | 809 | 1168 | 1752 | 2866 | 3424 | 4476 | ||
/bliki/ImmutableServer.html | 878 | 690 | 876 | 1256 | 1176 | 858 | ||
/bliki/index.html | 3578 | 3536 | 274 | 134 | 145 | 72 | 42 | 21 |
/bliki/IntegrationContractTest.html | 105 | 91 | 200 | 288 | 699 | 1042 | 1204 | |
/bliki/IntegrationTest.html | 2741 | |||||||
/bliki/InversionOfControl.html | 1916 | 1761 | 1873 | 1844 | 2370 | 2493 | 2008 | 1986 |
/bliki/MemoryImage.html | 5413 | 255 | 121 | 122 | 116 | 240 | 454 | 339 |
/bliki/MicroservicePremium.html | 2010 | 1398 | 1658 | 1724 | ||||
/bliki/MicroservicePrerequisites.html | 2016 | 1091 | 1217 | 1942 | 2220 | |||
/bliki/MonolithFirst.html | 2997 | 2020 | 2544 | 2948 | ||||
/bliki/NosqlDistilled.html | 1569 | |||||||
/bliki/OrmHate.html | 696 | 754 | 1042 | 1590 | 1519 | 1172 | 1264 | |
/bliki/PageObject.html | 1528 | 2244 | 3147 | 4296 | 4588 | 4100 | ||
/bliki/PolyglotPersistence.html | 5255 | 1876 | 2404 | 2616 | 3052 | 2609 | 2590 | 2311 |
/bliki/PresentationDomainDataLayering.html | 2092 | 579 | 484 | 530 | ||||
/bliki/ReportingDatabase.html | 168 | 370 | 382 | 762 | 846 | 926 | 1052 | 1026 |
/bliki/RulesEngine.html | 485 | 926 | 1182 | 1418 | 1614 | 1839 | 2096 | 1676 |
/bliki/Serverless.html | 1075 | 615 | 470 | |||||
/bliki/ShuHaRi.html | 87 | 131 | 310 | 474 | 809 | 970 | 1121 | 1158 |
/bliki/StranglerApplication.html | 263 | 299 | 464 | 669 | 1173 | 2070 | 2584 | 3321 |
/bliki/TechnicalDebt.html | 1724 | 1486 | 1667 | 1949 | 2055 | 2287 | 2037 | 1964 |
/bliki/TechnicalDebtQuadrant.html | 839 | 682 | 780 | 955 | 1356 | 1359 | 1448 | 1746 |
/bliki/TellDontAsk.html | 822 | 870 | 1139 | 1374 | 1615 | 1841 | ||
/bliki/TestCoverage.html | 761 | 704 | 929 | 1210 | 1522 | 1534 | 1688 | |
/bliki/TestDouble.html | 336 | 347 | 498 | 742 | 1102 | 1390 | 1645 | 2176 |
/bliki/TestPyramid.html | 630 | 1150 | 2285 | 3127 | 4498 | 6484 | 6784 | |
/bliki/TolerantReader.html | 86 | 54 | 49 | 1520 | 2318 | 2087 | 2053 | 1680 |
/bliki/TwoHardThings.html | 396 | 840 | 2330 | 3159 | 4330 | 4470 | 4462 | 4888 |
/bliki/UbiquitousLanguage.html | 34 | 119 | 492 | 1192 | 897 | 1135 | 1418 | 1792 |
/bliki/UnitTest.html | 1637 | 1612 | 1836 | 1978 | 2119 | |||
/bliki/ValueObject.html | 182 | 694 | 648 | 970 | 1240 | 1314 | 2156 | 2308 |
/bliki/Yagni.html | 2374 | 1790 | 2235 | 2448 | ||||
/books.html | 15956 | 8319 | ||||||
/books/ | 4276 | 4028 | 2589 | 2368 | 2434 | 2257 | 2159 | |
/books/buying.html | 1248 | 1256 | 1113 | 1114 | 948 | 930 | 934 | |
/books/continuousDelivery.html | 466 | 822 | 1188 | 1788 | 1782 | 1723 | 1543 | |
/books/dsl.html | 1364 | 1762 | 1961 | 2107 | 1884 | 1968 | 2016 | |
/books/eaa.html | 6521 | 7431 | 7666 | 7546 | 6890 | 6446 | 5960 | |
/books/nosql.html | 2792 | 2536 | 2038 | 1904 | 1130 | 892 | 778 | |
/books/refactoring.html | 1214 | 1642 | 2942 | 3302 | 3599 | 3806 | 4602 | |
/delivery.html | 1394 | 1964 | 2129 | 2466 | 2959 | 1707 | 1364 | 1282 |
/design.html | 5592 | 5424 | 6640 | 7172 | 6862 | 6962 | 7278 | 7614 |
/dsl.html | 2908 | 2230 | 2227 | 2069 | 1943 | 522 | 464 | 410 |
/eaaCatalog/ | 5715 | 5830 | 5678 | 5526 | 5184 | 5143 | 4898 | 4450 |
/eaaCatalog/activeRecord.html | 1515 | 1600 | 1678 | 1792 | 1650 | 1507 | 1378 | 1216 |
/eaaCatalog/classTableInheritance.html | 649 | 877 | 1012 | 940 | 960 | 872 | 820 | 694 |
/eaaCatalog/dataMapper.html | 2888 | 2917 | 2866 | 2532 | 2412 | 2235 | 2004 | 1608 |
/eaaCatalog/dataTransferObject.html | 1645 | 1895 | 2277 | 2537 | 2878 | 2926 | 2935 | 2906 |
/eaaCatalog/domainModel.html | 2407 | 2526 | 2508 | 2493 | 2501 | 2700 | 2625 | 2507 |
/eaaCatalog/frontController.html | 1040 | 976 | 762 | 623 | 536 | 486 | 451 | 368 |
/eaaCatalog/index.html | 2890 | 2718 | 2660 | 2798 | 2586 | 2329 | 2412 | 2030 |
/eaaCatalog/repository.html | 3768 | 4569 | 4620 | 4658 | 5216 | 5586 | 5743 | 5032 |
/eaaCatalog/serviceLayer.html | 1820 | 1772 | 1898 | 1834 | 2138 | 2138 | 2054 | 1806 |
/eaaCatalog/singleTableInheritance.html | 1057 | 1242 | 1378 | 1402 | 1342 | 1181 | 1081 | 862 |
/eaaCatalog/tableDataGateway.html | 1626 | 1390 | 1130 | 964 | 887 | 794 | 743 | 606 |
/eaaCatalog/transactionScript.html | 1282 | 1408 | 1534 | 1606 | 1524 | 1643 | 1722 | 1701 |
/eaaCatalog/twoStepView.html | 1292 | 1132 | 776 | 658 | 474 | 356 | 293 | 216 |
/eaaCatalog/unitOfWork.html | 3288 | 3926 | 4120 | 4234 | 4002 | 4222 | 3933 | 3325 |
/eaaDev/ | 810 | 780 | 625 | 751 | 1116 | 1054 | 1107 | 1092 |
/eaaDev/AuditLog.html | 456 | 649 | 550 | 580 | 327 | 255 | 750 | 1236 |
/eaaDev/DomainEvent.html | 438 | 390 | 412 | 552 | 592 | 705 | 1096 | 1152 |
/eaaDev/EventAggregator.html | 982 | 1040 | 1132 | 1012 | 1004 | 950 | 942 | 942 |
/eaaDev/EventCollaboration.html | 517 | 507 | 344 | 668 | 742 | 980 | 1154 | 1197 |
/eaaDev/EventNarrative.html | 120 | 124 | 116 | 144 | 200 | 878 | 1155 | 1151 |
/eaaDev/EventSourcing.html | 2591 | 3628 | 4046 | 5828 | 7549 | 10412 | 12928 | 16230 |
/eaaDev/ModelViewPresenter.html | 1758 | 1390 | 1156 | 867 | 706 | 514 | 458 | 336 |
/eaaDev/Notification.html | 1004 | 955 | 248 | 165 | 316 | 302 | 254 | 274 |
/eaaDev/PassiveScreen.html | 2340 | 2011 | 1765 | 1468 | 1306 | 1248 | 1520 | 1286 |
/eaaDev/PresentationModel.html | 4407 | 3760 | 3232 | 3047 | 3356 | 2215 | 2112 | 1778 |
/eaaDev/SupervisingPresenter.html | 2203 | 1770 | 1625 | 1330 | 1203 | 944 | 786 | 610 |
/eaaDev/timeNarrative.html | 680 | 653 | 652 | 762 | 1065 | 922 | 892 | 840 |
/eaaDev/uiArchs.html | 7366 | 7840 | 6709 | 7450 | 7590 | 6741 | 5758 | 4506 |
/intro.html | 3648 | 3695 | 3979 | 4044 | 3928 | 3878 | 4060 | 4496 |
/microservices/ | 10470 | 8194 | 9023 | 7518 | ||||
/nosql.html | 4123 | 6534 | 5645 | 5182 | 2019 | 1110 | 904 | |
/photos/109.html | 1107 | |||||||
/photos/112.html | 1517 | |||||||
/refactoring/ | 6585 | 7740 | 7798 | 7560 | 8308 | 7548 | 8175 | |
/refactoring/catalog/ | 832 | 1183 | 3504 | 3398 | 4102 | 4001 | 3749 | |
/refactoring/catalog/extractMethod.html | 722 | 854 | 950 | 1134 | 1174 | 1210 | 1223 | |
/refactoring/catalog/index.html | 3057 | 3359 | 761 | 591 | 409 | 318 | 302 | |
/refactoring/catalog/replaceConditionalWithPolymorphism.html | 665 | 742 | 718 | 797 | 1093 | 1187 | 1201 | |
/refactoring/catalog/replaceNestedConditionalWithGuardClauses.html | 300 | 368 | 594 | 812 | 1006 | 1532 | 1698 | |
/refactoring/catalog/replaceRecursionWithIteration.html | 501 | 616 | 836 | 1183 | 1372 | 1084 | 1059 | |
/refactoring/sources.html | 1765 | 2118 | ||||||
/tags/API design.html | 336 | 374 | 542 | 837 | 924 | 1068 | 1314 | 962 |
/tags/domain driven design.html | 143 | 170 | 473 | 1502 | 2240 | 2892 | 3373 | 3012 |
/videos.html | 3504 | 3660 | 3892 | 3540 |
Each year shows the median monthly unique page views for that year, colored green if over 1000.
Other Authors
With so much of my attention being on the refactoring book in the last two years, much of what's been published on martinfowler.com has been articles written by others. These still take a fair bit of my time - I act as developmental editor and can spend a good hunk of time working on these articles.
As I look to return to the site, a reasonable question is whether there a difference between articles written by others, and those done by me.
To examine this, I took all the articles launched between 2011 and 2017, and divided them into those written with me (as the author or one of the authors) and those written by others. I then plotted their monthly median views in 2018.
I chopped the y axis at 5000 page views a month, so the handful of outliers that got more traffic than that don't squash the box plots down so you can't read them. The data still informs the box plot markers.
As you can see, articles written by others do better than mine on average, with the median article written by others getting 586 views compared to my 167. Of the articles during this period 26 of mine average over 1000 views per month, and 10 from other authors. There's plenty of selection bias here, of course. We put a lot of work into all the articles done by others, while many of mine are more casual, leading to many of my articles having low page view counts. But I can conclude from this that working with other people to publish articles on martinfowler.com is worth the effort compared to focusing my energies solely on my own writing.
Topic Pages
As part of preparing to update the navigation menu on my site, I thought I'd look at the popularity of various topic pages.
I don't want to read too much into this, as it's a rather narrow data point. There are currently three tiers of popularity. The refactoring, design, and microservices pages are in the top band. (Although the microservices one seems to be falling to the second band.) The second band is the agile, site intro, and about pages. The bottom trio is the delivery, DSL, and NoSQL pages, the latter of which saw a big bump in 2014 and then a steady drop.
Age of Evergreens
One of the important things to remember about this site is that many of the popular articles are older. Here's a look at the dates of publication of pages that were evergreen in 2018.
year | count |
---|---|
2000 | 6 |
2003 | 14 |
2004 | 3 |
2005 | 6 |
2006 | 9 |
2009 | 3 |
2010 | 3 |
2011 | 6 |
2012 | 8 |
2013 | 7 |
2014 | 15 |
2015 | 7 |
2016 | 4 |
2017 | 3 |
2018 | 9 |
38 of these 103 pages are were first published over a decade ago. (I removed the navigation pages, such as the home page, from this list.)
Significant Revisions
10 July 2019: Added age of evergreens
11 April 2019: Added topics graph
07 March 2019: First released