SelfLearning ComputerScience
SelfLearning ComputerScience
ou
ge
N
eu
ro
n
Ac
ad
em
y
Preface 4
Mathematics 6
Action Items 6
References 6
Topics to explore using ChatGPT/Gemini 8
Algorithms and Data Structures 10
y
Action items: 11
References 11
em
Topics to explore using ChatGPT/Gemini 12
Data Structures 12
Algorithms 14
ad
Computer Architecture 16
Action items 16
References 17
Topics to explore using ChatGPT/Gemini
Operating Systems
Fundamentals
Ac 18
20
20
n
Distros (Distribution) 20
Action Items 20
ro
References 21
Topics to explore using ChatGPT/Gemini 22
eu
Programming Language 24
Action items 24
References 25
N
Action items 29
References 29
Topics to explore using ChatGPT/Gemini 30
ou
Networking 32
Action Items 32
R
References 33
Topics to explore using ChatGPT/Gemini 33
Databases 36
Action items 36
References 37
Topics to explore using ChatGPT/Gemini 37
Compiler Design 40
System Administration 40
y
General Programming and Design patterns 50
em
Action Items 50
References 50
Topics to explore using ChatGPT/Gemini 51
ad
Software Engineering 54
Actions items 54
References 54
Ac
Topics to explore using ChatGPT/Gemini 55
Security 58
Action items 58
References 58
n
Topics to explore using ChatGPT/Gemini 59
ro
eu
N
ge
ou
R
Software engineering has evolved beyond coding. Therefore, a long-lasting software career
demands more than the aspirants' programming skills. Moreover, with the increasing supply of
engineers, the bar for quality is dropping. So, the recruiters hire for the short term, and the
recruited stay for an even shorter time.
y
The market-dictated learning leads to a decaying career from the early stages. A decade-long
em
career cannot pay off a loan with a tenure of 30 years. As a result, most advice about software
engineering targets the top 10% of organizations that hire primarily from the computer science
departments of the top-ranked university graduate pools.
ad
What about the rest?
As one of the rest, I present this collection of resources that have helped me build a decent
The references are for readers interested in scaling their careers. Getting a promotion or higher
salary is a short-term goal with short-term rewards. A 10x growth is only possible with mastery
n
of fundamentals.
ro
Fundamentals change slowly. The steady rate of change allows books to be relevant for
decades. The trends and applications using fundamental technologies are being replaced
rapidly. Spotting the fundamentals powering the trends is a sure-shot way of growing in the
eu
industry.
N
One must understand the difference between using, maintaining, and building technology. Each
demands a different degree of expertise. For example, using Spark to write tasks, maintaining a
ge
Spark cluster with a thousand nodes, and adding a new operator in Spark are very different
skills. In a startup, an engineer might try to do it all at once, but doing it well is what brings in the
revenue. And the success rate of startups describes the result of hyper-multitasking without a
ou
Reading the right book makes one wise; reading it at the right time can help you increase your
R
market price!
As a student who has yet to start working full-time, this book is a peek into the depth of
knowledge they need to acquire to build a sustainable career in technology. Buy a book only
after you have exhausted the free online resources and are sure about the investment. Don’t
spend for the sake of being cool!
As an individual contributor, you may extend the lists to your friends and colleagues to build a
y
book club. The topics are too vast to cover alone.
em
As a manager, suggesting books to your mentees is a great way to add value to their careers.
For books like “Art of Computer Programming,” one needs a group to discuss and solve the
problems. Build a culture of learning. You may think about gifting books as rewards for smaller
amounts.
ad
YouTube channels where you should search for courses first
y
Don’t confuse mathematics with being theoretical and using expressions with Greek letters.
em
Being analytical in decision-making relies on mathematics, primarily statistics. The probability
theory is a handy tool in your skill set—capacity planning demands estimations based on
probability. For example, you cannot over-provision a system in the cloud in March, anticipating
the black Friday traffic, nor can you wait till the last moment. The auto scalers aren’t magic.
ad
They work with trends. Trends can be misleading, and identifying such patterns needs statistics.
Action Items
Ac
1. Identify the necessary mathematics for the next five years of your career.
2. Invest in learning the mathematics necessary for programmers. Books and blog posts
n
answering this question are available, but books are better from a completeness
ro
perspective.
3. Learn to express ideas regarding mathematical relations – ideally using the appropriate
symbols.
eu
4. Think in structured quantifiable steps. Focus on prerequisites for Algorithms and data
structures first.
5. Learn essential statistical functions in Excel. Of course, other processing and
N
visualization tools will do as well. But knowing at least one is the goal.
ge
References
ou
y
Understanding the matrix transformations used in the Deep Learning theory is helpful.
It will look familiar to readers with an electrical engineering background.
em
Linear Algebra and its Applications by Gilbert Strang
Understanding the matrix transformations used in the Deep Learning theory is helpful.
It will look familiar to readers with an electrical background.
ad
Probability - Random Variables and Stochastic Processes by Athanasios Papoulis and S
Pillai
Ac
The book presents stochastics 101 – a building block for estimation and detection theory.
This book is an excellent guide to quickly picking the necessary mathematics to answer
interview-related computer science questions.
It is limited in scope by design.
ou
2. Variables and Expressions: Understand how variables store values and how expressions
combine them using operators.
y
3. Order of Operations (PEMDAS): Learn PEMDAS (Parentheses, Exponents, Multiplication,
em
Division from left to right, Addition and Subtraction from left to right) for accurate calculations.
4. Basic Algebra: Grasp solving linear equations for unknowns, which is crucial in programming
logic.
ad
5. Inequalities: Be comfortable working with inequalities (>, <, >=, <=) to define conditions in
programs.
Ac
6. Coordinate Systems: Work with 2D (x,y) and 3D (x,y,z) coordinate systems for representing
positions in graphics or game development.
n
7. Logic and Sets: Understand basic logic concepts (AND, OR, NOT) and set theory (union,
intersection) for making decisions in programs.
ro
9. Functions and Graphs: Grasp the concept of functions (mapping inputs to outputs) and how
to visualize them with graphs.
N
10. Lists and Arrays: Understand how to store and manipulate ordered collections of data
ge
11. Matrices: Explore matrices for representing and manipulating data in a structured way
ou
12. Loops: Learn about for loops and while loops for repetitive tasks in programs.
R
13. Iteration: Grasp the concept of iteration, which is the repeated execution of a block of code.
14. Recursion: Understand recursion, a problem-solving technique where a function calls itself.
15. Conditional Statements: Master if-else statements for making decisions based on
conditions.
16. Big O Notation: Get familiar with Big O notation, a way to analyze algorithm efficiency.
18. Space Complexity: Learn how algorithms use memory based on input size.
19. Number Systems: Be comfortable with different number systems like binary (used by
computers) and hexadecimal (used in computer memory).
20. Bits and Bytes: Understand the concept of bits (0s and 1s) and bytes (collections of bits)
as the building blocks of computer data.
y
21. Data Types: Learn about different data types (integers, floats, booleans, strings) used in
em
programming languages.
22. Basic Statistics: Grasp concepts like mean, median, and mode for summarizing data sets
(useful for data analysis).
ad
23. Linear Algebra Basics: Explore basic linear algebra concepts like vectors and matrices for
solving systems of equations and geometric transformations (useful in graphics).
25. Discrete Mathematics: Get introduced to discrete mathematics, a branch that deals with
n
objects that can be counted (useful for algorithms and data structures).
ro
Remember, ChatGPT can provide basic explanations for these concepts. For a deeper
understanding, explore online resources, textbooks, or programming tutorials that delve into the
eu
It sounds cliched, but data structures and algorithms constitute computer science fundamentals.
Learning data structures through programming makes the language a primary objective. This
reversed priority is one of the biggest challenges for non-computer science students starting
y
careers in the software industry.
em
The fundamentals of data structures and algorithms are mathematical. Therefore, complexity
analysis and mathematical induction should be mandatory prerequisites. The interview-oriented
introduction to the subject leaves a knowledge gap. The complexity analysis presents a
ad
theoretical limit. The performance is data-driven, and inefficient data structures require more
hardware resources. For example, a bubble of 10 elements in an array performs much faster
than a lookup in a map data structure!
Ac
Counting iterations of “for loops” is generalized as a complexity analysis of algorithms. The
method proves to be sufficient in most interview preparations. Still, it fails in production when the
variable nature of data leads to inconsistent performance measurements. Most data processing
n
in programs uses data structures, be it message bodies, instructions, service requests, or any
ro
other form of unstructured data. Data structure design dictates the storage requirements in
memory. Two separate problems are understanding the need for a data structure and then using
a language to execute it. Serialization of data structures is one of the critical areas of
eu
Algorithms are the execution engines of programs. In simpler words, abstracting any repeatable
tasks becomes an algorithm. Searching and sorting dominate the application-level algorithms.
ge
The computationally heavy matrix mathematical algorithms are often abstracted into frameworks
and libraries. Hence, in general, reading data and performing data cleansing remains within the
scope of most developers. The master theorem dictates the operations complexities of
ou
algorithms. Master theorem proof is only taught in algorithm courses and has a prerequisite of
discrete mathematics. Algorithms are functional and consume data structures to communicate
with the rest of the program body.
R
So, someone looking for a long career in the software industry as a developer must understand
the relationship between mathematics, algorithms, and data structures. For example, the time
complexity is the mathematical analysis, and the space complexity is much closer to runtime!
The NP-completeness analysis is another advanced topic most programmers should
Action items:
Understand the basics; don’t get caught in details. Then, revisit once a couple of months till it
becomes obvious.
1. Number theory: Prime numbers, arithmetic, geometric progressions, etc.
y
2. Permutations and combinations
3. Basic mathematical induction
em
4. Set theory
5. Master Theorem: https://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms)
6. NP Completeness:https://en.wikipedia.org/wiki/NP-completeness
ad
References
Ac
Algorithms + Data Structures = Programs by Niklaus Wirth
Focuses on the fundamental aspect of programming, i.e., the relationship between data
n
structures and algorithms
Examples are in Pascal. Anyone familiar with at least one programming language can
ro
Data Structures and Algorithm Analysis in C and CPP by Mark Allen Weiss
The book is programmer-friendly. It doesn’t delve deep into mathematics.
Lots of code and assignments.
N
the series. Working through all the volumes at least once is a bucket list item for me!
y
em
Data Structures
Fundamental Concepts:
ad
1. Data Structures: Understand what data structures are and how they organize and store
data efficiently.
2. Abstract Data Types (ADTs): Learn about ADTs, which define a set of operations
without specifying implementation details.
Ac
3. Time vs. Space Complexity: Grasp the trade-off between time complexity (execution
speed) and space complexity (memory usage) when choosing data structures.
n
Basic Building Blocks:
ro
4. Variables and Data Types: Understand how variables store data of specific types
(integers, strings, booleans) relevant to data structures.
eu
undo/redo functionality.
8. Queues: Understand queues, FIFO (First-In-First-Out) structures used for task
scheduling or message passing.
ou
Intermediate Concepts:
R
9. Trees: Grasp the concept of trees, hierarchical data structures with a root node and child
nodes.
10. Binary Trees: Explore binary trees, special trees where each node has at most two
children (useful for searching and sorting).
11. Hash Tables: Learn about hash tables, efficient data structures for key-value pair lookup
based on hashing algorithms.
12. Heaps: Understand heaps, specialized tree-based structures used for implementing
priority queues.
14. Tries: Briefly introduce tries and specialized tree structures for efficient string searching
and prefix matching.
15. B-Trees and B+ Trees: Briefly explain B-Trees and B+ Trees, optimized tree structures
for large datasets used in databases.
16. AVL Trees and Red-Black Trees: Briefly mention AVL Trees and Red-Black Trees and
y
self-balancing binary search trees for guaranteed performance.
em
17. Skip Lists: Briefly introduce skip lists, probabilistic data structures offering faster search
than regular linked lists.
18. Bloom Filters: Briefly explain Bloom filters space-efficient data structures for checking if
an element might exist in a set.
ad
Applications and Problem-Solving:
Ac
19. Choosing the Right Data Structure: Learn how to select the most appropriate data
structure based on the problem you're trying to solve.
20. Searching and Sorting: Understand how data structures facilitate efficient searching
(finding elements) and sorting (organizing elements).
n
21. Algorithms and Data Structures: Explore how data structures play a crucial role in
implementing algorithms.
ro
23. Performance Analysis: Learn how to analyze the performance of data structures using
Big O Notation.
ge
Using AI ChatBots, you can ask detailed questions about each concept, get code examples for
implementing basic data structures in various programming languages, and even walk through
R
ChatBots can't directly execute code but can guide you through the logic and provide
explanations. To practice code implementation, refer to online coding platforms or tutorials in
your chosen programming language.
y
(pseudocode) before coding.
4. Algorithmic Thinking: Develop algorithmic thinking, designing solutions using
em
step-by-step instructions.
Fundamental Algorithms:
ad
5. Searching Algorithms: Master linear search, binary search, and their applications for
finding elements in data.
6. Sorting Algorithms: Explore sorting algorithms like selection, bubble, and insertion sort
Ac
and understand their time and space complexities.
7. Recursion: Deepen your understanding of recursion and its applications in algorithms
like divide-and-conquer.
8. Brute-Force vs. Efficient Algorithms: Learn to distinguish between brute-force
n
approaches and efficient algorithms.
ro
9. Conditional Statements: This section covers master if-else statements and switch
statements and their role in controlling program flow based on conditions.
10. Loops: Become proficient in using and while loops for repeated execution of code
N
blocks.
11. Iteration: Solidify the concept of iteration, which is the repeated execution of
ge
instructions.
Algorithmic Analysis:
ou
12. Time Complexity: Learn to analyze algorithms’ time complexity (execution speed) using
Big O Notation.
R
13. Space Complexity: Learn how to analyze algorithms’ space complexity (memory
usage) using Big O Notation.
14. Trade-offs: Grasp the trade-offs between time and space complexity when choosing
algorithms.
y
Searching & Sorting (More Advanced):
em
18. Merge Sort: Briefly explain merge sort, a divide-and-conquer sorting algorithm with a
time complexity of O(n log n).
19. Quick Sort: Briefly introduce fast sort, another efficient divide-and-conquer sorting
ad
algorithm with an average time complexity of O(n log n).
20. Hashing Algorithms: Briefly explore hashing algorithms used for efficient key-value pair
lookup in hash tables.
Algorithmic Paradigms:
Ac
21. Divide-and-Conquer: Understand the divide-and-conquer paradigm for solving
n
problems by recursively breaking them into smaller subproblems.
22. Brute-Force Search: Learn about brute-force search, a basic but inefficient approach
ro
problems.
24. Algorithm Animation: Explore using algorithm animation tools to visualize how
ge
Using AI ChatBots, you can ask in-depth questions about each concept, get explanations
tailored for beginners, and see code examples (without direct execution) for some core
algorithms. Using online platforms or tutorials, you can also practice implementing them in your
R
All programs execute on hardware or microcontrollers. Pseudo code is a tool for discussion.
Actual software becomes useful only once it runs. Higher-level languages abstract most
application developers away from the machine.
Hardware has its evolution journey. The software has to keep up with the changes. For
y
example, recent multicore systems changes demand a paradigm shift from concurrent to
em
parallel programming. Have you ever wondered why the integer size is 4 bytes? Could it have
been two as well?
Knowledge about instruction sets and clocks is crucial to performance engineering. The
ad
execution time of any program is the duration of running machine instructions.
Computer architecture is not limited only to assembly instructions. The arrangement of caches,
data exchange speed between cores, disk interactions, power consumption, and many other
Ac
factors become relevant to programs running on different architectures.
Before diving deeper into other architectures, one must understand the hardware they are
working on. Coincidentally, programmers from electronics backgrounds can appreciate this
subject better due to a massive overlap in curriculums around these topics.
n
Toolchain setups will vary with hardware. Cross-compilation will become part of the process and
ro
Knowledge of computer architecture will save you from pitfalls like assuming the performance of
eu
a microbenchmark on your laptop will hold on a cloud instance. Data Science frameworks are
known to be sensitive to hardware performance when working at scale. Crunching terabytes of
data on a CPU vs. GPU data is an interesting problem statement.
N
ge
Action items
1. Explore the three mainstream processor architectures
ou
https://www.cs.utexas.edu/~lin/cs380p/Free_Lunch.pdf
https://www.youtube.com/watch?v=oV9rvDllKEg
https://en.wikipedia.org/wiki/Cache_coherence
https://en.wikipedia.org/wiki/Instruction_set_architecture
https://en.wikipedia.org/wiki/Reduced_instruction_set_computer
References
Computer Architecture: A Quantitative Approach by John L. Hennessy
It is organized and rich with examples.
Covers standard topics recommended in university courses.
y
Computer Organization and Design: The Hardware/Software Interface by David A.
Patterson, John L. Hennessy
em
Part of The Morgan Kaufmann Series in Computer Architecture and Design
It delves deep into the subject and provides an efficient perspective.
ad
Computer System Architecture by M. Morris Mano
The book is a recommended text for many university courses.
It covers all the commonly discussed topics in great detail.
More hardware-oriented text. The book doesn’t click unless one has some background in
electronics and circuit design.
eu
circuit design.
ge
peripheral device interfacing. It is a good starting point before delving into device driver
programming.
R
1. Central Processing Unit (CPU): Grasp the role of the CPU as the brain of the
computer, responsible for processing instructions.
2. Memory (RAM): Understand Random Access Memory (RAM) as the temporary storage
for programs and data being actively used.
3. Storage Devices (HDD/SSD): Learn about permanent storage devices like Hard Disk
y
Drives (HDD) and Solid State Drives (SSD) for long-term data persistence.
4. Input/Output (I/O): Explore Input/Output devices (keyboard, mouse, monitor) for user
em
interaction and data exchange with external components.
5. Instruction Set Architecture (ISA): Understand the ISA, a set of instructions the CPU
understands to perform operations.
ad
Processing and Execution:
6. Machine Code vs. Assembly Language: Learn the distinction between machine code
machine code).
Ac
(understood by the CPU) and assembly language (human-readable instructions close to
Memory Management:
N
10. Address Space and Memory Hierarchy: Learn about address space (memory
locations) and the memory hierarchy (registers, cache, RAM, storage) with varying
ge
12. Memory Access and Caching: Understand how caching (storing frequently used data
closer to the CPU) improves memory access speed.
R
Data Representation:
13. Number Systems: Grasp binary (base-2) number system, the foundation for
representing data in computers.
14. Data Types: Understand how data types like integers, floating-point numbers, and
characters are represented in memory.
15. Boolean Logic: Learn about Boolean logic (TRUE/FALSE) and its use in representing
data and performing operations.
16. Motherboard: Explore the motherboard as the central circuit board connecting all
computer components.
17. Buses: Understand buses as pathways for data transfer between various components.
18. Input/Output (I/O) Controllers: Learn about I/O controllers that manage communication
between the CPU and peripheral devices.
y
19. Arithmetic Logic Unit (ALU): Briefly introduce the ALU, the CPU part responsible for
em
performing arithmetic and logical operations.
20. Control Unit (CU): Briefly explain the CU, the CPU part that controls the instructions
flow.
21. Parallel Processing: Briefly introduce parallel processing, using multiple processors to
ad
perform tasks simultaneously.
Ac
22. Impact on Programming: Learn how computer architecture concepts like memory
access times and data representation influence programming decisions.
23. Compiler and Interpreter Role: Understand how compilers and interpreters translate
n
code into machine code the CPU can understand.
ro
Operating systems are the core of programming. There are two perspectives for learning
operating systems, fundamentals and distros.
Fundamentals
y
em
The basics of operating systems haven’t changed for decades. The core components are
memory manager, device manager, virtual memory, etc. These concepts are implemented by
various vendors to create the distro ecosystem. The core concepts and implementation can look
very different. Knowledge of fundamentals will help you ask the right questions while designing
ad
your systems. For example, the idea of processes exists in all operating systems, but
concurrency and scheduling mechanisms vary according to implementation. Virtualization is
also an operating systems concept. Awareness about operating system design can help you
Ac
debug complex distributed systems. The errors are not always going to come from the code you
ship!
n
Distros (Distribution)
ro
The core components like kernel and drivers make up the heart of operating system distribution.
The window manager, package manager, standard line tools, etc., constitute the configurable
eu
aspect of the distro. Linux containers are also part of such tools. Knowing the development and
production distros will help you find the right debugging tools.
N
Action Items
ge
6. Explore Linux containers and their history. They have been around for a long time!
7. Read about distributed operating systems.
https://en.wikipedia.org/wiki/Operating_system
https://en.wikipedia.org/wiki/Distributed_operating_system
y
A book for Windows developers getting their hands on device driver development. The latest
versions still need to catch up to the newest version of Windows. However, a lot of the ideas
em
explained still hold.
ad
Linux Kernel Development by Robert Love
This is an excellent guide to understanding kernel programming. Although it is outdated,
Ac
considering the rapid kernel development in recent years, it is worth a glance nonetheless.
pondering—worth a glance.
ge
y
1. Process Management: Understand how the OS manages processes (running
em
programs), including creation, scheduling, and termination.
2. Memory Management: Learn how the OS allocates memory to processes and manages
virtual memory for efficient utilization.
3. Device Management: Explore how the OS controls and handles access to hardware
ad
devices like printers or disks.
4. File Management: Grasp how the OS organizes, stores, and retrieves files from storage
devices.
Ac
5. Security: Understand basic security concepts like user accounts, permissions, and
protection mechanisms implemented by the OS.
User Interaction:
n
6. User Interface (UI): Learn about different user interfaces (command line, graphical)
ro
Resource Management:
ge
11. Deadlocks: Understand deadlocks, situations where processes are permanently waiting
for resources held by each other, and how the OS can prevent them.
12. Booting Process: Explore the booting process and the sequence of events that start
the computer and load the operating system.
15. Virtualization: Briefly introduce virtualization, the technology that allows multiple virtual
machines to run on a single physical machine.
16. Interrupts and Exceptions: Briefly explain interrupts and exceptions, as well as
y
mechanisms for handling asynchronous events and errors in the system.
em
17. Memory Protection: Briefly introduce memory protection mechanisms that prevent
processes from accessing each other's memory space.
ad
18. System APIs: Learn about operating system APIs (Application Programming
Interfaces), which provide programmers with access to system resources and
Ac
functionalities.
19. I/O Models: Understand different I/O (Input/Output) models (e.g., blocking,
non-blocking) used for interacting with devices from a program's perspective.
n
Operating Systems in the Real World:
ro
systems).
21. Open-Source vs. Proprietary OS: Understand the distinction between open-source
operating systems (whose code is publicly available) and proprietary ones.
N
22. Security Threats: Briefly introduce common security threats like malware and viruses
and how the OS helps protect against them.
23. Performance Optimization: Explore basic techniques for optimizing program
ou
24. Operating Systems and Computer Architecture: Learn how operating systems rely on
underlying computer architecture for memory management, process execution, and
device interaction.
25. Operating Systems and Networking: Briefly introduce the role of the operating system
in network communication and resource sharing.
Knowing at least one programming language well is vital to a sustainable career in the software
industry. In addition, the language expertise will help you get things done efficiently, giving you
ample time to understand the business aspect.
As discussed, the programming languages abstract hardware through a type system. Statically
y
and dynamically typed systems pose different challenges from a software engineering
em
perspective. As a programmer, the choice of language will not be your responsibility in the initial
years. However, selection will be a crucial parameter in later years of technical leadership.
Many people need clarification on the relationship between framework expertise and language
expertise. For example, knowing how to boost libraries well is not the same as knowing C++
ad
in-depth, and knowing Spark doesn’t make one a proficient Scala programmer. Another case is
people mistaking Pandas expertise for data science or Python expertise.
Ac
Ideally, one should know around five different languages well enough. Master one, be hands-on
with the rest. Every language has a set of core features where it excels. Using those features
optimally makes your system perform at a high level from the start. Knowledge about various
languages also helps in designing domain-specific languages.
n
Programming languages provide basic types and some data structures. Some basic algorithms
ro
are also present in most languages. Using this essential toolkit can quickly start building
complex programs and systems. Third-party frameworks soon become part of the ecosystem,
but understanding their code is a massive asset to productivity.
eu
A language’s memory model is crucial to performance. Understanding the language design also
helps in designing robust programs. In-depth knowledge of the language benefits
object-oriented programming the most.
N
Data translations also rely heavily on your knowledge of the type system. Unnecessary
conversions and unintentional casting can lead to bugs. Finally, the toolchains and testing
ge
Note: Try to build a career as a software engineer, not a programming language fanatic.
ou
Programming languages are tools. Focus on getting the problems solved efficiently. Using more
than one language to build sustainable software signifies a healthy career.
R
Action items
1. Understand the terms strongly typed, weakly typed, statically typed, dynamically typed,
and duck typing.
2. Understand the nuances of type systems in your language, specifically string data types.
3. Spend time on getting good at using collections and built-in algorithms.
Note: Sharing C++ references since I use it most for professional work.
References
y
The C++ Programming Language by Bjarne Stroustrup
em
The book is the best source of the design aspect of the language. The examples illustrate
nuances of the language, something reading hundreds of blogs can never provide.
ad
A Tour of C++ by Bjarne Stroustrup
The book starts at an elementary level and generously explains the finer aspects of the
language with elaborate coding examples. It is structured almost like a textbook for formal
Ac
classroom teaching. Part of the C++ In-Depth Series.
C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and
N
Modern C++ Design: Generic Programming and Design Patterns Applied by Andrei
ou
Alexandrescu
It predates C++-03; hence, it might seem outdated today.
The design ideas and concerns discussed in the book are relevant even today.
R
C++ Coding Standards: 101 Rules, Guidelines, and Best Practices by Andrei
Alexandrescu and Herb Sutter
Hands-on and rich with code.
Fluency with the language before taking up this book is necessary.
y
C++ Primer by Lippman, Moo
em
Standard language reference manual.
ad
It has practical and relevant topics for any C++ developer.
Scott Meyers
Useful for developers who want to catch up with the new standards.
eu
The book contains insights into the language design of the creator himself.
One should read it after getting decent fluency in the language—it is more of a reference
ge
manual.
It presents a great way to extend C++ using the underlying interface with C.
Efficient guide to the language. Very easy to miss subtleties in the code snippets! Even though
C is not the language of choice in many new projects, this book remains a great sample of
R
1. Problem Decomposition: Learn how to break down complex problems into smaller,
manageable subproblems.
2. Algorithmic Design: Understand the process of designing efficient and well-structured
solutions using algorithms.
3. Algorithmic Thinking: Develop the ability to think in terms of step-by-step instructions
y
and computational processes.
4. Debugging Strategies: Master techniques for identifying and fixing errors in your code
em
(goes beyond syntax errors).
Programming Paradigms:
ad
5. Imperative Programming: Grasp the concept of imperative programming, where you
give explicit instructions to the computer. (Most beginner languages fall under this)
6. Object-Oriented Programming (OOP): Explore the principles of OOP, where programs
OOP)
Ac
are built around objects that encapsulate data and behavior. (Not all beginners start with
Programming Fundamentals:
eu
8. Variables and Data Types: Understand how variables store data of specific types
(integers, strings, booleans) and their impact on program behavior.
9. Operators: Master the different operators (arithmetic, comparison, logical) used to
N
12. Code Formatting and Indentation: Learn the importance of proper code formatting and
indentation for readability and maintainability. (Often overlooked in syntax-focused
courses)
13. Meaningful Variable and Function Names: Grasp the importance of choosing clear
and descriptive variable and function names to improve code understanding.
14. Commenting Your Code: Understand the value of adding comments to explain the
purpose of different code sections. (Crucial for collaboration and future reference)
16. Testing Strategies: Understand different testing strategies (unit testing, integration
testing) to ensure your code works as expected.
17. Debugging Tools: Explore how to use debugging tools (printers, debuggers) to identify
and fix errors in your code.
18. Error Handling: Learn how to handle errors gracefully using try-except blocks to prevent
y
program crashes.
em
Beyond Syntax - Program Design & Efficiency:
ad
Notation) to understand how program performance scales with input size. (Not always
covered in syntax-focused courses)
20. Space vs. Time Complexity: When choosing algorithms and data structures,
Ac
understand the trade-off between space complexity (memory usage) and time
complexity (execution speed).
21. Memory Management: Learn basic principles of memory management to avoid memory
leaks and improve program efficiency. (May not be covered extensively in beginners
n
courses)
ro
22. Version Control Systems (VCS): Briefly introduce version control systems (Git) for
tracking code changes and collaboration.
23. Clean Code Principles: Explore the principles of clean code (meaningful names, single
N
25. Real-World Applications: Explore how programming concepts are used to solve
problems in various domains (web development, game development, data science).
R
Persisting state and data are necessary for most applications. File systems are the backend of
the backend. Databases use storage engines to abstract the file systems. Operating systems
use drivers and tools to abstract away the intricate file system APIs.
As a programmer, understanding the nuances of storage at the software level are a huge asset.
File operations are one of the slowest operations. Efficient data access mechanisms need
y
significant engineering efforts. Using a file system optimally improves performance for all
em
applications using that particular operating system instance!
Writing filesystems is tricky. There is no single efficient file system for kind of file sizes. Access
times, indexing, CRUD operations, etc., are data size dependent. The file system as a subject is
available as a course in computer science departments. The knowledge of data structures and
ad
operating systems would be a prerequisite. File system design is a data structure problem at
heart. Searching and sorting are the primary operations.
The multi-user aspect of the operating system also demands a fundamental knowledge of the
Ac
filesystem. Unfortunately, detailed books about file systems are rare. However, some
suggestions will be made available in the final link of the course.
n
Action items
ro
https://en.wikipedia.org/wiki/File_system
ge
https://www.kernel.org/doc/html/latest/filesystems/ext4/index.html
ou
References
R
y
em
1. Hierarchical Structure: Grasp the concept of a hierarchical directory structure for
organizing files and folders within a file system.
2. File System Abstractions: Understand how file systems provide an abstraction layer,
hiding the complexities of physical storage from programs.
ad
3. File Attributes: Explore various file attributes, such as name, size, permissions, and
timestamps, and their role in managing files.
Ac
Beyond Basics - Understanding File System Operations:
4. File Creation and Deletion: Learn how file systems handle file creation, including
allocating storage space and managing directory entries.
n
5. File Opening and Closing: Understand the process of opening and closing files, which
establishes a connection for reading/writing data.
ro
6. File Permissions and Access Control: Grasp how file systems enforce access control
using permissions (read, write, execute) for users and groups.
eu
7. File Sharing and Locking: Explore mechanisms for sharing files between users or
processes and how locking prevents conflicts during concurrent access.
N
8. File Allocation Strategies: Learn about different file allocation strategies (contiguous,
ge
10. Disk Formatting and Partitioning: Explore how disks are formatted and partitioned to
create logical file systems on physical storage devices.
R
11. Journaling File Systems: Learn about journaling file systems that maintain a log of
changes to improve file system integrity in case of crashes.
12. File System Performance: Understand factors affecting file system performance, like
access times, seek times, and caching mechanisms.
13. File System Consistency: Explore how file systems maintain consistency in the face of
errors or power failures.
15. File System Security: Explore file system security features like access control lists
(ACLs) and encryption for protecting sensitive data.
16. File System Recovery: Understand basic file system recovery techniques used to
restore data after accidental deletion or corruption.
17. Disk Defragmentation: Learn about disk defragmentation and its role in optimizing file
y
system performance by reducing fragmentation.
em
Understanding Programmer Interaction:
18. System Calls for File I/O: Explore system calls used by programs to interact with file
ad
systems for reading, writing, and managing files.
19. File Path Resolution: Understand how file paths are resolved by the operating system
to locate specific files within the directory structure.
Ac
20. Standard Streams (stdin, stdout, stderr): Grasp the concept of standard streams
(standard input, output, error) for basic file I/O operations in many programming
languages.
n
Connecting File Systems to Other Concepts:
ro
21. File Systems and Operating Systems: Learn how file systems interact with the
operating system for process management, memory management, and device access.
eu
22. File Systems and Databases: Understand the distinction between file systems and
databases. File systems offer a simpler structure for general-purpose storage.
23. Copy-on-Write (COW) File Systems: Briefly introduce copy-on-write file systems used
ge
25. Flash Storage and File Systems: Explore how file systems are evolving to adapt to the
characteristics of flash storage (e.g., wear leveling).
y
networking libraries demands knowledge of the layers of networking. Rarely do people get to
work across all the layers of the network model. Products like software-defined networks overlap
em
hardware and software. Also, a lot of networking is part of IoT ecosystems.
Networking implementations are hardware and operating system-dependent. However, all
operating systems provide tools for network monitoring, and there are also off-the-shelf software
ad
tools for monitoring networks.
As a programmer, one must understand the protocols and behaviors while using them.
Debugging network issues in clouds can become challenging. Knowledge about tools and
Ac
network stacks is a survival skill for a career in distributed systems.
This topic covers the internal workings of the Internet. DNS, BGP, ISP, ARP, RARP, TCP, UDP,
n
SNMP, SMTP, etc., are frequently used. The more you understand networking, the more
accessible building scalable systems will become.
ro
Your career trajectory will define the depth of your understanding, but knowing more than
eu
necessary will always help. Understanding the complexity of networking will help you appreciate
distributed systems more.
N
Action Items
ge
https://en.wikipedia.org/wiki/Network_model
https://en.wikipedia.org/wiki/Software-defined_networking
https://www.ietf.org/standards/rfcs/
y
but provides an excellent big picture.
em
UNIX Network Programming (All Volumes) by Richard Stevens
It must be read by all native programmers. It covers a lot of fundamentals with examples.
ad
Very practical and relevant for all systems programmers.
Fluency with Linux systems via the command line will be needed.
1. Network Topologies: Grasp the different network topologies (bus, star, mesh) and their
N
4. Packet Switching: Understand packet switching, where data is broken down into
packets for efficient network transmission.
5. Addressing Schemes (IP & MAC): Explore IP addresses for identifying devices on a
network, and MAC addresses for identifying network adapters.
6. Subnetting: Learn about subnetting, a technique for dividing an extensive network into
smaller logical subnets for better organization and security.
10. Routing Protocols: Briefly introduce routing protocols the mechanisms routers use to
y
determine the best path for data packets to reach their destination.
em
11. Firewalls and Network Security: Briefly explain firewalls, which act as security barriers
to control incoming and outgoing network traffic.
12. Virtual Private Networks (VPNs): Briefly introduce VPNs, which create secure tunnels
over public networks for private communication.
ad
Understanding Programmer Interaction:
Ac
13. Sockets Programming: Explore socket programming, a fundamental technique for
creating network applications that can send and receive data.
14. Network APIs: Learn about network APIs (Application Programming Interfaces)
provided by programming languages to simplify network programming tasks.
n
15. Error Handling in Network Communication: Understand how to handle errors that can
occur during network communication, like timeouts and connection failures.
ro
16. Latency vs. Bandwidth: Grasp the difference between latency (communication delay)
and bandwidth (data transfer rate) and their impact on network performance.
N
17. Network Performance Tools: Explore tools for measuring and analyzing network
performance, such as ping and traceroute.
ge
18. Network Optimization Techniques: Learn about techniques like caching and content
delivery networks (CDNs) to improve network performance and user experience.
ou
19. Networking and Operating Systems: Understand how operating systems handle
network communication and provide network services to applications.
R
20. Networking and Security: Explore the interplay between networking and security,
where secure communication protocols and network segmentation are crucial.
Real-World Applications:
y
for building distributed systems where tasks are spread across multiple machines.
em
ad
Ac
n
ro
eu
N
ge
ou
R
Using, maintaining, and building databases are very different skills. For example, when
accessing a database through a connector library, you are unaware of the installation and the
destination database’s operating environment—in contrast, while maintaining one, you don’t
y
need to know actual application data processing. And while you are building one, you must care
em
about where the installation happens and the methods to access data.
The steepest learning curve is the database aspect of programming. This is because you must
address several permutations before making them available to the end user. Building a simple
in-memory database can teach you much about query parsing and concurrency. Taking it to the
ad
storage level will teach you about storage engines and file systems. You may start with SQLite.
In short, databases build a mirror operating system to manage all their resources! However,
Ac
building a storage engine is one of the niche problems in the industry. Therefore, invest time in
understanding the design decision needed to create a database.
n
Action items
ro
3. Get an open-source database and parse its code for concurrency, memory
management, and query parsing.
4. Try to write an in-memory key-value store with a simple CRUD language. Make sure to
N
https://en.wikipedia.org/wiki/ACID
ou
https://github.com/sqlite/sqlite
R
SQL and Relational Theory: How to Write Accurate SQL Code by C.J Date
The book presents a formal introduction to the SQL paradigm.
Database Design and Relational Theory: Normal Forms and All That Jazz by C.J Date
The book is DB Design 101. It focuses on RDBMS, as the name suggests. Predates the market
y
of distributed database systems becoming mainstream.
em
Fundamentals of Database System by Ramez Elmasri, Shamkant Navathe
The book is a recommended text for many university courses.
It covers all the fundamentals for RDBMS, and the latest editions also discuss the design
challenges in the distributed case.
ad
Ac
Topics to explore using ChatGPT/Gemini
Data Modeling Fundamentals:
n
1. Entity-Relationship Model (ERM): Understand the ERM, a conceptual data modeling
tool for representing entities, relationships, and attributes.
ro
3. Relational Model: Explore the relational model, the foundation for most popular
databases, where data is organized in tables with relationships.
N
7. Query Languages (Beyond SQL): Briefly introduce other query languages like XQuery
for specific purposes (won't go into details).
8. Query Optimization: Understand query optimization techniques that improve the
performance of database queries.
9. Indexing Strategies: Learn about indexing strategies for faster data retrieval in
relational databases.
y
em
13. DBMS Architecture: Explore the layered architecture of a Database Management
System (DBMS) and its core components.
14. Query Processing Engine: Understand the role of the query processing engine in
interpreting and executing user queries.
ad
15. Storage Management: Learn about storage management techniques used by DBMS to
efficiently store and retrieve data.
Ac
Advanced Concepts (Introduce Briefly):
16. NoSQL Databases: Briefly introduce NoSQL databases as alternative data storage
solutions for specific use cases with relaxed consistency models.
n
17. Distributed Databases: Briefly explain distributed databases, where data is stored
across multiple servers for scalability and high availability.
ro
18. Database Security: Briefly introduce database security concepts like access control and
encryption to protect sensitive data.
eu
19. Database Design for Different Applications: Explore how database design principles
N
differ for various applications (e.g., transactional systems vs. analytical systems).
ge
22. Database Administration (DBA): Briefly introduce the role of a Database Administrator
(DBA) in managing and maintaining databases.
23. Database Backup and Recovery: Explore strategies for backing up databases and
recovering data in case of failures.
24. Cloud Databases: Briefly introduce cloud databases, where database management is
handled by a cloud service provider.
25. Big Data and Databases: Briefly explain the role of databases in handling big data,
where traditional relational databases may not be suitable.
y
em
ad
Ac
n
ro
eu
N
ge
ou
R
Compiler design is a great learning opportunity for anyone serious about a 10+ years career as
a programmer. Automata theory is complex and does not have a mathematical background.
Unfortunately, the steep learning curve removes many self-learners from the compiler design.
y
Programming without compilers/interpreters is impossible. The basic necessity is sufficient to
em
investigate the inner workings of the tools. Let’s look at the two critical aspects of compilers from
a career journey perspective, system administration, and programming fundamentals.
ad
System Administration
Starting learning by installing your setup is the best way to start any programming language.
Ac
Installing compilers or tool chains provides you with the environmental dependencies of the
programs you will ship. Spend time understanding the nuances. Installation of any software, in
general, will provide this information. Don’t confuse the toolchain with IDE. Editors are only
using a cosmetic aspect of language. Translation of human-readable code to machine-readable
n
code is the responsibility of toolchains.
ro
Programming Fundamentals
eu
Compiler design regularly deals with parsers, graphs, trees, and dynamic programming. For
example, garbage collection is a traversal problem. Symbol resolution and syntax parsing
N
language parser. One doesn’t need expertise in automata theory to implement basic compilers.
The automata theory will become relevant in certain places. Still, thankfully, enough resources
are available to guide you in understanding and moving on. The goal is to work with the
ou
compiler as a piece of software instead of a black box. Most mainstream languages are open
source. Check out a compiler or runtime and compile it on your local machine!
R
y
https://en.wikipedia.org/wiki/Automata_theory
https://www.eclipse.org/Xtext/
em
References
ad
Compilers: Principles, Techniques, and Tools by Aho, Ullman, Sethi, Lam (The Dragon
Book)
The ultimate compiler design guide. It can sometimes get very cryptic; hence, it is best used
Ac
along with some standard university courses. Best understood with the simultaneous
implementation of some sort. MOOCs have a few classes, but being a niche subject is rarely
available.
n
Engineering a Compiler by Cooper and Torczon
ro
The book covers the most commonly discussed topics in compiler design.
The book doesn’t cover all topics like the Dragon Book. It’s best to have it as a supplement to
eu
There are versions of this book tailored to C and Java, as well as ML (not machine learning).
Implementation-oriented and suggested as a subsequent step to the compiler design theory
ge
books.
Modern Compiler Design by D. Grune, K. van Reeuwijk, H.E. Bal, C.J.H. Jacobs,K.
ou
Langendoen
The book details the commonly discussed design theory. It could supplement the Dragon Book.
R
y
The Elements Of Computing Systems Noam Nisan, Shimon Schocken
The book is a complete overview of building computer systems.
em
Content covers a lot of components; hence, it needs to be more detailed about any particular
topic.
ad
Fundamentals of design. Available online for free.
Ac
It will be very hands-on. Language design prerequisites will be needed. Learning Go and
working on an exciting side project is a good starting point.
n
Writing a compiler in Go by Thorsten Ball.
It will be very hands-on. Language design prerequisites will be needed. Learning Go and
ro
Compiler Fundamentals:
ge
y
em
7. Optimization Techniques: Learn about compiler optimization techniques (e.g., constant
folding, loop unrolling) that improve the efficiency of the generated code. (Relates to
fine-tuning a recipe for better results)
8. Code Generation: Explore how code generation translates the optimized IR into
ad
machine code specific to the target processor architecture. (Similar to translating a
recipe into steps for a specific kitchen appliance)
9. Just-In-Time (JIT) Compilation: Briefly introduce JIT compilation, where code is
unrecognized symbols) during the scanning stage. (Relates to catching spelling mistakes
in writing)
eu
11. Syntax Errors: Explore how compilers detect syntax errors (e.g., missing semicolons,
mismatched brackets) during the parsing stage. (Similar to identifying grammatical errors
in a sentence)
N
12. Semantic Errors: Learn about semantic errors (e.g., type mismatches, undeclared
variables) identified during semantic analysis. (Relates to logical inconsistencies in
ge
writing)
13. Compiler Design Tools (Lexers, Parsers): Briefly introduce tools like lexers and
parsers used for building compilers. (Similar to using libraries or frameworks to simplify
R
development)
14. Impact on Programming Languages: Understand how compiler design choices can
influence the features and syntax of programming languages. (Relates to how tools can
shape the creative process)
15. Error Reporting for Programmers: Explore how compilers provide informative error
messages to help programmers identify and fix issues in their code. (Similar to getting
feedback on your writing to improve clarity)
16. Interpreters vs. Compilers: Briefly explain interpreters, which translate and execute
code line by line, and how they differ from compilers. (Relates to different approaches for
following instructions - all at once vs. step-by-step)
17. Assembly Language: Briefly introduces assembly language, a low-level language
closer to machine code, and how it relates to compilers. (Similar to understanding
machine parts when working with a complex tool)
y
em
18. Cross-Platform Compilation: Explore how compilers can generate code for different
platforms (desktop vs. mobile) from the same source code. (Relates to writing a recipe
that can be adapted for different kitchens)
19. Development Tools and Compilers: Understand how Integrated Development
ad
Environments (IDEs) often use compilers behind the scenes for features like syntax
highlighting and error checking. (Similar to spell checkers and grammar tools used in
writing)
21. Loop Optimizations: Explore loop optimizations that compilers can perform to improve
the efficiency of loops in the generated code. (Relates to streamlining repetitive tasks in
eu
a process)
22. Dead Code Elimination: Briefly explain dead code elimination, an optimization that
removes code that is unreachable or has no impact on the program's output. (Similar to
N
23. Compiler Bugs and Security: Understand how compiler bugs can introduce security
ou
vulnerabilities into the generated code. (Relates to the importance of quality control in
any development process)
24. Impact on Programmer Productivity: Explore how well-designed compilers can
improve programmer productivity by providing clear error messages and optimizations.
R
(Similar to how good tools can make development faster and easier)
25. The Evolution of Compilers: Briefly introduce how compiler technology is constantly
evolving to support new programming languages, architectures, and optimization
techniques. (Relates to the ongoing development and improvement of tools in any field)
From a programming perspective, distributed systems are the trinity of storage, computing, and
networking. Everything revolves around three pillars. A deeper dive will bring computer
architecture, data storage, operating systems, network protocols, design patterns, etc., into the
equation.
y
em
Using a distributed system is different from building one—please don’t confuse the two!
Implementing the CAP theorem is hard. The Paxos and raft protocols can look easy until you
execute distributed transactions. Building distributed databases or storage is the building block
for any planet-scale product.
ad
You can rent such services through AWS, GCP, or Azure or build intermediate solutions using
edge computing frameworks like Cloudflare, Cloud Workers, etc. But none of these solutions
Ac
work in private data centers! The private cloud demands different answers. There are products
to solve this problem, but what if you are the one building that solution? Data engineering has
become crucial for most businesses with the explosion of AI/ML frameworks. Data engineering
is about dealing with distributed systems. The horizontal and vertical scaling ideas on interview
n
portals are only helpful in interviews. Reality is complex and demands learning a lot more.
ro
Action items
ge
1. Please read the Paxos and Raft papers. Unfortunately, Paxos is more complicated to
understand, so Raft was invented.
2. Find and follow some distributed system products engineering blogs
3. Clearly understand public cloud, private cloud, edge computing, and hybrid
ou
infrastructure.
4. Read papers from the early days of cloud research. Distributed storage is vital to
planet-scale problems. GFS paper should provide you a good start.
R
5. Identify the role of distributed systems in your career roadmap. For example, do you
want to be part of a team that builds or uses one?
6. Spend time learning about tools for monitoring and managing distributed systems in the
cloud, both vendor–provided and third–party.
https://en.wikipedia.org/wiki/Distributed_computing
References
y
Design constraints and solutions for the fundamental components of a distributed system. It
includes some mathematical notation.
em
Distributed Systems: Principles and Paradigms by Andrew Tannenbaum
covers most of the commonly discussed topics of distributed systems design.
ad
Distributed Operating Systems by Andrew Tannenbaum
The book addresses all components of the operating systems from a distributed operation
Ac
perspective. As a result, many non-obvious subtleties and bottlenecks are part of the
discussions.
Scala manual. The book is a stepping stone toward the Big Data framework, Spark and
functional programming.
N
Uses Spark 2.2 for code examples used to showcase the features.
Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and
Maintainable Systems by Martin Kleppmann
This book is an excellent guide to learning the working details of modern distributed systems.
As promised, the author explains enough to grasp the topics but not master them. The book is
rich with references and resources to follow up. It is a must-read for all software professionals.
y
em
1. What are Distributed Systems? Understand the definition of distributed systems,
where software components run on multiple interconnected computers.
2. Transparency: Explore the concept of transparency in distributed systems, the degree
to which users are aware of the system’s distributed nature.
ad
3. Scalability: Learn about scalability, the ability of a system to handle increasing load or
data by adding more resources.
4. Concurrency: Grasp the concept of concurrency, where multiple tasks or processes can
Ac
execute seemingly simultaneously in a distributed system.
5. Consistency: Understand the challenges of maintaining consistency in a distributed
system, ensuring all nodes have the same data view.
n
Communication and Coordination:
ro
message queues).
7. Distributed Consensus: Learn about distributed consensus algorithms mechanisms for
nodes in a distributed system to agree on a single value or state.
N
8. Leader Election: Briefly introduce leader election, where one node is chosen as the
leader to coordinate tasks in a distributed system.
ge
9. Failures in Distributed Systems: Understand different types of failures that can occur
ou
11. Fault Detection and Recovery: Learn about mechanisms for detecting failures and
recovering from them in a distributed systems environment.
12. Distributed Databases: Explore distributed databases, where data is stored and
managed across multiple nodes in a network. (Relates to managing a large dataset
across different teams or locations)
13. Data Partitioning: Learn about data partitioning techniques for distributing data across
nodes in a distributed database. (Similar to dividing work responsibilities among team
members)
14. Distributed Transactions: Understand the challenges and approaches for managing
transactions (data updates) across multiple nodes in a distributed system. (Relates to
y
ensuring coordinated changes across different parts of a project)
em
Concepts for Further Exploration:
15. Distributed File Systems: This section briefly introduces distributed file systems, which
ad
provide access to a shared file system across a network of computers.
16. Cloud-Based Distributed Systems: Briefly explain cloud-based distributed systems,
where resources and services are delivered on-demand over the internet.
18. Designing for Distribution: Explore design patterns and best practices for developing
applications that can leverage distributed systems effectively. (Relates to considering
eu
Real-World Applications:
N
19. Microservices Architecture: Understand how distributed systems principles are applied
ge
web applications with high availability and scalability. (Similar to handling a large influx of
users on a website)
21. Distributed Machine Learning: Briefly introduce distributed machine learning, where
training data and models are spread across multiple machines for faster processing.
22. The Internet of Things (IoT): Briefly explain the role of distributed systems in managing
and coordinating interconnected devices in the IoT.
23. Distributed Systems & Operating Systems: Understand how operating systems
provide fundamental building blocks for distributed systems (e.g., networking, process
management).
24. Distributed Systems & Security: Explore security considerations in distributed
systems, including authentication, authorization, and data encryption.
y
25. Distributed Hash Tables (DHTs): Briefly introduce DHTs, a data structure and algorithm
em
for storing and retrieving data across a distributed system based on a hash function.
(Similar to a distributed filing system with intelligent organization based on content)
ad
Ac
n
ro
eu
N
ge
ou
R
Programming originated from the need to perform mathematical tasks using machines. The idea
of programming hasn’t changed a lot; syntaxes and languages have. The early days of
programming, when C and UNIX design was ongoing, can still teach some of the core
programming ideas. Simpler hardware meant smaller programs. The Linux command line tools
y
are a great example of such modular programs. Over the years, the complexity of system
em
design has seeped into implementation, leading to complicated code bases and various schools
of thought defending them.
The ability to write an algorithm has nothing to do with language expertise. Breaking down
complex tasks into modules also doesn’t need a language in particular. Once the program
ad
structure is ready, the language is the tool to implement it.
Design patterns introduce the idea of providing a higher-level abstraction for programs using a
framework independent of higher-level programming languages. Over the years, the picture has
Writing clean programs sticking to the basics will lead to clean code. On the other hand,
production pressure can lead to suboptimal code. You will only get one chance to write code, do
n
it right.
ro
eu
Action Items
1. Read old articles about programming by scientists from AT&T labs.
2. Listen to a discussion about programming styles
N
References
R
Head First Object-Oriented Analysis and Design by David West and Brett McLaughlin
y
Worth a glance.
em
Design Patterns by Erich Gamma
It could be considered outdated—worth a glance.
Beautiful Code: Leading Programmers Explain How They Think by Andy Oram, Greg
ad
Wilson, Andy Oram, Greg Wilson
Nothing to do with hands-on coding as such. A collection of conversations with programmers
from different domains.
1. What are Design Patterns?: Grasp the concept of design patterns as templates for
eu
3. Types of Design Patterns: Explore the different categories of design patterns, such as
creational, structural, and behavioral patterns.
ge
4. Singleton: Learn about the Singleton pattern, which ensures only a single instance of a
class exists. (Relates to having one central location for specific data or functionality)
5. Factory Method: Understand the Factory Method pattern, which creates objects without
R
7. Adapter: Learn about the Adapter pattern, which allows incompatible interfaces to work
together.
8. Facade: Understand the Facade pattern, which provides a simplified interface to a
complex system.
10. Observer: Learn about the Observer pattern, where one object (subject) notifies multiple
objects (observers) about changes.
11. Strategy: Understand the strategy pattern, which allows for the choice of an algorithm at
runtime.
12. Template Method: Explore the Template Method pattern, which defines the steps of an
y
algorithm in an operation and allows subclasses to provide specific implementations.
em
Learning Through Examples (Focus on Understanding, Not Code):
13. Avoid Diving Deep into Code: While AI ChatBots can't write code for you, they can
ad
explain design patterns in a way that beginners can understand without complex code
examples.
14. Real-World Analogies: Use real-world analogies to illustrate the concepts. (e.g.,
Ac
Observer pattern - a doorbell notifying residents of visitors)
in a dish)
16. When to Use Design Patterns: Understand when design patterns are appropriate
eu
18. Applying Design Patterns in Code: Explain how design patterns can be applied in
ge
20. Iterator: Briefly introduce the Iterator pattern for accessing elements of a collection
object in a sequential manner.
21. Command: Briefly explain the Command pattern for encapsulating a request as an
object, allowing for flexible queuing and logging of actions.
22. State: Briefly explore the State pattern for allowing an object to alter its behavior when
its internal state changes.
23. Choosing the Right Pattern: Explore strategies for choosing the right design pattern for
a specific problem.
24. Combining Design Patterns: Understand how design patterns can be combined to
create more complex solutions.
25. Adapting to New Technologies: Briefly discuss how design patterns can be adapted to
y
new programming languages and paradigms.
em
ad
Ac
n
ro
eu
N
ge
ou
R
y
Knowing an idea's end-to-end lifecycle enables you to estimate the appropriate effort.
em
Therefore, a clear understanding of software engineering is critical to work-life balance.
Unfortunately, software engineering is rarely a dedicated subject. Most people end up imitating
the managers they liked the most.
ad
Most social media has boiled down software engineering to setting unrealistic goals and
motivating teams through the struggle. A better solution is needed. If you are reading this, it
means you, too, realize it. Do something about it.
Actions items
Ac
n
1. Read the books about software engineering that answer “why,” not “how.”
ro
References
ge
The Architecture of Open Source Applications by Multiple authors, at least one per
chapter.
Available online. A collection of experiences from the field. Proven ideas.
y
Relevant and relatable for most programmers working with application code daily. Suitable for
mentoring new programmers as well.
em
Refactoring by Kent Beck, Martin Fowler
The book is a collection of advice that makes dealing with existing code bases easier.
ad
The Effective Engineer: How to Leverage Your Efforts In Software Engineering to Make a
Disproportionate and Meaningful by Edmond Lau
Advice from the field. It might take some time to apply to you, but it is always suitable to have it
in your arsenal when the time comes.
Ac
Software Engineering at Google: Lessons Learned from Programming Over Time by Titus
n
Winters, Hyrum Wright, and Tom Manshrek
It is an excellent insight into how software engineering is a very different set of decisions beyond
ro
programming—filled with specific problems and advice to tackle them. Many issues only exist at
a particular scale, and the book highlights the fact at the beginning—worth the time.
eu
Foundational Concepts:
ge
1. Software Development Life Cycle (SDLC): Understand the different phases of the
SDLC, like planning, development, testing, deployment, and maintenance.
ou
2. Version Control Systems (VCS): Learn about using tools like Git for version control,
tracking code changes, and collaboration.
3. Integrated Development Environments (IDEs): Understand how IDEs like Visual
R
Studio Code or PyCharm provide features like code editing, debugging, and project
management.
4. Debugging Techniques: Explore different debugging techniques like print statements,
breakpoints, and debuggers to identify and fix errors in code.
5. Clean Code Principles: Learn about clean code principles like meaningful variable
names, proper formatting, and modularity for better code readability and maintainability.
6. Unit Testing: Understand the concept of unit testing, writing small tests to verify the
functionality of individual code units.
7. Code Documentation: Explore the importance of code documentation, explaining the
purpose and functionality of code for future reference.
y
em
8. Imperative vs Declarative Programming: Grasp the difference between imperative
programming (focusing on how to achieve a result) and declarative programming
(focusing on what needs to be achieved).
9. Object-Oriented Programming (OOP): Learn the core concepts of OOP, such as
ad
objects, classes, inheritance, and polymorphism, to structure code.
Ac
10. Data Structures and Algorithms: Explore fundamental data structures (arrays, linked
lists, stacks, queues) and algorithms (sorting, searching) for efficient data organization
and manipulation.
n
11. Time and Space Complexity: Learn to analyze algorithms’ time and space complexity
and understand how they affect program performance.
ro
12. Agile Development: Explore agile methodologies like Scrum for iterative and
incremental software development with continuous feedback.
13. Testing Strategies: Understand different testing strategies like unit testing, integration
N
14. Software Design Principles: Learn about software design principles like SOLID (Single
Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, Dependency
Inversion) for creating well-structured and maintainable code.
ou
15. User Interface (UI) Design Principles: Explore UI design principles like usability,
R
Looking Ahead:
y
19. The Future of Software Development: Briefly discuss emerging trends in software
em
development like artificial intelligence (AI) and machine learning (ML).
20. Continuous Learning: Emphasize the importance of constant learning in software
engineering to stay updated with new technologies and best practices.
ad
Ac
n
ro
eu
N
ge
ou
R
Security is ingrained in all layers of software systems, including hardware. Your career trajectory
might only demand knowing a little about safety since frameworks take care of it. But when
issues like a HeartBleed, Meltdown, Spectre, or log4j vulnerability show up, you should know
the impact on your system.
y
Knowledge about cryptography is mathematical. Spend some time understanding the basics.
em
The production setups will rely on frameworks. You may get interested in pursuing it full-time.
As an application programmer, I have fundamental knowledge about SELinux, encryption,
DDoS attacks, phishing, etc., which is always helpful. Data is always vulnerable to malicious
actors. Bot automation makes accidental access easy. Malicious actors might stumble on your
ad
system. So, spend time understanding the security aspects to be considered by your system’s
design.
Action items
1. Read more about SELinux
Ac
n
2. Read more about encryption
ro
https://www.schneier.com/
N
https://googleprojectzero.blogspot.com/
ge
References
ou
Cryptography 101.
Mathematically demanding.
Network Security with OpenSSL by Pravir Chandra, Matt Messier, John Viega
A hands-on guide to SSL programming.
y
Secure Programming Cookbook by Matt Messier, John Viega
This is a hands-on guide to programming practices with security as a primary objective and
em
functional specifications. It outlines subtle steps that can make a huge difference in product
security.
ad
Topics to explore using ChatGPT/Gemini
Core Security Principles:
Ac
1. CIA Triad: Understand the CIA triad (Confidentiality, Integrity, Availability) - the core
security objectives of protecting data confidentiality, ensuring data integrity, and
n
guaranteeing system availability.
ro
2. Threat Modeling: Learn about threat modeling, the process of identifying potential
threats and vulnerabilities in a system.
3. Secure Coding Practices: Explore secure coding practices, such as input validation,
eu
4. Injection Attacks: Learn about injection attacks, where malicious code is injected into
ge
10. Basic Cryptography Concepts: Learn about basic cryptographic concepts like
encryption (transforming data into an unreadable format) and decryption (reversing the
encryption process).
11. Hashing: Understand hashing functions, which generate unique fingerprints for data and
are used for data integrity verification.
y
em
Security Practices for Beginners:
12. Strong Passwords: Explore the importance of using strong passwords and proper
password management practices.
ad
13. Software Updates: Understand the importance of keeping software up-to-date to patch
security vulnerabilities.
Ac
Beyond the Basics:
14. Secure Coding Standards: Briefly introduce secure coding standards and guidelines
for writing secure code.
n
15. Security Testing: Briefly explain security testing methodologies to identify vulnerabilities
in applications.
ro
16. Security in the SDLC: Understand how security considerations are integrated
throughout the Software Development Life Cycle (SDLC).
17. Secure Coding Tools: Briefly introduce secure coding tools that can help identify and
N
18. Social Engineering: Learn about social engineering attacks, where attackers
ou
Looking Ahead:
20. The Evolving Security Landscape: Briefly discuss the ever-evolving security
landscape and the importance of staying informed about new threats and vulnerabilities.