Why Serene?
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
—Martin Fowler, 1999
If you do a Google search for "What programming language should people learn first?" in 2021, you'll see a lot of results for Python. Indeed, my first college computer science class several years ago was taught in Python, after they had switched from teaching MATLAB in previous years. While systems programming languages like C and C++ continue to be widely used within the industry, they are often taught later on and seen to be more difficult than high level languages like Python.
The term "systems programming language" has always been a bit vague, as many of the characteristic features, like static type checking, efficient optimizing compilers, support for concurrency, and low-overhead memory management, are still desirable for all kinds of general purpose programming. These advantages may lead one to wonder why systems programming languages aren't taught and used everywhere. But Python, which lacks nearly all these features, continues to be a popular choice for both beginners and for fast prototyping of applications due to better readability. Python's syntax often closely mirrors a natural English description of a process, while C is dense with symbols and abbreviations. But beyond syntax, the complexity of manual memory management in C can lead to a mismatch between how someone's code actually behaves and how they expect it to behave, and the language has few safeguards to prevent you from breaking things. Rust, a newer systems programming language, introduced a new memory management system based around ownership of objects, which provides those safeguards by default. But it is still quite complex, and an inaccurate mental model of how the system works can lead to a frustrating experience trying to get your code to compile.
Serene is a systems programming language designed to be naturally understood. It uses an ownership-based memory management system inspired by Rust, but it constrains the system to a simpler subset of the same idea. It uses keywords instead of symbols for common operations, and it has a minimalist design so there are less concepts to memorize. Serene is rather strict about its rules, but that leads to a consistent and organized procedural style for all of its code, where one can read and understand each function independently of any other code. It is the goal of the language to make the process of developing high performance software effortless, enjoyable, and—well, serene.