A software package is a group of programs which are bundled together to serve a common purpose. Often, a software package will also include the source code that built the executable programs as well as a variety of documentation for the programs themselves. Some software packages will also include example files that can further illustrate how the other components of the package work.
The components of a software package can do significantly different things, but all the components of the package come together in a unified whole. Some software packages have one main program that encapsulates all the smaller programs, while others take a more fragmented approach and have multiple small, specialized executables for different purposes. There are advantages and disadvantages to each approach, as well as specific audiences that benefit from each.
Packages that encapsulate all their functionality into one large program are useful for most computer users. They are usually easy to install, relatively easy to understand, and fairly easy to run. At times, a user can download add-ons for them, but this is all done behind the scenes with minimal interaction and effort from that user. All-in-one software packages like these are available for many purposes, from document management to 3D modeling and image rendering.
A software package that keeps its functionality more fragmented is often targeted toward more computer-savvy users. These packages will often have command line tools, along with extensive documentation and highly flexible capabilities. Changes to these packages must usually be done by either manipulating raw directory structures or completely downloading a new version of the package. Add-ons are not as common for these package types. Grouped software packages like these are often aimed toward academics and engineers, for purposes such as analysis of biological data and creation of new software programs.
Some software packages contain completely unique code, while others incorporate existing programs to combine functionality of existing algorithms. The debate between these two methodologies is ongoing. Some programmers prefer to write their own code for everything, and others prefer to link together multiple existing programs. Many packages exist using each type of framework, and either methodology can be used to create a successful software suite.
With the expansion of the open source software movement, more and more programs, algorithms, and software packages have become free to use in new software without licensing concerns. In scientific fields, for example, many new algorithms and programs are published with the expectation that they will be used freely not only for analysis, but also for building new programs. A new software package can easily be built upon or modeled after an old one, and this sharing of knowledge has become instrumental in software development.