All posts by admin

Topic 4 – Introduction to Data Structures and Algorithms

Why do I need to learn algorithms and data structures?

Your software must solve real-world problems.
Knowing a  programming language does help you to write software but it does not help you reuse existing solutions to save your time and effort when creating a software system.

Many real world problems were already solved and their solutions were documented as data structures and algorithms.
You need to learn them so that you will not reinvent the wheel and can apply them to solve your specific problems to reduce your time and effort or to optimize your solutions.

Moreover, learning algorithms and data structures will help you practice algorithmic thinking and problem-solving skill which are essential requirements for any software developer.

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

You will be able to write a program to tell a computer
– to store and search for something efficiently, or
– to sort something for you, or
– to find shortest paths from one location to another, or
– to encrypt or decrypt sensitive information for you.

Given some programs, you will be able to tell which one will run faster when looking at their source code.

Given a problem, you will be able to choose appropriate data structures for representing concepts in a computer.

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

Please read this Jay Wengrow (2017). A Common-Sense Guide to Data Structures and Algorithms. Pragmatic Bookshelf first.

After that please read this Richard J. Trudeau (1994). Introduction to Graph Theory book to learn about graph theory.

After that please read this Thomas H. Cormen et al. (2022). Introduction to Algorithms. The MIT Press. book to learn in depth about algorithms and data structures.

Alternatively, please watch
– this MIT 6.006 – Introduction to Algorithms, Fall 2011 course (Lecture Notes), then watch
– this MIT 6.046J – Design and Analysis of Algorithms, Spring 2015 course (Lecture Notes).

Terminology Review:

  • Arrays.
  • Lists.
  • Linked Lists.
  • Queues.
  • Stacks.
  • Sets.
  • Hash Tables, Maps, Dictionaries.
  • Trees.
  • Binary Trees.
  • Hierarchical Structure.
  • Linear Search.
  • Big O.
  • Selection Sort.
  • Insertion Sort.
  • Quick Sort.
  • Binary Search.
  • Graphs.
  • Breadth-First Search.
  • Depth-First Search.
  • Dijkstra’s Algorithm.
  • Bellman–Ford Algorithm.
  • Recursion.
  • Dynamic Programming: Memoization, subproblems, guessing, bottom-up.

After finishing learning about data structures and algorithms please click 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 instructions of your computer programs.
Without knowledge of a programming language, you cannot develop any 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, or Lisp.
How many programming languages should I know?

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

What can I do after finishing learning programming language?

You will be able to write a program to tell a computer
– to do a calculation, or
– to count for occurrence of a string, or
– to store and search for a string, or
– to sort a list of numbers, or
– to display an image.

What should I do now?

Please read this Stephen Prata (2011). C Primer Plus. Pearson book.

Alternatively, you can read

– this Stephen Prata (2012). C++ Primer Plus. Pearson book (from Chapter 1 to Chapter 9), or

– this John M. Zelle (2017). Python Programming: An Introduction to Computer Science. Franklin, Beedle & Associates book (from Chapter 1 to Chapter 9), or

– this Charles Severance (2013). Python for Informatics: Exploring Information book (from Chapter 1 to Chapter 11), or

– this Chris Pine (2013). Learn to Program: The Facets of Ruby Series. The Pragmatic Bookshelf book (from Chapter 1 to Chapter 11), or

– this Alan A. A. Donovan and Brian W. Kernighan (2015). The Go Programming Language. Addison-Wesley Professional book, and this Nathan Youngman and Roger Peppe (2018). Get Programming with Go. Manning Publications book.

After that if you would like to study system programming in depth then please read

– this Brian W. Kernighan and Dennis M. Ritchie (2016). The C Programming Language. Prentice Hall book, or

– this Michael Kerrisk (2018). The Linux Programming Interface. No Starch Press book.

After that if you would like to get vocabularies and in-depth knowledge about programming, especially the relationship between mathematics and programming, and ideas of functional programming and logic programming then please read

– this Harold Abelson and Gerald Jay Sussman (1996). Structure and Interpretation of Computer Programs. The MIT Press book, or

– these Course Notes.

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.
  • 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 learning about programming languages please click Topic 4 – Introduction to Algorithms and Data Structures 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 knowledge that helps you understand programming terminologies.

    You may even 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 learn about basic concepts of an operating system.

    How do I learn to use operating systems?

    Please read this Andy Rathbone (2015). Windows 10 For Dummies. Wiley book.

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

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

    If you have a PC with Ubuntu, or Linux, or Unix then you can read this Mark G. Sobell (2015). A Practical Guide to Ubuntu Linux. Prentice Hall book.

    After that please read these Introduction to Computing Principles lecture notes.

    After that please read this Abraham Silberschatz et al. (2018). Operating System Concepts. Wiley book.

    Terminology Review:

    • Central Processing Unit (CPU).
    • Random-Access Memory (RAM).
    • Hard Disk Drive (HDD).
    • Solid-State Drive (SSD).
    • Programs.
    • Basic Input/Output System (BIOS)
    • Unified Extensible Firmware Interface (UEFI).
    • Boot Loader.
    • 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 Topic 2 – Introduction to Computer Networks to continue.