Computer Programming 1
Bachelor in Computer Science and Artificial Intelligence (BCSAI) · IE University · syllabus-driven course outline.
This course strengthens students' C programming skills, introducing advanced memory management, multi-threading, and networking concepts. Students build high-performance, networked C applications and explore systems programming, embedded development, and AI-based optimizations.
A deep dive through modern C programming — polishing your skills while learning about best practices, helpful tools and full programming techniques. The companion interactive demos visualize the core ideas: variable tracing, control flow, pointers & memory, recursion and the C data structures covered below.
The syllabus is organised as a refresh module (Module 0) followed by six thematic modules that move from program correctness (error handling, testing) through the heart of C (pointers, dynamic memory, structures), the build/preprocessor toolchain, advanced language features (bits, enums, linked lists, recursion), and finally the systems-level material that gives the course its identity: concurrent programming and networked sockets. Two intermediate tests, a group project and a final exam punctuate the 30 live in-person sessions.
Learning objectives
By the end of the course, students will be able to:
- Master dynamic memory allocation and optimization techniques.
- Implement data structures using pointers efficiently.
- Develop multi-threaded and networked applications in C.
- Apply low-level systems programming concepts (process management, IPC).
- Debug and optimize C programs for performance and security.
- Write networked applications using socket programming in C.
Methodology & assessment
IE University's teaching method is collaborative, active and applied. The professor guides students toward the learning objectives through a diverse mix of activities — lectures, hands-on practice, assignments, online resources, project-based and peer learning, and assessments.
The seven teaching techniques used
- Lecture-based teaching — interactive lectures building conceptual understanding of C syntax, control structures, functions, arrays, pointers and data structures, with worked examples.
- Hands-on practice — in-class exercises writing and debugging C with proper technique; students are encouraged to work in groups and share knowledge.
- Assignments — regular problems that reinforce concepts and challenge students to think creatively, with feedback to improve their skills.
- Online resources — tutorials, videos and exercises that supplement lectures and support practice outside of class.
- Project-based learning — a course-long group project: identify a problem, design a solution, implement it in C and present it.
- Peer learning — group work that fosters a collaborative environment and develops teamwork skills.
- Assessments — quizzes, tests and exams that evaluate understanding and surface areas to improve.
Learning activity weighting
Evaluation criteria
Software stack
What each component asks for
- Final exam (50%) — deliverable: a comprehensive written exam with multiple-choice and coding sections (session 30). Evaluation: correctness of answers and quality of code written under exam conditions across the whole syllabus.
- Intermediate tests (20%) — deliverable: two midterms (session 9 covering modules 0–2 + file I/O; session 20 covering the networking material). Evaluation: understanding of the concepts and techniques taught up to each test.
- Group project (20%) — deliverable: a collaboratively built C program of moderate complexity plus documentation and a presentation (sessions 22–23 development, 28–29 presentation). Evaluation: functionality, code quality, design principles and adherence to best practices learned in the course.
- Class participation (10%) — deliverable: sustained, active engagement in lectures, discussions and hands-on work. Evaluation: continuous across the semester.
Pass, attendance & re-sit rules
- Each student has four chances to pass a course over two consecutive academic years: ordinary-call exams plus extraordinary-call (re-sit) exams in June/July.
- Students who do not meet the 80% attendance rule fail both calls for the year (ordinary and extraordinary) and must re-enrol the following year — they do not get a re-sit.
- The June/July re-sit is a single comprehensive exam taken in person on campus (Segovia or Madrid); continuous evaluation is not counted, the minimum passing grade is 5, and the maximum obtainable is 8.0 ("notable"). Re-takers (3rd call) may obtain up to 10.0 and must confirm criteria with their assigned professor.
- A review session follows grading; attending it is a prerequisite for any grade appeal. Failing more than 18 ECTS (single degree) or 21 ECTS (dual) after the re-sits leads to being asked to leave the Program.
Program — 6 modules, 30 sessions
Every session of the course, grouped by module. Tags link relevant interactive demos and key readings (K&R = Kernighan & Ritchie, PCP = Practical C Programming, HNP = Hands-On Network Programming).
C Language Basics Refresh
environment, tooling & reviewA short on-ramp that re-establishes the language and, just as importantly, the way you will build and run code all semester. It assumes prior C exposure and moves quickly from "what does this statement do" to "how do I compile and organise a real project".
By the end of this module you can
- Read and reason about basic C: types, expressions, control flow and functions.
- Drive the course toolchain end-to-end: terminal, Conda env, CMake build, VSCode.
- Compile a multi-file project with
add_executable/add_library.
-
1
Course Overview & General C Language Review
Presents the general contents of the course and runs a fast refresh of C language basics and environment setup.
- Syllabus & course goals — modules, assessment weights, the AI policy.
- C fundamentals refresh: types, expressions, control flow —
int/char/double, operators & precedence,if/while/for. - Functions & the shape of a C program — declarations vs definitions,
main(), headers. - Environment setup — compiler, editor and project layout.
Core concept — translation unit: a C program is a set of
.cfiles each compiled to an object file, then linked into one executable; the compiler sees one translation unit at a time, which is why declarations in headers matter.Key idea C is small but unforgiving: there is no runtime safety net, so you reason explicitly about types, memory and undefined behaviour from day one.
-
2
Tooling
The development toolchain and intended workflow for the course.
- The terminal — navigating, running builds and binaries by hand.
- Conda for dependencies — isolated, reproducible environments per project.
- CMake intro and compiling —
add_executable,add_library, configure-then-build. - Workflow — navigate via terminal → activate/create conda env → open VSCode → run cmake.
- VSCode refresher · GitHub Education / Copilot in VS Code
Core concept — out-of-source build: CMake reads
CMakeLists.txtand generates build files in a separatebuild/directory, keeping generated artefacts out of your source tree.Key idea A repeatable build is part of the program: if a teammate can
cmakeand run your code in one command, integration during the group project is painless.
Error Handling and Debugging
2 subtopicsBefore going deeper into the language, the course establishes how to keep code
correct: detecting and reporting errors deliberately, asserting invariants, and proving behaviour
with automated tests rather than ad-hoc printf debugging.
By the end of this module you can
- Choose between return-code,
errnoand assertion strategies for reporting failures. - Guard invariants with
assert()and understand howNDEBUGdisables them. - Write and run unit tests with GTest and wire them into a CMake build.
-
3
Error Handling and Assertions · subtopic 1/3
Error handling techniques and assertions in C, while refreshing debugging techniques.
- Error handling strategies — return codes, sentinel values,
errno+perror. - Assertions —
assert(cond)aborts when an invariant is violated. - Debugging techniques refresh — breakpoints, stepping, inspecting variables in a debugger.
Core concept — contracts vs errors: an
assertdocuments a condition the programmer believes is always true (a bug if false), whereas error handling deals with expected runtime failures such as a missing file.Key idea Assertions catch your mistakes during development; error handling deals with the world's failures at runtime — they are not interchangeable.
- Error handling strategies — return codes, sentinel values,
-
4
Unit Testing · subtopic 2/3
Writing and running automated tests for C code.
- Unit testing principles — isolate a unit, arrange–act–assert, test edge cases.
- GTest —
TEST(Suite, Name)macros andEXPECT_*/ASSERT_*checks. - Setting up tests in CMake — register tests so
ctestcan run them.
Core concept — regression safety: a unit test pins down expected behaviour so that a future change which breaks it fails loudly instead of silently.
Key idea Tests are the executable specification of your functions; once wired into CMake/ctest they turn "I think it works" into "the build proves it".
Pointers and Structures
3 subtopicsThe conceptual core of the course. Pointers, the heap and aggregate types are what let C model real data structures and manage memory by hand — the foundation every later module (linked lists, threads, socket buffers) builds on.
By the end of this module you can
- Declare, dereference and do arithmetic with pointers, relating them to memory addresses.
- Allocate and free heap memory with
malloc/calloc/realloc/freewithout leaking. - Model related data with
structand overlapping data withunion.
-
5
Pointers · subtopic 1/3
Refresh the concept of pointers, their purpose, and their relationship with memory addresses.
- Pointer declaration & initialization —
int *p = &x;holds the address ofx. - Referencing & dereferencing —
&takes an address,*reads/writes the value there. - Pointer arithmetic —
p + 1advances bysizeof(*p)bytes; the array/pointer duality.
Core concept — a pointer is a typed address: its value is a memory location and its type says how many bytes to read and how to interpret them, which is why
char*andint*step differently.Key idea Pass-by-pointer lets a function modify the caller's data and lets you share large objects without copying — the mechanism behind output parameters and every dynamic data structure.
- Pointer declaration & initialization —
-
6
Dynamic Memory Allocation & Memory Management · subtopic 2/3
Allocating and deallocating memory at runtime for flexible, efficient memory management.
malloc/calloc/realloc/free— request, zero-init, resize and release heap blocks.- Runtime allocation & deallocation — sizing buffers when the size is unknown at compile time.
- Memory bugs — leaks, double-free, use-after-free, dangling pointers.
Core concept — stack vs heap: locals live on the stack and vanish when a function returns;
mallocreturns heap memory that lives until youfreeit, so every allocation needs an owner responsible for releasing it.Key idea In C, lifetime is your job: pair every
mallocwith exactly onefree, and always check the returned pointer forNULLbefore using it. -
7
Structures and Unions · subtopic 3/3
Structures and unions as data constructs that organize and manipulate related data elements.
structdefinition & member access —s.fieldon a value,p->fieldthrough a pointer.- Unions — members share one block of memory; only one is valid at a time.
- Memory layout — padding & alignment affect
sizeof(struct). - Intro to data-oriented programming — organising data for cache-friendly access.
Core concept — struct vs union: a
structlays its members out side by side (total size = sum + padding); aunionoverlaps them (size = the largest member), trading safety for compact, reinterpretable storage.Key idea Structs let you name and pass aggregates as first-class values; combined with pointers they are the building block of every node-based data structure later in the course.
File Handling and Preprocessor Directives
file I/O · macros · midtermHow a C program talks to the outside world through files, and how the preprocessor shapes the source before it is compiled. The first midterm sits inside this module, consolidating everything from modules 0–2.
By the end of this module you can
- Open, read, write and close files with the
FILE*stream API, handling errors and releasing resources. - Use preprocessor directives (
#include,#define, conditional compilation, include guards). - Write safe function-like macros and know when an
inlinefunction or constant is better.
-
8
File Input/Output · subtopic 1/3
Reading from and writing to files, with proper error handling and resource management.
- Input/Output —
printf/scanffamily and the standard streams. - Dealing with files —
fopen,fread/fwrite,fgets,fclose. - Error handling & resource management — check return values,
feof/ferror, always close.
Core concept — the
FILE*stream:fopenreturns a handle to a buffered stream; reads/writes go through that buffer and are flushed to disk onfflush/fclose, so failing to close can lose data.Key idea A file handle is a resource just like heap memory: acquire it, check it opened, use it, and release it on every path — including error paths.
- Input/Output —
-
9
First Midterm
First intermediate test covering modules 0–2 and file I/O: C fundamentals, error handling & testing, pointers, dynamic memory, structures/unions and file streams.
Assessment Counts toward the 20% intermediate-tests component (shared with the session-20 mid exam). Expect both conceptual questions and short coding tasks.
-
10
Preprocessor Directives and Macros · subtopic 3/3
Commands that instruct the compiler before compilation, and macros for reusable inline code snippets and constants.
- Preprocessor directives —
#include,#define,#ifdef/#ifndefconditional compilation. - Function-like macros & constants —
#define MAX(a,b) ((a)>(b)?(a):(b)); parenthesise arguments. - Include guards — prevent a header being processed twice.
Core concept — textual substitution: the preprocessor runs before compilation and simply rewrites text — macros have no type checking and no scope, which is why over-using them is risky compared with
constorinlinefunctions.Key idea Macros are powerful but blunt: wrap every parameter and the whole body in parentheses to avoid precedence surprises, and prefer real functions when types matter.
- Preprocessor directives —
Advanced Concepts in C
4 subtopicsA tour of the techniques that distinguish fluent C: operating at the bit level, naming things well with enums and typedefs, building your first pointer-based data structure, and thinking recursively. Together these prepare you for the systems modules that follow.
By the end of this module you can
- Manipulate individual bits with
& | ^ ~ << >>and pack flags into integers. - Improve clarity with
enumconstants andtypedefaliases. - Implement a singly linked list with
malloc'd nodes and pointer surgery. - Design recursive solutions with correct base cases and apply backtracking.
-
11
Bit Manipulation · subtopic 1/4
Binary operations and manipulating individual bits for efficient, optimized solutions.
- Bitwise operators —
&mask,|set,^toggle,~invert,<</>>shift. - Famous tricks — Carmack's fast inverse square root, Morton codes for spatial hashing.
- 1's vs 2's complement — how signed integers are represented in binary.
- Using enums as flags — powers of two OR'd into one integer.
Core concept — masking: to test a bit use
x & (1u << n), to set itx |= (1u << n), to clear itx &= ~(1u << n)— the basis of compact flag sets and hardware registers.Key idea Bit tricks turn many separate booleans into one fast integer and unlock optimisations the compiler can't infer — but they trade readability for speed, so comment them.
- Bitwise operators —
-
12
Enumerations and Typedef in C · subtopic 2/4
Named-constant sets and custom type aliases to enhance readability, maintainability and efficiency.
enumfor named constants —enum Color { RED, GREEN, BLUE };auto-numbered from 0.typedeffor type aliases —typedef struct Node Node;drops thestructkeyword.- Code readability & maintainability — self-documenting names instead of magic numbers.
Core concept — naming as design: an
enumgives a fixed set of states a name and lets the compiler/switch help you cover them; atypedefhides repetitive type spelling and makes intent clear.Key idea Replacing magic numbers with enums and long type names with typedefs makes code read like its problem domain — fewer bugs, easier review.
-
13
Linked Lists · subtopic 3/4
A fundamental dynamic data structure enabling efficient insertion, deletion and traversal.
- Node = value + next pointer —
struct Node { int v; struct Node *next; }; - Insertion, deletion, traversal — relink
nextpointers; walk untilNULL. - Dynamic storage vs arrays — O(1) insert/delete vs O(1) random access trade-off.
Core concept — self-referential struct: a node contains a pointer to its own type, so a list is a chain of heap nodes ending in
NULL; this brings together structs, pointers andmalloc/freefrom Module 2.Key idea Linked lists trade contiguous memory and random access for cheap insertion/deletion anywhere — the classic data-structure trade-off you'll weigh for the rest of your degree.
- Node = value + next pointer —
-
14
Recursion and Backtracking · subtopic 4/4
Solving problems by reducing them to smaller instances, and systematically exploring solution spaces by building and undoing partial solutions.
- Recursion & base cases — a function that calls itself on a smaller input; the base case stops it.
- The call stack — each call gets a frame; deep recursion risks stack overflow.
- Backtracking — choose → recurse → undo, exploring a search tree (e.g. N-Queens).
Core concept — recurrence + base case: a correct recursion needs a base case that returns without recursing and a recursive step that strictly shrinks the problem toward it, otherwise it never terminates.
Key idea Backtracking is recursion plus an "undo": tentatively make a choice, recurse, and if it leads nowhere, revert and try the next — the engine behind solving puzzles and constraint problems.
Concurrent Programming
2 subtopicsModern machines have many cores; this module shows how to run parts of a program simultaneously and — harder — how to keep shared data correct when they do. It moves from creating threads to coordinating them safely.
By the end of this module you can
- Create, join and reason about the lifecycle of POSIX threads.
- Identify race conditions and protect critical sections with mutexes, semaphores and barriers.
- Recognise when higher-level frameworks (OpenMP, MPI) are the better tool.
-
15
Thread Concepts & Lifecycle · subtopic 1/2
Taking advantage of multi-core platforms where parts of a program execute simultaneously, using C's multithreading capabilities.
- Why concurrency — multiple cores let independent work run in parallel.
- Thread creation & lifecycle —
pthread_create→ run →pthread_join. - Basics of concurrent programming in C — passing arguments to and returning from threads.
Core concept — thread vs process: threads of one process share the same address space (and therefore the same heap and globals), which makes communication cheap but means uncoordinated access to shared data is dangerous.
Key idea Concurrency can speed a program up, but shared mutable state is the source of nearly every concurrency bug — the next session is about taming exactly that.
-
16
Advanced Thread Management · subtopic 2/2
Handling common thread issues to build reliable, optimized programs.
- Race conditions, shared/critical data, critical sections — when result depends on timing of interleaved access.
- Synchronisation primitives — mutexes (lock/unlock), semaphores (counted access), barriers (rendezvous).
- Higher-level constructs — OpenMP pragmas for shared-memory parallelism, MPI for message passing.
Core concept — mutual exclusion: a mutex guarantees only one thread enters a critical section at a time, so a read-modify-write on shared data can't be interleaved; the cost is potential contention and, if misused, deadlock.
Key idea Protect the smallest possible critical section: too little locking causes races, too much serialises everything and throws away the speedup.
Networking and Sockets
4 subtopics · mid examThe capstone technical module: writing C programs that talk over a network. It starts from the socket abstraction, builds client–server programs over TCP and UDP, secures them with TLS, and ends by surveying real networked applications. The second midterm sits inside it.
By the end of this module you can
- Explain what a socket is and use the Socket API to send and receive data.
- Build client–server programs and choose between reliable TCP and lightweight UDP.
- Reason about how TLS/HTTPS secures a connection with encryption and certificates.
- Recognise the architecture of real networked applications such as web servers.
-
17
Socket Programming in C for Network Communication · subtopic 1/4
Networking concepts and the Socket API to enable communication across networks.
- Networking concepts — IP addresses, ports, the client/server roles.
- What a socket is — an endpoint for communication, used through a file-descriptor-like handle.
- Using the Socket API —
socket,bind,connect,send/recv.
Core concept — the socket as a file descriptor: once created, a socket is read and written much like a file, which is why network I/O reuses the same mental model as Module 3's file streams.
Key idea A socket is identified by an address+port pair; getting two programs to agree on that pair is the whole game of establishing a connection.
-
18
Client–Server Architectures using TCP and UDP · subtopic 2/4
Network protocols and the client–server model across different transport protocols.
- Introduction to network protocols — the layered model and where TCP/UDP sit.
- TCP & socket I/O —
listen/acceptserver loop; connection-oriented, reliable, ordered stream. - UDP & socket I/O —
sendto/recvfrom; connectionless datagrams, no delivery guarantee.
Core concept — TCP vs UDP: TCP gives a reliable, ordered byte stream at the cost of handshakes and buffering; UDP sends independent datagrams with minimal overhead but no guarantees — you pick based on whether the app needs reliability or low latency.
Key idea The server's
acceptloop and the client'sconnectare the canonical client–server pattern that underlies almost every networked program you'll write. -
19
Secure Connections with Sockets · subtopic 3/4
Securing network connections using standard protocols via C.
- HTTPS and TLS — TLS wraps a TCP socket to add confidentiality and integrity.
- Encryption basics — symmetric vs asymmetric keys; the handshake that agrees a session key.
- Certificates — how a CA-signed certificate authenticates the server's identity.
Core concept — the TLS handshake: client and server use asymmetric crypto and a certificate to authenticate and agree on a shared symmetric key, then encrypt the rest of the conversation with that faster symmetric cipher.
Key idea Security isn't a feature bolted on at the end: TLS sits between your application and the raw socket, so "make it secure" means changing how you open and read/write the connection, not the business logic.
-
20
Mid Exam
Second intermediate test, focusing on the advanced-C and networking material (bit manipulation, enums/typedef, linked lists, recursion, concurrency and sockets).
Assessment Together with the session-9 midterm this makes up the 20% intermediate-tests component.
-
21
Networked Applications · subtopic 4/4
Reviewing real-world networked applications buildable with the course concepts.
- Real-world networked applications — putting sockets, protocols and concurrency together.
- Example: web servers — accept loop + request parsing + concurrent connection handling.
Core concept — synthesis: a simple web server combines almost the whole course — sockets and TCP (Module 6), threads to serve clients concurrently (Module 5), buffers and parsing (Modules 2–3) and careful error handling (Module 1).
Key idea This is where the pieces click: the skills taught separately become one program that does something genuinely useful over a network.
Group Project, Labs & Exams
sessions 22–30The final stretch turns knowledge into a deliverable: a collaboratively built C program, a look beyond C at programming paradigms, flexible lab time, revision, and the project presentations and final exam.
By the end you will have
- Designed, built, tested and documented a C program as a team.
- Presented and defended your project on functionality, code quality and best practices.
- Situated C within the wider landscape of programming paradigms (mainly OOP).
-
22
Group Work Session
Collaborative Program Development — develop a C program as a team, applying course concepts to a real-world problem.
- Group formation — 3–5 members, self-selected or assigned for a mix of skills.
- Program selection — a problem of moderate complexity exercising several course concepts.
- Planning & design — objectives, required input/output, and the tasks to split.
- Task allocation — modules, functions, debugging, testing, docs, integration.
Key idea Group work simulates real software development: communication and clean interfaces between members' code matter as much as the algorithms themselves.
-
23
Group Work Session
Continued collaborative development: integration, testing/debugging and documentation of the group program.
- Code integration — merge individual contributions into one cohesive program.
- Testing & debugging — systematic error identification to ensure correctness.
- Documentation — functionality, I/O spec, design choices, algorithms and per-member contributions.
Key idea The unit-testing and error-handling skills from Module 1 pay off here — a documented, tested integration is what gets evaluated, not just code that compiles.
-
24
Programming Paradigms (mainly OOP)
Introduction to programming paradigms with a focus on object-oriented programming, set against the procedural style of C.
- Procedural vs object-oriented thinking
- Encapsulation, inheritance, polymorphism — the OOP pillars
- How OOP ideas can be emulated in C (structs + function pointers)
Key idea C is procedural, but understanding OOP clarifies why certain C idioms (opaque structs, function-pointer tables) exist and prepares you for later object-oriented languages.
-
25
Programming Paradigms (mainly OOP)
Continued exploration of programming paradigms and OOP concepts, with examples contrasting them against the C techniques learned earlier.
- Abstraction & modularity across paradigms
- When each paradigm fits a problem
-
26
Advanced Concepts (LAB)
Flexible hands-on lab on advanced concepts, with the exact topics chosen depending on the progress of the course — extra time for the trickier material from earlier modules or a deeper dive on a topic of interest.
-
27
Revision
Course-wide revision session ahead of final assessments — consolidating the six modules and clarifying open questions before the final project presentation and exam. :)
-
28
Final Project Presentation & Evaluation
Students present their final projects to the instructor and peers; evaluated on functionality, code quality, design principles and adherence to the best practices learned throughout the course.
Assessment The presentation is part of the 20% group project grade; be ready to explain design choices and individual contributions.
-
29
Final Project Presentation & Evaluation
Continued final project presentations and evaluation, with feedback from the instructor and peers on each group's program.
-
30
Final Exam
Final written exam covering the whole syllabus, consisting of multiple-choice and coding sections.
Assessment The single largest component at 50%; the June/July re-sit (if needed) is one comprehensive exam graded out of a maximum of 8.0.
Key concepts
A quick-reference glossary of the core terms used across the course, in roughly the order they appear. Useful for revision before the midterms and final.
- Translation unit
- A single
.cfile plus its included headers, compiled to one object file before linking. - Declaration vs definition
- A declaration names a thing and its type; a definition also allocates/implements it.
- Pointer
- A typed variable holding a memory address;
*preads the value,&xtakes an address. - Dereference
- Following a pointer with
*to access the object it points to. - Pointer arithmetic
- Adding to a pointer moves it by multiples of
sizeofthe pointed-to type. - Stack
- Automatic storage for locals; freed automatically when a function returns.
- Heap
- Dynamic storage from
malloc; lives until youfreeit. - Dangling pointer
- A pointer to memory that has already been freed or gone out of scope.
- Memory leak
- Heap memory that is never freed, so it is lost for the program's lifetime.
struct- An aggregate type grouping named members laid out side by side in memory.
union- Members share one block of memory; only one is valid at a time.
- Alignment / padding
- Compiler-inserted gaps so members sit at addresses the CPU can access efficiently.
- Assertion
assert(cond)aborts when an invariant the programmer expects is false.- Unit test
- An automated check pinning down a function's expected behaviour (here via GTest/ctest).
- Preprocessor
- A text-substitution pass (
#include,#define) run before compilation. - Macro
- A preprocessor-defined text expansion; no type checking, so parenthesise carefully.
- Bitmask
- An integer whose bits are tested/set/cleared with
&,|,^,~, shifts. - Two's complement
- The standard binary representation of signed integers.
enum/typedef- Named integer constants; and aliases that simplify type names.
- Linked list
- A chain of heap nodes, each holding a value and a pointer to the next.
- Recursion / base case
- A function calling itself on a smaller input, stopped by a base case.
- Backtracking
- Recursion that makes a tentative choice and undoes it if it fails.
- Thread
- An independent flow of execution sharing the process's address space.
- Race condition
- A bug where the result depends on the unpredictable timing of concurrent access.
- Mutex / critical section
- A lock ensuring only one thread runs a protected region at a time.
- Socket
- A communication endpoint, used like a file descriptor, identified by address + port.
- TCP vs UDP
- Reliable ordered stream vs lightweight connectionless datagrams.
- TLS / certificate
- Encryption layer over TCP; a CA-signed certificate authenticates the server.
Bibliography
Compulsory readings (all available digitally). Each entry notes which sessions it supports.
-
The C Programming LanguageThe definitive guide to C, written by the language's creators — the timeless classic referenced throughout as "K&R" and the primary text for the core-language modules.supports sessions 1, 5–8, 10, 12–13 (Modules 0, 2, 3, 4)
-
Practical C ProgrammingA hands-on guide emphasizing efficient, reliable and portable C, from basics to advanced concepts ("PCP") — strong on toolchain, debugging and bit-level work.supports sessions 2–3, 11 (tooling, debugging, bit manipulation)
-
Hands-On Network Programming with CSocket programming in C; writing secure and optimized network code ("HNP") — the reference for the entire networking module.supports sessions 17–19, 21 (Module 6: sockets, TCP/UDP, TLS, applications)