Software is a set of instructions, data or programs used to operate computers and execute specific tasks. Opposite of hardware, which describes the physical aspects of a computer, software is a generic term used to refer to applications, scripts and programs that run on a device. Software can be thought of as the variable part of a computer, and hardware the invariable part.
Software is often divided into categories. Application software refers to user-downloaded programs that fulfill a want or need. Examples of applications include office suites, database programs, web browsers, word processors, software development tools, image editors and communication platforms.
System software includes operating systems and any program that supports application software.
The term middleware is sometimes used to describe programming that mediates between application and system software, or between two different kinds of application software. For example, middleware could be used to send a remote work request from an application in a computer that has one kind of operating system, to an application in a computer with a different operating system.
An additional category of software are the utilities, which are small, useful programs with limited capabilities. Some utilities come with operating systems. Like applications, utilities tend to be separately installable and capable of being used independently from the rest of the operating system.
Machine code is the lowest level of software. Other programming languages are translated into machine code so the computer can execute them.
Software can be purchased or acquired in the following ways:
- Shareware -- usually distributed on a free or trial basis, with the intention of sale when the period is over.
- Liteware -- a type of shareware with some capabilities disabled until the full version is purchased.
- Freeware -- can be downloaded for free but with copyright restrictions.
- Public domain software -- can be downloaded for free without restrictions.
- Open source software -- a type of software where the source code is furnished and users agree not to limit the distribution of improvements.
- Proprietary software -- software that remains the property of its owner/creator and is used by end users or organizations under predefined conditions.
Today, much of the purchased software, shareware and freeware is directly downloaded over the internet. In these cases, software can be found on specific software industry vendor websites or application service providers. However, software can also be packaged onto CD-ROMs or diskettes and sold physically to a consumer.
A specialized type of software that allows hardware to run is firmware. This is a type of programming that is embedded onto a special area of the hardware's nonvolatile memory, such as a microprocessor or read-only memory, on a one-time or infrequent basis so that thereafter it seems to be part of the hardware.
Although the terms computer science and software engineering are often used interchangeably, they are not the same. Computer science is the field of computing that centers around the study, implementation and analysis of algorithms. Software engineering, on the other hand, focuses on applying structured engineering principles to the development of software.
Types of software
The two main types of software are system software and application software.
System software is a type of computer program designed to run a computer's hardware and application programs. System software coordinates the activities and functions of the hardware and software. In addition, it controls the operations of the computer hardware and provides an environment or platform for all the other types of software to work in. The best-known example of system software is the operating system (OS), which manages all the other programs in a computer.
Application software is a computer software package that performs a specific function for an end user or, in some instances, for another application. An application can be self-contained or a group of programs. The program is a set of operations that runs the application for the user. Applications use the computer's OS and other supporting programs, typically system software, to function. Application software is different than other software that might come pre-bundled with a computer's operating system, such as a utility.
Some general kinds of application software include:
Design and implementation
Design and implementation are the second and third steps in the overall Software Design Life Cycle, after the initial analysis of requirements. After user requirements are defined, software design aims to specify how to fulfill them.
A software design includes a description of the structure of the software that will be implemented, data models, interfaces between system components, and potentially the algorithms the software engineer used.
The design process transforms user requirements into a suitable form, which helps the computer programmer in software coding and implementation. The software engineers develop the software design iteratively, adding detail and correcting the design as they develop it.
The different types of software design include:
- Architectural design: the foundational design, which identifies the overall structure of the system, its main components, and their relationships with each other.
- High-level design: the second layer of design, which focuses on how the system, along with all of its components, can be implemented in forms of modules. It describes the relationships between the various modules and functions of the system, data flow, flow charts and data structures.
- Detailed design: the third layer of design, which focuses on all the implementation details necessary for the specified architecture.
The implementation phase is the process of converting a system specification into an executable system. If the software engineers used an incremental approach, the implementation phase may also involve refining the software specifications.
Software quality measures if the software meets its requirements, which are classified as either functional or non-functional.
- Functional requirements identify what the software should do. Functional requirements could be technical details, data manipulation and processing, calculations or any other specific function that specifies what an application aims to accomplish.
- Non-functional requirements, also known as "quality attributes," determine how the system should work. Non-functional requirements include such things as portability, disaster recovery, security, privacy and usability.
Software testing detects and solves technical issues in the software source code and assesses the overall usability, performance, security and compatibility of the product to ensure it meets its requirements.
The dimensions of software quality include:
- Accessibility: the degree to which the software can be comfortably used by diverse groups of people -- including individuals who require adaptive technologies such as voice recognition and screen magnifiers.
- Compatibility: the suitability of the software for use in a variety of environments, such as different operating systems, devices and browsers.
- Efficiency: the ability of the software to perform well without wasting energy, resources, effort, time or money.
- Functionality: the ability of the software to carry out its specified or desired functions.
- Installability: the ability of the software to be installed in a specified environment.
- Localizability: the ability of the software to be used in various languages, time zones, etc.
- Maintainability: how easily the software can be modified to add features, improve features, fix bugs, etc.
- Performance: how fast the software performs under a particular load.
- Portability: the ability of the software to be easily transferred from one location to another.
- Reliability: the ability of the software to perform a required function under specific conditions for the specific period of time without any errors.
- Scalability: the measure of the software's ability to increase or decrease in performance in response to changes in the software's processing demands.
- Security: the ability of the software to protect against unauthorized access, invasion of privacy, theft, data loss, etc.
- Testability: the ability of the software to be easily tested.
- Usability: how easy it is to use the software.
Software licensing and patents
A software license is a document that provides legally-binding guidelines for the use and distribution of software.
Typically, software licenses provide users with the right to one or more copies of the software without violating copyright. Additionally, the license outlines the responsibilities of the parties that enter into the license agreement and may place restrictions on how the end user can use the software.
Software licensing terms and conditions generally include fair use of the software, the limitations of liability, warranties as well as disclaimers and protections if the software or its use infringes on the intellectual property rights of others.
Software licenses typically are either proprietary, free or open source -- depending on the terms under which users can redistribute or copy the software for future development or use.
Software patents are covered by the intellectual property suite of protections that grant the owner of the software exclusive rights to use the protected program. However, software patents are controversial in the United States and other countries for a variety of reasons, including the fact that software is already automatically covered by copyright protections and some think that additional protections may hamper innovation.
Currently, software may qualify for patent protection if it has an industrial or commercial use, and isn't just a business idea. The software must also be unique and not obvious to a person of average skill in the software industry. In addition, the owner has to describe the software in detail in an application submitted to the United States Patent and Trademark Office
History of software
The term "software" wasn't used until the late 1950s. During this time, although different types of programming software were being created, they were typically not commercially available. Consequently, users (mostly scientists and large enterprises) often had to write their own software.
This carried some advantages -- companies could tailor the software to their specific needs, and therefore they understood precisely what the software was doing. However, this required each company or lab to have in-house programmers on staff -- and companies that created the software often couldn't trade it to other businesses, because it would be developed for one specific computer system.
Software became more prevalent in the 1970s, when computers became small and cheap enough for individual users to purchase. But since home users couldn't program their computers themselves, the operating system was created -- which ran the computer and launched other software as the user needed it. One of the earliest operating systems was MS-DOS (introduced in 1981), the operating system many of the early IBM computers ran.
IBM began selling software around this time, when commercial software was just beginning to become available to the average consumer. As a result, the ability to add different types of programs to any computer quickly became popular.
Back then, a user had to type in the commands, and the early software only accepted keyboard input. When floppy disks first arrived on the scene in the late 1960s, they could only hold a very small amount of data. Considering most personal computers didn't have any actual hard drives, the software had to be very simple.
This changed as computer hardware evolved, and software became more sophisticated. In the 1980s, hard drives became standard in personal computers. At that point, software could be installed on a computer before it left the distributor, enabling computer manufacturers to start bundling operating systems and software with computers. Additionally, this allowed larger pieces of software to be loaded onto computers without sending the customer a stack of disks. This allowed end users to switch between different pieces of software without changing disks, increasing productivity.
When CD-ROMs became standard around 1989, larger pieces of software could be distributed quickly, easily and relatively inexpensively. CDs could hold much more data than floppy disks, and programs that were once spread across a dozen floppy disks fit on one CD.
As such, CDs rapidly became the standard for software distribution, and by the mid-2000s, floppy disk drives were no longer standard on computers. The DVDs, which held even more information than CDs, made it possible to put bundles of programs, such as the Microsoft Office Suite, all on one disc.
However, even DVDs are starting to grow obsolete as many users purchase and download their software directly from the internet. Now with cloud computing, users don't even have to download the software to their computers -- they can run programs directly from the cloud.