doc/en_US.ISO8859-1/books/dev-model/book.sgml
2004-04-11 08:38:42 +00:00

2690 lines
128 KiB
Text

<!--
- Copyright (c) 2002-2003 Niklas Saers
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- $FreeBSD$
-->
<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % bookinfo PUBLIC "-//FreeBSD//ENTITIES DocBook BookInfo Entities//EN">
%bookinfo;
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
%man;
<!ENTITY % freebsd PUBLIC "-//FreeBSD//ENTITIES DocBook Miscellaneous FreeBSD Entities//EN">
%freebsd;
<!ENTITY % chapters SYSTEM "chapters.ent">
%chapters;
<!ENTITY % chap.index "IGNORE">
]>
<book>
<bookinfo>
<title>A project model for the FreeBSD Project</title>
<author>
<firstname>Niklas</firstname>
<surname>Saers</surname>
</author>
<copyright>
<year>2002, 2003</year>
<holder>Niklas Saers</holder>
</copyright>
<revhistory>
<revision>
<revnumber>1.0</revnumber>
<date>December 4th, 2003</date>
<revremark>Ready for commit to FreeBSD Documentation</revremark>
</revision>
<revision>
<revnumber>0.7</revnumber>
<date>April 7th, 2003</date>
<revremark>Release for review by the Documentation team</revremark>
</revision>
<revision>
<revnumber>0.6</revnumber>
<date>March 1st, 2003</date>
<revremark>Incorporated corrections noted by
interviewees and reviewers</revremark>
</revision>
<revision>
<revnumber>0.5</revnumber>
<date>February 1st, 2003</date>
<revremark>Initial review by interviewees</revremark>
</revision>
</revhistory>
</bookinfo>
<preface>
<title>Foreword</title>
<para>
Up until now, the FreeBSD project has released a number of
described techniques to do different parts of work. However,
a project model summarising how the project is structured is needed
because of the increasing amount of project members.
<footnote>
<para>
This goes hand-in-hand with Brooks' law that <quote>adding
another person to a late project will make it later</quote>
since it will increase the communication needs <xref linkend="brooks">.
A project model
is a tool to reduce the communication needs.
</para>
</footnote>
This paper
will provide such a project model and is donated to the
FreeBSD Documentation project where it can evolve together with
the project so that it can at any point in time reflect the way
the project works. It is based on <citation><xref linkend="thesis"></citation>.
</para>
<para>
I would like to thank the following people for taking the time
to explain things that were unclear to me and for proofreading
the document.</para>
<itemizedlist>
<listitem><para>Andrey A. Chernov <email>ache@freebsd.org</email></para></listitem>
<listitem><para>Bruce A. Mah <email>bmah@freebsd.org</email></para></listitem>
<listitem><para>Dag-Erling Sm&oslash;rgrav <email>des@freebsd.org</email></para></listitem>
<listitem><para>Giorgos Keramidas<email>keramida@freebsd.org</email></para></listitem>
<listitem><para>Ingvil Hovig <email>ingvil.hovig@skatteetaten.no</email></para></listitem>
<listitem><para>Jesper Holck<email>jeh.inf@cbs.dk</email></para></listitem>
<listitem><para>John Baldwin <email>jhb@freebsd.org</email></para></listitem>
<listitem><para>John Polstra <email>jdp@freebsd.org</email></para></listitem>
<listitem><para>Kirk McKusick <email>mckusick@freebsd.org</email></para></listitem>
<listitem><para>Mark Linimon <email>linimon@freebsd.org</email></para></listitem>
<listitem><para>Marleen Devos</para></listitem>
<listitem><para>Niels J&oslash;rgenssen<email>nielsj@ruc.dk</email></para></listitem>
<listitem><para>Nik Clayton <email>nik@freebsd.org</email></para></listitem>
<listitem><para>Poul-Henning Kamp <email>phk@freebsd.org</email></para></listitem>
<listitem><para>Simon L. Nielsen <email>simon@freebsd.org</email></para></listitem>
</itemizedlist>
</preface>
<chapter id="overview">
<title>Overview</title>
<para>
A project model is a means to reduce the communications overhead in
a project. As shown by <citation><xref linkend="brooks"></citation>, increasing the
number of project participants increases the communication in the
project exponentionally. FreeBSD has during the past few year
increased both its mass of active users and committers, and the
communication in the project has risen accordingly. This project
model will serve to reduce this overhead by providing an up-to-date
description of the project.
</para>
<para>
During the Core elections in 2002, Mark Murray stated
<quote>I am opposed
to a long rule-book, as that satisfies lawyer-tendencies, and is
counter to the technocentricity that the project so badly
needs.</quote>
<citation><xref linkend="bsd-election2002"></citation>.
This project model is not meant to be a tool to
justify creating impositions for developers, but as a tool to
facilitate coordination.
It is meant as a
description of the project, with an overview of how the different
processes are executed.
It is an introduction to how the FreeBSD
project works.
</para>
<para>
The FreeBSD project model will be described as of
April 1st, 2003. It is based on the Niels J&oslash;rgensen's paper
<citation><xref linkend="jorgensen2001"></citation>,
FreeBSD's official documents,
discussions on FreeBSD mailing lists and interviews with
developers.
</para>
<para>
After providing definitions of terms used, this document will outline
the organisational structure (including role descriptions and
communication lines),
discuss the methodology model and after presenting the
tools used for process control, it will present the defined
processes. Finally it will outline major sub-projects of the
FreeBSD project.
</para>
<para>
<citation><xref
linkend="freebsd-developer-handbook">, Section 1.2 and 1.3</citation>
give the vision and the architectural guidelines for the
project. The vision is <quote>To produce the best UNIX-like
operating system package possible, with due respect to the
original software tools ideology as well as usability,
performance and stability.</quote> The architectural
guidelines help determine whether a problem that someone wants
to be solved is within the scope of the project
</para>
</chapter>
<chapter>
<title>Definitions</title>
<section id="ref-activity" xreflabel="">
<title>Activity</title>
<para>
An <quote>activity</quote> is an element of work performed
during the course of a project <citation><xref linkend="ref-pmbok"></citation>.
It has an output and
leads towards an outcome.
Such an output can either be an input to another
activity or a part of the process' delivery.
</para>
</section>
<section id="def-process" xreflabel="">
<title>Process</title>
<para>
A <quote>process</quote> is a series of activities
that lead towards a particular outcome. A process can
consist of one or more sub-processes. An example of a process is software
design.
</para>
</section>
<section id="ref-hat" xreflabel="Hat">
<title>Hat</title>
<para>
A <quote>hat</quote> is synonymous with role. A hat has
certain responsibilities in a process and for the process
outcome. The hat executes activities. It is well defined what
issues the hat should be contacted about by the project
members and people outside the project.
</para>
</section>
<section id="ref-outcome" xreflabel="Outcome">
<title>Outcome</title>
<para>
An <quote>outcome</quote> is the final output of the process.
This is synonymous with deliverable, that is defined as
<quote>any measurable, tangible, verifiable outcome, result or
item that must be produced to complete a project or part of a
project. Often used more narrowly in reference to an external
deliverable, which is a deliverable that is subject to approval
by the project sponsor or customer</quote> by <citation><xref
linkend="ref-pmbok"></citation>.
Examples of
outcomes are a piece of software, a decision made or a
report written.
</para>
</section>
<section id="ref-freebsd" xreflabel="">
<title>FreeBSD</title>
<para>
When saying <quote>FreeBSD</quote> we will mean the BSD
derivative UNIX-like operating system
FreeBSD, whereas when saying <quote>the FreeBSD
Project</quote> we will mean the project organisation.
</para>
</section>
</chapter>
<chapter id="model-orgstruct">
<title>Organisational structure</title>
<para>
While no-one takes ownership of FreeBSD, the FreeBSD
organisation is divided into core, committers and contributors
and is part of the FreeBSD community that lives around it.
</para>
<para>
<figure>
<title>The FreeBSD Project's structure</title>
<graphic fileref="figures/orghierarchy.png" format="PNG">
</figure>
</para>
<para>
Number of committers has been determined by going through
CVS logs from December 1st, 2001 to December 1st, 2002 and
contributors by going through the list of contributions and
problem reports.
</para>
<para>
The main resource in the FreeBSD community is its developers: the
committers and contributors. It is with their contributions that the
project can move forward. Regular developers are referred to as contributors.
As by January 1st, 2003, there are an estimated 5500
contributors on the project.
</para>
<para>
Committers are developers with the privilege of being able to
commit changes. These are usually the
most active developers who are willing to
spend their time not only integrating their own code but
integrating code submitted by the developers who
do not have this privilege. They are also the developers who elect
the core team, and they have access to closed discussions.
</para>
<para>
The project can be grouped into four distinct separate parts,
and most developers <!-- 57% by December 1st, 2002 -->
will during their involvement in the FreeBSD
project only be involved with one of these parts. The four parts
are kernel development, userland development, ports and
documentation. When referring to the base system, both
kernel and userland is meant.
</para>
<para>
This split changes our triangle to look like this:
</para>
<para>
<figure>
<title>The FreeBSD Project's structure with committers in categories</title>
<graphic fileref="figures/orghierarchy2.png" format="PNG">
</figure>
</para>
<para>
Number of committers per area has been determined by going through
CVS logs from December 1st, 2001 to December 1st,
2002. Note that many committers work in multiple
areas, making the total number higher than the real number
of committers. The total number of committers at that
time was 275.
</para>
<para>
Committers fall into three
groups: committers who are only concerned with one area of
the project (for instance file systems), committers who
are involved only with one sub-project
and committers who commit to different parts
of the code, including sub-projects.
Because some committers work on different parts, the total
number in the committers section of the triangle is higher than
in the above triangle.
</para>
<para>
The kernel is the main building block of FreeBSD. While
the userland applications are protected against faults in
other userland applications, the entire system is
vulnerable to errors in the kernel. This, combined with the
vast amount of dependencies in the kernel and that it is not easy to
see all the consequences of a kernel change, demands
developers with a relative full understanding of the
kernel. Multiple development efforts in the kernel also
requires a closer coordination than userland applications do.
</para>
<para>
The core utilities, known as userland, provide the interface that identifies
FreeBSD, both user interface, shared libraries and external interfaces to
connecting clients. Currently, 99 people are involved in userland
development and maintenance, many being maintainers for
their own part of the code.
Maintainership will
be discussed in the <xref linkend="role-maintainer"> section.
</para>
<para>
Documentation is handled by <xref linkend="sub-project-documentation">
and includes all documents surrounding the
FreeBSD project, including the web pages. There are currently 41
people involved in the FreeBSD Documentation Project.
</para>
<para>
Ports is the collection of meta-data that is needed to make
software packages build correctly on FreeBSD. An example of a port
is the port for the web-browser Mozilla. It contains
information about where to fetch the source, what patches to
apply and how, and how the package should be installed on the
system. This allows automated tools to fetch, build and
install the package. As of this writing, there are more than
7800 ports available.
<footnote>
<para>
Statistics are generated by counting the number of
entries in the file ports/INDEX by January 1st, 2003.
</para>
</footnote>
, ranging
from web servers to games, programming languages and most of the
application types that are in use on modern computers.
Ports will be discussed further in the section
<xref linkend="sub-project-ports">.
</para>
</chapter>
<chapter>
<title>Methodology model</title>
<section><title>Development model</title>
<para>
There is no defined model for how people write code in
FreeBSD. However, Niels J&oslash;rgenssen has suggested a model of
how written code is integrated into the project.
</para>
<para>
<figure>
<title>J&oslash;rgenssen's model for change integration</title>
<graphic fileref="figures/maintenance.png" format="PNG">
</figure>
</para>
<para>
The <quote>development release</quote> is the FreeBSD-CURRENT
("-CURRENT") branch and the <quote>production release</quote>
is the FreeBSD-STABLE branch ("-STABLE")
<citation><xref linkend="jorgensen2001"></citation>.
</para>
<para>
This is a model for one change, and shows that after
coding, developers seek community review and
try integrating it with their own systems. After integrating the change
into the development release, called FreeBSD-CURRENT, it is tested
by many users and developers in the FreeBSD community. After it
has gone through enough testing, it is merged into the production
release, called FreeBSD-STABLE. Unless each stage is finished
successfully, the developer needs to go back and make
modifications in the code and restart the process. To integrate a
change with either -CURRENT or -STABLE is called making a commit.
</para>
<para>
J&oslash;rgensen found that most FreeBSD developers work
individually, meaning that this model is used in parallel by
many developers on the different ongoing development efforts. A
developer can also be working on multiple changes, so that while
he is waiting for review or people to test one or more of his
changes, he may be writing another change.
</para>
<para>
As each commit represents an increment, this is a massively
incremental model. The commits are in fact so frequent that
during one year
<footnote>
<para>
The period from December 1st, 2001 to December 3rd, 2002 was
examined to find this number.
</para>
</footnote>
, 132148 commits were made, making a daily average of 360
commits.
</para>
<para>
Within the <quote>code</quote> bracket in J&oslash;rgensen's
figure, each programmer has his own working style and follows his
own development models. The bracket could very well have been
called <quote>development</quote> as it includes requirements
gathering and analysis, system and detailed design,
implementation and verification. However, the only
output from these stages is the source code or system documentation.
</para>
<para>
From a stepwise model's perspective (such as the waterfall
model), the other brackets can be seen as further verification
and system integration. This system integration is also important
to see if a change is accepted by the community. Up until the
code is committed, the developer is free to choose how much to
communicate about it to the rest of the project. In order for
-CURRENT to work as a buffer (so that bright ideas that had some
undiscovered drawbacks can be backed out) the minimum time a
commit should be in -CURRENT before merging it to -STABLE is 3
days. Such a merge is referred to as an MFC (Merge From Current).
</para>
<para>
It is important to notice the word <quote>change</quote>. Most
commits do not contain radical new features, but are maintenance
updates.
</para>
<para>
The only exceptions from this model are security fixes and
changes to features that are deprecated in the -CURRENT branch.
In these cases, changes can be committed directly to the -STABLE branch.
</para>
<para>
In addition to many people working on the project, there are
many related projects to the FreeBSD Project. These are either
projects developing brand new features,
sub-projects or projects whose outcome is incorporated into
FreeBSD
<footnote>
<para>
For instance, the development of the Bluetooth stack started
as a sub-project until it was deemed stable enough to be
merged into the -CURRENT branch. Now it is a part of the core
FreeBSD system.
</para>
</footnote>.
These projects fit into the FreeBSD Project just like regular
development efforts: they produce code that is integrated with
the FreeBSD Project. However, some of them (like Ports and
Documentation) have the privilege of being applicable to both
branches or commit directly to both -CURRENT and -STABLE.
</para>
<para>
There is no standards to how design should be done, nor is
design collected in a centralised repository.
The main design is that of 4.4BSD.
<footnote>
<para>
According to Kirk McKusick, after 20 years of developing
UNIX operating systems, the interfaces are for the most part
figured out. There is therefore no need for much
design. However, new applications of the system and new hardware leads to
some implementations being more beneficial than those that
used to be preferred. One example is the introduction of web
browsing that made the normal TCP/IP connection a short
burst of data rather than a steady stream over a longer
period of time.
</para>
</footnote>
As design is a part of the <quote>Code</quote> bracket in
J&oslash;rgenssen's model, it is up to every developer or
sub-project how this should be done.
Even if the design should be stored in a central repository,
the output from the design stages would be of limited use as
the differences of methodologies would make them poorly if at
all interoperable. For the overall design of the project, the
project relies on the sub-projects to negotiate fit interfaces
between each other rather than to dictate interfacing.
</para>
</section>
<section>
<title>Release branches</title>
<para>
The releases of FreeBSD is best illustrated by a tree with many
branches where each major branch represents a major
version. Minor versions are represented by branches of the
major branches.
</para>
<para>
In the following release tree, arrows that follow one-another
in a particular direction
represent a branch. Boxes with full lines and diamonds represent official
releases. Boxes with dotted lines represent the development
branch at that time. Security branches are represented by ovals.
Diamonds differ from boxes in that they
represent a fork, meaning a place where a branch splits into two
branches where one of the branches becomes a sub-branch.
For example,
at 4.0-RELEASE the 4.0-CURRENT branch split into 4-STABLE and
5.0-CURRENT. At 4.5-RELEASE, the branch forked off a security
release called RELENG_4_5.
</para>
<para>
<figure>
<title>The FreeBSD release tree</title>
<graphic fileref="figures/branches.png" format="PNG">
</figure>
</para>
<para>
The latest -CURRENT version
is always referred to as -CURRENT, while the latest -STABLE
release is always referred to as -STABLE. In this figure,
-STABLE refers to 4-STABLE while -CURRENT refers to
5.0-CURRENT following 5.0-RELEASE.
<citation><xref linkend="freebsd-releng"></citation>
</para>
<para>
A <quote>major release</quote> is always made from the -CURRENT branch.
However, the -CURRENT branch does not need to fork at that point in time,
but can focus on stabilising. An example of this is that following
3.0-RELEASE, 3.1-RELEASE was also a continuation of the
-CURRENT-branch, and -CURRENT did not become a true development
branch until this version was released and the 3-STABLE branch
was forked. When
-CURRENT returns to becoming a development branch, it can only be
followed by a major release. 5-STABLE is predicted to be forked
off 5.0-CURRENT at around 5.1-RELEASE or 5.2-RELEASE. It is not until
5-STABLE is forked that the development branch will be branded 6.0-CURRENT.
</para>
<para>
A <quote>minor release</quote> is made from the -CURRENT branch
following a major release, or from the -STABLE branch.
</para>
<para>
Following and including, 4.3-RELEASE<footnote>
<para>
The first release this actually happened for was 4.5-RELEASE,
but security branches were at the same time created for
4.3-RELEASE and 4.4-RELEASE.
</para>
</footnote>, when a minor release has been made, it becomes a <quote>security
branch</quote>. This is meant for organisations that do not want
to follow the -STABLE branch and the potential new/changed features it
offers, but instead require an absolutely stable environment, only
updating to implement security updates.
<footnote>
<para>
There is a terminology
overlap with respect to the word "stable", which leads to some
confusion. The -STABLE branch is still a
development branch, whose goal is to be
useful for most people.
If it is never acceptable for a system to get changes that
are not announced at the time it is deployed,
that system should run a security branch.
</para>
</footnote>
</para>
<para>
Each update to a security branch
is called a <quote>patchlevel</quote>. For every security
enhancement that is done, the patchlevel number is increased,
making it easy for people tracking the branch to see what
security enhancements they have implemented. In cases where there
have been especially serious security flaws, an entire new release
can be made from a security branch. An example of this is
4.6.2-RELEASE.
</para>
</section>
<section>
<title>Model summary</title>
<para>
To summarise, the development model of FreeBSD can be seen as
the following tree:
</para>
<para>
<figure>
<title>The overall development model</title>
<graphic fileref="figures/freebsd-code-model.png" format="PNG">
</figure>
</para>
<para>
The tree of the FreeBSD development with ongoing development
efforts and continuous integration.
</para>
<para>
The tree symbolises the release versions with major versions
spawning new main branches and minor versions being versions of
the main branch. The top branch is the -CURRENT branch where all
new development is integrated, and the -STABLE branch is the
branch directly below it.
</para>
<para>
Clouds of development efforts hang over the project
where developers use the development models they see fit. The
product of their work is then integrated into -CURRENT where it
undergoes parallel debugging and is finally merged from -CURRENT into
-STABLE. Security fixes are merged from -STABLE to the security branches.
</para>
</section>
</chapter>
<chapter id="sect-hats">
<title>Hats</title>
<para>
Many committers have a special area of responsibility. These
roles are called hats
<citation><xref linkend="bsd-hats"></citation>.
These hats can
be either project roles, such as public relations officer, or
maintainer for a certain area of the
code. Because this is a project where people give voluntarily of
their spare time, people with assigned hats are not always
available. They must therefore appoint a deputy that can perform
the hat's role in his or her absence. The other option is to have
the role held by a group.
</para>
<para>
Many of these hats are not formalised. Formalised hats have a
charter stating the exact purpose of the hat along with its
privileges and responsibilities. The writing of such charters is
a new part of the project, and has thus yet to be completed for
all hats. These hat descriptions are not such a formalisation,
rather a summary of the role with links to the charter where
available and contact addresses,
</para>
<section>
<title>General Hats</title>
<section id="role-contributor" xreflabel="Contributor">
<title>Contributor</title>
<para>
A Contributor contributes to the FreeBSD project either as a
developer, as an author, by sending problem reports, or in
other ways contributing to the progress of the project. A
contributor has no special privileges in the FreeBSD project.
<citation><xref linkend="freebsd-contributors"></citation>
</para>
</section>
<section id="role-committer" xreflabel="Committer">
<title>Committer</title>
<para>
A person who has the required privileges to add his code or documentation to the
repository.
<!--
Note that there are people with commit privileges that used
to be committers but have not done any commits the last
twelve months. These are not referred to as committers. -->
A committer has made a commit within the past 12 months.
<citation><xref linkend="freebsd-bylaws"></citation>
An active committer is a committer
who has made an average of one commit per month during that time.
</para>
<para>
It is worth noting that there are no technical barriers to prevent
someone, once having gained commit privileges, to make commits in
parts of the source the committer did not specifically get
permission to modify. However, when wanting to make
modifications to parts a committer has not been involved in
before, he/she should read the logs to see what has happened
in this area before, and also read the MAINTAINER file to see if
the maintainer of this part has any special requests on how
changes in the code should be made
Also, since
<xref linkend="sub-project-ports"> is allowed to give commit
privileges without approval from core, a committer who has
gained his privileges through contributing to the ports
sub-project should be careful and
have his changes approved before committing anything outside
the ports tree.
</para>
</section>
<section id="role-core" xreflabel="Core team">
<title>Core Team</title>
<para>
The core team is elected by the committers from the pool of committers
and serves as the board of directors of the FreeBSD project. It
promotes active contributors to committers, assigns people to
well-defined hats, and is the final arbiter of decisions involving
which way the project should be heading.
As by January 1st, 2003, core consisted of 9 members.
Elections are held every two years.
</para>
</section>
<section id="role-maintainer" xreflabel="Maintainership">
<title>Maintainership</title>
<para>
Maintainership means that that person is responsible for
what is allowed to go into that area of the code and has the
final say should disagreements over the code occur. This
involves involves proactive work aimed at stimulating
contributions and reactive work in reviewing commits.
</para>
<para>
With the FreeBSD
source comes the MAINTAINERS file that contains a one-line
summary of how each maintainer would like contributions to be
made. Having this notice and contact information
enables developers to focus on the development effort rather
than being stuck in a slow correspondence should the maintainer
be unavailable for some time.
</para>
<para>
If the maintainer is unavailable for an unreasonably long period
of time, and other people do a significant amount of work,
maintainership may be switched without the maintainer's approval.
This is based on the stance that maintainership should be
demonstrated, not declared.
</para>
<para>
Maintainership of a particular piece of code is a hat that
is not held as a group.
</para>
</section>
</section>
<section id="official-hats">
<title>Official Hats</title>
<para>
The official hats in the FreeBSD Project are hats that are more
or less formalised and mainly administrative roles. They have
the authority and responsibility for their area. The following
illustration shows the responsibility lines. After this follows
a description of each hat, including who it is held by.
</para>
<para>
<figure>
<title>Overview of official hats</title>
<graphic fileref="figures/hats-overview.png" format="PNG">
</figure>
</para>
<para>
All boxes consist of groups of committers, except for the
dotted boxes where the holders are not necessarily committers. The
flattened circles are sub-projects and consist of both
committers and non-committers of the main project.
</para>
<section id="role-doc-manager" xreflabel="Documentation
project architect">
<title>Documentation project manager</title>
<para>
<xref linkend="sub-project-documentation">
architect is responsible for
defining and following up documentation goals for the
committers in the Documentation project.
</para>
<para>
Hat held by:
The DocEng team <email>doceng@FreeBSD.org</email>.
The
<ulink url="http://www.freebsd.org/internal/doceng.html">
DocEng Charter</ulink>.
</para>
</section>
<section id="role-cvsup-coordinator" xreflabel="CVSup Mirror Site Coordinator">
<title>CVSup Mirror Site Coordinator</title>
<para>
The CVSup Mirror Site Coordinator coordinates all the
<xref linkend="role-cvsup-sitemaint">s to ensure that they
are distributing current versions of the software, that they
have the capacity to update themselves when major updates
are in progress, and making it easy for the general public
to find their closest CVSup mirror.
</para>
<para>
Hat currently held by:
John Polstra <email>jdp@FreeBSD.org</email>.
</para>
</section>
<section id="role-internationalisation" xreflabel="Internationalisation">
<title>Internationalisation</title>
<para>
The Internationalisation hat is responsible for coordinating
the localisation efforts of the FreeBSD kernel and userland
utilities. The translation effort are coordinated by
<xref linkend="sub-project-documentation">. The
Internationalisation hat should suggest and promote standards
and guidelines for writing and maintaining the software in a
fashion that makes it easier to translate.
</para>
<para>
Hat currently available.
<!--
Although Ache does Localization
Andrey A. Chernov <email>ache@FreeBSD.org</email>
-->
</para>
</section>
<section id="role-postmaster" xreflabel="Postmaster">
<title>Postmaster</title>
<para>
The Postmaster is responsible for mail being correctly
delivered to the committers' email address. He is also
responsible for ensuring that the mailing lists work and
should take measures against possible disruptions of mail
such as having troll-, spam- and virus-filters.
</para>
<para>
Hat currently held by:
Jonathan M. Bresler <email>jmb@FreeBSD.org</email>.
</para>
</section>
<section id="role-release-coordination" xreflabel="Release Coordination">
<title>Release Coordination</title>
<para>
The responsibilities of the Release Engineering Team are
<itemizedlist>
<listitem><para>
Setting, publishing and following a release schedule for
official releases
</para></listitem>
<listitem><para>
Documenting and formalising release engineering procedures
</para></listitem>
<listitem><para>
Creation and maintenance of code branches
</para></listitem>
<listitem><para>
Coordinating with the Ports and Documentation teams
to have an updated set of packages and documentation
released with the new releases
</para></listitem>
<listitem><para>
Coordinating with the Security team so that pending
releases are not affected by recently disclosed vulnerabilities.
</para></listitem>
</itemizedlist>
Further information about the development process is
available in the <xref linkend="process-release-engineering"> section.
</para>
<para>
Hat held by:
the Release Engineering team <email>re@FreeBSD.org</email>,
currently headed by
Murray Stokely <email>murray@FreeBSD.org</email>.
The
<ulink url="http://www.freebsd.org/releng/charter.html">
Release Engineering Charter</ulink>.
</para>
</section>
<section id="role-pr-cr" xreflabel="Public Relations &amp; Corporate Liaison">
<title>Public Relations &amp; Corporate Liaison</title>
<para>
The Public Relations &amp; Corporate Liaison's
responsibilities are:
<itemizedlist>
<listitem><para>
Making press statements when happenings that are
important to the FreeBSD Project happen.
</para></listitem>
<listitem><para>
Being the official contact person for corporations that
are working close with the FreeBSD Project.
</para></listitem>
<listitem><para>
Take steps to promote FreeBSD within both the Open Source
community and the corporate world.
</para></listitem>
<listitem><para>
Handle the <quote>freebsd-advocacy</quote> mailing list.
</para></listitem>
</itemizedlist>
</para>
<para>
This hat is currently not occupied.
</para>
</section>
<section id="role-security-officer" xreflabel="Security Officer">
<title>Security Officer</title>
<para>
The Security Officer's main responsibility is to
coordinate information exchange with others in the
security community and in the FreeBSD project.
The Security Officer is also responsible for taking action
when security problems are reported and promoting proactive
development behaviour when it comes to security.
</para>
<para>
Because of the fear that information about
vulnerabilities may leak out to people with malicious
intent before a patch is available, only the Security
Officer, consisting of an officer, a deputy and two
<xref linkend="role-core"> members, receive sensitive
information about security issues. However, to create or
implement a patch, the Security Officer has the Security
Officer Team <email>security-team@FreeBSD.org</email> to
help do the work.
</para>
<para>
Hat held by:
the Security Officer <email>security-officer@FreeBSD.org</email>,
currently headed by
Jacques Vidrine <email>nectar@FreeBSD.org</email>.
The
<ulink url="http://www.freebsd.org/security/index.html#sec">
Security Officer and The Security Officer Team's
charter</ulink>.
</para>
</section>
<section id="role-repo-manager" xreflabel="Source Repository Manager">
<title>Source Repository Manager</title>
<para>
The Source Repository Manager is the only one who is allowed
to directly modify the repository without using the
<xref linkend="tool-cvs"> tool.
It is his/her
responsibility to ensure that technical problems that arise in the
repository are resolved quickly. The source repository
manager has the authority to back out commits if this is
necessary to resolve a CVS technical problem.
</para>
<para>
Hat held by:
the Source Repository Manager <email>cvs@FreeBSD.org</email>,
currently headed by Peter Wemm <email>peter@FreeBSD.org</email>.
</para>
</section>
<section id="role-election-manager" xreflabel="Election Manager">
<title>Election Manager</title>
<para>
The Election Manager is responsible for the
<xref linkend="process-core-election"> process. The manager
is responsible for running and maintaining the election
system, and is the final authority should minor unforseen
events happen in the election process. Major unforseen
events have to be discussed with the <xref linkend="role-core">
</para>
<para>
Hat held only during elections.
</para>
</section>
<section id="role-webmaster" xreflabel="Web site Management">
<title>Web site Management</title>
<para>
The Web site Management hat is responsible for coordinating
the rollout of updated web pages on mirrors around the world,
for the overall structure of the primary web site and the
system it is running upon. The management needs to
coordinate the content with
<xref linkend="sub-project-documentation"> and acts as
maintainer for the <quote>www</quote> tree.
</para>
<para>
Hat held by:
the FreeBSD Webmasters <email>www@FreeBSD.org</email>.
</para>
</section>
<section id="role-ports-manager" xreflabel="Ports Manager">
<title>Ports Manager</title>
<para>
The Ports Manager acts as a liaison between
<xref linkend="sub-project-ports">
and the core project, and
all requests from the project should go to the ports manager.
</para>
<para>
Hat held by:
the Ports Management Team <email>portmgr@FreeBSD.org</email>,
currently headed by
Satoshi Asami <email>asami@FreeBSD.org</email>.
</para>
</section>
<section id="role-standards" xreflabel="Standards">
<title>Standards</title>
<para>
The Standards hat is responsible for ensuring that FreeBSD
complies with the standards it is committed to <!-- (covered in
<xref linkend="standardsguidelines">) -->, keeping up to date
on the development of these standards and notifying
FreeBSD developers of important changes that allows them to take a
proactive role and decrease the time between a standards
update and FreeBSD's compliancy.
</para>
<para>
Hat currently held by:
Garrett Wollman <email>wollman@FreeBSD.org</email>.
</para>
</section>
<section id="role-core-secretary" xreflabel="Core Secretary">
<title>Core Secretary</title>
<para>
The Core Secretary's main responsibility is to write drafts to
and publish the final Core Reports. The secretary also keeps
the core agenda, thus ensuring that no balls are dropped
unresolved.
</para>
<para>
Hat currently held by:
Wilko Bulte <email>wilko@FreeBSD.org</email>.
</para>
</section>
<section id="role-xfree86" xreflabel="XFree86 Project, Inc. Liaison">
<title>XFree86 Project, Inc. Liaison</title>
<para>
The XFree86 Project liaison relays information from the
XFree86 Project to the right people in the FreeBSD Project and
visa versa. This enables the projects to be alligned without
everyone in both projects staying up-to-date on the other project.
</para>
<para>
Hat currently held by:
Rich Murphey <email>rich@FreeBSD.org</email>.
</para>
</section>
<section id="role-gnats" xreflabel="GNATS Administrator">
<title>GNATS Administrator</title>
<para>
The GNATS Administrator is responsible for ensuring that the
maintenance database is in working order, that the entries
are correctly categorised and that there are no invalid entries.
</para>
<para>
Hat currently held by:
Steve Price <email>steve@FreeBSD.org</email>.
</para>
</section>
<section id="role-bugmeister" xreflabel="Bugmeister">
<title>Bugmeister</title>
<para>
The Bugmeister is person in charge of the problem report
group.
</para>
<para>
Hat currently held by:
Giorgos Keramidas <email>keramida@FreeBSD.org</email>.
</para>
</section>
<section id="role-donations" xreflabel="Donations Liaison Officer">
<title>Donations Liaison Officer</title>
<para>
The task of
the donations liason officer is to match
the developers with needs with people or
organisations willing to make a
donation. The Donations Liason Charter is
available
<ulink url="http://www.freebsd.org/donations/">here</ulink>
</para>
<para>
Hat held by:
the Donations Liaison Office <email>donations@FreeBSD.org</email>,
currently headed by
Michael W. Lucas <email>mwlucas@FreeBSD.org</email>.
</para>
</section>
<section id="role-admin" xreflabel="Admin">
<title>Admin</title>
<para>
(Also called <quote>FreeBSD Cluster Admin</quote>)
</para>
<para>
The admin team consists are the
people responsible for administrating the
computers that the project relies on for
its distributed work and communication to
be synchronised. It consists mainly of those
people who have physical access to the
servers.
</para>
<para>
Hat held by:
the Admin team <email>admin@FreeBSD.org</email>,
currently headed by Mark Murray <email>markm@FreeBSD.org</email>
</para>
</section>
</section>
<section>
<title>Process dependent hats</title>
<section id="role-problem-originator" xreflabel="Report originator">
<title>Report originator</title>
<para>
The person originally responsible for
filing a Problem Report.
</para>
</section>
<section id="role-bugbuster" xreflabel="Bugbuster">
<title>Bugbuster</title>
<para>
A person who will either find the right
person to solve the problem, or close the PR if
it is a duplicate or otherwise
not an interesting one.
</para>
</section>
<section id="role-mentor" xreflabel="Mentor">
<title>Mentor</title>
<para>
A mentor is a committer who takes it upon him/her to
initialise a new committer to the project, both in terms of
ensuring the new committers setup is valid,
that the new committer knows the available tools required in
his/her work and that the
new committer knows what is expected of him/her in terms of
behaviour.
</para>
</section>
<section id="role-vendor" xreflabel="Vendor">
<title>Vendor</title>
<para>
The person(s) or organisation whom
external code comes from and whom patches are sent to.
</para>
</section>
<section id="role-reviewer" xreflabel="Reviewer">
<title>Reviewers</title>
<para>
People on the mailing list where the request
for review is posted.
</para>
</section>
<section id="role-cvsup-sitemaint" xreflabel="CVSup Mirror Site
Admin">
<title>CVSup Mirror Site Admin</title>
<para>
A CVSup Mirror Site Admin has accesses to a server that he/she
uses to mirror the CVS repository. The admin works with the
<xref linkend="role-cvsup-coordinator"> to ensure the site
remains up-to-date and is following the general policy of
official mirror sites.
</para>
</section>
</section>
</chapter>
<chapter id="model-processes" xreflabel="processes">
<title>Processes</title>
<para>
The following section will describe the defined project
processes. Issues that are not handled by these processes happen
on an ad-hoc basis based on what has been customary to do in
similar cases.
</para>
<section id="proc-addrem-committer">
<title>Adding new and removing old committers</title>
<para>
The Core team has the responsibility of giving and removing
commit privileges to contributors. This can only be done
through a vote on the core mailing list.
The ports and documentation sub-projects can give commit
privileges to people working on these projects, but have to
date not removed such privileges. <!-- ref Bruce <bmah@> -->
</para>
<para>
Normally a contributor is recommended to core by a
committer. For contributors or outsiders to contact
core asking to be a committer is not well thought of
and is usually rejected.
</para>
<para>
If the area of particular interest for the developer
potentially overlaps with other committers' area of
maintainership, the opinion of those maintainers is
sought. However, it is frequently this committer that
recommends the developer.
</para>
<para>
When a contributor is given committer status, he is
assigned a mentor. The committer who recommended the
new committer will, in the general case, take it upon
himself to be the new committers mentor.
</para>
<para>
When a contributor is given his commit bit, a <xref linkend="tool-pgp">-signed email is sent
from either <xref linkend="role-core-secretary">,
<xref linkend="role-ports-manager"> or nik@freebsd.org to both
admins@freebsd.org, the assigned mentor, the new committer and
core confirming the approval of a new account. The mentor then
gathers a password line, <xref linkend="tool-ssh2"> public key and PGP key from the
new committer and sends them to <xref
linkend="role-admin">. When the new account is created, the
mentor activates the commit bit and guides the new committer
through the rest of the initial process.
</para>
<para>
<figure>
<title>Process summary: adding a new committer</title>
<graphic fileref="figures/proc-add-committer.png" format="PNG">
</figure>
</para>
<para>
When a contributor sends a piece of code, the receiving
committer may choose to recommend that the contributor is
given commit privileges. If he recommends this to core,
they will vote on this recommendation. If they vote in
favour, a mentor is assigned the new committer and the new
committer has to email his details to the administrators
for an account to be created. After this, the new
committer is all set to make his first commit. By
tradition, this is by adding his name to the committers list.
</para>
<para>
Recall that a committer is considered to be someone who
has committed code during the past 12
months. However, it is not until after 18 months of inactivity
have passed
that commit privileges are eligible to be revoked.
<citation><xref linkend="freebsd-expiration-policy"></citation>
There are, however, no
automatic procedures for doing this.
For reactions concerning commit privileges not triggered by
time, see <link linkend="process-reactions">section 8.5.8</link>.
</para>
<para>
<figure>
<title>Process summary: removing a committer</title>
<graphic fileref="figures/proc-rm-committer.png" format="PNG">
</figure>
</para>
<para>
When Core decides to clean up the committers list, they
check who has not made a commit for the past 18 months.
Committers who have not done so have their commit
bits revoked.
</para>
<para>
It is also possible for committers to request that their commit
bit be retired if for some reason they are no longer going
to be actively committing to the project. In this case, it can also
be restored at a later time by core, should the committer ask.
</para>
<para>
Roles in this process:
<orderedlist>
<listitem><para>
<xref linkend="role-core">
</para></listitem>
<listitem><para>
<xref linkend="role-contributor">
</para></listitem>
<listitem><para>
<xref linkend="role-committer">
</para></listitem>
<listitem><para>
<xref linkend="role-maintainer">
</para></listitem>
<listitem><para>
<xref linkend="role-mentor">
</para></listitem>
</orderedlist>
</para>
<para>
<citation><xref linkend="freebsd-bylaws"></citation>
<citation><xref linkend="freebsd-expiration-policy"></citation>
<citation><xref linkend="freebsd-new-account"></citation>
</para>
</section>
<section id="process-cvsupmirror" xreflabel="Adding an official
CVSup Mirror">
<title>Adding/Removing an official CVSup Mirror</title>
<para>
A <xref linkend="tool-cvsup"> mirror is a replica of the
official CVSup master that contains all the up-to-date source
code for all the branches in the FreeBSD project, ports and
documentation.
</para>
<para>
Adding an official CVSup mirror starts with the potential
<xref linkend="role-cvsup-sitemaint"> installing the
<quote>cvsup-mirror</quote> package. Having done this and
updated the source code with a mirror site, he now runs a
fairly recent unofficial CVSup mirror.
</para>
<para>
Deciding he has a stable environment, the processing
power, the network capacity and the
storage capacity to run an official mirror, he mails the
<xref linkend="role-cvsup-coordinator"> who decides whether
the mirror should become an official mirror or not.
</para>
<para>
In making this decision, the <xref linkend="role-cvsup-coordinator">
has to determine whether that geographical area needs
another mirror site, if the mirror administrator has the
skills to run it reliably, if the network bandwidth is
adequate and if the master server has the capacity to server
another mirror.
</para>
<para>
If <xref linkend="role-cvsup-coordinator"> decides that the
mirror should become an official mirror, he obtains an
authentication key from the mirror admin that he installs so
the mirror admin can update the mirror from the master server.
</para>
<para>
<figure>
<title>Process summary: adding a CVSup mirror</title>
<graphic fileref="figures/proc-add-cvsup.png" format="PNG">
</figure>
</para>
<para>
When a CVSup mirror administrator of an unofficial mirror
offers to become an official mirror site, the CVSup
coordinator decides if another mirror is needed and if
there is sufficient capacity to accommodate it. If so,
an authorisation key is requested and the mirror is given
access to the main distribution site and added to the
list of official mirrors.
</para>
<para>
Roles involved in this process:
<itemizedlist>
<listitem><para>
<xref linkend="tool-cvsup">
</para></listitem>
<listitem><para>
<xref linkend="tool-ssh2">
</para></listitem>
</itemizedlist>
</para>
<para>
Tools used in this process:
<itemizedlist>
<listitem><para>
<xref linkend="role-cvsup-coordinator">
</para></listitem>
<listitem><para>
<xref linkend="role-cvsup-sitemaint">
</para></listitem>
</itemizedlist>
</para>
</section>
<section>
<title>Committing code</title>
<para>
The committing of new or modified code is one of the most
frequent processes in the FreeBSD project and will usually
happen many times a day. Committing of code can only be done
by a <quote>committer</quote>. Committers commit either code
written by themselves, code submitted to them or code
submitted through a <link linkend="model-pr">problem
report</link>.
</para>
<para>
When code is written by the developer that is non-trivial, he
should seek a code review from the community. This
is done by sending mail to the relevant list asking for
review. Before submitting the code for review, he should
ensure it compiles correctly with the entire tree and that all
relevant tests run. This is called <quote>pre-commit
test</quote>. When contributed code is received, it should be
reviewed by the committer and tested the same way.
</para>
<para>
When a change is committed to a part of the source that
has been contributed from an outside
<xref linkend="role-vendor">,
the maintainer should
ensure that the patch is contributed back to the
vendor. This is in line with the open source
philosophy and
makes it easier to stay in sync with outside projects
as the patches do not have to be reapplied every time a
new release is made.
</para>
<para>
After the code has been available for review and no further
changes are necessary, the code is committed into the
development branch, -CURRENT.
If the change applies for
the -STABLE branch or the other branches as well, a
<quote>Merge From Current</quote> ("MFC") countdown is
set by the committer. After the number of days the
committer chose when setting the MFC have passed, an email
will automatically be
sent to the committer reminding him to commit it to the -STABLE
branch (and possibly security branches as well). Only security
critical changes should be merged to security branches.
</para>
<para>
Delaying the commit to -STABLE and other branches allows for
<quote>parallel debugging</quote> where the committed code is
tested on a wide range of configurations. This makes changes
to -STABLE to contain fewer faults and thus giving the branch
its name.
</para>
<para>
<figure>
<title>Process summary: A committer commits code</title>
<graphic fileref="figures/proc-commit.png" format="PNG">
</figure>
</para>
<para>
When a committer has written a piece of code and
wants to commit it, he first needs to determine if it is
trivial enough to go in without prior review or if it should
first be reviewed by the developer community. If the code is
trivial or has been reviewed and the committer is not the
maintainer, he should consult the maintainer before
proceeding.
If the code is contributed by an outside vendor, the
maintainer should create a patch that is sent back to the
vendor. The code is then committed and the deployed by
the users. Should they find problems with the code, this
will be reported and the committer can go back to writing
a patch. If a vendor is affected, he can choose to
implement or ignore the patch.
</para>
<para>
<figure>
<title>Process summary: A contributor commits code</title>
<graphic fileref="figures/proc-contrib.png" format="PNG">
</figure>
</para>
<para>
The difference when a contributor makes a code contribution is
that he submits the code through the send-pr
program. This report is picked up by the maintainer who
reviews the code and commits it.
</para>
<para>
Hats included in this process are:
<orderedlist>
<listitem><para>
<xref linkend="role-committer">
</para></listitem>
<listitem><para>
<xref linkend="role-contributor">
</para></listitem>
<listitem><para>
<xref linkend="role-vendor">
</para></listitem>
<listitem><para>
<xref linkend="role-reviewer">
</para></listitem>
</orderedlist>
</para>
<para>
<citation><xref linkend="freebsd-committer"></citation>
<citation><xref linkend="jorgensen2001"></citation>
</para>
</section>
<section id="process-core-election" xreflabel="Core election">
<title>Core election</title>
<para>
Core elections are held at least every two years.
<footnote>
<para>The first Core election was held September 2000</para>
</footnote>
Nine core members are elected. New elections are held if
the number of core members drops below seven. New elections can
also be held should at least 1/3 of the active committers demand this.
</para>
<para>
When an election is to take place, core announces this at
least 6 weeks in advance, and appoints an election manager to
run the elections.
</para>
<para>
Only committers can be elected into core. The candidates need
to submit their candidacy at least one week before the
election starts, but can refine their statements until the
voting starts. They are
presented in the <ulink
url="http://election.uk.freebsd.org/candidates.html">candidates
list</ulink>. When writing their election statements, the candidates
must answer a few standard questions submitted by the election manager.
</para>
<para>
During elections, the rule that a committer must have
committed during the 12 past months is followed strictly.
Only these committers are eligible to vote.
</para>
<para>
When voting, the committer may vote once in support of up to
nine nominees. The voting is done over a period of four weeks
with reminders being posted on <quote>developers</quote>
mailing list that is available to all committers.
</para>
<para>
The election results are released one week after the election
ends, and the new core team takes office one week after the
results have been posted.
</para>
<para>
Should there be a voting tie, this will be resolved by
the new, unambiguously elected core members.
</para>
<para>
Votes and candidate statements are archived, but the archives
are not publicly available.
</para>
<para>
<figure>
<title>Process summary: Core elections</title>
<graphic fileref="figures/proc-elections.png" format="PNG">
</figure>
</para>
<para>
Core announces the election and selects an election
manager. He prepares the elections, and when ready,
candidates can announce their candidacies through
submitting their statements. The committers then vote.
After the vote is over, the election results are
announced and the new core team takes office.
</para>
<para>
Hats in core elections are:
<itemizedlist>
<listitem><para>
<xref linkend="role-core">
</para></listitem>
<listitem><para>
<xref linkend="role-committer">
</para></listitem>
<listitem><para>
<xref linkend="role-election-manager">
</para></listitem>
</itemizedlist>
</para>
<para>
<citation><xref linkend="freebsd-bylaws"></citation>
<citation><xref linkend="bsd-election2002"></citation>
<citation><xref linkend="freebsd-election"></citation>
</para>
</section>
<section>
<title>Development of new features</title>
<para>
Within the project there are sub-projects that are working on
new features. These projects are generally done by one person
<citation><xref linkend="jorgensen2001"></citation>
. Every project is free to
organise development as it sees fit. However, when the project
is merged to the -CURRENT branch it must follow the project
guidelines. When the code has been well tested in the
-CURRENT branch and deemed stable enough and relevant
to the -STABLE branch, it is merged to the -STABLE branch.
</para>
<para>
The requirements of the project are given by developer
wishes, requests from the community in terms of direct
requests by mail, Problem Reports, commercial funding for the development
of features, or contributions by the scientific community.
The wishes that come within the responsibility of a developer
are given to that developer who prioritises his time between
the request and his wishes. A common way to do this is maintain
a TODO-list maintained by the project. Items that do not come within
someone's responsibility are collected on TODO-lists unless someone
volunteers to take the responsibility. All
requests, their distribution and follow-up are
handled by the <xref linkend="tool-gnats"> tool.
</para>
<para>
Requirements analysis happens in two ways. The requests that
come in are discussed on mailing lists, both within the main
project and in the sub-project that the request belongs to or is
spawned by the request. Furthermore, individual developers on
the sub-project will evaluate the feasibility of the requests
and determine the prioritisation between them. Other than archives
of the discussions that have taken place, no outcome is created
by this phase that is merged into the main project.
</para>
<para>
As the requests are prioritised by the individual developers on
the basis of doing what they find interesting, necessary or are
funded to do, there is no overall strategy or priorisation of
what requests to regard as requirements and following up their
correct implementation. However, most developers have some
shared vision of what issues are more important, and they can
ask for guidelines from the release engineering team and
technical review board.
</para>
<para>
The verification phase of the project is two-fold. Before
committing code to the current-branch, developers request their
code to be reviewed by their peers. This review is for the most
part done by functional testing, but also code review is
important. When the code is committed to the branch, a broader
functional testing will happen, that may trigger further code
review and debugging should the code not behave as
expected. This second verification form may be regarded as
structural verification.
Although the sub-projects themselves may write formal
tests such as unit tests, these are usually not collected by the main
project and are usually removed before the code is committed to
the current branch.
<footnote>
<para>
More and more tests are however performed when
building the system (<quote>make
world</quote>). These tests are however a very new
addition and no systematic framework for these
tests have yet been created.
</para>
</footnote>
</para>
</section>
<section id="model-maintenance" xreflabel="maintenance">
<title>Maintenance</title>
<para>
It is an advantage to the project to for each area of the source
have at least one person that knows this area well.
Some parts of the code have designated
maintainers. Others have de-facto maintainers, and some
parts of the system do not have
maintainers.
The maintainer is usually a person from the sub-project that
wrote and integrated the code, or someone who has ported it from
the platform it was written for.
<footnote>
<para>
sendmail and named are examples of code that has been merged
from other platforms.
</para>
</footnote>
The maintainer's job is to make sure the code is in sync with the
project the code comes from if it is contributed code, and apply patches
submitted by the community or write fixes to issues that are
discovered.
</para>
<para>
The main bulk of work that is put into the FreeBSD project is
maintenance. <citation><xref
linkend="jorgensen2001"></citation>
has made a figure
showing the life cycle of changes.
</para>
<para>
<figure>
<title>J&oslash;rgenssen's model for change integration</title>
<graphic fileref="figures/maintenance.png" format="PNG">
</figure>
</para>
<para>
Here <quote>development release</quote> refers to the -CURRENT
branch while <quote>production release</quote> refers to the
-STABLE branch. The <quote>pre-commit test</quote> is the
functional testing by peer developers when asked to do so or
trying out the code to determine the status of the sub-project.
<quote>Parallel debugging</quote> is the functional testing
that can trigger more review, and debugging when the code is
included in the -CURRENT branch.
</para>
<para>
As of this writing, there were 275 committers in the
project. When they commit a change to a branch, that constitutes
a new release. It is very common for users in the community to
track a particular branch. The immediate existence of a new
release makes the changes widely available right away and allows
for rapid feedback from the community. This also gives the
community the response time they expect on issues that are of
importance to them. This makes the community more engaged, and
thus allows for more and better feedback that again spurs more
maintenance and ultimately should create a better product.
</para>
<para>
Before making changes to code in parts of the tree
that has a history unknown to the committer, the
committer is required to read the commit logs to see why
certain features are implemented the way they are in
order not to make mistakes that have previously either been
thought through or resolved.
</para>
</section>
<section id="model-pr">
<title>Problem reporting</title>
<para>
FreeBSD comes with a problem reporting tool called
<quote>send-pr</quote> that is a part of the GNATS package.
All users and developers are encouraged to use this tool for
reporting problems in software they do not maintain. Problems
include bug reports, feature requests, features that should be enhanced
and notices of new versions of external software that is included
in the project.
</para>
<para>
Problem reports are sent to an email address where it
is inserted into the GNATS maintenance database. A
<xref linkend="role-bugbuster">
classifies the problem and sends it to the
correct group or maintainer within the project. After someone
has taken responsibility for the report, the report is being
analysed. This analysis includes verifying the problem and
thinking out a solution for the problem. Often feedback is
required from the report originator or even from the FreeBSD
community. Once a patch for the problem is made, the
originator may be asked to try it out. Finally, the working patch
is integrated into the project, and documented if
applicable. It there goes through the regular maintenance
cycle as described in section <xref linkend="model-maintenance">.
These are the states a problem report can be in:
open, analyzed, feedback, patched, suspended and closed. The
suspended state is for when further progress is not possible
due to the lack of information or for when the task would require
so much work that nobody is working on it at the moment.
</para>
<para>
<figure>
<title>Process summary: problem reporting</title>
<graphic fileref="figures/proc-pr.png" format="PNG">
</figure>
</para>
<para>
A problem is reported by the report originator. It is
then classified by a bugbuster and handed to the correct
maintainer. He verifies the problem and discusses the
problem with the originator until he has enough
information to create a working patch. This patch is then
committed and the problem report is closed.
</para>
<para>
The roles included in this process are:
<orderedlist>
<listitem><para>
<xref linkend="role-problem-originator">
</para></listitem>
<listitem><para>
<xref linkend="role-maintainer">
</para></listitem>
<listitem><para>
<xref linkend="role-bugbuster">
</para></listitem>
</orderedlist>
</para>
<para>
<citation><xref linkend="freebsd-handle-pr"></citation>.
<citation><xref linkend="freebsd-send-pr"></citation>
</para>
</section>
<section id="process-reactions" xreflabel="Reacting to misbehaviour">
<title>Reacting to misbehaviour</title>
<para>
<citation><xref linkend="freebsd-committer"></citation> has a
number of rules that committers should follow. However, it
happens that these rules are broken. The following rules exist
in order to be able to react to misbehaviour. They specify what
actions will result in how long a suspension the committer's
commit privileges.
<itemizedlist>
<listitem><para>
Committing during code freezes without the approval of the
Release Engineering team - 2 days
</para></listitem>
<listitem><para>
Committing to a security branch without approval - 2 days
</para></listitem>
<listitem><para>
Commit wars - 5 days to all participating parties
</para></listitem>
<listitem><para>
Impolite or inappropriate behaviour - 5 days
</para></listitem>
</itemizedlist>
<citation><xref linkend="ref-freebsd-trenches"></citation>
</para>
<para>
For the suspensions to be efficient, any single core member can
implement a suspension before discussing it on the <quote>core</quote>
mailing list. Repeat offenders can, with a 2/3 vote by core,
receive harsher penalties, including permanent removal of
commit privileges. (However, the latter is always viewed as a last
resort, due to its inherent tendency to create controversy). All
suspensions are posted to the
<quote>developers</quote>
mailing list, a list available to committers only.
</para>
<para>
It is important that you cannot be suspended for making
technical errors. All penalties come from breaking social etiquette.
</para>
<para>
Hats involved in this process:
<itemizedlist>
<listitem><para>
<xref linkend="role-core">
</para></listitem>
<listitem><para>
<xref linkend="role-committer">
</para></listitem>
</itemizedlist>
</para>
</section>
<section id="process-release-engineering" xreflabel="release engineering">
<title>Release engineering</title>
<para>
The FreeBSD project has a Release Engineering <!-- ("RE") --> team with a
principal release engineer that is responsible for creating releases
of FreeBSD that can be brought out to the user community via the
net or sold in retail outlets. Since FreeBSD is available on multiple
platforms and releases for the different architectures are made
available at the same time, the team has one person in charge of
each architecture. Also, there are roles in the team responsible
for coordinating quality assurance <!-- ("QA") --> efforts, building a package
set and for having an updated set of documents.
When referring to the release engineer,
a representative for the release engineering team is
meant.
</para>
<para>
When a release is coming, the FreeBSD project changes shape
somewhat. A release schedule is made containing feature- and
code-freezes, release of interim releases and the final
release. A feature-freeze means no new features are allowed to
be committed to the branch without the release engineers'
explicit consent. Code-freeze means no changes to the code (like
bugs-fixes) are allowed to be committed without the release
engineers explicit consent. This feature- and code-freeze is
known as stabilising. During the release process, the release
engineer has the full authority to revert to older versions of
code and thus "back out" changes should he find that the changes
are not suitable to be included in the release.
</para>
<para>
There are three different kinds of releases:
<orderedlist>
<listitem><para>
.0 releases are the first release of a major
version. These are branched of the -CURRENT branch
and have a significantly longer release engineering
cycle due to the unstable nature of the -CURRENT branch
</para></listitem>
<listitem><para>
.X releases are releases of the -STABLE
branch. They are scheduled to come out every 4 months.
</para></listitem>
<listitem><para>
.X.Y releases are security releases that follow
the .X branch. These come out only when sufficient
security fixes have been merged since the last
release on that branch. New features are rarely
included, and the security team is far more
involved in these than in regular releases.
</para></listitem>
</orderedlist>
</para>
<para>
For releases of the -STABLE-branch, the release process starts 45
days before the anticipated
release date. During the first phase, the first 15 days, the
developers merge what changes they have had in -CURRENT
that they want to have in the release to the release
branch. When this period is over, the code enters a 15
day code freeze in which only bug fixes, documentation updates,
security-related fixes and minor device driver changes are
allowed. These changes must be approved by the release engineer
in advance. At the beginning of the last 15 day period a release
candidate is created for widespread testing. Updates are less
likely to be allowed during this period, except for important
bug fixes and security updates. In this final period, all
releases are considered release candidates. At the end of the
release process, a release is created with the new version
number, including binary distributions on web sites and the
creation of a CD-ROM images. However, the release isn't
considered "really released" until a <xref linkend="tool-pgp">-signed message stating
exactly that, is sent to the mailing list freebsd-announce; anything
labelled as a "release" before that may well be in-process and
subject to change before the PGP-signed message is sent.
<footnote>
<para>
Many commercial vendors use these images to create
CD-ROMs that are sold in retail outlets.
</para>
</footnote>.
</para>
<para>
The releases of the -CURRENT-branch (that is, all releases that
end with <quote>.0</quote>) are very similar, but with twice as
long timeframe. It starts 8 weeks prior to the release with
announcement of the release time line. Two weeks into the
release process, the feature freeze is initiated and performance
tweaks should be kept to a minimum. Four weeks prior to the
release, an official beta version is made available. Two weeks
prior to release, the code is officially branched into a new
version. This version is given release candidate status, and as
with the release engineering of -STABLE, the code freeze of the
release candidate is
hardened. However, development on the main development branch
can continue. Other than these differences, the release
engineering processes are alike.
</para>
<para>
.0 releases go into their own branch and are aimed
mainly at early adopters. It is not until .1 versions
are released that the branch becomes -STABLE and
-CURRENT targets the next major
version.
</para>
<para>
Most releases are made when a given date that has been deemed a
long enough time since the previous release comes. A target is
set for having major releases every 18 months and minor
releases every 4 months.
The user community has made it very clear that security and
stability cannot be sacrificed by self-imposed deadlines and
target release dates.
For slips of time not to become to long with regards to security
and stability issues,
extra dicipline is required when committing changes to -STABLE.
</para>
<para>
<figure>
<title>Process summary: release engineering</title>
<graphic fileref="figures/proc-releng.png" format="PNG">
</figure>
</para>
<para>
These are the stages in the release engineering
process. Multiple release candidates may be created until
the release is deemed stable enough to be released.
</para>
<para>
<citation><xref linkend="freebsd-releng"></citation>
</para>
</section>
</chapter>
<chapter>
<title>Tools</title>
<para>
The major support tools for supporting the development process are
CVS, CVSup, Perforce, GNATS, Mailman and OpenSSH. Except for
CVSup, these are externally
developed tools. These tools are commonly used in the open source world.
</para>
<section id="tool-cvs" xreflabel="CVS">
<title>Concurrent Versions System (CVS)</title>
<para>
Concurrent Versions System
or simply <quote>CVS</quote>
is a system to handle multiple versions of text files and
tracking who committed what changes and why. A project lives
within a <quote>repository</quote> and different versions are
considered different <quote>branches</quote>.
</para>
</section>
<section id="tool-cvsup" xreflabel="CVSup">
<title>CVSup</title>
<para>
CVSup is a software package for distributing and updating
collections of files across a network. It is consists of a
client program, cvsup, and a server program, cvsupd. The
package is tailored specifically for distributing CVS
repositories, and by taking advantage of CVS' properties, it
performs updates much faster than traditional systems.
</para>
</section>
<section id="tool-gnats" xreflabel="GNATS">
<title>GNATS</title>
<para>
GNATS is a maintenance database consisting of a set of tools to track bugs at a
central site. It supports the bug tracking process for sending
and handling bugs as well as querying and updating the database
and editing bug reports. The project uses one of its many client
interfaces, <quote>send-pr</quote>, to send
<quote>Problem Reports</quote> by email to the
projects central GNATS server. The committers have also web and
command-line clients available.
</para>
</section>
<section id="model-mailman" xreflabel="[model, Mailman]">
<title>Mailman</title>
<para>
Mailman is a program that automates the
management of mailing lists. The FreeBSD Project uses it to run
17 general lists, 45 technical lists and 6 limited lists. It is
also used for many mailing lists set up and used by other people
and projects in the FreeBSD community. General lists are lists
for the general public, technical lists are mainly for the
development of specific areas of interest, and closed lists
are for internal communication not intended for the general
public. The majority of all the communication in the project goes
through these 68 lists
<citation><xref linkend="ref-bsd-handbook">, Appendix C</citation>.
</para>
</section>
<section id="tool-perforce" xreflabel="Perforce">
<title>Perforce</title>
<para>
Perforce is a commercial software configuration management
system developed by Perforce
Systems that is available on over 50 operating systems. It
is a collection of clients built around the Perforce server
that contains the central file repository and
tracks the operations done upon it. The clients are both
clients for accessing the repository and administration of
its configuration.
<!-- REF: http://www.perforce.com/perforce/products.html -->
</para>
</section>
<section id="tool-pgp" xreflabel="PGP">
<title>Pretty Good Privacy</title>
<para>
Pretty Good Privacy, better known as PGP, is a cryptosystem
using a public key architecture to allow people to digitally
sign and/or encrypt information in order to ensure secure
communication between two parties. A signature is used when
sending information out many recipients, enabling them to verify
that the information has not been tampered with before they
received it. In the FreeBSD Project this is the primary means of
ensuring that information has been written by the person who
claims to have written it, and not altered in transit.
</para>
</section>
<section id="tool-ssh2" xreflabel="SSH 2">
<title>Secure Shell</title>
<para>
Secure Shell is a standard for securely logging into a remote system
and for executing commands on the remote system. It allows
other connections, called tunnels, to be established and
protected between the two involved systems. This standard
exists in two primary versions, and only version two is used
for the FreeBSD Project. The most common implementation of the
standard is OpenSSH that is a part of the project's main distribution.
Since its source is updated more often than FreeBSD releases,
the latest version is also available in the ports tree.
</para>
</section>
</chapter>
<chapter>
<title>Sub-projects</title>
<para>
Sub-projects are formed to reduce the amount of communication
needed to coordinate the group of developers. When a problem
area is sufficiently isolated, most communication would be
within the group focusing on the problem, requiring less
communication with the groups they communicate with than were
the group not isolated.
</para>
<section id="sub-project-ports" xreflabel="The Ports Subproject">
<title>The Ports Subproject</title>
<para>
A <quote>port</quote> is a set of meta-data and patches that
are needed to fetch, compile and install correctly an external piece of
software on a FreeBSD system. The amount of ports have grown
at a tremendous rate, as shown by the following figure.
</para>
<para>
<figure id="fig-ports">
<title>Number of ports added between 1996 and 2003</title>
<graphic fileref="figures/portsstatus.png" format="PNG">
</figure>
</para>
<para>
<xref linkend="fig-ports"> is taken from
<ulink url="http://www.freebsd.org/ports/growth/status.png">
the FreeBSD web site</ulink>. It shows the number of ports
available to FreeBSD in the period 1995 to 2003. It looks
like the curve has first grown exponentionally, and then
since the middle of 2001 grown linerly.
</para>
<para>
As the external software described by the port often is under
continued development, the amount of work required to maintain
the ports is already large, and increasing. This has led to
the ports part of the FreeBSD project gaining a more empowered
structure, and is more and more becoming a sub-project of the
FreeBSD project.
</para>
<para>
Ports has its own core team with the
<xref linkend="role-ports-manager"> as its leader, and this
team can appoint committers without FreeBSD Core's
approval. Unlike in the FreeBSD Project, where a lot of maintenance
frequently is rewarded with a commit bit, the ports sub-project
contains many active maintainers that are not committers.
</para>
<para>
Unlike the main project, the ports tree is not branched. Every
release of FreeBSD follows the current ports collection and has thus
available updated information on where to find programs and
how to build them. This, however, means that a port that makes
dependencies on the system may need to have variations
depending on what version of FreeBSD it runs on.
</para>
<para>
With an unbranched ports repository
it is not possible to guarantee that any port
will run on anything other than -CURRENT and -STABLE, in
particular older, minor releases. There is neither the infrastructure
nor volunteer time needed to guarantee this.
</para>
<para>
For efficiency of communication, teams depending on Ports,
such as the release engineering team, have their own ports liaisons.
</para>
</section>
<section id="sub-project-documentation" xreflabel="The FreeBSD
Documentation Project">
<title>The FreeBSD Documentation Project</title>
<para>
The FreeBSD Documentation project was started January 1995. From
the initial group of a project leader, four team leaders and 16
members, they are now a total of 44 committers. The
documentation mailing list has just under 300 members,
indicating that there is quite a large community around it.
</para>
<para>
The goal of the Documentation project is to provide good and
useful documentation of the FreeBSD project, thus making it
easier for new users to get familiar with the system and
detailing advanced features for the users.
</para>
<para>
The main tasks in the Documentation project are to work on
current projects in the <quote>FreeBSD Documentation Set</quote>,
and translate the documentation to other languages.
</para>
<para>
Like the FreeBSD Project, documentation is split in the same
branches. This is done so that there is always an updated
version of the documentation for each version. Only
documentation errors are corrected in the security branches.
</para>
<para>
Like the ports sub-project, the Documentation project can
appoint documentation committers without FreeBSD Core's approval.
<citation><xref linkend="freebsd-doceng-charter"></citation>.
</para>
<para>
The Documentation project has a primer. This is used both to
introduce new project members to the standard tools and
syntaxes and acts as a reference when working on the project.
</para>
</section>
</chapter>
<bibliography>
<title>References</title>
<biblioentry id="brooks" xreflabel="Brooks, 1995">
<authorgroup>
<author><firstname>Frederick P.</firstname><surname>Brooks</surname></author>
</authorgroup>
<copyright><year>1975</year><year>1995</year>
<holder>Pearson Education Limited</holder>
</copyright>
<isbn>0201835959</isbn>
<publisher>
<publishername>Addison-Wesley Pub Co</publishername>
</publisher>
<title>The Mythical Man-Month</title>
<subtitle>Essays on Software Engineering, Anniversary Edition (2nd Edition)</subtitle>
</biblioentry>
<biblioentry id="thesis" xreflabel="Saers, 2003">
<authorgroup>
<author><firstname>Niklas</firstname><surname>Saers</surname></author>
</authorgroup>
<copyright>
<year>2003</year>
</copyright>
<title>A project model for the FreeBSD Project</title>
<subtitle>Candidatus Scientiarum thesis</subtitle>
<bibliomisc role="url"><ulink url="http://niklas.saers.com/thesis"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="jorgensen2001" xreflabel="J&oslash;rgensen, 2001">
<authorgroup>
<author><firstname>Niels</firstname><surname>J&oslash;rgensen</surname></author>
</authorgroup>
<copyright>
<year>2001</year>
</copyright>
<title>Putting it All in the Trunk</title>
<subtitle>Incremental Software Development in the FreeBSD Open Source Project</subtitle>
<bibliomisc role="url"><ulink url="http://www.dat.ruc.dk/~nielsj/research/papers/freebsd.pdf"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="ref-pmbok" xreflabel="PMI, 2000">
<authorgroup>
<author><surname>Project Management Institute</surname></author>
</authorgroup>
<copyright><year>1996</year><year>2000</year>
<holder>Project Management Institute</holder>
</copyright>
<isbn>1-880410-23-0</isbn>
<publisher>
<publishername>Project Management Institute</publishername>
<address>
<street>Newtown Square</street>
<city>Pennsylvania</city>
<country>USA</country>
</address>
</publisher>
<title>PMBOK Guide</title>
<subtitle>A Guide to the Project Management Body of Knowledge,
2000 Edition</subtitle>
</biblioentry>
<biblioentry id="freebsd-bylaws" xreflabel="FreeBSD, 2000A">
<copyright><year>2002</year>
<holder>The FreeBSD Project</holder>
</copyright>
<title>Core Bylaws</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/internal/bylaws.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-developer-handbook" xreflabel="FreeBSD, 2002A">
<copyright><year>2002</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<title>FreeBSD Developer's Handbook</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="bsd-election2002" xreflabel="FreeBSD, 2002B">
<copyright><year>2002</year>
<holder>The FreeBSD Project</holder>
</copyright>
<title>Core team election 2002</title>
<bibliomisc role="url"><ulink url="http://election.uk.freebsd.org/candidates.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="bsd-hats" xreflabel="Losh, 2002">
<authorgroup>
<author><firstname>Warner</firstname><surname>Losh</surname></author>
</authorgroup>
<copyright><year>2002</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<title>Working with Hats</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en/articles/hats/article.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-handle-pr" xreflabel="FreeBSD, 2002C">
<authorgroup>
<author><firstname>Dag-Erling</firstname><surname>Sm&oslash;rgrav</surname></author>
<author><firstname>Hiten</firstname><surname>Pandya</surname></author>
</authorgroup>
<copyright><year>2002</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Documentation Project</publishername>
</publisher>
<title>Problem Report Handling Guidelines</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en/articles/pr-guidelines/article.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-send-pr" xreflabel="FreeBSD, 2002D">
<authorgroup>
<author><firstname>Dag-Erling</firstname><surname>Sm&oslash;rgrav</surname></author>
</authorgroup>
<copyright><year>2002</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Documentation Project</publishername>
</publisher>
<title>Writing FreeBSD Problem Reports</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en/articles/problem-reports/article.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-committer" xreflabel="FreeBSD, 2001">
<copyright><year>2001</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Documentation Project</publishername>
</publisher>
<!-- Version 1.146 -->
<title>Committers Guide</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en/articles/committers-guide/article.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-releng" xreflabel="FreeBSD, 2002E">
<authorgroup>
<author><firstname>Murray</firstname><surname>Stokely</surname></author>
</authorgroup>
<copyright><year>2002</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<!-- Version 1.42 -->
<publisher>
<publishername>The FreeBSD Documentation Project</publishername>
</publisher>
<title>FreeBSD Release Engineering</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/articles/releng/article.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="ref-bsd-handbook" xreflabel="FreeBSD, 2003A">
<authorgroup>
<author><surname>The FreeBSD Documentation Project</surname></author>
</authorgroup>
<title>FreeBSD Handbook</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-contributors" xreflabel="FreeBSD, 2002F">
<copyright><year>2002</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Documentation Project</publishername>
</publisher>
<title>Contributors to FreeBSD</title>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/articles/contributors/article.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-election" xreflabel="FreeBSD, 2002G">
<copyright><year>2002</year>
<holder>The FreeBSD Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Project</publishername>
</publisher>
<title>Core team elections 2002</title>
<bibliomisc role="url"><ulink url="http://election.uk.freebsd.org"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-expiration-policy" xreflabel="FreeBSD, 2002H">
<copyright><year>2002</year>
<holder>The FreeBSD Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Project</publishername>
</publisher>
<title>Commit Bit Expiration Policy</title>
<subtitle>2002/04/06 15:35:30</subtitle>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/internal/expire-bits.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-new-account" xreflabel="FreeBSD, 2002I">
<copyright><year>2002</year>
<holder>The FreeBSD Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Project</publishername>
</publisher>
<title>New Account Creation Procedure</title>
<subtitle>2002/08/19 17:11:27</subtitle>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/internal/new-account.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="freebsd-doceng-charter" xreflabel="FreeBSD, 2003B">
<copyright><year>2002</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<publisher>
<publishername>The FreeBSD Documentation Project</publishername>
</publisher>
<title>FreeBSD DocEng Team Charter</title>
<subtitle>2003/03/16 12:17</subtitle>
<bibliomisc role="url"><ulink url="http://www.freebsd.org/internal/doceng.html"></ulink></bibliomisc>
</biblioentry>
<biblioentry id="ref-freebsd-trenches" xreflabel="Lehey, 2002">
<authorgroup>
<author><firstname>Greg</firstname><surname>Lehey</surname></author>
</authorgroup>
<copyright><year>2002</year>
<holder>Greg Lehey</holder>
</copyright>
<publisher>
<publishername>Greg Lehey</publishername>
</publisher>
<title>Two years in the trenches</title>
<subtitle>The evolution of a software project</subtitle>
<bibliomisc role="url"><ulink url="http://www.lemis.com/grog/In-the-trenches.pdf"></ulink></bibliomisc>
</biblioentry>
</bibliography>
</book>