What is Software?
![What is Software](https://www.finoit.com/wp-content/uploads/2024/07/what-is-software.jpg)
Software is a set of computer programs that instruct computers what to do. It mainly comprises code, algorithms, and data structures necessary to operate a computer system.
The term “Software” was introduced to differentiate these sets of computer programs from hardware i.e., physical components of computers.
System software and Application Software are two main types of software. System Software runs computer hardware and applications, while Application software performs specific tasks for users.
Other types of software are Programming Software, Middleware, Device Drivers, and Embedded Software.
All software works the same but may vary in functionality. When software is installed on a device it has a set of instructions to instruct the device what to do for the program to run. These instructions are taken by software from source code and communicate with the device’s hardware such as memory storage, and i/o devices such as printers, faxes, speakers, and monitors.
The term ‘software’ was coined by John W. Turkey in 1958. However, its principle was set much earlier in 1834 when Ava Lovelace wrote the algorithm for Charles Babbage’s Analytical Engine.
The evolution of software storage and distribution started with paper tape and punched cards. As computers developed, OEMs like IBM bundled software into computers. The 20th Century saw the use of magnetic tape, which shifted towards floppy disks, CD-ROMs, and DVD-ROMs.
With the arrival of the internet in 1983, software distribution methods changed, and users could now download software from their computers. Today, you can download it from the Windows Store, Google Play, and other sites. It can be transferred through online methods and stored in HDDs, SSDs, and USB flash drives.
What are Different Types of Software with Examples?
Some of the common types of software are system software, application software, programming software, middleware, device drivers, and embedded software.
- 1. System Software
System software is a computer program that runs computer hardware and applications and manages computer resources. These resource management include memory management, processor management, peripheral device management, and file management.
System software continuously runs in the background, providing an operable platform for application and programming software. It helps to create an interface between the computer hardware and the end user.
Operating Systems such as Microsoft Windows, MacOS, and Linux are examples of system software. Other common examples include the OSs used by smartphones and tablets, including Apple’s iOS, Android, and Windows Phone OS.
Other system software types include Firmware, BIOS and UEFI, Programming Language Translators, Utility Software, Device Drivers, and Assemblers.
- 2. Application Software
Application software refers to the type of computer program that performs specific tasks, such as communication, information management, word processing, simulation, and document management. These programs are usually user-friendly and interactive and specialize in specific functions.
Various types of application software are:
- Web Browsers: Chrome, Brave, Firefox, Opera, Safari
- Application Development Software: Xcode, Visual Studio, Android Studio
- Enterprise Software: Microsoft Dynamics 365, Acumatica Cloud ERP, NetSuite
- Spreadsheet Software: MS Excel, Google Spreadsheet, LibreOffice, Quip
- Multimedia Software: iTunes, VLC media, Windows Media Player, MX Player
- Communication Software: Zoom, Skype, Slack, Teams
- Database Software: Oracle, MySQL, Redis, MongoDB
- Simulation Software: AnyLogic, ANSYS, MATLAB, Fusion 360
- Penetration Testing Software: Nessus, Wireshark, Sqlmap, Burp Suite, Cobalt
- 3. Programming Software
Programming Software is a program that provides developers with programming tools they need to develop other software. It includes a debugger, compiler, code editor, integrated development environment (IDE), and version control system, which help software developers write, test, and manage codes efficiently while developing programs and applications.
The core elements of programming software are Assemblers, Debuggers, Interpreters, and Compilers. The assembler converts the assembly language into machine language, the debugger removes bugs from the code, the interpreter converts statements into machine code and executes it, and the compiler reads the source program and translates it into equivalent machine language.
Some of the most popular programming software include Sublime Text, Visual Studio, Xcode, IntelliJ IDEA, AWS Cloud9, and Eclipse.
- 4. Middleware
Middleware is an interface between hardware and an application running on it. It bridges different applications, systems, or components and operates as a ‘software glue,’ facilitating communication between different applications.
Working between application software and the operating system, middleware provides mutual services and capabilities to apps in a distributed system. It simplifies the development of complex, interconnected software solutions.
Some common middleware types and their examples are listed below:
- Database Middleware: Open Database Connectivity (ODBC), Java Database Connectivity (JDBC)
- Massage-Oriented Middleware (MOM): Apache Kafka, RabbitMQ, IBM MQ
- Web Middleware: Nginx, Apache Tomcat, Microsoft IIS
- Application Servers: WebSphere, JBoss, WebLogic
- 5. Device Driver
Device Drivers, also known as computer drivers, control specific peripheral devices attached to the computer. They serve as facilitators that help the hardware component communicate with the operating system.
When you attach a hardware device to your computer, the device drive steps up and establishes communication between the OS and the peripheral device. It receives the command from the OS and helps the hardware understand it, ensuring the device executes its dedicated task.
Here are some common device driver types with their examples:
- Kernel-mode drivers: Disk drivers, Graphics drivers
- User-mode drivers: Printer drivers, USB device drivers
- Bus drivers: PCI, USB, SCSI bus drivers
- Function drivers: Disk encryption drivers, Antivirus file system filters
- Class drivers: Human Interface Device (HDI) driver for keyboards and mice
- Virtual device drivers: Virtual disk drivers, Virtual network adapters
- Miniport drivers: NDIS, WDM, StorPort, HID, WIA
- 6. Embedded Software
Embedded Software is a type of software that runs or controls the function of the embedded system. It includes a mixture of processor, memory, and peripheral devices designed for a specific function within a greater electronic or mechanical system.
This type of software is mostly found in electronics of security systems, cars, televisions, digital watches, robots, appliances, and more. Embedded Software bridges the disparity between the physicality of hardware and the logical functionality of software.
Here are the common types of embedded software:
- Real-time Operating Systems (RTOS): FreeRTOS, VxWorks, QNX
- Standalone Embedded Systems include digital watches, MP3 players, Calculators, Temperature measurement systems, and appliances such as washing machines, refrigerators, and microwave ovens.
- Network Embedded Systems: Home and office security systems, Automated teller machines (ATMs), Point-of-sale (POS) systems
- Automotive Embedded Software: Airbag control, Automatic parking system, Anti-lock braking, Adaptive cruise control
- Medical and Healthcare Embedded Software: Insulin pumps, Glucose meters, Intro-Aortic Balloon Pumps (IABP), Dialysis Machines
Software Development Process: From Design to Implementation
Software development process, or software development life cycle (SDLC), is the systematic process that covers every stage of software development, from planning and analysis to testing and maintenance. It is essential to have a clear software development methodology for software development so the overall process can maximize the available resources while minimizing the risks. Its main goal is to provide value by solving real problems and enhancing productivity while also meeting user needs.
The software development life cycle starts with planning, where the project’s scope, objectives, and resources are clearly determined. A feasibility study is conducted, and a project plan is developed.
The second phase involves analyzing the initial requirements for software development, such as cost of production, revenue potential, and the needs of the software’s end-users. If the software meets all initial requirements, it is converted to a software requirement specifications (SRS) document.
After that comes the design phase, which specifies how to fulfill all initial requirements, such as programming languages, frameworks, methodologies, development tools, libraries, APIs, Database Management Systems, security measures, etc. These are elaborated into a Software Design Document (SDD), translating user requirements into technical specifications that programmers can follow for coding and implementation.
Interface Design, Architectural Design, and Detailed design are 3 phases of software design. Interface design is about the look and feel of the product, its appearance, usability, and responsiveness. Software Architectural design is about the system structure & hierarchy and discipline of how it works. Detailed design is a specification of components required to construct and test architectural design.
The next step would be Software Testing, which detects and solves issues in source code to enhance usability, performance, security, and maintainability. Software testing checks for software bugs by combining automation and manual testing or continuous testing, i.e., testing code immediately after it is written; testing runs parallel to development.
The following step would be software maintenance, necessary to keep the system up and running. This includes fixing bugs, addressing and resolving customers’ issues, improving functionality, and adjusting source code to prevent issues.
How to Achieve Software Quality?
Software quality is the measure of how well the software meets the functional and non-functional requirements and needs of end users. It can be best served by fixed-quality models such as ISO/IEC 25002:2024.
Below is the hierarchy of eight software quality characteristics, each composed of sub-characteristics:
- Functional Suitability: Functional completeness, Functional correctness, Functional appropriateness
- Performance Efficiency: Time behavior, Resource utilization, Capacity
- Compatibility: Coexistence, Interoperability
- Usability: Appropriateness, recognizability, Learnability, Operability, User error protection, User interface aesthetics, Accessibility
- Reliability: Maturity, Availability, Fault tolerance, Recoverability
- Security: Confidentiality, Integrity, Non-repudiation, Accountability, Authenticity
- Portability: Adaptability, Installability, Replaceability
- Maintainability: Modularity, Reusability, Analyzability, Modifiability, Testability
Functional requirements include input given to the system, the operation performed, and output expected according to the specific demands of end users as the basic facility of the final software product. Non-functional requirements state how the final product should work. They include efficiency, compatibility, usability, reliability, security, portability, and maintainability.
Achieving software quality is one thing, whereas maintaining it, in the long run, requires developers to make software constantly adaptable to new customers’ needs and solve the problems identified by users. Software Quality Assurance includes fixing bugs, resolving new customer issues, and adjusting source code to prevent issues.
The maintenance of software allows software developers to make 4 types of changes: corrective, adaptive, perfective, and preventive.
Corrective maintenance includes fixing bugs reported by users’ code errors causing a mismatch of functional requirements.
Adaptive maintenance includes upgrading the codes to ensure compatibility with changing environments, such as new OS versions and peripheral device models.
Perfective maintenance includes changes to improve functionality, performance, and user interface.
Preventive Maintenance includes optimization and restructuring of codes to keep the system up and running.
Software Liability, Licensing & Patents
Software Liability refers to the legal responsibility of software manufacturing companies on any issues related to the software they develop. Companies can be held liable for damages caused by software like bugs, security issues, and intellectual property violations
Software license is a legal document that states the right of use and distribution of software. It involves an agreement between the software developer or vendor and the end user, defining the terms under which the software can be used, modified, and distributed. terms and conditions generally include fair use of the software, the limitations of liability, warranties, disclaimers, and protections if the software or its use infringes on the intellectual property rights of others.
Five of the common types of software licenses are Public domain license, GNU Lesser General Public License (LPGL), Proprietary License, Permissive License, and Copyleft License.
- Public Domain License: Software with this license has no restriction on its use, modification, and distribution. You can use the software freely, create products from it, and benefit financially. Examples of software with this license are GIMP, SQLite, and SHA-3.
- GNU Lesser General Public License (LPGL): This license allows developers to integrate LGPL’s software component as their own without having to make their own code open-sourced. Some software with GNU LPGL are 7-Zip, ORBit, CubicWeb, and Qt.
- Proprietary License: This is the most restrictive license, and it does not allow users to make any changes to the software’s code. If you want to modify or redistribute such software, you will need to acquire an end-user license agreement (EULA). Some software with proprietary licenses are Microsoft Windows, Skype, iTunes, and Adobe Acrobat.
- Permissive License: This license is a restrictive form of Public Domain License. You can use the software freely, but it has some restrictions, such as meeting certain conditions for intellectual property protection and retaining copyright information in the distribution process. Examples of this license include the Apache License, GNU All-permissive License, BSD License, MIT License, and Apple Public Source License.
- Copyleft License: This license dictates that any modification made to the software must be released under the original software’s license terms. Any derivative work done with the software remains free and open source. The FOSS digital audio editing software Audacity is a general example.
While the prevalence of these licensing models in the software industry still remains, there has been a paradigm shift towards a subscription-based model in recent times. It has given rise to the idea of Software as a Service (SaaS), which is a software delivery model that a vendor uses to host applications, and customers can subscribe to their service over the Internet. Users don’t need to purchase any license on local machines. Software is hosted on the cloud and made available to those users who pay subscription fees.
Software patent protects a piece of computer software. Computer software can be a stand-alone software program, a mobile app, or software integrated into mechanical hardware, and it must meet other requirements, the same as any other innovation to be patentable. Since copyright is only able to stop anyone from copying the source code of a software product, it cannot stop other developers from creating the same software independently, whereas a patent can stop another developer from using the functionality of any software that is claimed in patent though it is being developed independently. Thus, the more a software is functionally different, the more likely it is to get patented.
The History of Software
Over the past century, the evolution of software has been fascinating. With the technological advancement of computer technology, there has been a massive transformation from the earliest conceptual algorithm to modern complex applications. Below is a timeline of the historical advancement of software, highlighting the major groundbreaking events that shaped its overall structure.
1946: Introduction of the world’s first general-purpose digital computer called ENIAC (Electronic Numerical Integrator and Computer). Its software employed plugboards and switches.
1948: The world’s first software was created by computer scientist Tom Kilburn for the Manchester Baby computer at the University of Manchester, England.
1949: Assembly language, a low-level language with a more human-readable view of machine-level instructions, was invented by Kathleen Booth.
Early 1950s: General Motors developed the world’s first operating system called the General Motors Operating System (GM OS) for the IBM 701 Electronic Data Processing Machine.
1957: IBM developed the first high-level programming language called FORTRAN (Formula Translation).
1958: John W. Tukey, an American statistician, first used the term ‘software’ in a scientific article.
Late 1960s: Floppy disks were introduced for software distribution.
1964: John Kemeny and Thomas Kurtz developed BASIC (Beginner’s All-purpose Symbolic Instruction Code).
1969: Ken Thompson, Dennis Ritchie, and others develop the UNIX operating system at Bell Labs.
1972: Dennis Ritchie developed the C programming language at Bell Labs.
1975: Bill Gates and Paul Allen founded Microsoft.
1976: Steve Jobs, Steve Wozniak, and Ronald Wayne launched Apple Computer.
1980s: PCs were equipped with hard drives, and computer manufacturers began bundling software into computers.
1981: Microsoft released MS-DOS (Microsoft Disk Operating System).
1984: Apple introduces the Macintosh. It was the first mass-market personal computer that featured a GUI and mouse.
1985: Microsoft Windows 1.0 was released.
1989: World Wide Web is proposed by Tim Berners-Lee.
1991: Linus Torvalds releases Linux kernel.
1993: Mosaic, the first popular web browser, is released.
1995: Java programming language is released by Sun Microsystems.
1998: Google is founded by Larry Page and Sergey Brin.
2001: Apple released Mac OS X, and Wikipedia was launched.
2004: Mozilla Firefox was released, and Facebook was launched by Mark Zuckerberg.
2007: Apple introduces the iPhone. It revolutionized how mobile computing and software development were viewed.
2010s: CD-ROMs and DVDs became the major devices for downloading and purchasing software.
2010: Apple introduced the iPad, while Microsoft released Windows 7.
2015: Microsoft released Windows 10. It saw the return of the Start menu. Cortana was introduced.
2016: Amazon Alexa and other virtual assistants became popular.
2017: Artificial Intelligence and Machine Learning were widely used in various applications.
2018: EU implements GDPR (General Data Protection Regulation) for regulation of software privacy policies.
2020: With the global surge of COVID-19, remote work software like Zoom and Microsoft Teams took center stage.
2021: Apple introduces the M1 chip. It combined CPU, GPU, and RAM on a single chip, significantly improving performance and efficiency.
2022: Metaverse and VR software are on the rise. Companies like Meta (formerly Facebook) are the primary investors.
2023: Quantum computing sees significant advancements, with major tech companies demonstrating practical quantum computing applications.
2024: Artificial General Intelligence (AGI) research progresses, with AI systems becoming more autonomous and capable.
The Future of Software
The world is constantly evolving and moving forward to reach new heights. One can only wonder how it will do so next. With the advent of artificial intelligence, quantum computing, augmented reality, and robotics, there are more chances for developers or programmers to increase their imagination and adjust to this world based on their learnings.
- Artificial General Intelligence (AGI): More human-like interactions through advanced NLP as well as decision enhancement organically across sectors via AI.
- Blockchain: Decentralized Finance (DeFi), voting systems, legal and property transactions, etc., with scalability and interoperability improvements.
- Augmented Reality (AR): Improved adoption in education, healthcare (e.g., remote surgical treatments), property (virtual walkthroughs), and seamless integration with glasses and contact lenses.
- Cybersecurity: Increased use of AI and machine learning for proactive threat hunting, development of zero-trust architectures, and advancements in quantum-resistant encryption algorithms.
- Continuous Integration and Delivery (CI/CD): More AI for integration to predict and remediate breaking changes, wider use of containerization with orchestration tools such as Kubernetes, and robust security throughout the CI/CD pipeline.
- Quantum Computing: Realizing practical quantum applications, democratization of low-level quantum cloud services, and a new selection of Quantum Programming Languages/Development Frameworks.
- DevOps: Expect to see more integrated DevSecOps practices, wider adoption of AI for automating operational tasks, and an increase in site reliability engineering which means increased focus on system performance along with better support.