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

Benjamin Mako Hill || Want to submit a patch?