About me
Programming has been a passion of mine for as long as I can remember. It began as a childhood hobby, gradually became a serious interest, and eventually became my profession. Even after all these years, however, it has never stopped being a hobby as well.
How it all started
It all began while I was still in elementary school, when I asked for an IBM-compatible PC for Christmas. My family tried to convince me to choose a C64/128, an Amiga or another computer that was cheaper, more suitable for children, and better for games and multimedia.
I was not particularly interested in playing games, though. Several of my friends already owned C64s, so I was somewhat familiar with them. Another friend had a PC at home. It was less appealing as a games machine, but I was fascinated by its possibilities. It offered no colorful graphics or synthesizer-like sound. It was mostly limited to text mode and black-and-white Hercules graphics, but it had a lot of RAM and, for its time, a very powerful CPU.
My first computer was an 8 MHz 8088 XT with 1 MB of RAM, EGA graphics, a monochrome amber monitor, two 5.25-inch floppy drives, and no hard drive. The graphics hardware supported 16 colors, but on my monitor they appeared as 16 different levels of amber brightness.
I later received a C64 from relatives, but for me it remained mostly a gaming machine. The PC was where I learned to program.
I started with GW-BASIC and x86 assembly, followed by several other BASIC dialects and clones. Some of my earliest assembly experiments involved low-level keyboard handling and system interrupts. One of them was a keyboard logger, which was certainly a questionable teenage project, but it taught me a great deal about how closely software could interact with the machine.
Soon after leaving elementary school, I discovered Turbo Pascal. It allowed me to move beyond small experiments and write my first useful applications.
None of my early projects ever became widely used or particularly successful. A friend and I once wrote a mathematics learning application in a compiled BASIC dialect. Later, I created various Delphi tools for friends and family. I also once reimplemented bzip2 in Java, mostly because I wanted to understand how it worked.
From DOS to graphical applications
I continued using the 8088 for a remarkably long time. My family simply could not afford a 286 or 386, so I eventually upgraded directly from the XT to a 486.
The 486 also brought Windows into my life, but I initially had little use for Windows 3.1 as a programming platform. I continued to work mainly in DOS.
That changed with Windows 95 and Delphi. Its object-oriented Pascal environment finally gave me practical access to graphical application development and made it possible for me to build the kinds of GUI applications that had previously seemed out of reach.
Then Java appeared with a major promise: platform-independent software. That idea fascinated me, so I learned Java before I had properly learned C and at a time when C++ was little more than a name to me.
Java stayed with me for many years. When I began using Linux in parallel, however, C became unavoidable.
The slow road to the Internet
I gained Internet access relatively late at home. For a long time, I used a 28K modem, followed later by a 56K modem.
There were no flat-rate plans available to me at the time. Internet access was charged by the minute, which made efficiency and data usage very real concerns. Downloads had to be planned carefully, unnecessary traffic cost money, and large files could require a great deal of patience.
It took a very long time before I finally received a 128 Kbit/s ADSL connection. Even today, my Internet connection is comparatively slow. I am still far away from gigabit speeds and do not even have a 100 Mbit/s connection.
Growing up with limited bandwidth, limited storage, and limited computing resources probably contributed to my preference for efficient software. Resources should be used deliberately rather than treated as unlimited.
Learning English
For the first half of my school years, I was only an average English student. Over time, however, my English improved considerably, and by the time I graduated from high school, I was one of the top students in my class.
That improvement began even before I had Internet access. I read a great deal of technical documentation in English, since much of the useful material about computers and programming was unavailable in German. This gave me a strong technical vocabulary and made me comfortable reading complex English texts.
English-language computer games were another important influence. I especially enjoyed adventure games by Sierra and LucasArts, where understanding dialogue, descriptions, and instructions was often essential to making any progress. Role-playing games also contributed a great deal to my vocabulary and reading comprehension.
When I eventually gained access to the Internet, an entirely new world opened up to me. I was an anime fan, but there was very little local anime fan community where I lived, so I looked for communities online instead. English was usually the common language, which gave me a reason to use it actively rather than merely read it.
At the time, dubbed versions of many anime series were difficult or impossible to obtain, while Japanese releases with English subtitles were often much easier to find. I therefore spent a great deal of time reading English subtitles and communicating with other fans.
Technical documentation had taught me technical English, while adventure and role-playing games had expanded my general vocabulary and reading comprehension. Anime and international fan communities added everyday language, informal expressions, and conversational English that school lessons rarely covered.
The web, Unix, and formal education
As the World Wide Web grew into a major platform, I taught myself HTML. JavaScript and PHP followed over time, and regular expressions became one of my particular interests.
I later began studying computer science in a traditional German Diplom program. While attending university, I also became certified as a Java developer. I subsequently started vocational training as an IT specialist in software development and eventually left university without completing the Diplom program.
By then, I had completed roughly the amount of study that would later have been associated with a bachelor's degree. However, bachelor's and master's degrees had not yet been introduced into the program at the time, so there was no bachelor's degree I could have earned or formally completed.
During that period, I also learned CSS, Perl, and SQL.
At the same time, I used Windows less and less. Eventually, I left it almost entirely behind and discovered that it was perfectly possible to live and work without it.
At university, I worked extensively with Unix systems such as AIX, IRIX, and Solaris, but also with Linux.
I only became interested in Macs with Mac OS X 10.2. I had never liked the classic Mac OS and found it rather unpleasant to use. Mac OS X was different. Its Unix foundation and its roots in NeXT made it a much more compelling system to me. NeXT had always seemed far more interesting from a technical perspective than the classic Macintosh platform.
Today, I primarily use Apple Macs as my desktop and development systems. I use Linux for servers, embedded devices, test systems, and as the base for systems I build, but not as my primary desktop environment.
Professional development
By that point, programming had naturally grown from a childhood hobby into the work I wanted to do professionally.
Once I began working as a software developer, new technologies followed in rapid succession. I worked with Ruby and Objective-C, later with Swift and TypeScript, and with a variety of niche languages depending on the needs of individual projects.
Some projects even involved bare-metal programming. I have worked with ARM assembly, and I have even written OpenGL shaders for a commercial project.
I have only a basic familiarity with C++, Python, and Rust. When reading code in those languages, I can often follow parts of the information and data flow and get a rough idea of what is going on, but I do not know them well enough to develop in them myself. At least, not yet. I am a quick learner and can usually pick up new languages relatively easily.
Why I still write my own software
One of my main motivations is dissatisfaction with existing solutions.
Software rarely convinces me in terms of quality. Too often, developers appear to ignore what users actually ask for while implementing features that few people need and nobody requested. At the same time, basic usability, reliability, efficiency, and long-term maintainability are neglected.
When existing software does not solve a problem properly, my natural response is often to consider building a better solution myself. That does not mean every idea becomes a finished or successful project. Most do not. For me, however, designing and implementing an alternative is often the most direct way to understand the problem and explore how it could be solved differently.
It is also simply fun. Even when an idea leads nowhere, I have still been doing it for my own entertainment.
How I approach software
I prefer code that is simple and efficient, but simple does not mean simplistic.
Software development often rewards solutions that are quick to adopt but considerably more complex than the original problem requires. These solutions can overshoot the actual goal while still failing to remain extensible, maintainable, or suitable for future requirements.
I prefer to understand a problem thoroughly and build the smallest design that solves it well without closing off sensible paths for later development. I value software that is robust, understandable, and built to remain useful for a long time.
I appreciate polymorphism and abstract interfaces, but I am skeptical of traditional object-oriented programming, particularly inheritance. Inheritance can create rigid and fragile relationships between components and is often used where composition or explicit interfaces would be safer and easier to understand.
I strongly prefer statically typed languages. Type checking during the build process prevents entire classes of avoidable errors before the software is ever executed.
I also avoid unnecessary dependencies. A dependency may save some initial effort, but it introduces external complexity, compatibility risks, maintenance obligations, supply-chain concerns, and decisions outside my control. Dependencies are sometimes necessary, but their long-term cost should justify their value.
Low-level development and C
I feel more at home close to the system than in user interface work.
My favorite development platforms are macOS and Linux, particularly for native applications, system software, network services, protocols, embedded systems, and tools that solve practical problems without unnecessary complexity.
When given a choice, I prefer C.
C has relatively few hidden runtime mechanisms. It gives me direct control over memory, data structures, and representation. It is highly portable, produces small binaries, requires no large runtime environment, and can be extremely fast. I also appreciate the fact that C does relatively little behind my back. The language may require more care from the programmer, but the relationship between the code and the resulting program is usually much clearer than in larger and more abstract environments.
I enjoy understanding systems from the lowest practical level upward. I would rather know what a component is doing than treat it as an unexplained black box.
For higher-level development, I currently consider TypeScript the best language. I prefer POSIX shell scripting for scripting tasks, but for tasks beyond shell scripting capabilities, I'd prefer Ruby over Python, Perl, or PHP.
AI-assisted development
Today, I also use AI-assisted development tools, but I see AI as a tool rather than a replacement for engineering knowledge and programming skills. It's a tool, just like a compiler is a tool.
A non-developer using AI is somewhat like a person who owns the best agricultural machinery but knows very little about farming. The machinery may still be useful, but it does not determine the quality or quantity of the harvest. Knowledge, judgment, planning, and experience remain essential.
AI can accelerate development, help explore alternatives, and reduce repetitive work, like writing documentation or unit tests. It cannot replace the ability to recognize whether a solution is correct, appropriate, maintainable, or secure. It cannot replace the need to design software architectures, interfaces, APIs, or write code in general.
Beyond programming
Outside software development, I have a strong interest in science, particularly particle physics, quantum physics, and astronomy.
I am also interested in politics, psychology, sociology, and anything related to technology.
I have little interest in social media and am largely absent from social networks. I occasionally use YouTube for educational, scientific, or technical content, but otherwise I am difficult to find on social platforms.
My Codeberg projects
The projects I publish on Codeberg are entirely personal hobby projects.
They are not related to my employer, my professional work, or any commercial activity. They represent my own interests, experiments, and ideas, and I make them available in case someone else finds them useful.
I use Codeberg because I prefer an independent, community-oriented platform over hosting my personal projects on a service owned by Microsoft.
Licenses vary from project to project, so please check the license information in each repository carefully.
Contact
You can contact me at 19plw1f47@mozmail.com.
This is a heavily spam-filtered relay address and may be deleted at any time. Messages that appear too much like spam may not be delivered.