/practicing-computer-science

Practicing Computer science (Data structures, Algorithms etc.)

Learning Computer Science

Table of Contents

General advices about learning CS

Books

  • Classic Computer Science Problems in Python - David Kopec (2019, 1st edition, 224 pages, Manning)

Computer architecture

Software architecture

  • Alex Hyett - Software Architecture
    • 1. 5 Design Patterns That Are ACTUALLY Used By Developers (184K views, 9 months ago, 9:27)
    • 2. Domain Driven Design: What You Need To Know (95K views, 1 year ago, 8:42)
    • 3. Event-Driven Architecture: Explained in 7 Minutes! (82K views, 1 year ago, 7:18)
    • 4. Hexagonal Architecture: What You Need To Know - Simple Explanation (67K views, 1 year ago, 8:16)
    • 5. Monolithic vs Microservice Architecture: Which To Use and When? (62K views, 1 year ago, 10:43)

Computer science

Computer science (with Python) courses

  • Introduction To Computer Science And Programming In Python
    • edX link
    • OCW MIT link
    • A Dev' Story - Getting the basics (CS Fundamentals)
      • 1. Linear Data Structures in 7 minutes! [Fundamental Data Structures (Part I)] (6.2K views, 3 years ago, 6:43)
      • 2. Non Linear Data Structures in 4 minutes! [Basic Data Structures (Part II)] (2.4K views, 3 years ago, 3:47)
      • 3. Complexity Analysis and Big Oh Notation (1.6K views, 3 years ago, 5:51)
      • 4. Map data structure: How does a Hash Table work? (2.4K views, 3 years ago, 5:19)
      • 5. Complexity Analysis: Typical Growth Rates (Tips) (798 views, 3 years ago, 5:59)
      • 6. How does Merge Sort work? (Quick Explanation) (1.1K views, 3 years ago, 5:43)
      • 7. How does Quicksort work? (in 6 minutes) (4.2K views, 3 years ago, 5:44)
      • 8. Search algorithms: Linear Search, Binary Search, Depth First Search and Breadth First Search (2K views, 3 years ago, 5:53)
      • 9. Search algorithms: Linear Search, Binary Search, Depth First Search and Breadth First Search (2K views, 3 years ago, 5:53)
      • 10. Processes and Threads (Concurrency Basics) (4.7K views, 3 years ago, 5:20)
      • 11. How to avoid Deadlocks with Immutability (2.2K views, 3 years ago, 5:07)
      • 12. Object Oriented Programming Explained in a Nutshell (7.7K views, 3 years ago, 6:19)
      • 13. SOLID Design Principles Explained in a Nutshell (127K views, 3 years ago, 6:14)
      • 14. Object Oriented Design Patterns Explained (18K views, 3 years ago, 6:03)
      • 15. Getting the Basics - Software Architecture Introduction (part 1) (534K views, 2 years ago, 7:48)
      • 16. Scaling Distributed Systems - Software Architecture Introduction (part 2) (124K views, 2 years ago, 6:34)
      • 17. Distributed Cache explained - Software Architecture Introduction (part 3) (58K views, 2 years ago, 4:00)

Design Patterns

Data Structures and Algorithms

General advices about learning Data structures and Algorithms for coding interviews

Fun algorithms

  • polylog - Algorithms

    • 1. The most powerful (and useless) algorithm (123K views, 8 months ago, 14:40)
    • 2. The OPTIMAL algorithm for factoring! (35K views, 8 months ago, 3:04)
    • 3. The hidden beauty of the A* algorithm (656K views, 11 months ago, 19:22)
    • 4. AI cracked this Codeforces problem. Can you? (52K views, 1 year ago, 13:28)
    • 5. The Simplest Sorting Algorithm (You’ve Never Heard Of) (125K views, 1 year ago, 4:18)
    • 6. The trick that solves Rubik’s Cubes and breaks ciphers (2.5M views, 1 year ago, 14:17)
    • 7. How to Use Beads and Strings to Find the Diameter of a Tree (29K views, 2 years ago, 14:42)

Software basics

Software development general advice

Software development basics

  • V. Anton spraul (playlist) - Think Like a Programmer

    V. Anton Spraul is an author and instructor who has taught software development to thousands of people. He has written several books on programming, including "Think Like a Programmer" and "How Software Works". \

    22 videos 271,307 views Last updated on 7 Mar 2018

    • 1. Think Like a Programmer: Introduction (180K views, 10 years ago, 4:33)
    • 2. Puzzles & Programming Problems (Think Like a Programmer) (288K views, 10 years ago, 11:31)
    • 3. The Blank Screen (Think Like a Programmer) (70K views, 10 years ago, 8:00)
    • 4. Recursion (Think Like a Programmer) (153K views, 10 years ago, 10:42)
    • 5. Solving a Programming Contest Problem, Part 1 of 2 (Think Like a Programmer) (49K views, 10 years ago, 9:23)
    • 6. Solving a Programming Contest Problem, Part 2 of 2 (Think Like a Programmer) (24K views, 10 years ago, 8:37)
    • 7. Spreadsheets & Programming (Think Like a Programmer) (19K views, 10 years ago, 11:57)
    • 8. Different Approaches (Think Like a Programmer) (19K views, 9 years ago, 13:55)
    • 9. Planning Your Problem Solving (Think Like a Programmer) (18K views, 9 years ago, 7:16)
    • 10. Tackling a Real-World Problem, Part 1 of 2 (Think Like a Programmer) (19K views, 8 years ago, 4:56)
    • 11. Think Like a Programmer: What It's All About (19K views, 9 years ago, 1:13)
    • 12. Tackling a Real-World Problem, Part 2 of 2 (Think Like a Programmer) (8.5K views, 8 years ago, 8:46)
    • 13. Performance & Efficiency (Think Like a Programmer) (6.1K views, 6 years ago, 13:13)
    • 14. Divide & Conquer (Think Like a Programmer) (31K views, 7 years ago, 15:45)
    • 15. Practical Big-O Notation (Think Like a Programmer) (5.3K views, 6 years ago, 13:00)
    • 16. RUA Programmer? (Think Like a Programmer) (2.6K views, 6 years ago, 9:15)
    • 17. Dynamic Programming (Think Like a Programmer) (67K views, 6 years ago, 14:39)
    • 18. Bottom-Up Programming Solutions (Think Like a Programmer) (15K views, 6 years ago, 13:02)
    • 19. The Peg Puzzle Solved (Think Like a Programmer) (9.1K views, 6 years ago, 15:38)
    • 20. What Is an Algorithm? (21K views, 6 years ago, 7:55)
    • 21. Backtracking (Think Like a Programmer) (299K views, 6 years ago, 13:02)
    • 22. Finding the Best Path (Dijkstra's Algorithm) (12K views, 5 years ago, 17:14)
  • Alex Hyett - Programming for Beginners (playlist)

    This playlist contains videos for beginner programmers who want to get started with software development. I am covering all the basics you need to know before moving on to more advanced topics.

    20 videos 3,643 views Last updated on 21 Sept 2023

    • 1. Backend Developer Roadmap - Everything you need to know in 2023 (101K views, 9 months ago, 6:52)
    • 2. Stack vs Heap Memory - Simple Explanation (82K views, 1 year ago, 5:28)
    • 3. SOLID Principles: Do You Really Understand Them? (46K views, 6 months ago, 7:04)
    • 4. Bitwise Operators and WHY we use them (31K views, 1 year ago, 8:41)
    • 5. 5 Design Patterns That Are ACTUALLY Used By Developers (15K views, 4 months ago, 9:27)
    • 6. 5 Types of Testing Software Every Developer Needs to Know! (13K views, 10 months ago, 6:24)
    • 7. Git Flow vs GitHub Flow: What You Need to Know (11K views, 1 year ago, 6:16)
    • 8. 8 DATA STRUCTURES You NEED to Know (5.6K views, 1 year ago, 10:50)
    • 9. This is a Better Way to Understand Recursion (5.3K views, 8 months ago, 4:03)
    • 10. Top 5 Programming Languages to Learn in 2023 (to Get a Job) (4.4K views, 10 months ago, 5:23)
    • 11. Idempotency - What it is and How to Implement it (3.4K views, 3 months ago, 8:05)
    • 12. Binary Numbers: What Every Developer Should Know (but doesn't) (3.2K views, 1 year ago, 6:58)
    • 13. What is Big O Notation, and Why You Should Care (1.6K views, 1 year ago, 7:30)
    • 14. Bad at MATH? Can you be a Software Developer? (1.3K views, 1 year ago, 4:58)
    • 15. CRUD Operations are Everywhere: DB and REST API Examples (1.2K views, 11 months ago, 4:31)
    • 16. The BEST Programming Language to Learn as a Beginner in 2023 (1K views, 1 year ago, 4:17)
    • 17. 6 Coding Concepts You MUST Know For Beginners (962 views, 1 year ago, 5:31)
    • 18. Finally Understand Regular Expressions - In Just 7 Minutes! (836 views, 1 year ago, 7:26)
    • 19. How I would learn to code in 2023 (if I could start over) (809 views, 1 year ago, 6:00)
    • 20. Why You Struggle to Learn to Code (and How To Fix It) (458 views, 11 months ago, 4:28)

Software development tools (Git, Docker, etc.)

Object Oriented Programming

NOTE: Check out other sections of this README for more resources about OOP.

  • Programming with Mosh - Object Oriented Programming in 7 minutes

  • Keep on Coding - Object Oriented Programming - The Four Pillars of OOP

  • Computer Science - Fundamental Concepts of Object Oriented Programming

  • freeCodeCamp - Steven from NullPointer Exception - Intro to Object Oriented Programming - Crash Course

    NOTE: (My conclusions from this and other videos) \

    Encapsulation

    • the idea of bundling data with methods that can operate on that data within a class.
    • other classes should not directly interact with the data/attributes of another class.
      To access that data getters and setters should be used. Basically we a hiding the data (attributes/fields/private variables) of a class from other classes.

    Abstraction

    • the idea of hiding the complex implementation details of a class and only showing the necessary features of an object. We do this by creating an interface through which classes can interact with one another.

    Inheritance

    • the principle that allows classes to derive from other classes.

    Polymorphism

    • describes methods that are able to take on many forms
    • types of polymorphism:
      • Dynamic or Run-time polymorphism - achieved by method overriding
        • This is when you have a method in a subclass that has the same name and parameters as a method in the superclass.
      • Static or Compile-time polymorphism - achieved by method (and operator) overloading
        • This is when you have multiple methods with the same name but different parameters.
        • (In other words: allows a method to do different things based on the parameters that are passed to it.)
    • Encapsulation - refers to bundling data with methods that can operate on that data within a class. \

      TODO: Check out the chess example from the video.

      Essentially, it is the idea of hiding data within a class, preventing anything outside that class from directly interacting with it (read about setters and getters below).
      This does not mean than members of other classes cannot interact at all with the attributes of another object.
      Members of other classes can interact with the attributes of another object through it's methods.
      Remember, methods are the functions defined within the class.
      In practice, one way this tends to work, is by creating getting and setting methods. These methods act to either get information from an object, or set attributes to different values.

      • Encapsulation - information hiding
        You may also want some attributes to be read-only from the outside:

        • To do this, you would define a getter method but not a setter method.
        • The variable could only be referenced, not changed.

        It is generally best to not allow external classes to directly edit an object's attributes. This is very important when working on large and complex programs. Each piece should not have access to or rely on the inner workings of other sections of code.
        Information hiding, or keeping the data of one class hidden from external classes, helps you keep control of your program and prevent it from becoming too complicated.

      • Encapsulation - overview
        Encapsulation is a vital principle in Object-Oriented Programming.
        Encapsulation:

        • Keeps the programmer in control of access to data
        • Prevents the program from ending up in any strange or unwanted states
    • Abstraction - refers to the process of hiding the complex implementation details of a class and only showing the necessary features of an object.

      TODO: Check out the car example from the video.

      The classes you create should act like your car. Users of your classes should not worry about the inner details of those classes.
      This is similar to encapsulation that was discussed earlier. Classes should not directly interact with other classes' data (with it's data store). Rather, have them use the classes' methods to access their data.
      This idea is very important when working on your program incrementally, where you focus on one class at a time and ensure that it works. This is a very useful approach as it can be difficult for you to focus in the big picture while programming and splitting up your project into smaller chunks can make it much more manageable. Furthermore, programs nowadays are very complex to the point where multiple programmers tend to work on one program/project. In this case, it's best if the section that you work on is able to function without knowledge of the inner workings of your colleague's section.

      • Abstraction - Interface and Implementation
        To achieve the previous, it's best to think of your program in terms of interface and implementation.
        The interface refers to the way sections of code can communicate with one another. This is typically done through methods that each class is able to call/access.
        The implementation refers to the inner workings of the class (how these methods are coded). This is the data and methods that should be hidden (from other classes), within the class.

        TODO: Check out the car + chess examples from the video.

        If classes are entangles, then one change creates a ripple effect that causes many more changes.
        Creating a set interface through which classes can interact with one another, and hiding the implementation details, can prevent this ripple effect so that each (chess) piece can be individually developed.

      • Abstraction - overview
        Abstraction allows the program to be worked on incrementally and prevents it from becoming entangled and complex.
        Determine specific points of contact that can act as an interface between classes, and only worry about the implementation when coding it.

    • Inheritance - is the principle that allows classes to derive from other classes

      TODO: Check out the game example from the video.
      Here is an overview of the example:
      The Weapon class is the base class (also called superclass). It has two attributes: name and damageType. It also has a method attack().
      This class contains methods and attributes that are common to all weapons.

      An example for damageType for a sword could be sharp.
      weapon.damageType = "sharp"
      An example for damageType for a club could be blunt.
      weapon.damageType = "blunt"
      These differences would be represented in different values for their attributes as well as possibly different attributes altogether. However, they would still have the same methods and attributes that are common to all weapons (because they are both members of the Weapons class).

      ---
      title: Inheritance example
      ---
      classDiagram
        class Weapon {
          + name: string
          + damageType: number
          + attack(): void
        }
      
        class Sword {
          + name: string
          + damageType: number
          + attack(): void
        }
      
        class Club {
          + name: string
          + damageType: number
          + attack(): void
        }
      
        Weapon <|-- Sword
        Weapon <|-- Club
      
      
      Loading

      The Weapon is the superclass or base class. The Sword and Club classes are subclasses of the Weapon class. They inherit the attributes and methods of the Weapon class! \

      ---
      title: Inheritance example
      ---
      classDiagram
        class Superclass {
        }
      
        class SubclassX {
        }
      
        class SubclassY {
        }
      
        Superclass <|-- SubclassX
        Superclass <|-- SubclassY
      
      Loading

      Many of the attributes and methods associated with the Weapon class would also be present in the Sword and Club (sub)classes.
      Any given sword or club would require the methods and attributes present in the Weapon class in order to function.
      In most cases the class hierarchy you create will have many more layers with many more (sub)classes in each layer.
      For example the Weapon class may even be a subclass of a broader Items class, which would have many more subclasses of its own etc.

      • Inheritance - access modifiers
        Inheritance also allows you to control access to other classes or attributes and methods of a class.
        You can restrict access to certain attributes and methods to only the subclass or superclass.
        This is done through access modifiers: \
        • Public attributes and methods can be accessed by any class.
          • This is very useful when we want to have access from a wide range of places in our program.
        • Private attributes and methods can only be accessed by the class they are defined in.
          • This is best to us if we don't need this information accessed from else in the program. Additionally this allows us to create other private members of the same name in separate classes, which would not conflict with one another due to their private access modifier.
        • Protected attributes and methods can be accessed by the class they are defined in and any subclasses of that class.
          • Essentially protected variables are private to the class hierarchy that they are defined in.
    • Polymorphism - describes methods that are able to take on many forms There are two types of polymorphism:

      • Dynamic polymorphism

        • occurs during the runtime of the program, when the programs is being executed.
        • this type of polymorphism describes when a method signature is in both a subclass and a superclass.
          The methods share the same name and parameters, but the implementations are different in each class.
          The implementation in the subclass overrides the implementation in the superclass.
        • in other words, polymorphism allows a method to do different things based on the object that it is called on (because different objects will have different implementations of the method).

          TODO: Check the "car" example from the video. Here is an overview of the example: \

        ---
        title: Polymorphism example; different types of cars in class hierarchy
        ---
        classDiagram
          class Car {
            + drive(miles: number): void
          }
        
          class SportsCar {
            + drive(miles: number): void
          }
        
          Car <|-- SportsCar
        
        
        Loading

        In the Car class, we might have an attribute gas where {Car.gas -= 0.04 * miles} because the .drive() method may cause the car's gas to decrease by 0.04 gallons per mile.
        On the other side in the SportsCar class, we might have an attribute gas where {SportsCar.gas -= 0.02 * miles} because the .drive() method may cause the car's gas to decrease by 0.02 gallons per mile.
        So, if we create an instance of a sports car named mySportsCar, and call the .drive() method on it, the SportsCar class's implementation of the .drive() method will override the generic Car version of the .drive(). That will cause the gas to decrease by 0.02 gallons per mile.

        This works because the form of the method is decided based on where in the class hierarchy it is called.

        The implementation of a method signature that will be used is determined dynamically as the program is run.

      • Static polymorphism

        • occurs during the compile time of the program, when the program is being compiled rather than during runtime.
        • refers to when multiple methods with the same name but different arguments(!) are defined in the same(!) class.
        • in this case, the methods are differentiated by
          • the number of arguments that they take
          • the type of arguments that they take
          • the order of the arguments
        • This is known as method overloading.

        TODO: Check the "car" example from the video. Here is an overview of the example: \

        ---
        title: Static polymorphism example; different types of cars in class hierarchy
        ---
        classDiagram
          class Car {
            + drive(speed: number, destination: string): void
            + drive(speed: number, distance: number): void
            + drive(destination: string, speed: number): void
          }
        
        
        Loading

        Method signatures in the previous example are different because they have different number of arguments, types of arguments and order of arguments therefore the computer is being able to differentiate between them when the program is being compiled.

        The implementation of a method signature that will be used is determined statically as the program is compiled.

        For example, if we do the myCar.drive(100, "New York") the first method will be called. If we do myCar.drive("New York", 100) the third method will be called.

  • freeCodeCamp Talks - Object Oriented Programming is not what I thought - Talk by Anjana Vakil

  • (text) People Don't Understand OOP

Code quality

Databases

  • Studytonight with Abhishek (playlist) - Database Normalization - 1NF, 2NF, 3NF, BCNF, 4NF and 5NF
    • 1. Basic Concept of Database Normalization - Simple Explanation for Beginners (1.6M views, 5 years ago, 8:11)
    • 2. First Normal Form (1NF) | Database Normalization | DBMS (1M views, 5 years ago, 3:42)
    • 3. Second Normal Form (2NF) | Database Normalization | DBMS (1M views, 5 years ago, 7:13)
    • 4. Third Normal Form (3NF) | Database Normalization | DBMS (878K views, 5 years ago, 4:16)
    • 5. Boyce-Codd Normal Form (BCNF) | Database Normalization | DBMS (655K views, 5 years ago, 4:42)
    • 6. 4th Normal Form (4NF) | Multi-Valued Dependency | Database Normalization (431K views, 5 years ago, 4:51)
    • 7. 5th Normal Form (5NF) | Join Dependency | Database Normalization (210K views, 4 years ago, 8:09)
    • 8. Concept of Keys in DBMS - Super, Primary, Candidate, Foreign Key, etc (451K views, 3 years ago, 9:16)
    • 9. How to Design DB Tables for any Application? (The Basics) (49K views, 3 years ago, 9:29)
    • 10. RDBMS vs NoSQL Databases Explained! (12K views, 2 years ago, 13:35)
    • 11. What is Database Transaction? | Transactions in Database | DB Transactions with Examples #dbms (8.3K views, 1 year ago, 8:29)
    • 12. When to use Database Transactions? #dbms #dbmstutorials (309 views, 4 weeks ago, 13:26)
    • https://www.studytonight.com/dbms/
  • LaraconEU - Things every developer absolutely, positively needs to know about database indexing - Kai Sassnowski

Compilers

  • Pixeled - Creating a Compiler
    • 1. Let's Create a Compiler (Pt.1) 309K views, 4 months ago, 1:11:03)
    • 2. Growing a Parse Tree (Compiler Pt.2) 48K views, 4 months ago, 1:05:48)
    • 3. Variables in Assembly (Compiler Pt.3) 28K views, 4 months ago, 1:29:28)
    • 4. Adding adding to my language (Compiler Pt.4) 17K views, 4 months ago, 1:12:18)
    • 5. Multiplication Superiority (Compiler Pt.5) 11K views, 3 months ago, 1:12:28)
    • 6. If and Scopes! (Compiler Pt.6) 12K views, 3 months ago, 1:09:45)
    • 7. Comments and Else! (Compiler Pt.7) 1.9K views, 2 days ago, 1:25:47)

Assembly

General

Tutorials

Projects

Reverse engineering

How the Internet Works

PROGRAMMING PROBLEMS AND SOLUTIONS

  • Tech With Tim - Programming Problems & Solutions
    • 1. Programming Problem #1 - Alphabet Soup (Beginner/Novice) (12K views, 5 years ago, 14:48)
    • 2. Programming Problem #2 - Magic Squares (Novice/Intermediate) (13K views, 5 years ago, 15:07)
    • 3. Programming Problem #3 - Geneva Confection (Intermidiate) (2.7K views, 5 years ago, 16:40)
    • 4. Programming Problem #4 - A Set of Beginner Coding Problems & Solutions (4.9K views, 4 years ago, 14:54)
    • 5. Programming Problem #5 - String Compression/Encryption (Intermediate) (2.1K views, 4 years ago, 13:53)
    • 6. Programming Problem #6 - Maze Traversal (Advanced) (3.5K views, 4 years ago, 20:59)
    • 7. Programming Problem #7 - Tandem Bicycle (Intermediate) (2.6K views, 4 years ago, 11:41)
    • 8. Programming Problem #8 - Tree Data Structure Traversal (2.7K views, 4 years ago, 22:50)
    • 9. Programming Problem #9 - Tower of Hanoi (16K views, 4 years ago, 15:28)
    • 10. Coding Interview Question & Solution (Python) - Water Trapped Between Pipes (7.9K views, 4 years ago, 13:18)
    • 11. Python Coding Interview Preparation - For Beginners (54K views, 4 years ago, 14:23)
    • 12. Python Coding Interview Practice - Difficulty: Hard (124K views, 4 years ago, 22:05)

PROJECT IDEAS

  • Wojtek Dzierzkowski - 6 Programming Projects to Land a Job
    • First 3 projects (learning the core language features and basic syntax to solve simple problems)
      • These projects are for you to learn
        • Basic syntax
        • Control flow statements
        • Basic data structures
        • Solving simple problems
      • Requirements
        • Use only a programming language. No libraries / no frameworks!
        • Less than 5 classes or less then 250 lines of code. Try to keep it simple.
        • Solve 1 problem.
        • For backend languages - don't create a UI! It's a waste of time! Use console.
      • Project ideas
        • Random name generator
        • Duplicate text checker
        • Password generator
    • Next 2 projects (to learn to use just one(!) framework, how to simplify things and let us solve problems easaly)
      • These projects are for you to learn
        • How to use the framework
        • Framework features
        • To use framework the way it was intended to be used
      • Requirements
        • Use the choosen framework (only one!)
        • Less than 10 classes or less then 500 lines of code. Try to keep it simple.
        • Solve 1 major problem and many minor problems.
        • For backend languages - don't create a UI! It's a waste of time! Use API.
        • Add Unit tests.
      • Project ideas
        • Finance tracker
        • Event registration system
    • Final project
      • This project is for you to learn
        • To use framework the way it was intended to be used.
        • To integrate multiple pieces.
        • To provide solution to real world problem.
      • Requirements
        • Use the choosen framework (only one!) + add a Database.
        • Use external APIs
        • More than 10 classes and more than 500 lines of code.
        • Solve multiple major problems
        • For backend languages - create an API - but don't create a UI! It's a waste of time! Use API.
        • Add Unit and Integration tests.
      • Project ideas
        • Blog API
        • Library API
        • Authentication system API (more technical)
  • Austin Z. Henley - Challenging projects every programmer should try
  • Austin Z. Henley - More challenging projects every programmer should try
    • Ray tracer
    • Key-value store web API
    • Web browser
    • Stock trading bot
  • Austin Z. Henley - Challenging algorithms and data structures every programmer should try
    • Topological sort
    • Recursive descent parsing
    • Myers string difference
    • Bloom filter
    • Piece table
    • Splay tree
  • The Coding Sloth - 20 Programming Projects That Will Make You A God At Coding
  • Nand2Tetris [HARD but VERY INTERESTING]

Mathematics for programmers

Coding interviews

Sites for learning programming

Sites for practicing coding (DA, DS, coding interviews)

YouTube channels

Curriculums

Other people's curriculums

Other

Haskell