Introduction

Introduction to Software Engineering (CSSE 1001)

Author

Paul Vrbik

Published

May 21, 2026

What is a computer?

Perhaps we could define a computer as follows:

A computer is a machine that can carry out sequences of arithmetic or logical operations automatically.

Formal definition of a computer

Alan Turing gave a formal definition for a computer and what it means for something to be computable. In particular, he demonstrated that there are problems that are not computable.

A finite state machine is a machine that can change state when given input. A Turing Machine is a finite state machine that has (infinite) read/write memory called tape.

A Turing Machine is a general purpose computer (a single machine that can be programmed to do different tasks).

What is software?

Perhaps…

Software is the complement of hardware. They are instructions for the machine.

What is an algorithm?

Perhaps…

An algorithm is an ordered sequence of unambiguous instructions that eventually terminates.

The language we use to express ourselves is less important than what we are expressing: an instruction sequence that does something useful like sorting a list.

What is computer science and software engineering?

Perhaps we can define computer science as:

The practice/art of creating algorithms and measuring their relative effectiveness.

And software engineering as:

The practice/art of creating and maintaining software (realized algorithms) in groups.

Programming Languages

There are a myriad of languages with wildly differing philosophies that we can use to issue instructions to the machine. These philosophies or “paradigms” broadly fall into four categories. This course is an introduction to imperative and object oriented programming.

Declarative

Declarative languages have the programmer describe the problem (or more specifically, the desired properties of a solution), rather than the steps involved in solving the problem. Examples include SQL, HTML/CSS, and all functional languages.

Functional

Functional languages are a subset of declarative languages. The core ideas in the functional paradigm are:

  • avoiding mutations of state
  • functional composition
  • pure functions (functions always produce the same output for the same input and do not produce side effects)

Don’t worry if that doesn’t make sense just yet, this course doesn’t focus on functional programming. While many modern languages contain elements of the functional paradigm, an example of a pure functional language is Haskell.

Imperative

Imperative languages have the programmer describe the steps that need to be run in order to solve a problem. All imperative languages provide the programmer with at least the following 3 tools:

  • Sequencing: lines are run in a specified order, where the order of execution of the lines can affect the behaviour of the program.
  • Selection: code may be skipped or run depending on whether some condition has been met.
  • Iteration: code may be repeated until a specified condition no longer holds.

Object Oriented

Object Oriented languages allow the programmer to organize their programs into objects. Programmers create objects of different types (categories, or classes) where an object’s type / class determines what kind of data (attributes) and functionality (methods) it has.