Because so much open source is available in the Unix
world, skill at finding code to reuse can have an enormous payoff
— much greater than is the case for other operating systems.
Such code comes in many forms: individual code snippets and
examples, code libraries, utilities to be reused in scripts. Under
Unix most code reuse is not a matter of actual cut-and-paste into
your program — in fact, if you find yourself doing that, there
is almost certainly a more graceful mode of reuse that you are
missing. Accordingly, one of the most useful skills to cultivate under
Unix is a good grasp of all the different ways to glue together code,
so you can use the Rule of Composition.
To find re-usable code, start by looking under your nose. Unixes
have always featured a rich toolkit of re-usable utilities and
libraries; modern ones, such as any current Linux system, include
thousands of programs, scripts, and libraries that may be re-usable.
A simple man -k search with a few keywords often
yields useful results.
To begin to grasp something of the amazing wealth of resources
out there, surf to SourceForge, ibiblio, and Freshmeat.net. Other
sites as important as these three may exist by the time you read this
book, but all three of these have shown continuing value and
popularity over a period of years, and seem likely to endure.
SourceForge is a
demonstration site for software specifically designed to support
collaborative development, complete with associated project-management
services. It is not merely an archive but a free development-hosting
service, and in mid-2003 is undoubtedly the largest single hub of
open-source activity in the world.
The Linux archives at ibiblio were the largest in the
world before SourceForge. The ibiblio archives are passive, simply a
place to publish packages. They do, however, have a better interface to
the World Wide Web than most passive sites (the program that creates
its Web look and feel was one of our case studies in the discussion of
Perl in Chapter14). It's also the home site of the Linux
Documentation Project, which maintains many documents that are
excellent resources for Unix users and developers.
Freshmeat is a
system dedicated to providing release announcements of new software,
and new releases of old software. It lets users and third parties
attach reviews to releases.
These three general-purpose sites contain code in many
languages, but most of their content is C or C++. There are also sites specialized
around some of the interpreted languages as discussed in Chapter14.
The CPAN archive is the central repository for useful free code
in Perl. It is easily reached from the Perl home
page
.
The Python Software Activity makes an archive of
Python
software and documentation available at the Python Home Page.
Many Java
applets and pointers to other sites featuring free Java software are
made available at the Java
Applets page.
One of the most valuable ways you can invest your time as a Unix
developer is to spend time wandering around these sites learning
what is available for you to use. The coding time you save may be
your own!
Browsing the package metadata is a good idea, but don't stop
there. Sample the code, too. You'll get a better grasp on what the code
is doing, and be able to use it more effectively.
More generally, reading code is an investment in the future.
You'll learn from it — new techniques, new ways to partition
problems, different styles and approaches. Both using the code and
learning from it are valuable rewards. Even if you don't use the
techniques in the code you study, the improved definition of the
problem you get from looking at other peoples' solutions may well help
you invent a better one of your own.
Read before you write; develop the habit of reading code. There
are seldom any completely new problems, so it is almost always
possible to discover code that is close enough to what you need to be
a good starting point. Even when your problem is genuinely novel, it
is likely to be genetically related to a problem someone else has
solved before, so the solution you need to develop is likely to be
related to some pre-existing one as well.