Computer science is a vast subject that covers an array of topics, including databases, computer networks, programming languages, and more. If you're a student or software engineer studying computer science, it's essential to have a good grasp of these fundamental principles, as they form the backbone of modern computer systems.

Computer science offers a plethora of opportunities and applications, thanks to our ever-increasing reliance on technology in our daily lives. Whether you're interested in developing the next big software program, designing AI systems, or improving computer hardware performance, a foundation in computer science fundamentals can lead to a fulfilling and meaningful career.

#### Basic concepts include:

#### A.1. Data Structures

#### A.2. Algorithms

#### A.3. Object-Oriented Design

#### A.4. Time and Space Complexity

#### A.5. Computational Complexity Theory

#### A.6. Networking

#### A.7. Database

#### A.8. Operating System

#### A.9. Computer Architecture

#### A.10. Encryption

#### A.11. Design Pattern

##### A.1. 📊 Data Structures

Data structures are used to store and organize data in a way that makes it easy to access, modify, and manipulate. Choosing the right data structure for a particular problem is crucial because different data structures work better for different tasks. For example, a linked list might be great for inserting and deleting items, while a hash table is ideal for quickly looking up values.

🔴 **Review:** common data structures, such as arrays, linked lists, stacks, queues, trees, and graphs. Understand their performance characteristics and how they can be used to solve various types of problems.

📘 **Additional Reading:** “Data Structures and Algorithms” in Python by Michael T. Goodrich: This book provides a thorough treatment of data structures and algorithms in Python, and includes a wide range of examples and exercises

##### A.2. ⚙️ Algorithms

An algorithm is like a set of instructions that a computer follows to solve a problem or complete a task. They are an essential part of computer science, and they are used for a wide range of tasks like sorting data, searching for specific information, and pattern matching. The study of algorithms is crucial in computer science, and it includes designing, analyzing, implementing, and evaluating algorithms.

🔴 **Review:** common algorithms, such as sorting algorithms (e.g. bubble sort, merge sort, quick sort) and search algorithms (e.g. linear search, binary search).

📘 **Additional Reading:** “The Algorithm Design Manual” by Steven S. Skiena: This book provides a practical approach to the design and analysis of algorithms, and includes a wide range of examples and exercises.

##### A.3. 🎲 Object-Oriented Design

This design paradigm focuses on representing real-world objects and their interactions through software objects. This helps to simulate how the system would behave in the real world. OOD is widely used in modern software development, especially for complex systems and programs. It promotes good software design practices, making it easier to produce clean, maintainable, and scalable code. In fact, the fundamentals of OOD are extensively covered in computer science courses and are an essential requirement for any software engineer.

🔴 **Review:** concepts such as inheritance, polymorphism, and encapsulation, and how they can be used to design object-oriented systems.

📘 **Additional Reading:** Gamma, Richard Helm, Ralph Johnson, and John Vlissides: This book, also known as the "Gang of Four" book, is a classic resource on object-oriented design patterns and is widely considered a must-read for anyone interested in the subject.

📒 More on Object-Oriented Design

##### A.4. ⌛Time and Space Complexity

Time complexity and space complexity are two important concepts in computer science that refer to how efficient an algorithm is. Time complexity is a measure of how long an algorithm takes to run in relation to the size of the input it receives. Essentially, it measures how much time an algorithm needs to process data.

On the other hand, space complexity refers to the amount of memory (space) an algorithm needs to complete a task, based on the size of the input. This means that as the input size increases, so does the amount of memory the algorithm needs to operate. Understanding these concepts is crucial for software engineers to be able to create efficient and scalable software systems that can handle large amounts of data without crashing.

🔴 **Review:** time complexity, space complexity, time and space trade-offs, complexity analysis and performance optimization.

📘 **Additional Reading:** "Introduction to Algorithms" by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein - This book is widely considered the standard reference for algorithms and data structures. It provides a comprehensive introduction to time and space complexity and covers a wide range of algorithms and data structures.

📒 More on Time & Space Complexity

##### A.5. ⌨️ Computational Complexity Theory

It's a subfield of theoretical computer science that studies the resources required to solve computational problems and the difficulties that come with them. The main goals of computational complexity theory are to understand what makes a problem hard to solve and to categorize problems based on their difficulty. This field has a huge impact on the development of algorithms for real-world problems and on the design and analysis of algorithms. It also provides a way to understand the limitations of what computers can compute and the constraints of computational power.

🔴 **Review:** P, NP, & NP-hard problems, computational models, reductions, approximation algorithm, NP completeness, probabilistic algorithms

📘 **Additional Readings:** "Introduction to the Theory of Computation" by Michael Sipser: This is a classic textbook that provides a comprehensive introduction to the theory of computation and its applications in computer science. It covers topics such as finite automata, regular expressions, context-free grammars, pushdown automata, Turing machines, complexity theory, and NP-completeness.

📒 More on Computational Complexity Theory

##### A.6. 📡 Networking

Networking is all about connecting hardware, like servers, phones, and computers, so they can share data and resources. This can include files, printers, and internet access. There are different technologies you can use to connect networks, like wired connections such as Ethernet, or wireless connections such as Wi-Fi. The type of network and technology used will depend on the specific requirements and limitations of the network.

🔴 **Review:** basic networking concepts, such as protocols, IP addresses, and HTTP.

📘 **Additional Reading:** “Data and Computer Communications” by William Stallings: This book provides a comprehensive introduction to networks.

##### A.7. 📈 Database

Database is basically a collection of organized data that's super easy to access and work with. For instance, if you've ever made a purchase online, that site probably has a database that stores all of your order details. Databases are also used in finance, customer relationship management systems, and tons of other applications.

But, managing all of this data can be a bit tricky, which is where a database management system (DBMS) comes in. A DBMS is responsible for handling everything from creating and updating the database to searching and retrieving data. Depending on the specific needs of an application, different types of databases and DBMSs can be used.

🔴 **Review:** common data structures, such as arrays, linked lists, stacks, queues, trees, and graphs. Understand their performance characteristics and how they can be used to solve various types of problems.

📘 **Additional Reading:** “Data Structures and Algorithms in Python” by Michael T. Goodrich: This book provides a thorough treatment of data structures and algorithms in Python, and includes a wide range of examples and exercises

##### A.8. 🛠️ Operating Systems

Operating systems is the software that powers your computer and makes it all run smoothly! It's like the boss of the computer, controlling all the underlying hardware resources and making sure that your software applications can run seamlessly.

Some of the cool services that the OS provides include managing your computer's memory, running different processes, and handling input/output operations. Without the OS, your computer would just be a fancy paperweight!

🔴 **Review:** fundamental concepts of operating systems, such as processes, threads, and concurrency.

📘 **Additional Reading:** “Modern Operating Systems” by Andrew S. Tanenbaum: This book provides a comprehensive introduction to operating systems that is taught in school.

##### A.9. 🖥️ Computer Architecture

Computer architecture is all about how the different parts of a computer fit together, including the hardware and software components. This includes how data is processed, stored, and communicated between different parts of the computer.

The architecture of a computer system can have a huge impact on how well it performs and how user-friendly it is. Factors like speed, power usage, cost, and scalability all depend on the design choices made for the computer's architecture.

For computer engineers, software developers, and system administrators, having a good understanding of computer architecture is crucial for designing, building, and managing computer systems that meet the needs of their users.

🔴 **Review: **basic computer architecture concepts, such as memory hierarchy and pipelining.

📘 **Additional Reading:** “Computer Architecture: A Quantitative Approach” by John L. Hennessy and David A. Patterson: This book provides a more advanced breakdown of computer architecture.

📒 More on Computer Architecture

##### A.10. 🖨️ Encryption

Basically, encryption turns your sensitive data into a code that only someone with the right key or password can unlock. This is why you have to enter a password to access your email, social media, or bank account, for example.

Cryptography is the science behind encryption and decryption. It involves creating and breaking codes to keep digital information safe from prying eyes. Encryption is especially important for protecting sensitive data like credit card details, private company information, and passwords. Even if hackers or cybercriminals manage to steal the data, they won't be able to read it without the right decryption key.

🔴 **Review:** cryptographic algorithms, key management, PKI, encryption mode, attacks on encryption, security standards, and, cryptographic protocol

📘 **Additional Reading:** "Cryptography Engineering: Design Principles and Practical Applications" by Niels Ferguson, Bruce Schneier, and Tadayoshi Kohno.

##### A.11. 🔁 Design Pattern

These patterns are like a set of blueprints for designing software systems that have been tested and proven to be effective. Design patterns are used in various settings, like object-oriented design, system architecture, and even database design. And the best part is, they're not specific to any programming language. So, no matter what programming language you're using, you can apply design patterns to solve software design problems.

🔴 **Review:** common design patterns, such as factory, observer, and singleton, and understand when to use them in your design.

📘 **Additional Reading:** "Design Patterns: Elements of Reusable Object-Oriented Software" by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides is widely considered as one of the classic and must-read books for software developers interested in learning about design patterns. The book provides a comprehensive overview of various design patterns and how they can be applied in software development, making it a valuable resource for those who want to improve their design skills and write more efficient, maintainable, and reusable code.