Whole document tree 2. Starting a ProjectWith very little argument, the beginning is the most difficult period in a project's life to do successful free software project managment. Laying a firm foundation will determine whether your project flourishes or withers away and dies. It is also the subject that is of most immediate interest to anyone reading this document as a tutorial. Starting a project involves a dilemma that you as a developer must try and deal with: no potential user for your program is interested in a program that doesn't work, while the development process that you want to employ holds involvement of users as imperative. It is in these dangerous initial moments that anyone working to start a free software project must try and strike a balance along these lines. One of the most important ways that someone trying to start a project can work towards this balance is by establishing a solid framework for the development process through some of the suggestions mentioned in this section. 2.1. Choosing a ProjectIf you are reading this document, there's a good chance you already have an idea for a project in mind. Chances are also pretty good that it fills a percieved gap by doing something that no other free software project does or by doing something in a way that is unique enough to necessitate a brand new piece of software. 2.1.1. Identify and articulate your ideaEric S. Raymond writes about how free software projects start in his essay, "The Cathedral and the Bazaar," which comes as required reading for any free software developer. It is available online . In "The Cathedral and the Bazaar," Raymond tells us that: "every good work of software starts by scratching a developers itch." Raymond's now widely accepted hypothesis is that new free software programs are written, first and foremost, to solve a specific problem facing the developer. If you have an idea for a program in mind, chances are good that it targets a specific problem or "itch" you want to see scratched. This idea is the project. Articulate it clearly. Write it out. Describe the problem you will attack in detail. The success of your project in tackling a particular problem will be tied to your ability to identify that problem clearly early on. Find out exactly what it is that you want your project to do. Monty Manley articulates the importance of this initial step in an essay, "Managing Projects the Open Source Way." As the next section will show, there is a lot of work that needs to be done before software is even ready to be coded. Manley says, "Beginning an OSS project properly means that a developer must, first and foremost, avoid writing code too soon!" 2.1.2. Evaluate your ideaIn evaluating your idea, you need to first ask yourself a few questions. This should happen before you move any further through this HOWTO. Ask yourself: Is the free software development model really the right one for your project? Obviously, since the program scratches your itch, you are definitely interested in seeing it implemented in code. But, because one hacker coding in solitude fails to qualify as a free software development effort, you need to ask yourself a second question: Is anybody else interested? Sometimes the answer is a simple "no." If you want to write a set of scripts to sort your MP3 collection on your machine, maybe the free software development model is not the best one to choose. However, if you want to write a set of scripts to sort anyone's MP3s, a free software project might fill a useful gap. Luckily, the Internet is a place so big and so diverse that, chances are, there is someone, somewhere, who shares your interests and who feels the same "itch." It is the fact that there are so many people with so many similar needs and desires that introduces the third major question: Has somebody already had your idea or a reasonably similar one? 2.1.2.1. Finding Similar ProjectsThere are places you can go on the web to try and answer the question above. If you have experience with the free software community, you are probably already familiar with many of these sites. All of the resources listed below offer searching of their databases:
2.1.2.2. Deciding to ProceedOnce you have successfully charted the terrain and have an idea about what kinds of similar free software projects exist, every developer needs to decide whether to proceed with their own project. It is rare that a new project seeks to accomplish a goal that is not at all similar or related to the goal of another project. Anyone starting a new project needs to ask themselves: "Will the new project be duplicating work done by another project? Will the new project be competing for developers with an existing project? Can the goals of the new project be accomplished by adding functionality to an existing project?" If the answer to any of these questions is "yes," try to contact the developer of the existing project(s) in question and see if he or she might be willing to collaborate with you. For many developers this may be the single most difficult aspect of free software project managment, but it is an essential one. It is easy to become fired up by an idea and get caught up in the momentum and excitement of a new project. It is often extremely difficult to do, but it is important that any free software developer remembers that the best interests of the free software community and the quickest way to accomplish your own project's goals and the goals of similar projects can often be accomplished by not starting a new development effort. 2.2. Naming your projectWhile there are plenty of projects that fail with descriptive names and plenty that succeed without them, I think naming your project is worth giving a bit of thought. Leslie Orchard tackles this issue in an Advogato article. His article is short and definately worth looking over quickly. The synopsis is that Orchard recommends you pick a name where, after hearing the name, many users or developers will both:
Humorously, Orchard's project, "Iajitsu," does neither. It is probably unrelated that development has effectively frozen since the article was written. He makes a good point though. There are companies whose only job is to make names for pieces of software. They make ridiculous amount of money doing it and are supposedly worth it. While you probably can't aford a company like this, you can afford to learn from their existance and think a little bit about the name you are giving your project because it does matter. If there is a name you really want but it doesn't fit Orchard's criteria, you can still go ahead. I thought "gnubile" was one of the best I'd heard for a free software project ever and I still talk about it long after I've stopped using the program. However, if you can be flexible on the subject, listen to Orchard's advice. It might help you. 2.3. Licensing your SoftwareOn one (somewhat simplistic) level, the difference between a piece of free software and a piece of propriety software is the license. A license helps you as the developer by protecting your legal rights to have your software distributed under your terms and helps demonstrate to those who wish to help you or your project that they are encouraged to join. 2.3.1. Choosing a licenseAny discussion of licenses is also sure to generate at least a small flame war as there are strong feelings that some free software licenses are better than others. This discussion also brings up the question of "Open Source Software" and the debate over the terms "Open Source Software" and "Free Software". However, because I've written the Free Software Project Management HOWTO and not the Open Source Software Project Management HOWTO, my own allegiances in this argument are in the open. In attempting to reach a middle ground through diplomacy without sacrificing my own philosophy, I will recommend picking any license that conforms to the Debian Free Software Guidelines. Originally compiled by the Debian project under Bruce Perens, the DFSG forms the first version of the Open Source Definition. Examples of free licenses given by the DFSG are the GPL, the BSD, and the Artistic License. Conforming to the definition of free software offered by Richard Stallman in "The Free Software Definition", any of these licenses will uphold, "users' freedom to run, copy, distribute, study, change and improve the software." There are plenty of other licenses that also conform to the DFSG but sticking with a more well-known license will offer the advantage of immediate recognition and understanding. In attempting a more in-depth analysis, I agree with Karl Fogel's description of licenses as falling into two groups: those that are the GPL and those that are not the GPL. Personally, I license all my software under the GPL. Created and protected by the Free Software Foundation and the GNU Project, the GPL is the license for the Linux kernel, GNOME, Emacs, and the vast majority of GNU/Linux software. It's the obvious choice but I also believe it is a good one. Any BSD fanatic will urge you to remember that there is a viral aspect to the GPL that prevents the mixture of GPL'ed code with non-GPL'ed code. To many people (myself included), this is a benefit, but to some, it is a major drawback. The three major licenses can be found at the following locations:
In any case, please read through any license before your release your software under it. As the primary developer, you can't afford any license surprises. 2.3.2. The mechanics of licensingThe text of the GPL offers a good description of the mechanics of applying a license to a piece of software. My quick checklist for applying a license includes:
2.3.3. Final license warningPlease, please, please, place your software under some license. It may not seem important, and to you it may not be, but licenses are important. For a piece of software to be included in the Debian GNU/Linux distribution, it must have a license that fits the Debian Free Software Guidelines. If your software has no license, it can not be distributed as a package in Debian until you re-release it under a free license. Please save yourself and others trouble by releasing the first version of your software with a clear license. 2.4. Choosing a Method of Version NumberingThe most important thing about a system of version numbering is that there is one. It may seem pedantic to emphasize this point but you'd be surprised at the number of scripts and small programs that pop up without any version number at all. The second most important thing about a system of numbering is that the numbers always go up. Automatic version tracking systems and people's sense of order in the universe will fall apart if version numbers don't rise. It doesn't really matter if 2.1 is a big jump and 2.0.005 is a small jump but it does matter that 2.1 is more recent than 2.0.005. Follow these two simple rules and you will not go (too) wrong. Beyond this, the most common technique seems to be the "major level," "minor level," "patch level" version numbering scheme. Whether you are familiar with the name or not, you interact with it all the time. The first number is the major number and it signifies major changes or rewrites. The second number is the minor number and it represents added or tweaked functionality on top of a largely coherant structure. The third number is the patch number and it usually will only refer to releases fixing bugs. The widespread use of this scheme is why I know the nature and relative degree in the differences between a 2.4.12 release of the Linux kernel and a 2.4.11, 2.2.12, and 1.2.12 without knowning anything about any of the releases. You can bend or break these rules, and people do. But beware, if you choose to, someone will get annoyed, assume you don't know, and try and educate you, probably not nicely. I always follow this method and I implore you to do so as well. There are several version numbering systems that are well known, useful, and that might be worth looking into before you release your first version.
2.5. DocumentationA huge number of otherwise fantastic free software applications have withered and died because their author was the only person who knew how to use them fully. Even if your program is written primarily for a techno-savvy group of users, documentation is helpful and even necessary for the survival of your project. You will learn later in Section 4.3 that you should always release something that is usable. A piece of software without documentation is not usable. There are lots of different people you should document for and there are lots of ways to document your project. The importance of documentation in source code to help facilitate development by a large community is vital but it falls outside the scope of this HOWTO. This being the case, this section deals with useful tactics for user-directed documentation. A combination of tradition and necessity has resulted in a semi-regular system of documentation in most free software projects that is worth following. Both users and developers expect to be able to get documentation in several ways and it's essential that you provide the information they are seeking in a form they can read if your project is ever going to get off the ground. People have come to expect: 2.5.1. Man pagesYour users will want to be able to type "man yourprojectname" end up with a nicely formatted man page highlighting the basic use of your application. Make sure that before you release your program, you've planned for this. Man pages are not difficult to write. There is excellent documentation on the man page writing process available through the "The Linux Man-Page-HOWTO" which is available through the Linux Documentation project (LDP) and is written by Jens Schweikhardt. It is available from Schweikhardt's site or from the LDP. It is also possible to write man pages using DocBook SGML. Because man pages are so simple and the DocBook method relatively new, I have not been able to follow this up but would love help from anyone who can give me more information on how exactly how this is done. 2.5.2. Command line accessible documentationMost users will expect some basic amount of documentation to be easily available from the command line. For few programs should this type of documentation extend for more than one screen (24 or 25 lines) but it should cover the basic usage, a brief (one or two sentence) description of the program, a list of the commands with explanations, as well as all the major options (also with explanations), plus a pointer to more in-depth documentation for those who need it. The command line documentation for Debian's apt-get serves as an excellent example and a useful model:
It has become a GNU convention to make this type of information accessible with the "-h" and the "--help" options. Most GNU/Linux users will expect to be able to retrieve basic documentation these ways so if you choose to use different methods, be prepared for the flames and fallout that may result. 2.5.3. Files users will expectIn addition to man pages and command-line help, there are certain files where people will look for documentation, especially in any package containing source code. In a source distribution, most of these files can be stored in the root directory of the source distribution or in a subdirectory of the root called "doc" or "Documentation." Common files in these places include:
2.5.4. WebsiteIt's only indirectly an issue of documentation but a good website is quickly becoming an essential part of any free software project. Your website should provide access to your documentation (in HTML if possible). It should also include a section for news and events around your program and a section that details the process of getting involved with development or testing and make an open invitation. It should also supply links to any mailing lists, similar websites, and provide a direct link to all the available ways of downloading your software. 2.5.5. Other documentation hintsAll your documentation should be in plaintext, or, in cases where it is on your website primarily, in HTML. Everyone can cat a file, everyone has a pager, (almost) everyone can render HTML. You are welcome to distribute information in PDF, PostScript, RTF, or any number of other widely used formats but this information must also be available in plaintext or HTML or people will be very angry at you. It doesn't hurt to distribute any documentation for your program from your website (FAQs etc) with your program. Don't hesitate to throw any of this in the program's tarball. If people don't need it, they will delete it. I can repeat it over and over: Too much documentation is not a sin. 2.6. Other Presentation IssuesMany of the remaining issues surrounding the creation of a new free software program fall under what most people describe as common sense issues. Its often said that software engineering is 90 percent common sense combined with 10 percent specialized knowledge. Still, they are worth noting briefly in hopes that they may remind a developer of something they may have forgotten. 2.6.1. Package formatsPackage formats may differ depending on the system you are developing for. For windows based software, Zip archives (.zip) usually serve as the package format of choice. If you are developing for GNU/Linux, *BSD, or any UN*X, make sure that your source code is always available in tar'ed and gzip'ed format (.tar.gz). UNIX compress (.Z) has gone out of style and usefulness and faster computers have brought bzip2 (.bz2) into the spot-light as a more effective compression medium. I now make all my releases available in both gzip'ed and bzip2'ed tarballs. Binary packages should always be distribution specific. If you can build binary packages against a current version of a major distribution, you will only make your users happy. Try to foster relationships with users or developers of large distributions to develop a system for the consistent creation of binary packages. It's often a good idea to provide RedHat RPM's (.rpm), Debian deb's (.deb) and source RPM's SRPM's if possible. Remember: While these binaries packages are nice, getting the source packaged and released should always be your priority. Your users or fellow developers can and will do the the binary packages for you. 2.6.2. Version control systemsA version control system can make a lot of these problems of packaging (and a lot of other problems mentioned in this HOWTO) less problematic. If you are using *NIX, CVS is your best bet. I recommend Karl Fogel's book on the subject (and the posted HTML version) wholeheartedly. CVS or not, you should probably invest some time into learning about a version control system because it provides an automated way of solving many of the problems described by this HOWTO. I am not aware of any free version control systems for Windows or MacOS but I know that CVS clients exist for both platforms. Websites like SourceForge do a great job as well with a nice, easy-to-use web interface to CVS. I'd love to devote more space in this HOWTO to CVS because I love it (I even use CVS to keep versions straight on this HOWTO!) but I think it falls outside the scope of this document and should have (already has) its own HOWTO. 2.6.3. Useful tidbits and presentation hintsOther useful hints include:
|