]> projects.mako.cc - fspm_howto/blob - FreeSoftwareDevelopmentHOWTO.sgml
A lot organizational change but not much content yet. Mostly in
[fspm_howto] / FreeSoftwareDevelopmentHOWTO.sgml
1 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
2
3 <article>
4
5 <!-- Header -->
6
7  <artheader>
8   <title>Free Software Development HOWTO</title>
9   
10   <author>
11    <firstname>Benjamin</firstname>
12    <othername>Mako</othername>
13    <surname>Hill</surname>
14    <affiliation>
15     <address>
16       <email>mako@debian.org</email>
17     </address>
18    </affiliation>
19   </author>
20   
21   <revhistory>
22    <revision>
23     <revnumber>v0.2</revnumber>
24     <date>7 April 2001</date>
25     <authorinitials>bch</authorinitials>
26    </revision>
27
28    <revision>
29     <revnumber>v0.01</revnumber>
30     <date>27 March 2001</date>
31     <authorinitials>bch</authorinitials>
32     <revremark>Initial Release</revremark>
33    </revision>
34   </revhistory>
35
36   <abstract>
37    <indexterm>
38     <primary>fswd</primary>
39    </indexterm>
40    
41    <para>
42     This HOWTO is designed for people with experience in programming
43     and some skills in managing a software project but who are new to
44     the world of free software. This document is meant to act as a
45     guide to the non-technical aspects of free software development
46     and was written to act as a crash course in the people skills that
47     aren't taught to commercial coders but that can make or break a
48     free software project.
49    </para>
50   </abstract>
51   
52  </artheader>
53
54 <!-- Section1: intro -->
55
56  <sect1 id="intro">
57   <title>Introduction</title>
58   
59   <indexterm>
60    <primary>fswd!introduction</primary>
61   </indexterm>
62   
63   <para>
64    Skimming through freshmeat.net provides mountains of reasons for this
65    HOWTO's existence--the Internet is littered with excellently
66    written and useful programs that have faded away into the Universe
67    of Free Software Forgottenness. This dismal scene made me ask
68    myself, "Why?"
69   </para>
70
71   <para>
72    This HOWTO tries to do a lot of thing (probably too many), but it
73    can't answer that question and won't attempt it. What this HOWTO
74    will attempt to do is give your Free Software project a fighting
75    chance--an edge. If you write a piece of crap that no one is
76    interested in, you can read this HOWTO until you can recite it in
77    your sleep and your project will probably fail. Then again, you can
78    write a beautiful, relevant piece of software and follow every
79    instruction in this HOWTO and your software may still not make
80    it. Sometimes life is like that. However, I'll go out a limb and
81    say that if you write a great, relevant pieces of software and
82    ignore the advise in this HOWTO, you'll probably fail <emphasis>
83    more often</emphasis>.
84   </para>
85
86   <para>
87    A lot of the information in this HOWTO is best called common
88    sense. Of course, as any debate on interfaces will prove, what is
89    common sense to some programmers proves totally unintuitive to
90    others. After explaining bits and pieces of this HOWTO to Free
91    Software developers on several occasions, I realized that writing
92    this HOWTO might provide a useful resource and a forum for
93    programmers to share ideas about what has and has not worked for
94    them.
95   </para>
96
97   <para>
98    As anyone involved in any of what seems like an unending parade of
99    ridiculous intellectual property clashes will attest to, a little
100    bit of legalese proves important.
101   </para>
102
103 <!-- Section2: copyright -->
104
105   <sect2 id="copyright">
106    <title>Copyright Information</title>
107
108    <para>
109     This document is copyrighted (c) 2000 Benjamin (Mako) Hill and is
110     distributed under the terms of the Linux Documentation Project
111     (LDP) license, stated below.
112    </para>
113
114    <para>
115     Unless otherwise stated, Linux HOWTO documents are copyrighted by
116     their respective authors. Linux HOWTO documents may be reproduced
117     and distributed in whole or in part, in any medium physical or
118     electronic, as long as this copyright notice is retained on all
119     copies. Commercial redistribution is allowed and encouraged;
120     however, the author would like to be notified of any such
121     distributions.
122    </para>
123
124    <para>
125     All translations, derivative works, or aggregate works
126     incorporating any Linux HOWTO documents must be covered under this
127     copyright notice. That is, you may not produce a derivative work
128     from a HOWTO and impose additional restrictions on its
129     distribution. Exceptions to these rules may be granted under
130     certain conditions; please contact the Linux HOWTO coordinator at
131     the address given below.
132    </para>
133
134    <para>
135     In short, we wish to promote dissemination of this information
136     through as many channels as possible. However, we do wish to
137     retain copyright on the HOWTO documents, and would like to be
138     notified of any plans to redistribute the HOWTOs.
139    </para>
140
141    <para>
142     If you have any questions, please contact
143     <email>linux-howto@metalab.unc.edu</email>
144    </para>
145   </sect2>
146
147 <!-- Section2: disclaimer -->
148
149   <sect2 id="disclaimer">
150    <title>Disclaimer</title>
151
152    <para>
153     No liability for the contents of this documents can be accepted.
154     Use the concepts, examples and other content at your own risk.  As
155     this is a new edition of this document, there may be errors and
156     inaccuracies, that may of course be damaging to your system.
157     Proceed with caution, and although this is highly unlikely, the
158     author(s) do not take any responsibility for that.
159    </para>
160
161    <para>
162     All copyrights are held by their by their respective owners, unless
163     specifically noted otherwise.  Use of a term in this document
164     should not be regarded as affecting the validity of any trademark
165     or service mark.
166    </para>
167
168    <para>
169     Naming of particular products or brands should not be seen 
170     as endorsements.
171    </para>
172
173    <para>
174     You are strongly recommended to take a backup of your system 
175     before major installation and backups at regular intervals.
176    </para>
177   </sect2>
178
179 <!-- Section2: newversions-->
180
181   <sect2 id="newversions">
182    <title>New Versions</title>
183
184     <indexterm>
185      <primary>fswd!news on</primary>
186     </indexterm>
187
188    <para>
189     This is the initial release. It is written to be released to
190     developers for critique and brainstorming and submitted to
191     Hampshire College for academic credit. Please keep in mind that
192     this version of the HOWTO is still in an infant stage and will be
193     revised extensively before it hits the LDP.
194    </para>
195
196    <para>
197     The latest version number of this document should always be listed
198     on <ulink url="http://people.debian.org/~mako/">my webpage at
199     Debian</ulink>.
200    </para>
201
202    <para>
203     The newest version of this HOWTO will always be made available at
204     the same website, in a variety of formats:
205    </para>
206
207    <para>
208    <itemizedlist>
209
210     <listitem>
211      <para>
212       <ulink url="http://people.debian.org/~mako/projects/howto/FreeSoftwareDevelopment-HOWTO/t1.html">HTML</ulink>.
213      </para>
214     </listitem>
215
216
217     <listitem>
218      <para>
219       <ulink url="http://people.debian.org/~mako/projects/howto/FreeSoftwareDevelopment-HOWTO.html">HTML (single page)</ulink>.
220      </para>
221     </listitem>
222
223     <listitem>
224      <para>
225        <ulink URL="http://people.debian.org/~mako/projects/howto/FreeSoftwareDevelopment-HOWTO.txt">plain text</ulink>.
226      </para>
227     </listitem>
228
229     <listitem>
230      <para>
231       <ulink url="http://people.debian.org/~mako/projects/howto/FreeSoftwareDevelopment-HOWTO.ps.gz">compressed postscript</ulink>.
232      </para>
233     </listitem>
234
235     <listitem>
236      <para>
237       <ulink url="http://people.debian.org/~mako/projects/howto/FreeSoftwareDevelopment-HOWTO.sgml.gz">Compressed SGML source</ulink>.
238      </para>
239     </listitem>
240    </itemizedlist>
241    </para>
242   </sect2>
243
244 <!-- Section2: credits -->
245
246   <sect2 id="credits">
247    <title>Credits</title>
248
249    <para>
250     In this version I have the pleasure of acknowledging:
251    </para>
252
253    <para>
254     <emphasis>Karl Fogel</emphasis>, the author of <emphasis>Open
255     Source Development with CVS</emphasis> published by the Coriolis
256     Open Press. Large parts of his book are available <ulink
257     url="http://cvsbook.red-bean.com">on the web</ulink>. 225 pages of
258     the book are available under the GPL and constitute the best
259     tutorial on CVS I've ever seen. The rest of the book covers, "the
260     challenges and philosophical issues inherent in running an Open
261     Source project using CVS." The book does a good job of covering
262     some of the subjects brought up in this HOWTO and much
263     more. <ulink url="http://cvsbook.red-bean.com">The book's
264     website</ulink> has information on ordering the book and provides
265     several translations of the chapters on CVS. I you are seriously
266     interested in running a Free Software project, you want this
267     book. I tried to mention Fogel in sections of this HOWTO where I
268     knew I was borrowing directly from his ideas. If I missed any, I'm
269     sorry, and I'll try and have those fixed in future versions.
270    </para>
271    
272    <para>
273     Karl Fogel can be reached at <email>kfogel (at) red-bean (dot)
274     com</email>
275    </para>
276
277    <para>
278     Also providing support material, and inspiration for this HOWTO is
279     Eric S. Raymond for his prolific, consistent, and carefully
280     crafted arguments, Lawrence Lessig for reminding me of the
281     importance of Free Software. Additionaly, I want to thank every
282     user and developer involved with the <ulink
283     url="http://www.debian.org">Debian Project</ulink>. The project
284     has provided me with a home, a place to practice Free Software
285     advocacy, a place to make a difference, a place to learn from
286     those how have been involved with the movement much longer than I,
287     and proof of a Free Software project that definitely, definitely
288     works.
289    </para>
290
291    <para>
292     Above all, I want to thank <emphasis>Richard Stallman</emphasis>
293     for his work at the Free Software Foundation and for never giving
294     up. Stallman provides and articulates the philosophical basis that
295     attracts me to Free Software and that drives me towards writing a
296     document to make sure it succeeds. RMS can always be emailed at
297     <email>rms (at) gnu (dot) org</email>.
298    </para>
299
300   </sect2>
301
302 <!-- Section2: feedback -->
303
304   <sect2 id="feedback">
305    <title>Feedback</title>
306
307    <para>
308     Feedback is always and most certainly welcome for this
309     document. Without your submissions and input, this document
310     wouldn't exist. Do you feel that something is missing? Don't
311     hesitate to contact me to have me write a chapter, section, or
312     subsection or to write one yourself. I want this document to be a
313     product of the Free Software development process that it heralds
314     and I believe that its ultimate success will be rooted in this
315     fact. Please send your additions, comments and criticisms to the
316     following email address : <email>mako@debian. org</email>.
317    </para>
318    </sect2>
319
320 <!-- Section2: translations -->
321
322   <sect2 id="translations">
323    <title>Translations</title>
324
325    <para>
326     I know that not everyone speaks English. Translations are nice and
327     I'd love for this HOWTO to gain the kind of international reach
328     afforded by a translated version.
329    </para>
330
331    <para>
332     However, this HOWTO is still young and I have to yet to be
333     contacted about a translation so English is all that is currently
334     available. If you would like to help with or do a translation, you
335     will gain my utmost respect and admiration and you'll get to be
336     part of a cool process. If you are at all interested, please don't
337     hesitate to contact me at: <email>mako@debian.org</email>.
338    </para>
339    </sect2>
340  </sect1>
341
342 <!-- Section1: intro: END -->
343
344 <!-- Section1: starting -->
345
346  <sect1 id="starting">
347   <title>Starting a Project</title>
348
349    <indexterm>
350     <primary>fswd!starting</primary>
351    </indexterm>
352   <para>
353    With very little argument, the beginning is most difficult part of
354    successful free software development. Laying a firm foundation will
355    determine whether your project flourishes or withers away and
356    dies. It is also the subject that is of most immediate interest to
357    anyone reading this document as a tutorial.
358   </para>
359
360   <para>
361    Starting a project involves a dilemma that you as a developer must
362    try and deal with: No potential user for your program is interested
363    in a program that doesn't work. Simultaneously, the development
364    process that you want to employ holds involvement of users as
365    prerequisit to working software.
366   </para>
367
368   <para>
369    It is in these dangerous initial moments that anyone working to
370    start a free software project must try and strike a balance along
371    these lines. One of the most important ways that someone trying to
372    start a project can work towards this balance is by establishing a
373    solid framework for the development process through some of the
374    suggestions mentioned in this section.
375   </para>
376
377
378 <!-- Section2: chooseproject-->
379
380   <sect2 id="chooseproject">
381    <title>Choosing a Project</title>
382
383    <para>
384     If you are reading this document, there's a good chance you
385     already have an idea for a project in mind. Chances are pretty
386     good, it fills in a percieved gap by doing something that no other
387     free software process does or by doing something in a way the is
388     unique enough to necessitate a separate project.
389    </para>
390
391    <sect3 id=identifyidea>
392     <title>Identify and articulate your idea</title>
393     <para>
394      Eric S. Raymond writes about how free software projects start in
395      his paper, <quote>The Cathedral and the Bazaar,</quote> which
396      comes as required reading for any free software development. It
397      is available <ulink
398      url="http://www.tuxedo.org/~esr/writings/cathedral-bazaar/">online
399      </ulink>.
400     </para>
401
402     <para>
403      In <quote>The Cathedral and the Bazaar,</quote> Raymond tells us
404      that: <emphasis>Every good work of software starts by scratching
405      a developers itch.</emphasis> Raymond's now widely accepted
406      hypothesis is that new free software programs are written, first
407      and foremost, to solve a specific problem facing the developer.
408     </para>
409
410     <para>
411      If you have an idea for a program in mind, chances are good that
412      it targets a specific problem or <quote>itch</quote> you want to
413      see scratched. This idea is the project. Articulate it
414      clearly. Write it out. Describe the problem you will attack in
415      detail. The success of your project in tackling a particular
416      problem will be tied to your ability to identify that problem
417      early on. Find out exactly what it is that you want your project
418      to do.
419     </para>
420    </sect3>
421
422    <sect3 id=evalulateidea>
423     <title>Evaluate your idea</title>
424
425     <para>
426      In evaluating your idea, you need to first ask yourself a few
427      questions.  Before you move any further into this HOWTO, you need
428      to determine if the free software development model really is the
429      right one for your project. Obviously, since the program
430      scratches your itch, you are definitely interested in seeing it
431      implemented in code. But, because one hacker coding in solitude
432      fails to qualify as a free software development effort, you need
433      to ask yourself the question: <emphasis>Is anybody else
434      interested?</emphasis>
435     </para>
436
437     <para>
438      Sometimes the answer is a simple <emphasis>no</emphasis>. If you
439      want to write a set of scripts to sort <emphasis>your</emphasis>
440      <acronym>MP3</acronym> collection on your machine, maybe the free
441      software development model is not the best one to
442      choose. However, if you want to write a set of scripts to sort
443      <emphasis>anyone's</emphasis> <acronym>MP3</acronym>s, a free
444      software project might fill a useful gap.
445     </para>
446
447     <para>
448      Luckily, The Internet is a place so big and so diverse that,
449      chances are, there is someone, somewhere, who shares your
450      interests and how feels the same <quote>itch.</quote> It is the
451      fact that there are so many people with so many similar needs and
452      desires that introduces the second major question: <emphasis>Has
453      somebody already had your idea or a reasonably similar
454      one?</emphasis>
455     </para>
456
457      <sect4 id=evalwhere>
458       <title>Finding Similar Projects</title>
459
460      <para>
461       There are places you can go on the web to try and answer the
462       question above. If you have experience with the free software
463       community, you are probably already familiar with all of these
464       sites. All of the resources listed bellow offer searching of
465       their databases:
466      </para>
467
468      <para>
469      <variablelist>
470        <varlistentry>
471         <term>freshmeat.net:</term>
472         <listitem>
473          <para><ulink url="http://freshmeat.net">freshmeat.net</ulink>
474          describes itself as, <quote>the Web's largest index of Linux
475          and Open Source software</quote> and its reputation along
476          these lines is totally unparalleled and unquestioned. If you
477          can't find it on freshmeat, its doubtful that you (or anyone
478          else) will find it anywhere.</para>
479         </listitem>
480        </varlistentry>
481
482        <varlistentry>
483         <term>Slashdot:</term>
484         <listitem>
485          <para><ulink url="http://slashdot.org">Slashdot</ulink>
486          provides <quote>News for Nerds: Stuff that Matters,</quote>
487          which usually includes discussion of free software, open
488          source, technology, and geek culture new and events. It is
489          not unusual for an particularly sexy development effort to be
490          announced here so it definitely worth checking.</para>
491         </listitem>
492        </varlistentry>
493
494        <varlistentry>
495         <term>SourceForge:</term>
496         <listitem>
497          <para><ulink url="http://sourceforge.net">SourceForge</ulink>
498          houses and facilitates a growing number of open source and
499          free software projects. It is also quickly becoming a nexus
500          and an necessary stop for free software
501          developers. SourceForge's <ulink
502          url="http://sourceforge.net/softwaremap/trove_list.php">software
503          map</ulink> and <ulink url="http://sourceforge.net/new/"> new
504          releases</ulink> pages should be necessary stops before
505          embarking on a new free software project. SourceForge also
506          provides a at <ulink
507          url="http://sourceforge.net/snippet/">Code Snippet
508          Library</ulink> which contains useful reusable chunks of code
509          in an array of languaqges which can come in useful in any
510          project.</para>
511         </listitem>
512        </varlistentry>
513
514        <varlistentry>
515         <term>Google and Google's Linux Search:</term>
516         <listitem>
517          <para><ulink url="http://www.google.com">Google</ulink> and
518          <ulink url="http://www.google.com/linux"> Google's Linux
519          Search</ulink>, provide powerful web searches that may
520          reveal people working on similar projects. It is not a
521          catalog of software or news like freshmeat or Slashdot, but
522          it is worth checking before you begin pouring your effort
523          into a redundant project.</para>
524         </listitem>
525        </varlistentry>
526
527       </variablelist>
528      </para>
529     </sect4>
530
531     <sect4 id=evalhow>
532      <title>Deciding to Proceed</title>
533      <para>
534       Once you have successful charted the terrain and have an idea
535       bout what kinds of similar free software projects exist, every
536       developer needs to decide whether to proceed with their own
537       project. It is rare that a new project seeks to accomplish a
538       goal that is not similar to or related to the goal of another
539       project. Anyone starting a new project needs to ask themselves:
540       <quote>Will the new project be duplicating work done by another
541       project? Will the new project be competing for developers with
542       an existing project? Can the goals of the new project be
543       accomplished by adding functionality to an existing
544       project?</quote>
545      </para>
546
547      <para>
548       If the answer to any of these questions is <quote>yes,</quote>
549       try to contact the developer of the existing project(s) in
550       question and see if he or she might be willing to collaborate
551       with you.
552      </para>
553
554      <para>
555       This may be the single most difficult aspect of free software
556       development for many developers but it is an essential one. It
557       is easy to become fired up by an idea and be caught up in the
558       momentum and excitement of a new project. It is often extremely
559       difficult to do but, it is important that any free software
560       developer remember that the best interests of the free software
561       community and the quickest way to accomplish ones own project's
562       goals and the goals of similar project can often be accomplished
563       by <emphasis>not</emphasis> starting a new project.
564      </para>
565
566     </sect4>
567    </sect3>
568   </sect2>
569
570 <!-- Section2: licensing-->
571
572   <sect2 id="licensing">
573    <title>Licensing your Software</title>
574    
575    <para>
576     On one (somewhat simplistic) level, the difference between a piece
577     of free software and a piece of propriety software is the
578     license. A license helps you as the developer by protecting your
579     legal rights to have your software distributed under your terms
580     and helps demonstrate to those who wish to help you or your
581     project that they are encouraged to join.
582    </para>
583    
584    <sect3 id="chooselicense">
585     <title>Choosing a license</title>
586
587     <para>
588      Any discussion of licenses is also sure to generate at least a
589      small flame war as there are strong feelings that some free
590      software licenses are better than others. This discussion also
591      brings up the question of <quote>Open Source Software</quote> and
592      the debate around <quote>Open Source Software</quote> and
593      <quote>Free Software</quote>. However, because I've written the
594      Free Software Development HOWTO and not the Open Source
595      Development HOWTO, my own allegiances in this argument are in the
596      open.
597     </para>
598
599     <para>
600      In attempting to reach a middle ground through diplomacy without
601      sacrificing my own philosophy, I recommend picking any license
602      that conforms to the <ulink
603      url="http://www.debian.org/social_contract">Debian Free Software
604      Guidelines</ulink>. Originally compiled by the Debian project
605      under Bruce Perens, the <acronym>DFSG</acronym> form the first
606      version of the Open Source definition. Examples of free licenses
607      given by the <acronym>DFSG</acronym> are the
608      <acronym>GPL</acronym>, the <acronym>BSD</acronym>, and the
609      Artistic License. 
610     </para>
611
612     <para>
613      Conforming to the definition of Free Software offered by Richard
614      Stallman in <ulink
615      url="http://www.gnu.org/philosophy/free-sw.html"><quote>The Free
616      Software Definition</quote></ulink>, any of these licenses will
617      uphold,<quote> users' freedom to run, copy, distribute, study,
618      change and improve the software.</quote> There are plenty of
619      other licenses that also conform to the <acronym>DFSG</acronym>
620      but sticking with a more common license will offer the advantage
621      of immediate recognition and understanding.
622     </para>
623
624     <para>
625      In attempting a more in-depth analysis, I agree with Karl Fogel's
626      description of licenses as falling into two groups: those that
627      are the <acronym>GPL</acronym> and those that are not the
628      <acronym>GPL</acronym>.
629     </para>
630
631     <para>
632      Personally, I license all my software under the
633      <acronym>GPL</acronym>. Created and protected by the Free
634      Software Foundation and the GNU Project, the
635      <acronym>GPL</acronym> is the license for the Linux kernel,
636      GNOME, Emacs, and the vast majority of GNU/Linux software. It's
637      the obvious choice but I believe it is a good one. Any BSD
638      fanatic will urge you to remember that there is a viral aspect to
639      the <acronym>GPL</acronym>that prevents the mixture of
640      <acronym>GPL</acronym>'ed code with non-<acronym>GPL</acronym>'ed
641      code. To many people (myself included), this is a benefit, but to
642      some, it is a major drawback.
643     </para>
644
645     <para>
646      The three major license can be found at the following locations:
647     </para>
648
649     <para>
650      <itemizedlist>
651       <listitem>
652        <para><ulink url="http://www.gnu.org/copyleft/gpl.html">The GNU
653        General Public License</ulink></para>
654       </listitem>
655       <listitem>
656        <para><ulink url="http://www.debian.org/misc/bsd.license">The
657        BSD License</ulink></para>
658       </listitem>
659       <listitem>
660        <para><ulink
661        url="http://language.perl.com/misc/Artistic.html">The Artistic
662        License</ulink></para>
663       </listitem>
664      </itemizedlist>
665     </para>
666
667     <para>
668      <emphasis>In any case, please read through any license before
669      your release your software. As the primary developer, you can't
670      afford any license surprises.</emphasis>
671     </para>
672    </sect3>
673
674    <sect3 id="licensechoose">
675     <title>The mechanics of licensing</title>
676
677     <para>
678      The text of the <acronym>GPL</acronym> offers <ulink
679      url="http://www.gnu.org/copyleft/gpl.html#SEC4">a good
680      description</ulink> of mechanics of applying a license to a piece
681      of software. My quick checklist for applying a license includes:
682     </para>
683
684     <para>
685      <itemizedlist>
686      
687       <listitem>
688        <para>If at all possible, attach and distribute a full copy of
689        the license with the source and binary in a separate
690        file.</para>
691       </listitem>
692
693       <listitem>
694        <para>At the top of each source file in your program, attach a
695        notice of copyright and information on where the full license
696        can be found. The <acronym>GPL</acronym> recommends that each
697        file begin with:</para>
698
699        <screen>
700 <emphasis>one line to give the program's name and an idea of what it does.</emphasis>
701 Copyright (C) yyyy  name of author
702
703 This program is free software; you can redistribute it and/or
704 modify it under the terms of the GNU General Public License
705 as published by the Free Software Foundation; either version 2
706 of the License, or (at your option) any later version.
707
708 This program is distributed in the hope that it will be useful,
709 but WITHOUT ANY WARRANTY; without even the implied warranty of
710 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
711 GNU General Public License for more details.
712
713 You should have received a copy of the GNU General Public License
714 along with this program; if not, write to the Free Software
715 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
716        </screen>
717
718        <para>
719         The <acronym>GPL</acronym> goes on to recommend attaching
720         information on contacting you (the author) via email or
721         physical mail.
722       </para>
723       </listitem>
724
725       <listitem>
726        <para>
727         The <acronym>GPL</acronym> continues and suggests that if your
728         program runs in an interactive mode, you should write the
729         program to output a notice each time it enters interactive
730         mode that includes a message like this one that points to more
731         information about the programs licensing:
732        </para>
733
734        <screen>
735 Gnomovision version 69, Copyright (C) year name of author
736 Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
737 type `show w'.  This is free software, and you are welcome
738 to redistribute it under certain conditions; type `show c' 
739 for details.
740        </screen>
741       </listitem>
742
743       <listitem>
744        <para>Finally, it might be helpful to include a
745        <quote>copyright disclaimer</quote> with the program from an
746        employer or a school if you work as a programmer or if it seems
747        like your employer or school might be able to make an argument
748        for ownership of your code later on. Its often needed but there
749        are plenty of free software developers who have gotten into
750        trouble and wish they had attained one.</para>
751       </listitem>
752
753      </itemizedlist>
754     </para>    
755    </sect3>
756
757    <sect3 id="licensewarning">
758     <title>Final license warning</title>
759
760     <para>
761      Please, please, please, place your software under some
762      license. It may not seem important, and to you, it may not be,
763      but licenses <emphasis>are</emphasis> important. For a piece of
764      software to be included in the Debian GNU/Linux distribution, it
765      must have a license that fits the <ulink
766      url="http://www.debian.org/social_contract">Debian Free Software
767      Guidelines</ulink>. If you have no license, your program can not
768      be distributed as a package in Debian until you re-release it
769      under a free license. Please save yourself and others trouble by
770      releasing the first version of your software with a clear
771      license.
772     </para>
773
774    </sect3>
775
776  </sect2>
777
778 <!-- Section2: chooseversioning-->
779
780   <sect2 id="chooseversioning">
781    <title>Choosing a Method of Version Numbering</title>
782
783    <para>
784     <emphasis>The most important thing about a system of version
785     numbering is that there is one.</emphasis> It may seem pedantic to
786     emphasize this point but you'd be surprised at the number of
787     scripts and small programs that pop up without any version number
788     at all.
789    </para>
790
791    <para>
792     <emphasis>The second most important thing about a system of
793     numbering is that the numbers always go up.</emphasis> Automatic
794     version tracking systems and people's sense of order in the
795     universe will fall apart if version numbers don't rise. It doesn't
796     <emphasis>really</emphasis> matter if 2.1 is a big jump and
797     2.0.005 is a small jump but it does matter that 2.1 is more recent
798     than 2.0.005.
799    </para>
800
801    <para>
802     Follow these two simple rules and you will not go (too)
803     wrong. Still, there are several version numbering systems that are
804     well known, useful, and that might be worth looking into before
805     you release your first version.
806    </para>
807
808    <variablelist>
809     <varlistentry>
810      <term>Linux kernel version numbering:</term>
811      <listitem>
812       <para>The Linux kernel uses a versioning system where any odd
813       minor version number refers to an development or testing release
814       and any even minor version number refers to a stable
815       version. Think about it for a second. Under this system, 2.1 and
816       2.3 kernels were and always will be development or testing
817       kernels and 2.0, 2.2. and 2.4 kernels are all production code
818       with a higher degree of stability and more testing.
819      </para>
820
821       <para>
822        Whether you plan on having a split development model (as
823        described in <xref linkend="branches">) or only one version
824        released at a time, my experience with several free software
825        projects and with the Debian project has taught me that use of
826        Linux's version numbering system is worth taking into
827        consideration. In Debian, all minor versions are stable
828        distributions (2.0, 2.1, etc). However, many people assume that
829        2.1 is an unstable or development version and continue to use
830        an older version until they get so frustrated with the lack of
831        progress development that they complain and figure the system
832        out. If you never release an odd minor version but only release
833        even ones, nobody is hurt, and less people are confused. It's
834        worth taking into consideration.
835       </para>
836      </listitem>
837     </varlistentry>
838
839     <varlistentry>
840      <term>Wine version numbering:</term>
841      <listitem>
842       <para>Because of the unusual nature of wine's development where
843       the not-emulator is constantly improving but not working towards
844       any immediately achievable goal, wine is released every three
845       weeks. Wine does this by labeling their releases in Year Month
846       Day format where each release might be labeled
847       <quote>wine-XXXXXXXX</quote> where the version from January 04,
848       2000 would be <quote>wine-20000104</quote>. For certain
849       projects, Year Month Day format can make a lot of sense.
850       </para>
851      </listitem>
852     </varlistentry>
853
854     <varlistentry>
855      <term>Mozilla milestones:</term>
856      <listitem>
857       <para>When one considers Netscape 6 and vendor versions, the
858       mozilla's project development structure is one of the most
859       complex free software model available. Their version numbering
860       has reflected the unique situation in which it is
861       developed.
862       </para>
863
864       <para>
865        Mozilla's version numbering structure has historically been
866        made up of milestones. From the beginning of the mozilla
867        project, the goals of the project in the order and degree to
868        which they were to be achieved were charted out on a series of
869        <ulink url="http://www.mozilla.org/roadmap.html">road
870        maps</ulink>. Major points and achievements along these
871        road-maps were marked as milestones. Therefore, mozilla was
872        built and distributed nightly as "nightly builds" but on a day
873        when the goals of a milestone on the road-map had been reached,
874        that particular build was marked as a milestone release.
875       </para>
876
877       <para>
878        While I haven't seen this method employed in any other projects
879        to date, I like the idea and think that it might have value in
880        any testing or development branch of a large free application
881        under heavy development.
882       </para>
883      </listitem>
884     </varlistentry>
885
886    </variablelist>
887   </sect2>
888
889 <!-- Section2: documentation-->
890
891   <sect2 id="documentation">
892    <title>Documentation</title>
893
894    <para>
895     A huge number of otherwise fantastic free software applications
896     have withered and died because their author was the only person
897     who knew how to use them fully. Even if your program is written
898     primarily for a techno-savvy group of users, documentation is
899     helpful and even necessary for the survival of your project. You
900     will learn later in <xref linkend="releasing"> that you should
901     always release something that is usable. <emphasis>A piece of
902     software without documentation is not usable.</emphasis>
903    </para>
904
905    <para>
906     There are lots of different people for whom to document and
907     therefore there are lots of ways to document your project. The
908     idea of documentation in source code to help facilitate
909     development by a large community is vital but it falls outside the scope
910     of this HOWTO. This being the case, this section deals mostly
911     useful tactics for user-directed documentation.
912    </para>
913
914    <para>
915     A combination of tradition and necessity has resulted in a
916     semi-regular system of documentation in most free software
917     projects that is worth following. Both users and developers expect
918     to be able to get documentation in several ways and it's essential
919     that you provide the information they are seeking in a form they
920     can read if your project is ever going to get off the
921     ground. People have come to expect:
922    </para>
923
924    <sect3>
925     <title>Man pages</title> 
926
927     <para>Your users will want to be able to type <quote>man
928     projectname</quote> end up with a nicely formatted man page
929     highlighting the basic use of yourapplication. Make sure that
930     before you release your program, you've planned for this.
931     </para>
932
933     <para>
934      Man pages are not difficult to write. There is excellent
935      documentation on the man page writing process available through the
936      <quote>The Linux Man-Page-HOWTO</quote> available through the
937      Linux Documentation project <acronym>(LDP)</acronym> written by
938      Jens Schweikhardt. It is available <ulink
939      url="http://www.schweikhardt.net/man_page_howto.html">from
940      Schweikhardt's site</ulink> or <ulink
941      url="http://www.linuxdoc.org/HOWTO/mini/Man-Page.html">from the
942      <acronym>LDP</acronym></ulink>.
943     </para>
944
945     <para>
946      It is also possible to write man pages using DocBook SGML and
947      convert them into man pages. Because man pages are so simple and
948      the DocBook method relatively new, I have not been able to follow
949      this up but would love help from anyone who can give me more
950      information on how exactly this is done.
951     </para>
952    </sect3>
953
954    <sect3>
955     <title>Command line accessible documentation</title>
956
957     <para>
958      Most users will expect some basic amount of documentation to be
959      easily available from the command line. For few programs should
960      this type of documentation extend for more than one screen (24 or
961      25 lines) but it should cover the basic usage, a brief (one or
962      two sentence) description of the program, a list of the commands
963      with explanations, all the major options (also with
964      explanations), and a pointer to more in-depth documentation for
965      those who need it. The command line documentation for Debian's
966      apt-get serves as an excellent example and a useful model:
967     </para>
968
969     <screen>
970 apt 0.3.19 for i386 compiled on May 12 2000  21:17:27
971 Usage: apt-get [options] command
972        apt-get [options] install pkg1 [pkg2 ...]
973
974 apt-get is a simple command line interface for downloading and
975 installing packages. The most frequently used commands are update
976 and install.
977
978 Commands:
979    update - Retrieve new lists of packages
980    upgrade - Perform an upgrade
981    install - Install new packages (pkg is libc6 not libc6.deb)
982    remove - Remove packages
983    source - Download source archives
984    dist-upgrade - Distribution upgrade, see apt-get(8)
985    dselect-upgrade - Follow dselect selections
986    clean - Erase downloaded archive files
987    autoclean - Erase old downloaded archive files
988    check - Verify that there are no broken dependencies
989
990 Options:
991   -h  This help text.
992   -q  Loggable output - no progress indicator
993   -qq No output except for errors
994   -d  Download only - do NOT install or unpack archives
995   -s  No-act. Perform ordering simulation
996   -y  Assume Yes to all queries and do not prompt
997   -f  Attempt to continue if the integrity check fails
998   -m  Attempt to continue if archives are unlocatable
999   -u  Show a list of upgraded packages as well
1000   -b  Build the source package after fetching it
1001   -c=? Read this configuration file
1002   -o=? Set an arbitary configuration option, eg -o dir::cache=/tmp
1003 See the apt-get(8), sources.list(5) and apt.conf(5) manual
1004 pages for more information and options.
1005     </screen>
1006
1007     <para>
1008      It has become a GNU convention to make this type of information
1009      accessible with the <quote>-h</quote> and the
1010      <quote>--help</quote> options. Most GNU/Linux users will expect
1011      to be able to retrieve basic documentation these ways so if you
1012      choose to use different method, be prepared for the flames and
1013      for the fallout that may result.
1014     </para>
1015    </sect3>
1016
1017    <sect3>
1018     <title>Files users will expect</title>
1019     <para>
1020      In addition to man pages and command-line help, there are certain
1021      files where people will look for documentation, especially in any
1022      package containing source code. In a source distribution, most of
1023      these files can be stored in a the root directory of the source
1024      distribution or in a subdirectory of the root called
1025      <quote>doc</quote> or <quote>Documentation</quote>. Common files
1026      places in these places include:
1027     </para>
1028
1029     <para>
1030      <variablelist>
1031       <varlistentry>
1032        <term>README or Readme</term>
1033
1034        <listitem>
1035         <para>A document containing all the basic installation,
1036         compilation, and even basic use instructions that make up the
1037         bare minimum information needed to get the program up and
1038         running. A README is not your chance to be verbose but needs
1039         to be concise and effective. An ideal README is at least 30
1040         lines long and more no more than 250.</para>
1041        </listitem>
1042
1043       </varlistentry>
1044       <varlistentry>
1045        <term>INSTALL or Install</term>
1046
1047        <listitem>
1048         <para>The INSTALL file should be much shorter than the README
1049         file and should quickly and concisely describe how to build
1050         and install the program. Usually an INSTALL file simply
1051         instructs the user to run <quote>./configure; make; make
1052         install</quote> and touches on any unusual options or actions
1053         that may be necessary. More advanced users can usually avoid
1054         INSTALL files but it's good practice to at least glance at one
1055         to understand what can be expected. For most relatively
1056         standard install procedures and for most programs, INSTALL
1057         files are as short as possible are rarely over 100
1058         lines.</para>
1059        </listitem>
1060
1061       </varlistentry>
1062       <varlistentry>
1063        <term>Changelog, ChangeLog, CHANGELOG, or changelog</term>
1064
1065        <listitem>
1066         <para>A changelog is a simple file that every well-managed
1067         free software project should include. A changelog is simple
1068         the file that, as its name implies, logs or documents the
1069         changes to a program. The most simple way to do a changelog is
1070         to simply keep a file with the source code for your program
1071         and add a section to the top of the changelog with each
1072         release describing what has been, changed, fixed, or added to
1073         the program. It's a good idea to post the changelog onto the
1074         website as well because it can help people decide whether they
1075         want or need to upgrade to a newer version or wait for a more
1076         significant upgrade.</para>
1077        </listitem>
1078
1079       </varlistentry>
1080       <varlistentry>
1081        <term>NEWS</term>
1082
1083        <listitem>
1084         <para>A NEWS file and a ChangeLog are similar. A news file is
1085         not typically sorted by version but just whenever new features
1086         are added, the developer responisble will make a note in the
1087         NEWS file. NEWS files should not have to changed before a
1088         release (they should be kept up to date all along) but it's
1089         usually a good idea to check first anyway because often people
1090         just forget to keep them as current as they should.</para>
1091        </listitem>
1092
1093       </varlistentry>
1094       <varlistentry>
1095        <term><acronym>FAQ</acronym></term>
1096
1097        <listitem>
1098         <para>For those of you that don't already
1099         know. <acronym>FAQ</acronym> stands for Frequently Asked
1100         Questions and a FAQ is a collection of exactly that. FAQs
1101         are not difficult to make. Simply make a policy that if you
1102         are asked a question or see a question on a mailing list two
1103         or more times, add it the question (and its answer) to your
1104         FAQ. FAQs are more optional than the files listed above but
1105         they can save your time, increase usability, and decrease
1106         headaches on all sides.</para>
1107        </listitem>
1108
1109       </varlistentry>
1110      </variablelist>
1111     </para>
1112    </sect3>
1113
1114    <sect3>
1115     <title>Website</title> 
1116     <para>
1117      It's only idirectly an issue of documentation but a good website
1118      is quickly becoming an essential part of any free software
1119      project's documentation. Your website should provide access to
1120      documentation (in <acronym>HTML</acronym> if possible). It should
1121      also include a section for news and events around your program
1122      and a section that details the process of getting involved with
1123      development or testing and creates an open invitation. It should
1124      also supply links to any mailing lists, similar websites, and
1125      provide a direct link to all the available ways of downloading
1126      your software.
1127     </para>
1128    </sect3>
1129
1130    <sect3>
1131     <title>Other documentation hints</title>
1132
1133     <para>
1134      It doesn't hurt to distribute any documentation for your program
1135      from your website or anywhere else (FAQs etc) with the
1136      program. Make a FAQ by cutting and posting common questions and
1137      answers from a mailing list or your own email. Then, don't
1138      hesitate through this in the programs tarball. If people don't
1139      need it, they will delete it. I can repeat it over and over:
1140      <emphasis>Too much documentation is not a sin.</emphasis>
1141     </para>
1142
1143     <para>
1144      All your documentation should be in plaintext, or, in cases where
1145      it is on your website primarily, in HTML. Everyone can cat a
1146      file, everyone has a pager, (almost) everyone can render
1147      HTML. <emphasis>You are welcome to distribute information in PDF,
1148      PostScript, RTF, or any number of other widely used formats but
1149      this information must also be available in plaintext or HTML or
1150      people will be very angry at you.</emphasis>
1151     </para>
1152    </sect3>
1153   </sect2>
1154
1155 <!-- Section2: presentation -->
1156
1157   <sect2 id="presentation">
1158    <title>Other Presentation Issues</title>
1159    <para>
1160     Many of the remaining issues surrounding the creation of a new
1161     free software program fall under what most people describe as
1162     common sense issues. Still, they are worth noting briefly in
1163     hopes that they may remind a developer of something they may have
1164     forgotten.
1165    </para>
1166
1167    <sect3>
1168     <title>Package formats</title>
1169     <para>
1170      Package formats may differ depending on the system you are
1171      developing for. For windows based software, Zip archives (.zip)
1172      usually serve as the package format of choice. If you are
1173      developing for GNU/Linux, *BSD, or any UN*X, make sure that your
1174      source code is always available in tar'ed and gzip'ed format
1175      (.tar.gz). UNIX compress (.Z) has gone out of style and
1176      usefulness and faster computers have brought bzip2 (.bz2) into
1177      the spot-lit as a more effective compression medium. I now make
1178      all my releases available in both gzip'ed and bzip2'ed formats.
1179     </para>
1180
1181     <para>
1182      Binary packages are largely distribution specific. You can build
1183      binary packages against a current version of a major
1184      distribution, you will only make your users happy. Try to foster
1185      relationships with users or developers of large distribution to
1186      develop a system for consistent binary packages. It's often a
1187      good idea to provide RedHat <acronym>RPM</acronym>'s (.rpm),
1188      Debian deb's (.deb) and source <acronym>RPM</acronym>'s
1189      <acronym>SRPM</acronym>'s. Binary packages can also be compiled
1190      against a specified system with specified libraries and
1191      distributed in tar.gz format as well. <emphasis>Remember: While
1192      these binaries packages are nice, getting the source packaged and
1193      released should always be your priority. Your users or fellow
1194      developers can and will do the the binary packages for
1195      you.</emphasis>
1196     </para>
1197    </sect3>
1198
1199    <sect3>
1200     <title>Useful tidbits and presentation hints</title>
1201
1202     <para>
1203      Other useful hints include:
1204     </para>
1205
1206     <para>
1207      <itemizedlist>
1208
1209       <listitem>
1210        <para>
1211         <emphasis>Make sure that your program can always be found in a
1212         single location.</emphasis> Often this means that you have a
1213         single directory accessible via <acronym>FTP</acronym> or
1214         <acronym>HTTP</acronym> where the newest version will be
1215         quickly recognized. One effective technique is a provide a
1216         symlink called <quote>projectname-latest</quote> that is
1217         always pointing to the most recent released or development
1218         version of your free software project. Keep in mind that this
1219         location will recieve many requests for downloads around
1220         releases so make sure that the server you choose for this
1221         purpose has adequate bandwidth.
1222        </para>
1223       </listitem>
1224
1225       <listitem>
1226        <para>
1227         <emphasis>Make sure that there is a consistent email address
1228         for bug reports.</emphasis> It's usually a good idea to make
1229         this something that is NOT your primary email address like
1230         projectname@host or projectname-bugs@host. This way if you
1231         ever decide to hand over maintainership or if your email
1232         address changes, you simply need to change where this email
1233         address forwards. It also will allow for more than one person
1234         to deal with the influx of mail that is created if your
1235         project becomes as huge as you hope it will.
1236        </para>
1237       </listitem>
1238
1239      </itemizedlist>
1240     </para>
1241
1242    </sect3>
1243   </sect2>
1244  </sect1>
1245
1246 <!-- Section1: starting: END -->
1247
1248 <!-- Section1: developers -->
1249
1250  <sect1 id="developers">
1251   <title>Maintaining a Project: Interacting with Developers</title>
1252   <indexterm>
1253    <primary>fswd!developers</primary>
1254   </indexterm>
1255
1256   <para>
1257    Once you have gotten your project started, you have overcome the
1258    most difficult hurdles in the development process of your
1259    program. Laying a firm foundation is essential, but the development
1260    process itself is equally important and provides quite a few
1261    opportunities for failure. In the next two sections, I will cover
1262    running a project by discussing how to maintain a project through
1263    interactions with developers and with users.
1264   </para>
1265
1266   <para>
1267    In releasing your program, your program becomes free software. This
1268    transition is more than just a larger user base. By releasing your
1269    program as free software, <emphasis>your</emphasis> software
1270    becomes the <emphasis>free software community's</emphasis>
1271    software. The direction of your software's development will be
1272    reshaped, redirected, and fully determined by your users and, to a
1273    larger extent, by other developers in the community.
1274   </para>
1275
1276   <para>
1277    The major difference between free software development and
1278    propriety software development is the developer base. As the leader
1279    of a free software project, you need to attract and keep developers
1280    in a way that leaders of proprietary software projects simply don't
1281    have to worry about. <emphasis>As the person leading development of
1282    a free software project, you must harness the work of fellow
1283    developers by making responsible decisions and by responsibly
1284    choosing not to make decisions. You have to direct developers
1285    without being overbearing or bossy. You need to strive to earn
1286    respect and never forget to give it out.</emphasis>
1287   </para>
1288
1289 <!-- Section2: delegation  -->
1290
1291   <sect2 id="delegation">
1292    <title>Delegating Work</title>
1293
1294    <para>
1295     By now, you've hypothetically followed me through the early
1296     programming of a piece of software, the creation of a website and
1297     system of documentation and and we've gone ahead and (as will be
1298     discussed in <xref linkend="releasing">) released it to the rest
1299     of the world. Times passes, and if things go well, people become
1300     interested and want to help. The patches begin flowing in.
1301    </para>
1302
1303    <para>
1304     <emphasis>Like the parent of any child who grows up, it's now time
1305     to wince and smile and do most difficult thing in any parents
1306     life: It's time to let go.</emphasis>
1307    </para>
1308
1309    <para>
1310     Delegation is the political way of describing this process of
1311     <quote>letting go.</quote> It is the process of handing some of
1312     the responsibility and power over your project to other responsible
1313     and involved developers. It is difficult for anyone who has
1314     invested a large deal of time and energy into a project but it
1315     essential for the growth of any free software project. One person
1316     can only do so much. A free software project is nothing
1317     without the involvement of a group of developers. A group of
1318     developers can only be maintained through respectful and
1319     responsible leadership and delegation.
1320    </para>
1321
1322    <para>
1323     As your project progresses, you will notice people who are putting
1324     significant amounts of time and effort into your project. These
1325     will be the people submitting the most patches, posting most on
1326     the mailing lists, engaging in long email discussions. It is your
1327     responsibility to contact these people and to try and shift some of
1328     the power and responsibility of your position as the project's
1329     maintainer onto them (if they want it). There are several easy
1330     ways you can do this:
1331    </para>
1332
1333    <sect3>
1334     <title>How to delegate</title>
1335  
1336     <para>
1337      You may find that other developers seem even more experienced or
1338      knowledgeable than you. Your job as a maintainer does not mean
1339      you have to have to be the best or the brightest. It means you
1340      need are responsible for showing good judgment and for
1341      recognizing which solutions are maintainable and which are not. 
1342     </para>
1343     <para>
1344      Like anything, its easier to watch others delegate than to do it
1345      yourself. In a sentence: <emphasis>Keep an eye out for other
1346      qualified developers who show an interest and sustained
1347      involvement with your project and try and shift responsibility
1348      towards them.</emphasis> The following ideas might be good places
1349      to start or good sources of inspiration:
1350     </para>
1351  
1352     <sect4>
1353      <title>Allow a larger group of people write access to your CVS
1354      repository and make real efforts towards rule by a
1355      committee</title>
1356
1357      <para>
1358       <ulink url="http://httpd.apache.org/">Apache</ulink> is an
1359       example of a project that is run by small group of developers
1360       who vote on major technical issues and the admission of new
1361       members and all have write access to the main source
1362       repository. Their process is detailed <ulink
1363       url="http://httpd.apache.org/ABOUT_APACHE.html">online.</ulink>
1364      </para>
1365
1366      <para>
1367       The <ulink url="http://www.debian.org/"> Debian Project</ulink>
1368       is an extreme example of rule by committee. At current count,
1369       more than 700 developers have full responsibility for certain
1370       aspects of the projects. All these developers can upload into
1371       the main FTP servers, and vote on major issues. Direction for
1372       the project is determined by the project's <ulink
1373       url="http://www.debian.org/social_contract">social
1374       contract</ulink> and a <ulink
1375       url="http://www.debian.org/devel/constitution">constitution</ulink>. To
1376       facilitate this system, there are special teams (i.e. the
1377       install team, the Japanese language team) as well as a technical
1378       committee and a project leader. The leader's main responsibility
1379       is to, <quote>Appoint Delegates or delegate decisions to the
1380       Technical Committee.</quote>
1381      </para>
1382
1383      <para>
1384       While both of these projects operate on a scale that your
1385       project will not (at least initially), their example is
1386       helpful. Debian's idea of a project leader who can do
1387       <emphasis>nothing</emphasis> but delegate serves as a
1388       caricature of how a project can involve and empower a huge
1389       number of developers and grow to a huge size.
1390      </para>
1391
1392     </sect4>
1393
1394     <sect4 id="releasemanager">
1395      <title>Publicly appoint someone as the release manager for a
1396        specific release.</title>
1397
1398      <para>
1399       A release manager is usually responsible for coordinating
1400       testing, enforcing a code freeze, being responsible for
1401       stability and quality control, packaging up the software, and
1402       placing it in the appropriate places to be downloaded.
1403      </para>
1404
1405      <para>
1406       This use of the release manager is a good way to give yourself a
1407       break and to shift the responsibility for accepting and
1408       rejecting patches to someone else. It is a good way of very
1409       clearly defining a chunk of work on the project as belonging to
1410       a certain person and its a great way of giving yourself room to
1411       breath.
1412      </para>
1413     </sect4>
1414
1415     <sect4 id="delegatebranch">
1416      <title>Delegate control of an entire branch.</title>
1417      <para>
1418       If your project chooses to have branches (as described in <xref
1419       linkend="branches">), it might be a good idea to appoint someone
1420       else to be the the head of a branch. If you like focusing your
1421       energy on development releases and the implementation of new
1422       features, hand total control over the stable releases to a
1423       well-suited developer.
1424      </para>
1425
1426      <para>
1427       The author of Linux, Linus Torvalds, came out and crowned Alan
1428       Cox as <quote>the man for stable kernels.</quote> All patches
1429       for stable kernels go to Alan and, if Linus were to be taken
1430       away from work on Linux for any reason, Alan Cox would be more
1431       than suited to fill his role as the acknowledged heir to the
1432       Linux maintainership.
1433      </para>
1434     </sect4>
1435    </sect3> 
1436   </sect2>
1437
1438 <!-- Section2: patching -->
1439
1440   <sect2 id="patching">
1441    <title>Accepting and Rejecting Patches</title>
1442    <para>
1443     This HOWTO has already touched on the fact that as the maintainer
1444     of a free software project, one of primary and most important
1445     responsibilities will be accepting and rejecting patches submitted
1446     to you by other developers.
1447    </para>
1448
1449    <sect3>
1450     <title>Technical judgment</title>
1451
1452     <para>
1453      In <emphasis>Open Source Development with CVS</emphasis>, Karl
1454      Fogel makes a convincing argument that the most important things
1455      to keep in mind when rejecting or accepting patches are:
1456     </para>
1457
1458     <para>
1459      <itemizedlist>
1460
1461       <listitem>
1462        <para>A firm knowledge of the scope of your program (that's the
1463        <quote>idea</quote> I talked about in <xref linkend="chooseproject">);</para>
1464       </listitem>
1465       
1466       <listitem>
1467        <para>The ability to recognize, facilitate, and direct
1468        <quote>evolution</quote> of your program so that the program
1469        can grow and change and incorporate functionality that was
1470        originally unforeseen;</para>
1471       </listitem>
1472
1473       <listitem>
1474        <para>The necessity to avoid digressions that might expand the
1475        scope of the program too much and result and push the project
1476        towards an early death under its own weight and
1477        unwieldiness.</para>
1478       </listitem>
1479
1480      </itemizedlist>
1481     </para>
1482
1483     <para>
1484      These are the criteria that you as a project maintainer should
1485      take into account each time you receive a patch.
1486     </para>
1487
1488     <para>
1489      Fogel elaborates on this again and states the <quote>the
1490      questions to ask yourself when considering whether to implement
1491      (or approve) a change are:</quote>
1492     </para>
1493
1494     <para>
1495      <itemizedlist>
1496
1497       <listitem>
1498        <para>Will it benefit a significant percentage of the program's
1499        user community?</para>
1500       </listitem>
1501
1502       <listitem>
1503        <para>Does it fit within the program's domain or within a
1504        natural, intuitive extension of that domain?</para>
1505       </listitem>
1506
1507      </itemizedlist>
1508     </para>
1509
1510     <para>
1511      The answers to these questions are never straightforward and its
1512      very possible (and even likely) that the person who submitted the
1513      patch may feel differently about the answer to those questions
1514      than you do. However, if you feel that that the answer to either
1515      of those questions is <quote>no,</quote> it is your responsibility
1516      to reject the change. If you fail to do this, the project will
1517      become unwieldy and unmaintainable and will ultimately fail.
1518     </para>
1519    </sect3>
1520
1521    <sect3>
1522     <title>Rejecting patches</title>
1523
1524     <para>
1525      Rejecting patches is probably the most difficult and the most
1526      sensitive job that the maintainer of any free software project
1527      has to face. But sometimes it has to be done. I mentioned earlier
1528      (in <xref linkend="developers"> and in <xref
1529      linkend="delegation">) that any developer needs to try and
1530      balance your responsibility and power to make what you think are
1531      the best technical decisions with the fact that you will lose
1532      support from other developers if you seem like you are on a power
1533      trip or being overly bossy or possessive of a community-based
1534      project. I recommend that you keep three major facts in mind when
1535      rejecting patches (or other changes):
1536     </para>
1537
1538     <sect4>
1539      <title>Bring it to the community</title>
1540      <para>
1541       One of the best ways of justifying a decision to reject a patch
1542       and working to not seem like you keep an iron grip on your
1543       project is by not making the decision alone at all. It might
1544       make sense to turn over larger proposed changes or more
1545       difficult decisions to a development mailing list where they can
1546       be discussed. There will be some patches (bug fixes, etc.) which
1547       will definitely be accepted and some that you feel are so off
1548       base that they do not even merit further discussion. It is those
1549       that fall into the grey area between these two groups that might
1550       merit a quick forward to a mailing list.
1551      </para>
1552
1553      <para>
1554       I recommend this process wholeheartedly. As the project
1555       maintainer you are worried about making the best decision for
1556       the project, for the project's users and developers, and for
1557       yourself as a responsible project leader. Turning things over to
1558       an email list will demonstrate your own responsibility and
1559       responsive leadership as it tests and serves the interests of
1560       your software's community.
1561      </para>
1562     </sect4>
1563
1564     <sect4>
1565      <title>Technical issues are not always good justification</title>
1566      <para>
1567       Especially towards the beginning, you will find that many
1568       changes are difficult to implement, introduce new bugs, or have
1569       other technical problems. Try to see past these. Especially with
1570       added functionality, good ideas do not always come from good
1571       coders. Technical merit is a valid reason to postpone an
1572       application of a patch but it is not always a good reason to
1573       reject a change outright. Even small changes are worth the
1574       effort of working with the developer submitting the patch to
1575       iron out bugs and incorporate the change if you thing you think
1576       it seems like a good addition to your project. The effort on
1577       your part will work to make your project a community project and
1578       it will pull a new or less experienced developer onto your
1579       project and even teach them something that might help them in
1580       making their next patch.
1581      </para>
1582     </sect4>
1583
1584     <sect4>
1585      <title>Common courtesy</title>
1586      <para>
1587       It should go without saying but, <emphasis>above all and in all
1588       cases, just be nice.</emphasis> If someone has an idea and cares
1589       about it enough to write some code and submit a patch, they
1590       care, they are motivated, and they are already involved. Your
1591       goal as the maintainer is make sure they submit again. They may
1592       have thrown you a dud this time but next time may be the idea or
1593       feature that revolutionizes your project. 
1594      </para>
1595
1596      <para>
1597       It is your responsibility to first justify your choice to not
1598       incorporate their change clearly and concisely. Then thank
1599       them. Let them know that you a appreciate their help and feel
1600       horrible that you can't incorporate their change. Let them know
1601       that you look forward to their staying involved and you hope
1602       that the next patch or idea meshes better with your project
1603       because you appreciate their work and want to see it in the
1604       project. If you have ever had a patch rejected after putting a
1605       large deal of time, thought, and energy into it, you remember
1606       how it feels and it feels bad. Keep this in mind when you have
1607       to let someone down. It's never easy but you need to do
1608       everything you can to make it as not-unpleasant as possible.
1609      </para>
1610     </sect4>
1611    </sect3>
1612   </sect2>
1613
1614 <!-- Section2: branches  -->
1615
1616   <sect2 id="branches">
1617    <title>Stable and Development Branches</title>
1618
1619    <para>
1620     The idea of stable and development branches has already been
1621     described briefly in <xref linkend="chooseversioning"> and in
1622     <xref linkend="delegatebranch">. These allusions attest to some of
1623     the ways that multiple branches can affect your software. Branches
1624     can let you avoid (to some extent) some of the problems around
1625     rejecting patches (as described in <xref linkend="patching">) by
1626     allowing you to temporarily compromise the stability of your
1627     project without affecting those users who need that stability.
1628    </para>
1629
1630    <para>
1631     The most common way of branching your project is to have one
1632     branch that is stable and one that is for development. This is the
1633     model followed by the Linux kernel that is described in <xref
1634     linkend="chooseversioning">. In this model, there is always one
1635     branch that is stable and always one that is in
1636     development. Before any new release, the development branch goes
1637     into a <quote>feature freeze</quote> as described in <xref
1638     linkend="freezing"> where major changes and added features are
1639     rejected or put on hold under the development kernel is released
1640     as the new stable branch and major development resumes on the
1641     development branch. Bug fixes and small changes that are unlikely
1642     to have any large negative repercussions are incorporated into the
1643     stable branch as well as the development branch.
1644    </para>
1645
1646    <para>
1647     Linux's model is an extreme one. On many projects, there is no
1648     need to have two versions always available. It may make sense to
1649     have two versions only near a release. The Debian project has
1650     historically made both a stable and an unstable distribution
1651     available but has expanded to this to include: stable, unstable,
1652     testing, experimental, and (around release time) a frozen
1653     distribution that only incorporates bug fixes during the
1654     transition from unstable to stable. There are few projects whose
1655     size would necessitate a system like Debian's but this use of
1656     branches helps demonstrate how they can be used to balance
1657     consistent and effective development with the need to make regular
1658     and usable releases.
1659    </para>
1660
1661    <para>
1662     In trying to set up a development tree for yourself, there are
1663     several things that might be useful to keep in mind:
1664    </para>
1665
1666    <para>
1667     <variablelist>
1668
1669      <varlistentry>
1670       <term>Minimize the number of branches</term>
1671       <listitem>
1672        <para>Debian may be able to make good use of four or five
1673        branches but it contains gigabytes of software in over 5000
1674        packages compiled for a 5-6 different architectures. For you,
1675        two is probably a good number. Too many branches will confuse
1676        your users (I can't count how many times I had to describe
1677        Debian's system when it only had 2 and sometimes 3 branches!),
1678        potential developers and even yourself. Branches can help but
1679        they come at a cost so use them very sparingly.</para>
1680       </listitem>
1681      </varlistentry>
1682
1683      <varlistentry>
1684       <term>Make sure that all your different branches are explained</term>
1685       <listitem>
1686        <para>As I mentioned in the preceding paragraph, different
1687        branches <emphasis>will</emphasis> confuse your users. Do
1688        everything you can to avoid this by clearly explaining the
1689        different branches in a prominent page on your website and in a
1690        Readme file in the <acronym>FTP</acronym> or
1691        <acronym>HTTP</acronym> directory.</para>
1692
1693        <para>
1694         I might also recommend against a mistake that I think Debian
1695         has made. The terms <quote>unstable,</quote>
1696         <quote>testing,</quote> and <quote>experimental</quote> are
1697         vague and difficult to rank in order of stability (or
1698         instability as the case may be). Try explaining to someone
1699         that <quote>stable</quote> actually means <quote>ultra
1700         stable</quote> and that <quote>unstable</quote> doesn't
1701         actually include any unstable software but is really stable
1702         software that is untested as a distribution.
1703        </para>
1704
1705        <para>
1706         If you are going to use branches, especially early on, keep in
1707         mind that people are conditioned to understand the terms
1708         <quote>stable</quote> and <quote>development</quote> and you
1709         probably can't go wrong with this simple and common division of
1710         branches.
1711        </para>
1712       </listitem>
1713      </varlistentry>
1714
1715      <varlistentry>
1716       <term>Make sure all your branches are always available</term>
1717       <listitem>
1718        <para>Like a lot of this document, this should probably should
1719        go without saying but experience has taught me that it's not
1720        always obvious to people. It's a good idea to physically split
1721        up different branches in different directories or directory
1722        trees on your <acronym>FTP</acronym> or <acronym>HTTP</acronym>
1723        site. Linux accomplishes this by having kernels in a v2.2 and a
1724        v2.3 subdirectory where it is immediately obvious (after you
1725        know their version numbering scheme) which directory is for the
1726        most recent stable and the current development releases. Debian
1727        accomplishes this by naming all their distribution with names
1728        (i.e. woody, potato, etc.) and then changing symlinks named
1729        <quote>stable,</quote> <quote>unstable</quote> and
1730        <quote>frozen</quote> to point to which ever distribution (by
1731        name) is in whatever stage. Both methods work and there are
1732        others. In any case, it is important that different branches
1733        are always available, are accessible from consistent locations,
1734        and that different branches are clearly distinguished from each
1735        other so your users know exactly what they want to be
1736        downloading and where to get it.</para>
1737       </listitem>
1738      </varlistentry>
1739
1740     </variablelist>
1741    </para>
1742
1743   </sect2>
1744
1745 <!-- Section2: otherdev -->
1746
1747   <sect2 id="otherdev">
1748    <title>Other Development issues</title>
1749    <para>
1750     There are more issues surrounding interaction with developers in a
1751     free software project that I can not touch on in great detail in a
1752     HOWTO of this size. Please don't hesitate to contact me if you see
1753     any major omissions.
1754    </para>
1755
1756    <para>
1757      Other smaller issues that are worth mentioning are:
1758    </para>
1759
1760    <sect3 id="freezing">
1761     <title>Freezing</title>
1762     <para>
1763      For those projects that choose to adopt a split development model
1764      (<xref linkend="branches">), freezing is a concept that is worth
1765      becoming familiar with. 
1766     </para>
1767
1768     <para>
1769      Freezes come in two major forms. A <quote>feature freeze</quote>
1770      is a period when no significant functionality is added to a
1771      program. It is a period where established functionality (even
1772      skeletons of barely working functionality) can be improved and
1773      perfected. It is a period where bugs are fixed. This type of
1774      freeze is usually applied some period (a month or two) before a
1775      release. It is easy to push a release back as you wait for
1776      <quote>one more feature</quote> and a freeze helps to avoid this
1777      situation by drawing the much needed line in the sand. It gives
1778      developers room they need to get a program ready for release.
1779     </para>
1780
1781     <para>
1782      The second type of freeze is a <quote>code freeze</quote> which
1783      is much more like a released piece of software. Once a piece of
1784      software has entered a code freeze, all changes to the code are
1785      frowned upon and only changes that fix known bugs are
1786      permitted. This type of freeze usually follows a <quote>feature
1787      freeze</quote> and directly precedes a release. Most released
1788      software is in what could be interpreted as a sort of high
1789      level<quote>code freeze.</quote>
1790     </para>
1791
1792     <para>
1793      Even if you never choose to appoint a release manager (<xref
1794      linkend="releasemanager">), you will have an easier time
1795      justifying the rejection or postponement of patches (<xref
1796      linkend="patching"> before a release with a publicly stated
1797      freeze in effect.
1798     </para>
1799    </sect3>
1800
1801    <sect3>
1802     <title>Forking</title>
1803     <para>
1804      Forks are the most extreme version of a branch. A fork is
1805      when a group of developers takes code from a free software
1806      project and actually starts a brand new free software
1807      project. The most famous example of a fork is Emacs and
1808      XEmacs. Both emacsen are based on an almost identical code-base
1809      but for technical, political, and philosophical reasons,
1810      development was split into two projects which now compete with
1811      each other.
1812     </para>
1813
1814     <para>
1815      The short version of the fork section is, <emphasis>don't do
1816      them.</emphasis> Forks force developers to choose one project to
1817      work with, cause nasty political divisions and redundancy of
1818      work.  Luckily, usually the threat of the fork is enough to scare
1819      the maintainer or maintainers of a project into changing the way
1820      they run their project to avoid it.
1821     </para>
1822
1823     <para>
1824      In his chapter on <quote>The Open Source Process,</quote> Karl
1825      Fogel describes how to do a fork if you absolutely must. If you
1826      have determined that is absolutely necessary and that the
1827      differences between you and the people threatening to fork are
1828      absolutely unresolvable, I recommend Fogel's book as a good place
1829      to start.
1830     </para>
1831    </sect3>
1832   </sect2>
1833  </sect1>
1834
1835 <!-- Section1: users -->
1836
1837  <sect1 id="users">
1838   <title>Maintaining a Project: Interacting with Users</title>
1839   <indexterm>
1840    <primary>fswd!users</primary>
1841   </indexterm>
1842
1843   <para>
1844    If you've worked your way up to here, congratulations, you are
1845    nearing the end of this document. This final section describes some
1846    of the situations in which you, in your capacity as project
1847    maintainer, will be interacting with users. It gives some
1848    suggestions on how these situations might be handled effectively.
1849   </para>
1850
1851   <para>
1852    Interacting with users is difficult. In our discussion of
1853    interaction with developers, the underlying assumption is that in a
1854    free software project, a project maintainer must constantly strive to
1855    attract and keep developers who can easily leave at any time.
1856   </para>
1857
1858   <para>
1859    Users in the free software community are different than developers
1860    and are also different than users in the world of proprietary
1861    software and they should be treated differently than either
1862    group. Some ways in which the groups differ significantly follow:
1863   </para>
1864
1865   <para>
1866    <itemizedlist>
1867
1868     <listitem>
1869      <para>The lines between users and developers are blurred in ways
1870      that is totally foreign to any proprietary development
1871      model. Your users are often your developers and vice
1872      versa.</para>
1873     </listitem>
1874
1875     <listitem>
1876      <para>In the free software world, you are often your users only
1877      choice. Because there is such an emphasis on not replicating the
1878      work of others in the free software community and because the
1879      element of competition present in the propriety software model is
1880      absent (or at least in an extremely different form) in the free
1881      software development model, you will probably be the only project
1882      that does what you do (or at least the only one that does what
1883      you do in the way that you do it). This means your responsiveness
1884      to your users is even more important than in the proprietary
1885      software world.</para>
1886     </listitem>
1887
1888     <listitem>
1889      <para>In an almost paradoxical situation, free software projects
1890      have less immediate or dire consequences for ignoring their users
1891      altogether--it is also often easier to do. Because you don't
1892      usually need to compete with another product in the free software
1893      model, chances are good that you will not be scrambling to gain
1894      the features of the competitor's newest program. This means that
1895      your development process will have to be directed either
1896      internally, by a commitment to your users or by both.</para>
1897     </listitem>
1898    </itemizedlist>
1899   </para>
1900
1901   <para>
1902    Trying to tackle this unique situation can only be done
1903    indirectly. Developers and maintainers need to listen to users and
1904    to try and be as responsive as possible. A solid knowledge of the
1905    situation recounted above is any free software developer's best tool
1906    for shifting his development or leadership style to fit the unique
1907    process of free software development. This chapters will try and
1908    introduce some of the more difficult or important points in any
1909    projects interactions with users and give some hints on how to
1910    tackle these.
1911   </para>
1912
1913 <!-- Section2: testing -->
1914
1915   <sect2 id="testing">
1916    <title>Testing and Testers</title>
1917
1918    <para>
1919     In addition to your users being your developers, they are also
1920     (and perhaps more commonly) your testers. Before I get flamed, I
1921     should rephrase my sentence: <emphasis>some</emphasis> of your
1922     users are your testers.
1923    </para>
1924
1925    <para>
1926     It is important that this distinction be made early on because not
1927     all of your users want to be testers. Many users want to use
1928     stable software and don't care if they don't have the newest
1929     greatest software with the latest and greatest features. These
1930     users except a stable, tested piece of software with major or
1931     obvious bugs worked out or openly declared and will be angry if
1932     they find themselves in a testing position. This is yet another
1933     way in which a split development model (as mentioned in <xref
1934     linkend="branches">) might come in handy.
1935    </para>
1936
1937    <sect3>
1938     <title>Automated testing</title>
1939     <para>
1940      For many programs, many common mistakes can be caught by
1941      automated means. Automated tests tend to be pretty good at
1942      catching errors that you've run into several times before or
1943      something you just forget. They are not very good at finding
1944      errors, even major ones, that were totally unforeseen.
1945     </para>
1946
1947     <para>
1948      CVS comes with a bourne shell script called sanity.sh that is
1949      worth looking at. Debian uses a program called lintian that
1950      checks Debian packages for all of the most common errors. While
1951      use of these scripts may not be possible, there is a host of
1952      other sanity checking software on the net that may be applicable
1953      (feel free to email any recommendations). None of these will
1954      create a bug-free release but they will avoid at least some major
1955      oversights. Finally, if your programs become a long term
1956      endeavor, you will find that there are certain errors that you
1957      tend to make over and over. Start a collection of scripts that
1958      check for these errors to help prevent them in the future.
1959     </para>
1960    </sect3>
1961
1962    <sect3>
1963     <title>Testing by testers</title>
1964     <para>
1965      For any program that depends on user interactivity, many bugs
1966      will only be uncovered through testing by users actually clicking
1967      the keys and pressing the mouse buttons. For this you need
1968      testers and as many testers as possible.
1969     </para>
1970
1971     <para>
1972      The most difficult part of testing is finding testers. It's
1973      usually a good tactic to post a message to a relevant mailing
1974      list or news group announcing a specific proposed release date
1975      and outline the functionality of the program. If you put some
1976      time into the announcement, you are sure to get a few bites.
1977     </para>
1978
1979     <para>
1980      The second most difficult part of testing is keeping your testers
1981      and keeping them actively involved in the testing
1982      process. Fortunately, there are some tried and true tactics that
1983      can applied towards this end:
1984     </para>
1985
1986     <para>
1987      <variablelist>
1988
1989       <varlistentry>
1990        <term>Make things simple for your testers</term>
1991        <listitem>
1992         <para>Your testers are doing you a favor so make it as easy as
1993         possible for them. This means that you should be careful to
1994         package your software in a way that is easy to find, unpack,
1995         install, and uninstall. This also means you should explain
1996         what you are looking for to each tester and make the means for
1997         reporting bugs simple and well established. The key is to
1998         provide as much structure as possible to make your testers'
1999         jobs easy and maintain as much flexibility as possible for
2000         those that want to do things a little differently.</para>
2001        </listitem>
2002       </varlistentry>
2003
2004       <varlistentry>
2005        <term>Be responsive to your testers</term>
2006        <listitem>
2007         <para>When your testers submit bugs, respond to them and
2008         respond quickly. Even if you are only responding to tell them
2009         that the bug has already been fixed, quick and consistent
2010         responses make them feel like their work is heard, important,
2011         and appreciated.</para>
2012        </listitem>
2013       </varlistentry>
2014
2015       <varlistentry>
2016        <term>Thank your testers</term>
2017        <listitem>
2018         <para>Thank them personally each time they send you
2019         patch. Thank them publicly in the documentation and the about
2020         section of your program. You appreciate your testers and your
2021         program would not be possible without their help. Make sure
2022         they know it. Pat them on the back to make sure the rest of
2023         the world knows it too. It will be appreciated more than you
2024         expected.</para>
2025        </listitem>
2026
2027       </varlistentry>
2028      </variablelist>
2029     </para>
2030
2031    </sect3>
2032   </sect2>
2033
2034 <!-- Section2: support  -->
2035
2036   <sect2 id="support">
2037    <title>Setting up Support Infrastructure</title>
2038
2039    <para>
2040     While testing is important, the large part of your interactions
2041     and responsibility to your users falls under the category of
2042     support. The best way to make sure your users are adequately
2043     supported in using your program is to set up a good infrastructure
2044     for this purpose so that your developers and users help each other
2045     and less of the burden falls on you. This way, people will also
2046     get quicker and better responses to their questions. This
2047     infrastructure comes in several major forms:
2048    </para>
2049
2050    <sect3>
2051     <title>Documentation</title>
2052     <para>
2053      It should not come as any surprise that the key element to any
2054      support infrastructure is good documentation. This topic was
2055      large covered in <xref linkend="documentation"> and will not be
2056      repeated here.
2057     </para>
2058    </sect3>
2059
2060    <sect3>
2061     <title>Mailing lists</title>
2062     <para>
2063      Aside from documentation, effective mailing lists will be your
2064      greatest tool in providing user support. Running a mailing list
2065      well is more complicated than installing mailing list software
2066      onto a machine.
2067     </para>
2068
2069     <sect4>
2070      <title>Separate lists</title>
2071      
2072      <para>
2073       A good idea is too separate your user and development mailing
2074       lists (perhaps into project-user@host and project-devel@host)
2075       and enforce the division. If people post a development question
2076       onto -user, politely ask them to repost it onto -devel and vise
2077       versa. Subscribe yourself to both groups and encourage all
2078       primarily developers to do the same.
2079      </para>
2080
2081      <para>
2082       This system provides that no one person is stuck doing all of
2083       the support work and works so that users learn more about the
2084       program, they can help newer users with their questions.
2085      </para>
2086     </sect4>
2087
2088     <sect4>
2089      <title>Choose mailing list software well</title>
2090      <para>
2091       Please don't make the selection of mailing list software
2092       impulsively. Please consider easy accessibility by users without
2093       a lot of technical experience so you want to be as easy as
2094       possible. Web accessibility to an archive of the list is also
2095       important.
2096      </para>
2097
2098      <para>
2099       The two biggest free software mailing list programs are <ulink
2100       url="http://www.greatcircle.com/majordomo/">majordomo</ulink>
2101       and <ulink url="http://www.list.org/">GNU Mailman</ulink>. A
2102       long time advocate of majordomo, I would now recommend any
2103       project choose GNU Mailman. It fulfills the criteria listed
2104       above and makes it easier to do so. It provides a good mailing
2105       list program for a free software project maintainer as opposed
2106       to a good mailing list application for a mailing list
2107       administrator.
2108      </para>
2109
2110      <para>
2111       There are other things you want to take in setting up your
2112       list. If it is possible to gate your mailing lists to USENET and
2113       provide them in digest form as well as making them accessible on
2114       the web, you will please some users and work to make the support
2115       infrastructure slightly more accessible.
2116      </para>
2117     </sect4>
2118    </sect3>
2119
2120    <sect3>
2121     <title>Other support ideas</title>
2122
2123     <para>
2124      A mailing list and accessible documentation are far from all you
2125      can do to set up good user support infrastructure. Be
2126      creative. If you stumble across something works well, email me
2127      and I'll include it here in the HOWTO.
2128     </para>
2129
2130     <sect4>
2131      <title>Make your self accessible</title>
2132      <para>
2133       You can not put to few methods to access you. If you hang out in
2134       an <acronym>IRC</acronym> channel, don't hesitate to list in
2135       your projects documentation. List email and snail mail
2136       addresses, or ways to reach you via <acronym>ICQ</acronym>,
2137       <acronym>AIM</acronym>, or Jabber.
2138     </para>
2139     </sect4>
2140
2141     <sect4>
2142      <title>Bug management software</title>
2143      <para>
2144       For many large software projects, use of bug management software
2145       is essential to keep track of which bugs have been fixed, which
2146       bugs have not been fixed, and which bugs are being fixed by
2147       which people. Debian uses the <ulink
2148       url="http://bugs.debian.org">Debian Bug Tracking System</ulink>
2149       (<acronym>BTS</acronym>) although it may not be best choice for
2150       every project (it seems to currently be buckling under its own
2151       weight. As well as a damn good web browser, the mozilla project
2152       has spawned a sub-project resulting in a bug tracking system
2153       called <ulink
2154       url="http://www.mozilla.org/projects/bugzilla/">bugzilla</ulink>
2155       which has become extremely possible and which I like quite a
2156       bit.
2157      </para>
2158
2159      <para>
2160       These systems (and others like them) can be unwieldy so
2161       developers should be careful to not spend more time on the bug
2162       tracking system than on the bugs or the projects themselves. If
2163       a project continues to grow, use of a bug tracking system can
2164       provide an easy standard way for users and testers to report
2165       bugs and for developers and maintainers to fix them and track
2166       them in an orderly fashion.
2167      </para>
2168     </sect4>
2169    </sect3>
2170   </sect2>
2171
2172 <!-- Section2: releasing -->
2173
2174   <sect2 id="releasing">
2175    <title>Releasing Your Program</title>
2176
2177    <para>
2178     As mentioned earlier in the HOWTO, the first rule of releasing is,
2179     <emphasis>release something useful.</emphasis> Non-working or
2180     not-useful software will not attract anyone to your
2181     project. People will be turned off of your project and be likely
2182     to simply gloss over it next time they see a new version
2183     announced. Half-working software, if useful, will intrigue people,
2184     whet their appetites for versions to come, and encourage them to
2185     join the development process.
2186    </para>
2187
2188    <sect3>
2189     <title>When to release</title>
2190
2191     <para>
2192      Making the decision to release your software for the first time
2193      is an incredibly important and incredibly stressful decision. But
2194      it needs to be done. My advice is to try and make something that
2195      is complete enough to be usable and incomplete enough to allow
2196      for flexibility and room for imagination by your future
2197      developers. It's not an easy decision. Ask for help on a local
2198      Linux User Group mailing list or from a group of developer
2199      friends.
2200     </para>
2201
2202     <para>
2203      One tactic is to first do an <quote>alpha</quote> or
2204      <quote>beta</quote> release as described below in <xref
2205      linkend="alphabeta">. However, most of the guidelines described
2206      above still apply.
2207     </para>
2208
2209     <para>
2210      <emphasis>When you feel in your gut it is time and you feel
2211      you've weighed the situation well several times, cross your
2212      fingers and take the plunge.</emphasis>
2213    </para>
2214    </sect3>
2215
2216    <sect3>
2217     <title>How to release</title>
2218
2219     <para>
2220      If you've followed the guidelines described in this HOWTO up
2221      until this point, the mechanics of doing a release are going to
2222      be the easy part of releasing. If you have set up consistent
2223      distribution locations and the other infrastructure described in
2224      the preceding sections, releasing should be as simple as building
2225      the package, checking it once over, and uploading it into the
2226      appropriate place and then reflecting the release on your
2227      website.
2228     </para>
2229    </sect3>
2230
2231    <sect3 id="alphabeta">
2232     <title>Alpha, beta, and development releases</title>
2233
2234     <para>
2235      When contemplating releases, it worth considering the fact that
2236      not every release needs to be a full numbered release. Software
2237      users are accustomed to pre-releases but you must be careful to
2238      label these releases accurately or they cause more problems then
2239      they are worth.
2240     </para>
2241
2242     <para>
2243      <variablelist>
2244
2245       <varlistentry>
2246        <term>alpha releases</term>
2247        <listitem>
2248         <para>Alpha releases are expected to be unstable, perhaps a
2249         little unsafe, but definitely usable. Alpha versions should
2250         have full functionality and limited testing. They can have
2251         known bugs and kinks that have yet to be worked out. Before
2252         releasing an alpha, be sure to keep in mind that
2253         <emphasis>alpha releases are still releases</emphasis> and
2254         people are not going to be expecting a nightly build from the
2255         CVS source. An alpha should work and have minimal testing and
2256         bug fixing already finished.</para>
2257        </listitem>
2258       </varlistentry>
2259
2260       <varlistentry>
2261        <term>beta releases</term>
2262        <listitem>
2263         <para>Beta releases are general expected to be usable and
2264         slightly unstable, although definitely <emphasis>not
2265         unsafe.</emphasis> Beta releases usually preclude a full
2266         release by under a month. They can contain small known bugs
2267         but no major ones. All major functionality should be fully
2268         implemented although the exact mechanics can still be worked
2269         out. Beta releases are great tool to whet the appetites of
2270         potential users by giving them a very realistic view of where
2271         your project is going in the very near future and can help
2272         keep interest by giving people
2273         <emphasis>something.</emphasis></para>
2274        </listitem>
2275       </varlistentry>
2276
2277       <varlistentry>
2278        <term>development releases</term>
2279        <listitem>
2280         <para><quote>Development release</quote> is much more vague
2281         term than <quote>alpha</quote> or <quote>beta</quote>. I
2282         usually choose to reserve the term for discussion of a
2283         development branch although there are other ways to use the
2284         term. So many in fact, that I feel the term has been
2285         cheapened. The popular window manager <ulink
2286         url="http://www.enlightenment.org">Enlightenment</ulink> has
2287         released <emphasis>nothing but</emphasis> development
2288         releases. Most often, the term is used to describe releases
2289         that are not even to alpha or beta stages though and if I were
2290         to release a pre-alpha version of a piece of software in order
2291         to keep interest in my project live, this is probably how I
2292         would have to label it.</para>
2293        </listitem>
2294       </varlistentry>
2295
2296      </variablelist>
2297
2298     </para>
2299    </sect3>
2300   </sect2>
2301
2302 <!-- Section2: announcing  -->
2303
2304   <sect2 id="announcing">
2305    <title>Announcing Your Project</title>
2306
2307    <para>
2308     Well, you've done it. You've (at least for the purposes of this
2309     HOWTO) designed, built, and released your free software
2310     project. All that is left is for you to tell the world so they
2311     know to come and try it out and hopefully jump on board with
2312     development. If everything is in order as described above, this
2313     will be a quick and painless process. A quick announcement is all
2314     that it takes to put yourself on the free software communities
2315     radar screen.
2316    </para>
2317
2318    <sect3>
2319     <title>Mailing lists and USENET</title>
2320     <para>
2321      Email is still the way that most people on the Internet get their
2322      information. Its a good idea to send a message announcing your
2323      program to any relevant mailing list you know of and any relevant
2324      USENET discussion group. Karl Fogel recommends that use you
2325      simple subject describing the fact that the message is an
2326      announcement, the name of the program, the version, and a
2327      half-line long description of its functionality. This way, any
2328      interested user or developer will be immediately attracted to
2329      your announcement. Fogel's example looks like:
2330     </para>
2331
2332     <screen>Subject: ANN: aub 1.0, a program to assemble USENET binaries</screen>
2333
2334     <para>
2335      The rest of the email should describe the programs functionality
2336      quickly and concisely in no more than two paragraphs and should
2337      provide links to the projects webpage and direct links to
2338      downloads for those that want to try it right away.
2339     </para>
2340
2341     <para>
2342      You should repeat this announcement process consistently in the
2343      same locations for each subsequent release.
2344     </para>
2345    </sect3>
2346
2347    <sect3>
2348     <title>freshmeat.net</title>
2349     <para>
2350      Mentioned earlier in <xref linkend="evalwhere">, in today's free
2351      software community, announcements of your project on freshmeat
2352      are almost more important than announcements on mailing lists.
2353     </para>
2354
2355     <para>
2356      Visit the <ulink url="http://freshmeat.net">freshmeat.net
2357      website</ulink> or their <ulink
2358      url="http://freshmeat.net/add-project/">submit project
2359      page</ulink> to post your project onto their site and into their
2360      database. In addition to a large website, freshmeat provides a
2361      daily newsletter that highlights all the days releases and
2362      reaches a huge audience (I skim it every night for any
2363      interesting new releases).
2364     </para>
2365    </sect3>
2366   </sect2>
2367 </sect1>
2368
2369 </article>
2370
2371 <!-- Keep this comment at the end of the file
2372 Local variables:
2373 mode: sgml
2374 sgml-omittag:t
2375 sgml-shorttag:t
2376 sgml-namecase-general:t
2377 sgml-general-insert-case:lower
2378 sgml-minimize-attributes:nil
2379 sgml-always-quote-attributes:t
2380 sgml-indent-step:1
2381 sgml-indent-data:nil
2382 sgml-parent-document:nil
2383 sgml-exposed-tags:nil
2384 sgml-local-catalogs:nil
2385 sgml-local-ecat-files:nil
2386 End:
2387 -->

Benjamin Mako Hill || Want to submit a patch?