As the famous entrepreneur and investor Marc Andreesson said, Software is Eating the World. From the wide-spread use of the computer, the inter-network created between them, to now into everyone’s hands, software is expanding. With the next wave arriving in artificial intelligence and distributed decision making, it continues it’s expansion. So you might want to know what is software and who creates them.

Concepts

In terms of concepts, there are several groups of people to understand:

Computer Scientists – This is the study of computing and it is an extremely broad title. Computer scientists could be interested in any or all elements of computing, from networking to operating systems to compilers to programming languages to algorithms to artificial intelligence or even other fields like biology. Computer scientists can apply computing theory and principles to existing systems or help design new ones that are proven to be mathematically correct.

Software Engineers – This is the application of computer science principles to today’s software and is what I’m currently interested in. In this field, you need to understand computer science issues, but you aren’t as interested in purely theoretical solutions but rather how you can apply it. It also involves project management, project delivery, risk management, and the maintenance of software. The definition isn’t as clear as the one I’m proposing here, and you’ll see why shortly.

Programmers – Programming is not the same as engineering. You can learn how to code to solve a problem very quickly, but to understand formal logic, queue theory, project risks, you need a different level of understanding. Programming is literally the writing of software where you use a language that the computer understands and can eventually execute. Telling the computer to go to page 2, open the camera, or take a photo, are all instructions written through programming.

Software Engineering Definition

Unfortunately, there does not seem to be a consensus on what software engineering is, and even when I chose to study it, I found it difficult to unanimously differentiate it between computer science. Here are some definitions from around the web:

Oxford’s Software Engineering Department defines it as:

Software Engineering is the application of scientific and engineering principles to the development of software systems—principles of design, analysis, and management

Carnegie Melon’s Department of Software Engineering defines it as:

Software engineering, on the other hand, focuses on technical and managerial leadership for large and complex systems. Its foundation of enduring engineering principles will support a lifetime of practice amid emerging technologies.

From these two definitions, it’s difficult to understand what the common ground is. Oxford appears to care more about the principles of engineering and science with an acceptance of the management element. CMU appears to care more about the management aspect by listing it first and using principles of engineering to support your job as technology changes. In this sense, both agree that there is a human element and the principles of engineering are important, but Oxford makes note of an additional scientific importance. My interpretation of these differences is that CMU is more focused on management, whereas Oxford appears to be more focused on technicals and theory, taking into account their definitions of software engineering.

Let’s take a look at their course offerings of their Masters in Software Engineering Programs:

CMU:

Software Engineering Reflection
Introduction to Personal Software Process
Estimating Software Development and Maintenance Projects
Computer Science for Practicing Engineers
Software Measurement
Hardware for Software Engineers
Models of Software Systems
Methods: Deciding What to Design
Managing Software Development
Communication for Software Engineers I
Software Development Studio I
Software Development Studio I
Directed Study
Independent Study
Introduction to Team Software Process
Risk Management for Software Intensive Projects
Systems Architecture for Managers
Management of Software Development for Technology Executives
Technology Innovation, Adopttion, and Diffusion
Analysis of Software Artifacts
Architectures for Software Systems
Communication for Software Engineers II
Software Development Studio II
Independent Study
Independent Study

This course set is clearly management and programming focused, with a minor scientific course offering such as computer science for practicing engineers.

Oxford’s software engineering course list is inline with their definition:

Software Engineering Mathematics (SEM)
Concurrency and Distributed Systems (CDS)
Advanced Concurrency/ Model Checking (MCH)
Performance Modelling (PMO)
Software Development Management (SDM)
Agile Methods (AGM)
Interaction Design (IDE)
Requirements Engineering (REN)
Management of Risk and Quality (MRQ)
Process Quality and Improvement (PRO)
Safety Critical Systems (SCS)
Enterprise Architecture (EAR)
Software Engineering Tools
Algorithmics (ALG)
Object-Oriented Design (OOD)
Object-Oriented Programming (OOP)
Design Patterns (DPA)
Software Testing (STE)
Database Design (DAT)
Functional Programming (FPR)
Concurrent Programming (CPR)
Agile Engineering Practices (APE)
Extensible Markup Language (XML)
Service Oriented Architectures (SOA)
Cloud Computing and Big Data (CLO)
Embedded Software and Systems (ESS)
Mobile and Sensor Networks (MOB)
Semantic Technologies (STC)
Software and Systems Security
Security Principles (SPR)
Secure and Robust Programming (SRO)
Trusted Computing Infrastructure (TCI)
Design for Security (DES)
Risk Analysis and Management (RIS)
People and Security (PAS)
Network Security (NES)
Cloud Security (CLS)
Forensics (FOR)
Data Security and Privacy (DAS)
Security and Incident Management (SIM)
Building Information Governance (BIG)
Mobile Systems Security (MSS)
Security in Wireless Networks (SWN)

Since they don’t seem to agree on what software engineering is, Wikipedia’s definition is:

Software engineering is the study and an application of engineering to the design, development, and maintenance of software.[1][2][3]

Typical formal definitions of software engineering are:

  • “the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software“;[4]
  • “an engineering discipline that is concerned with all aspects of software production”;[5]
  • and “the establishment and use of sound engineering principles in order to economically obtain software that is reliable and works efficiently on real machines.”[6]

Of these three different definitions on Wikipedia, I support the last one. To excel as a software engineer, one must be concerned of using sound principles, making cost-conscious decisions in terms of time and effort, and care about the efficiency of their applications and systems. The second definition is far too broad and the first definition misses out on the economy of software engineering.

Unfortunately, it appears there isn’t a real consensus on what software engineering really is. As a software engineer myself, I would agree mostly with Oxford’s definition as the application of scientific, engineering, and management principles overlap to create software engineering. These software practitioners then use computer science theory, software development, and software management to create applications for the world to use.

If you are thinking about studying software engineering, my advice to you is to study where their definition is more aligned with what you want to do. Take a look at their course list to make sure it agrees with their definition as well, so you won’t be surprised by the new courses they develop.