pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rev="made" href="mailto:esr@snark.thyrsus.com" />
<meta name="description"
content="Fetchmail participation statistics" />
<meta name="keywords" content="fetchmail, growth, analysis" />
<title>Trends in the fetchmail project's growth</title>
<style type="text/css">
/*<![CDATA[*/
span.c6 {color: brown}
span.c5 {color: red}
span.c4 {color: lime}
span.c3 {color: blue}
div.c2 {text-align: center}
h1.c1 {text-align: center}
/*]]>*/
</style>
</head>
<body>
<table width="100%" cellpadding="0" summary="Canned page header">
<tr>
<td width="30%" align="right">$Date$</td>
</tr>
</table>
<hr />
<h1 class="c1">Trends in the fetchmail project's growth</h1>
<p>The scattergram below was made with Gnuplot 3.7 from data pulled
directly out of the project NEWS file using two custom
shellscripts, <a href="timeseries">timeseries</a> and <a
href="growthplot">growthplot</a>. If you see a broken-image icon,
upgrade to a <a
href="http://www.libpng.org/pub/png/pngapbr.html">browser that can
view PNGs</a>.</p>
<div class="c2"><img src="growth.png"
alt="Fetchmail trends graph" /></div>
<p>The graph shows the population growth of the fetchmail project.
The horizontal scale is days since baseline, which is when I
started collecting statistics in October 1996 at version 1.9.0.
Left vertical scale is number of participants. There is one data
point for each release; therefore, the changes in density of marks
indicate release frequency.</p>
<p>The peak in the earliest part of the graph (before the note "Bad
addresses dropped") seems to be an artifact; I was not regularly
dropping addresses that became invalid at the time. Turnover on the
list seems to be about 5% per month (but that's just my estimate, I
don't have numbers on this).</p>
<p>The <span class="c3">blue scatter of squares</span> is total
participants. The <span class="c4">green scatter of crosses</span>
is the count of people on fetchmail-friends after I split the list.
The <span class="c5">cyan scatter of diamonds</span> is the
population of fetchmail-announce after the split.</p>
<p>The <span class="c6">brown scatter of diamonds</span> tracks
project size in lines of code (right vertical axis). The scale
relationship between this scatter and the other three is
arbitrary.</p>
<p>This graph is quite revealing. Several trends stand out:</p>
<ul>
<li>
<p>Over time, the project population displays rather consistent
linear growth.</p>
</li>
<li>
<p>The key event in the project's lifetime was release 4.3.0 in
October 1997, when I declared the code to be out of development and
in maintainance mode, and split the fetchmail list.</p>
</li>
<li>
<p>The run-up to 4.3.0 saw the most intensive spate of releases in
the project's history (the gap in that run happened when I took a
two-week vacation). It was followed by a significant slowdown.</p>
</li>
<li>
<p>After 4.3.0, the developer population remained fairly stable
around an average of about 250 participants.</p>
</li>
<li>
<p>Essentially all population growth after 4.3.0 happened on the
announce list, among people using fetchmail but not active
co-developers.</p>
</li>
<li>
<p>The growth trend in code size looks sublinear, perhaps
logarithmic.</p>
</li>
</ul>
<p>The linear growth trend in population is particularly
interesting; a priori we might expect geometric or logistic growth,
given that the project spreads by word of mouth.</p>
<p>It has been suggested that the linear growth rate is the result
of a situation in which both number of projects and the population
of eligible programmers are rising on trend curves of the same
(probably exponential) rate.</p>
<hr />
<table width="100%" cellpadding="0" summary="Canned page header">
<tr>
<td width="30%" align="right">$Date$</td>
</tr>
</table>
<br clear="left" />
<address>Eric S. Raymond <a
href="mailto:esr@thyrsus.com"><esr@thyrsus.com></a></address>
</body>
</html>