Category Archives: Software Engineering Curriculum

Topic 7 – Introduction to Database Management Systems

Why do I need to learn about database management systems?

Your software must help users to do their work. The most important part of the users’ work is the information. You need to learn about database management systems to store, manipulate, retrieve and secure this information.

The database is the heart of any software system, especially enterprise systems. Poor database design will eventually cause a system to fail. Designing enterprise databases requires both specific domain knowledge and a deep understanding of database design principles. This is another reason why learning about database management systems is essential.

What can I do after finishing learning database management systems?

You will be able to design and implement database part for software systems. These systems may include airlines and railways, banking, education, telecommunications, digital libraries and digital publishing, finance, sales, health care information systems, e-commerce system, content management system.

You will be able to decide when to use a relational database management system and when to use a NoSQL database management system, as well as how a database system works internally.

You will also know how to build a data warehouse. You will know how to design a relational database and write SQL code PROPERLY (i.e. for specific purposes) too.

You will also be able to design databases for scalable and highly available software systems.

It sounds interesting! What should I do now?

Learning about database management systems requires a lot of effort. First you need to learn how to use database management systems.

First, please read one of the following books to learn the core concepts of relational database management systems and gain hands-on experience working with them:

After that, please read this book to learn how to write SQL code efficiently: Stephane Faroult and Peter Robson (2006). The Art of SQL. O’Reilly Media.

After that, please read these books to learn about normal forms and the relational theory behind relational databases, which will help you create more efficient logical designs for your databases:

After that, please read these books to learn how to build a data warehouse:

After that, please read these books to learn the core concepts of NoSQL database management systems and gain hands-on experience working with them:

Terminology Review:

  • Databases.
  • Flat Files.
  • Database Management Systems.
  • Relational Databases.
  • (Oracle) Tablespaces, Datafiles, and Objects.
  • (Oracle) Databases, Instances, Schemas.
  • Tables, Rows, Columns, Primary Keys, Foreign Keys.
  • Normal Forms.
  • Relational Model: Relations, Tuples, Primary Keys, Foreign Keys, Constraints.
  • Data Manipulation Languages (DMLs): Relational
    Algebra, Relational Calculus.
  • Relational Algebra: σ Select, π Projection, ∪ Union, ∩ Intersection, – Difference, × Product, ⋈ Join.
  • Data Models: Entity-Relationship (ER) Model, Relational Model, Object-Oriented Model, NoSQL Model.
  • Schemas.
  • Entity-Relationship Model.
  • SQL, TSQL.
  • Stored Procedures.
  • Functions.
  • Queries.
  • Aggregates (AVG, MIN, MAX, SUM, COUNT), ANY_VALUE, GROUP BY, HAVING, LIKE (Strings).
  • Output Redirection.
  • ORDER BY, ROW_NUMBER, RANK.
  • Subqueries.
  • Views.
  • Common Table Expressions.
  • Indexes.
  • Recovery.
  • Replication.
  • Data Warehouse.
  • Dimensional Modeling.
  • NoSQL.
  • Key-Value Databases.
  • Document Databases.
  • Column-Family Databases.
  • Graph Databases.
  • Array (Vector, Matrix, Tensor) Databases.

After finishing database management systems, please click on Topic 8 – Introduction to Web Application Development to continue.

 

Topic 6 – Introduction to Windows Programming

Why do I need to learn about Windows programming?

Because Windows is the most popular OS and most companies use it for their daily work. So your software must run on Windows in order to help users do their work.

What can I do after finishing learning Windows programming?

You will know how to create Windows applications that are similar to Notepad, or Paint, or Calculator.

You could also create a dictionary application or an application for storing and searching for books.

It sounds interesting! What should I do now?

Windows  programming is a very big topic. You need to master at least 3 specific technologies: Windows API, Windows Forms and Windows Presentation Foundation.

First, please read the books below to learn about Windows APIs:

After that, please read this book to learn about Windows Forms: Chris Sells and Michael Weinhardt (2006). Windows Forms 2.0 programming. Addison-Wesley.

After that, please read this book to learn about Windows Presentation Foundation: Chris Sells and Ian Griffiths (2007). Programming WPF: Building Windows UI with Windows Presentation Foundation. O’Reilly Media.

Can I learn Java stuff instead of Microsoft stuff for Windows programming?

Yes, you can. However please remember that Microsoft is the one who created and has been developing Windows. Therefore we believe that the good approach for learning programming for Windows is to learn Microsoft technologies.

Can I create a desktop application that can run in Windows, macOS and Linux using one code base?

Yes, you can.  Please consider one of the tools below:

Terminology Review:

  • Windows, Menus, Panels, Tabs.
  • Buttons, Text Boxes, Combo Boxes, Images, Trees.
  • Windows API.
  • Windows Forms.
  • Windows Presentation Foundation (WPF).
  • Graphics Device Interface (GDI).
  • Dynamic-Link Library (DLL).
  • Processes.
  • Threads.
  • Shared Memory.
  • Windows Sockets 2 (Winsock).
  • Windows Services.
  • Office Add-ins.

After finishing windows programming, please click on Topic 7 – Introduction to Database Management Systems to continue.

 

Topic 5 – Object-Oriented Programming

Why do I need to learn about object-oriented programming?

Because most of modern software are written using object-oriented programming languages. Using object-oriented programming as a tool and more importantly as a problem solving approach will save you a lot of time and cost when you create modern software systems.

What can I do after finishing learning object-oriented programming?

You will be able to write a program to allow a user
– to draw a picture, save it, then load it, or
– to play ping-pong game, or
– to store and search for an employee’s CV.

Alright! What should I do now?

First, please read this book to gain a fundamental understanding of object-oriented programming with intuitive examples, and to distinguish object-oriented concepts from procedural programming concepts: Jim Keogh and Mario Giannini (2004). OOP Demystified. McGraw-Hill.

After that, please read this book to learn how to apply object-oriented concepts to creating real world software using a specific object-oriented programming language (i.e. C# language): RB Whitaker (2017). The C# Player’s Guide. Starbound Software.

After that, please take a quick look at one of the books below so you can refer to a specific topic that requires further study when developing real-world software:

I hear that there are many object-oriented programming languages, such as C++, C#, Java, PHP, Objective-C, Swift, Python, and Ruby. How many object-oriented programming languages do I need to learn?

You should learn as many as possible. However, at this stage, we recommend that you focus on learning only C++, C#, or Java.

C++ is the most widely used language for developing high-performance software systems, including games, operating systems, compilers, database management systems, web browsers, graphics editors, and medical or engineering applications.

Java and C# are the most widely used languages for developing enterprise systems.

If you are required or prefer to learn C++, please read this book to learn the core concepts of object-oriented programming with C++ implementation and specific features: Bjarne Stroustrup (2013). The C++ Programming Language. Pearson Education.

If you are required or prefer to learn Java, please read this book to learn the core concepts of object-oriented programming with Java implementation and specific features: Herbert Schildt (2019). Java: The Complete Reference. McGraw-Hill Education.

You should focus on mastering the core object-oriented principles such as encapsulation, inheritance, polymorphism, and abstraction, rather than trying to learn every OOP language. Once you understand these principles well, you can apply them across different languages with relatively little effort.

After that, please read the two books below to deepen your understanding of OOP concepts and to learn how to design software more efficiently using this approach:

Terminology Review:

  • Abstraction.
  • Encapsulation.
  • Class-based Inheritance.
  • Prototype-based Inheritance.
  • Polymorphism.
  • Types.
  • Method Variables (C++ Function Pointers, C# Delegates).
  • Concurrency.
  • Collections.
  • Object-Oriented Analysis.
  • Object-Oriented Design.
  • Object-Oriented Programming.

After finishing learning about object-oriented programming, please click on Topic 6 – Introduction to Windows Programming to continue.

Topic 4 – Introduction to Data Structures and Algorithms

Why do I need to learn data structures and algorithms?

Your software should address real-world problems. While knowing a programming language is important for writing software, it doesn’t help you leverage existing solutions to save time and effort when building a system.

Many real-world problems have already been solved, and their solutions are documented as data structures and algorithms. It’s important to learn these so you don’t reinvent the wheel, enabling you to apply them to your specific problems, thereby reducing time and effort, or optimizing your solutions.

Additionally, learning algorithms and data structures will help you develop algorithmic thinking and problem-solving skills, which are essential for any software developer.

What can I do after finishing learning algorithms and data structures?

Given a problem, you’ll be able to choose the appropriate data structures to represent concepts in a computer.

You’ll be capable of writing a program that instructs the computer to:
– store and search for data efficiently,
– sort information,
– compute irrational numbers,
– find the shortest path between two locations, or
– encrypt and decrypt sensitive information.

When examining source code, you’ll also be able to determine which program will run faster.

That sounds useful! How can I learn algorithms and data structures?

First, please read this book to gain intuitive understanding of data structures and algorithms: Jay Wengrow (2020). A Common-Sense Guide to Data Structures and Algorithms. Pragmatic Bookshelf.

After that, please read this book to learn about graph theory: Richard J. Trudeau (1993). Introduction to Graph Theory. Dover Publications.

After that, please read this book to learn how to formally define, implement, and evaluate data structures and algorithms: Thomas H. Cormen et al. (2022). Introduction to Algorithms. The MIT Press.

Alternatively, please audit this course and read its lecture notes to learn the core data structures and algorithms through interactive explanations: MIT 6.006 – Introduction to Algorithms, Fall 2011, (Lecture Notes).

After that, you can audit this course and read its lecture notes to delve deeper into the design and analysis of data structures and algorithms through interactive explanations: MIT 6.046J – Design and Analysis of Algorithms, Spring 2015 (Lecture Notes).

Terminology Review:

  • Arrays.
  • Selection Sort.
  • Invariant Reasoning.
  • Order of Growth, Big O, Big Theta.
  • Insertion Sort. Complexity: O(n²).
  • Merge Sort, Recursion Tree. Complexity: O(nlgn).
  • Bubble Sort. Complexity: O(n²).
  • Quick Sort. Complexity: O(nlgn).
  • Counting Sort. Complexity: O(n + k).
  • Radix Sort. Complexity: O(nlogₙk).
  • Sets.
  • Stacks.
  • Queues.
  • Lists, Linked Lists, Sorted Lists.
  • Trees, Binary Trees, Heaps.
  • Heapsort. Complexity: O(nlgn).
  • Hash Tables, Maps, Dictionaries: Chaining, Division Method, Multiplication Method, Open Addressing, Linear Probing, Double Hashing, Cuckoo Hashing.
  • Linear Search.
  • Binary Search.
  • String Matching: Karp-Rabin Algorithm, Rolling Hash ADT.
  • Binary Trees: Depth, Height, Traversal Order.
  • Binary Search Trees (BST).
  • AVL Trees, Rotations, AVL Sort.
  • Sequence Binary Trees.
  • Red-Black Trees.
  • 2-3 Trees.
  • B-Trees.
  • B+ Trees.
  • Comparison Model of Computation, Decision Tree, Search Lower Bound, Sorting Lower Bound.
  • Hierarchical Structure.
  • Karatsuba’s Algorithm.
  • Newton’s Method for Computing Square Roots.
  • Graphs: Complete Graphs, The Handshaking Lemma, Identical Graphs, Graph Isomorphism,  Adjacency Lists, Implicit Graphs, Adjacency Matrix, Incidence Matrix.
  • Breadth-First Search: Shortest Paths.
  • Depth-First Search: Tree Edges, Nontree Edges (Back Edges, Forward Edges, Cross Edges), Cycle Detection, Job Scheduling, Topological Sort.
  • Dijkstra’s Algorithm.
  • Bellman–Ford Algorithm.
  • Single-source Single-target Dijkstra.
  • Bi-Directional Search.
  • A* Algorithm.
  • Dynamic Programming: Subproblems, Guessing, Recursion and Memoization, Bottom-up, Topological Order, Original Problem and Parent Pointers.
  • Dynamic Programming Examples: Fibonacci Numbers, Text Justification, Parenthesization, Edit Distance.
  • Computational Difficulty: P, NP, EXP, R.
  • Hardness and Completeness: NP-hard, NP-complete, EXP-hard, EXP-complete.

After finishing learning about data structures and algorithms, please click on Topic 5 – Object-Oriented Programming to continue.

 

Topic 3 – Introduction to Programming

Why do I need to know a programming language?

Because you will develop your software using a programming language.
A programming language is a language that both you and a computer will understand.
It’s a tool for you to express what you want a computer to do.
It’s a tool for you to write the instructions of your computer programs.
Without knowledge of a programming language, you cannot develop software.

I hear that there are many programming languages such as C, C++, C#, Objective-C, Java, Swift, Ruby, Python, JavaScript, PHP, F#, Kotlin, Clojure, Go, and Lisp.
How many programming languages should I know?

As many as possible. However, at this stage, you should first learn about the structure of a computer program and a procedural language (e.g., C or C++).

What can I do after finishing learning programming language?

You will be able to write programs that tell a computer to:

  • perform calculations,
  • count the occurrences of a string,
  • store and search for a string,
  • sort a list of numbers, or
  • display an image.

What should I do now?

Please read this book to learn programming using the C language: Stephen Prata (2011). C Primer Plus. Pearson.

Alternatively, you can read this book (from Chapter 1 to Chapter 9), to learn programming using the C++ language: Stephen Prata (2012). C++ Primer Plus. Pearson.

Alternatively, you can read these books to learn programming using the Python language:,

Alternatively, you can read this book (from Chapter 1 to Chapter 11), to learn programming using the Ruby language: Chris Pine (2013). Learn to Program: The Facets of Ruby Series. The Pragmatic Bookshelf.

Alternatively, you can read these books to learn programming using the Go language:

After that, if you would like to study system programming in depth, please read one of the following books:

After that, if you would like to build your vocabulary and gain in-depth knowledge of programming, especially the relationship between mathematics and programming, as well as the ideas of functional programming and logic programming, then please read the book or the notes below:

Terminology Review:

  • Computer Programs.
  • Compilers.
  • Just-In-Time Compilers.
  • Interpreters.
  • Structured Programming.
  • Procedural Programming.
  • Object-Oriented Programming.
  • Functional Programming.
  • Declarative Programming.
  • Logic Programming.
  • Primitive Types: int, float, double, string, date/time, null.
  • Basic Constructs: variables & assignments, pointers, declarations, functions, macro.
  • Control Flow: if/else, while, switch, for, break, continue, recursion, exception, parallelism, signal, jump.
  • User-defined Types: struct, class, type.
  • Data Structures: Arrays, Lists, Linked Lists, Dictionaries.
  • Object-Oriented Programming: abstraction, encapsulation, class-based inheritance, prototype-based inheritance, polymorphism.
  • Functional Programming: first-class and higher-order functions, no side effects, recursion.
  • Modularity: files, packages, namespaces, libraries, modules.
  • Concurrency: processes, threads, locks, channels, timers, callbacks, events, promises, event loop.
  • Type system: static type, dynamic type.
  • Error handling: try/catch.
  • Metaprogramming: reflection, template programming, DSL.
    • Clojure.

    After finishing programming, please click on Topic 4 – Introduction to Data Structures and Algorithms to continue.

    Topic 1 – Operating Systems

    Why do I need to learn about operating systems?

    Because you will develop your software using an operating system or for an operating system.

    What can I do after finishing learning operating systems?

    You will be prepared with skills that help you prepare environments for your your programming journey.

    You will be prepared with the concepts that help you understand programming terminologies.

    You will be inspired to learn programming to solve problems.

    How many operating systems should I know?

    As many as possible. We recommend that you learn how to work with Windows first. Then you can learn the core concepts of any operating system.

    How do I learn to use operating systems?

    Please read this book to learn how to use Windos 10: Andy Rathbone (2015). Windows 10 For Dummies. John Wiley & Sons.

    Aternatively, please read the books below to learn how to use Windows 11:

    How about other operating systems such as macOS, Linux or Unix?

    If you have a Mac then you can read this book to learn how to use macOS: Pogue David (2019). macOS Mojave: The Missing Manual. O’Reilly Media.

    If you have a PC with Ubuntu, or Linux, or Unix then you can read this book to learn how to use a Unix-based operating system: Mark G. Sobell (2015). A Practical Guide to Ubuntu Linux. Prentice Hall.

    After that, please read these lecture notes and try the code to grasp the core concepts of computing: Introduction to Computing Principles.

    After that, please read this book to learn the core concepts of an operating system: Abraham Silberschatz et al. (2018). Operating System Concepts. Wiley.

    Terminology Review:

    • Central Processing Unit (CPU).
    • Random-Access Memory (RAM).
    • Hard Disk Drive (HDD).
    • Solid-State Drive (SSD).
    • Programs: How does a program start and run?
    • Boot Loaders.
    • Basic Input/Output System (BIOS)
    • Unified Extensible Firmware Interface (UEFI).
    • Computers: The interplay of CPU, RAM and Devices.
    • Interrupts.
    • ∞×∞
    • Operating System (OS).
    • Monolithic Structure.
    • Microkernels.
    • User Mode.
    • System Calls.
    • Kernel.
    • Kernel Mode.
    • Processes.
    • Threads.
    • Process Synchronization.
    • Memory Management Unit.
    • Logical Address.
    • Physical Address.
    • Paging.
    • File System.
    • Security and Protection.
    • Networks.
    • Virtual Memory.
    • Virtualization.
    • Virtual Machines.

    Once you finish learning about operating systems, please click on Topic 2 – Introduction to Computer Networks to continue.