The Simple Useful System Challenge

By Macoy Madson. Published on .

This is a challenge to create a personal computing system which is:

Apologies for the somewhat free-form nature of this post. Much of it comes directly from my personal notes, which weren't exactly written for public consumption. If there is interest I will get around to polishing up this content.

Entries

None yet!

If you believe you have a viable entry to this challenge, email me.

Beware

A serious attempt at this challenge will steal months of your life away.

You will learn a lot and become a more skilled programmer, but it will cost you a significant amount of time and energy.

Challenge criteria

The following criteria must be met for the system to be considered compliant.

These criteria are chosen deliberatly to exclude many existing systems or approaches. They are chosen such that if followed, I believe a truly unique, interesting, and powerful system will result. You can build whatever you want, but if you try to conform to these it will be easier to compare with other peoples' systems making this attempt.

Use less than 100,000 lines of any code total

All of these exclusions of code should not be read as to minimize the benefit of eliminating these other things, e.g. not requiring any firmware on the machine to run. The less complexity there is anywhere in the entire stack, the better.

Bootstrapping

If I use GCC to build Tiny C Compiler, then use Tiny C Compiler to build itself, do I need to count GCC?

I say no, you don't need to count GCC then, but you get bonus points if you can build the thing using an e.g. "bring your own interpreter" idea, which in theory could be done by hand or something crazy.

The bring-your-own-interpreter is actually a nice idea because it removes the requirement for a specific tool, which maybe is a way of getting around the "eventually you need to count some giant dependency" problem. The interpreter, however, would still count against the lines of code!

There could be said to be a "seed executable", which is allowed to bootstrap the system so long as A) the system can build the seed executable from source and B) the executable is under a specified size (e.g. 5 MiB), but I would be pretty skeptical of this and would need to be convinced it was fair and in spirit of the challenge.

The system must run on bare metal

The system does not depend at all on a network connection

This requirement is to exclude any tomfoolery around actually doing the computation on a server somewhere else, and just having the system be a terminal or dumb client.

By network, I mean any means to connect one machine to another. Wired or wireless, bluetooth, etc. all count under this specification.

The system should display its output to a screen connected to the machine through its standard video ports

The system can receive keyboard input via USB

The user can create and run new programs within the system

Could I make a simple game, or a spreadsheet application, or a program to track my budget, or a paint application in your system? If not, you are stretching the Usefulness criteria.

The system has reasonable facilities for coping with errors and debugging newly created programs

By error, I mean the execution of an instruction which causes the program to no longer be able to be run. I do not mean logical errors.

This requirement is specifically to make the creation and running of new programs requirement more rigorous, because it is unreasonable to expect someone to write programs successfully if they don't have any recourse when they make mistakes.

The user's programs can save data that can be loaded even after the system has been rebooted

To put it simply, the system must be able to remember data for the user even after it has been turned off and back on.

Other storage media can be required from the user in order to meet this request.

The system targets modern hardware

This challenge is about making a simple system on modern hardware.

While I respect efforts to make new things for old hardware (e.g. retro computing, making things for 6502/Z80, etc.), I want to emphasize looking towards the future of computing, which includes the present and future of computing hardware.

Your system can (and practically, should) target a specific piece of hardware. For example, you could target the Raspberry Pi 5, or a specific ESP32 system-on-a-chip board. The hardware should be modern (still in production) and publicly available (not just in your garage, and not locked down like a modern game console).

If you build your own hardware, that's cool, but maybe save it for a future "Simple Useful Hardware" challenge. Do let everyone know you've done this though; the more attempts at new hardware, the better.

Bonus points

Bonus points are granted for creating systems that approach practical usability more than just the bare minimum specified previously.

Rationale for challenge

Technical recommendations

The following are some of my thoughts and speculation on how a system like this could evolve, and maybe recommendations for creators on how to make their system more appealing to me (and by extension, others with similar values).

Thanks and inspiration

For my attempt (Tiny C Compiler-based toolchain targeting Raspberry Pi 4) specifically:

Talks, projects, inspiration: