The Many Types Of Programs

There are many different types of computer programs, most of which are mentioned in Wiki in various places (but nowhere are they listed in one place). By "type of computer program", we refer to a subset of programming which requires differing skills, methodologies, and tools than other types. A programmer can be familiar with one, several, or all of these types.

The taxonomy presented may be a bit arbitrary, and certainly could use some fine tuning. The categories are not intended to be mutually exclusive -- a program can fall into more than one type. There are probably also some useful programs out there which don't fit into any of the types listed below.


Business Programming. Also known as "business logic", "enterprise applications", and by a host of other names. This type consists mostly of custom software which is used to support an organization's management information system. This software is typically written in-house (or by contractors hired for the purpose), is usually not distributed outside the organization that it was written for, and is often highly integrated with the IT infrastructure and business processes of the organization.

Typical characteristics of this software:

Examples of this type of software:

Language features which benefit this category:

Languages features which are detrimental to this category:


Glue code/Scripting In many ways, this is similar to the business software above; many of the same design considerations apply. One major difference is the absence of a database here.

Typical characteristics:

Examples:

Language features which benefit this category.

Language features which are detrimental:


Realtime number-crunching. This type of software is about realtime data generation or digital signal processing in which computations are done piecemeal on data which is "streamed" in.

Typical characteristics of this software:

Examples of this type of software:

Language features which benefit this category:

Languages features which are detrimental to this category:


Heavy batch computation - numeric analysis and symbol manipulation, similar to the category above but differs in that usually the data is known in advance and there are no RealTime constraints.

Examples of this type of software:

Language features beneficial to this category:


High performance data processing Another "high-performance" category; but here I/O performance and memory bandwidth are key design criteria, rather than efficient CPU utilization. In this sort of programming, throughput is very important--often a banner spec--and optimizations are often made to improve it.

Typical characteristics of this software:

Examples of this type of programming:

Language features which benefit this category:

Language features which are detrimental to this category:

Definition issues


Monolithic Applications In many ways, one of the most complicated types of software--and one which some folks feel shouldn't be written (or at least, should be refactored into smaller parts). The monolithic application combines elements from many different categories above, into one big ball of wax.

Characteristics of this category:

Examples:

Language features which are beneficial:

Language features which are detrimental:

Definition Issues


Data format converters like batch text-processing / image processing systems, protocol stacks, compilers, many Unix utilities, printer drivers etc.


Systems programming Systems programming is that which a) interfaces directly with hardware (beyond peeks/pokes to RandomAccessMemory?), and/or b) operates in the "kernel mode" of a microprocessor. In other words, code that runs on the metal.

Characterstics of this category:

Examples of this category:

Language features which are beneficial:

Language features which are detrimental.


Embedded systems Perhaps this category should be further subdivided, as there is a wide variation (compare a 4-bit microcontroller running inside a toaster with a PDA or set-top-box), but the embedded system is a key category all its own. The name of the game here is limited resources, especially memory. Software which runs on a modern PC or server will have many megabytes (if not gigabytes or even terabytes) of physical memory available--backed up by oodles of virtual memory on disk. And if a program still runs out of memory, the user has the option to go to FrysElectronics? (or wherever) and buy more.

In the embedded world, there usually is no disk, RAM is far more limited, and in many cases memory is not expandable.

Key characteristics:

Examples

At the high end (lots of processing power, high user interactivity):

In the middle (lots of processing power, low user interactivity)

At the low end (dirt cheap, user many not even know there's a computer in there)

Language features which are beneficial:

Language features which are detrimental:


The next three types aren't really categories all their own, independent of the above. Rather, they are particular sub-categories of the above which impose specific requirements--many of which are incompatible with many modern programming languages.

Real-time systems A RealTime system is a system where the timeliness of a computation or side-effect is just as important as it's value. In other words, a late response is a wrong response. Note: here we are mainly referring to hard real-time; where the program fails irreversibly if a time constraint is not met; not systems where failure to meet a time constraint merely results in reduced quality of service. Also note that real-time doesn't address the severity of the consequences of failure (it could range from nuking a city or killing a patient, to something minor as ruining a printed page), just it's definition.

Characteristics of this category:

Examples:

Language features which are beneficial:

Language features which are detrimental:


Mission critical systems A mission-critical system is one where the consequences of failure are catastrophic. An airplane may crash, a patient may die, a multi-million dollar transaction will get bungled, etc. Often times, true mission-critical systems are subject to governmental regulatory regimes--any avionics software installed in an airplane (in the UnitedStates) must be developed with acceptable methodologies, reviewed, and approved by the FederalAviationAdministration?, for example.

In order to avert these catastrophies from happening, in many cases ProofOfCorrectness of an implementation is required--demonstrating an absence of defects through QualityAssurance, UnitTests, and other techniques which involve running the program and observing its behavior is insufficient.

Characteristics of mission-critical systems:

Examples:

Language features which are beneficial:

Language features which are detrimental:


Data warehousing applications - databases, filesystems, VersionControlSystems, prevalence layers, transaction systems, etc.

Secure/"Trusted" Systems. These two are opposite sides of the same coin; but they are listed together. A secure system is one which can safely execute unknown or untrusted (and possibly hostile) code (in a sandbox or some other limited environment). A "trusted" system is one which allows code to be executed in a hostile environment while preventing (or at least detecting) any attempts at tampering. Dealing with malicious programmers requires a lot more attention to design than merely securing a system against accidental defects. (Note: "Trusted" systems are ripe for abuse by the PowersThatBe...Microsoft would love it, for example, if our PCs were incapable of booting any OS other than Windows. And there already is such a PC--the XBox. Hackers have managed to defeat the security and make it load Linux; but expect that loophole to be closed.)

Characteristics of this category:

Examples:

Language features which are beneficial:

Language features which are detrimental:


"... EmbeddedSystems are a different universe ..."

How many different "universes" are there for programming software?

Another way of categorizing software: Are there other useful ways of categorizing the kinds of work programmers do?

"Five Worlds," article by Joel Spolsky 2002-05-06 [http://www.joelonsoftware.com/articles/FiveWorlds.html], mentions five categories. (He immediately mentions that some of them are "basically the same", so really only 3).


RefactoringHint?: This page is well structured, but too large. I think, that the types of programs deserve their own pages (partly these are already there and should be merged). This is very OnTopic, but not yet appropriately linked.


CategoryProgrammingLanguage


EditText of this page (last edited May 16, 2008) or FindPage with title or text search