Systems Developer Student at 42 Heilbronn

Building from first principles

Niklas Weber

I write software that operates close to the metal. My work focuses on systems programming, low-level optimization, and understanding how things work beneath the abstraction layers.

Scroll
01

Selected Work

3 Projects
continued
02 2025

miniRT

High-Performance Raytracer in C

High-performance raytracer in C achieving 120+ FPS using SIMD optimization and cache-friendly data structures.

Problem: I started building a basic raytracer in C to understand computer graphics fundamentals—ray-sphere intersections, Phong lighting, reflections, and shadows. The initial naive implementation achieved only 1-5 FPS when rendering complex scenes with multiple light sources and geometric primitives. For real-time interaction, I needed at least 60+ FPS. This bottleneck wasn't about the algorithm's correctness; it was a systems programming challenge that demanded low-level optimization expertise.

Solution: Rather than accept the sluggish performance, I rebuilt the core rendering loop with C systems programming principles at its foundation. The approach combined SIMD vectorization using SSE/AVX intrinsics for batch vector operations, cache-efficient data structures using structure-of-arrays layouts instead of array-of-structures, and multi-threaded tile-based rendering to leverage multiple CPU cores. Every design decision prioritized high-performance execution on actual hardware.

Technical Approach: The optimization work centered on three pillars: vectorization, memory hierarchy, and parallelism. Vector operations—dot products, cross products, normalizations—are ideal for SIMD; SSE intrinsics process 4 floats in parallel, while AVX handles 8. I restructured data to exploit CPU cache locality by storing all X-coordinates contiguously, then Y, then Z, enabling prefetcher-friendly access patterns. The renderer divides the framebuffer into tiles, with each thread processing one tile independently, eliminating synchronization overhead. Profiling with `perf` and cycle-accurate analysis revealed that the ray-primitive intersection test was the hottest code path—this became the focus of aggressive optimization techniques. This project shares architectural discipline with the ELO leaderboard and minishell projects, where understanding system constraints drives design decisions.

Results & Learnings: The optimized raytracer renders at 120+ FPS—an 80x improvement over the baseline. Complex scenes with 10+ light sources and hundreds of geometric objects maintain interactive frame rates. This project taught me that systems programming at the graphics layer isn't just about algorithms; it's about respecting CPU cache behavior, instruction pipelines, and memory bandwidth. Profiling-driven optimization revealed counterintuitive insights: removing apparent "optimizations" that stalled the CPU pipeline actually made code faster. I learned to read assembly, understand why branches hurt performance, and design data layouts around hardware reality rather than abstract convenience.

Language
C
Concepts
Linear algebra, optics simulation
miniRT raytracer C implementation with sphere rendering, shadows, reflections and Phong lighting model
Fig. 2 — Rendered output
03 2025

minishell

POSIX-Compliant Shell in C

POSIX-compliant Unix shell in C demonstrating process management, file descriptors, and signal handling.

Problem: Understanding how a Unix shell works requires deep knowledge of operating system fundamentals. Most developers interact with shells as black boxes, unaware of the intricate machinery handling process spawning, signal management, and file descriptor manipulation beneath the surface. Building a shell from scratch meant confronting these abstraction layers directly—how does the OS actually execute commands? What happens when a child process terminates? How do pipes and redirections work at the kernel level?

Solution: I implemented a POSIX-compliant shell in C that replicates bash's core functionality. This wasn't a toy exercise; the shell handles the complete command execution pipeline: lexical analysis and parsing transform user input into an abstract syntax tree, and an execution engine processes these tokens using genuine Unix system calls. The implementation includes pipe management, input/output redirection, environment variable expansion, and comprehensive signal handling—everything necessary for a functional, production-aware shell.

Technical Approach: The project centers on three critical systems programming concepts. First, process management via fork and exec: each command spawns a child process using fork(), which then executes the target program with exec family calls. This separation of process creation and program execution is fundamental to Unix design. Second, file descriptor manipulation through dup2() redirects stdin/stdout/stderr, enabling pipes and file-based I/O redirection. Third, signal handling with sigaction() ensures the shell responds correctly to SIGCHLD when child processes terminate, preventing zombie processes. The parsing phase uses recursive descent techniques to build command structures, then the executor walks the tree and applies these low-level primitives. This project shares architectural rigor with the raytracer and ELO leaderboard, where systems-level understanding drives correctness.

Results & Learnings: The resulting shell executes complex commands with pipes, redirections, and background jobs reliably. Building minishell transformed my understanding of Unix architecture—I learned viscerally how shells are orchestrators of the OS, not autonomous entities. Signal handling taught me why race conditions in concurrent systems are insidious: a process could exit between checking its status and reaping it. This hands-on exploration of process management, file descriptors, and IPC deepened my appreciation for why low-level programming discipline matters. Every feature required reasoning about kernel behavior, not just abstract programming concepts—that alignment between code and hardware reality is what systems programming demands.

Language
C
Focus
Unix process management, system calls
02

About

I'm currently at 42 Heilbronn, a peer-to-peer programming school where learning happens through building.

My focus is systems programming—the layer where software meets hardware. I find satisfaction in understanding how things work at their most fundamental level, whether that's memory management, process scheduling, or network protocols.

Beyond C and Unix internals, I work with Go for concurrent systems, and TypeScript for web applications when the problem calls for it.

Technical Vocabulary

  • Systems C, C++, Go
  • Web TypeScript, React, Node
  • Data PostgreSQL, Redis
  • Tools Linux, Docker, Git

"The best way to learn is to build, break, and rebuild."

03

Contact

Let's discuss your project

I'm interested in systems work, performance-critical applications, and projects where understanding the fundamentals matters.