> Even hobby projects are dull because they're done in mere days.
It depends what you're building, and why you're doing it.
For example I've always been interested in compilers and interpreters, and I've spent the past few months writing (by hand) a lisp compiler.
It's nothing special, nobody will use it, and existing solutions already exist. But I've had a lot of fun getting things working.
To highlight two examples, and bearing in mind my output binaries are statically linked with no libc, I wrote a garbage collector in amd64 assembly. Getting that working took a couple of weeks, as I kept finding random segfaults and issues. But now? Now I could write something similar in an afternoon. (And because it was for learning I chose stop© instead of mark&sweep. It seemed simpler and easier.)
Secondly I realized, belatedly, that I could implement the "(syscall N arg1 arg2 ..)" primitive in my lisp. Which meant that I could write wrappers like this:
(defconst SYS_mkdir 83)
(defun mkdir (path)
"Create the given directory."
(if (< (syscall SYS_mkdir path (octal "0o755")) 0)
nil
1))
And that let me remove a bunch of assembly code I'd written. Sure writing "system" isn't hard it's just a combination of fork/dup/exec/wait, but I wrote that in assembly using syscalls, and now I have an implementation in more readable lisp.
Nobody will find it too interesting, I'll say again, but writing a compiler (in golang) that has it's own static runtime written in pure assembly? I'm sure some models will eventually one-shot that, but it won't teach anybody anything.
For me hobby projects are either a) to solve a need (which is what led to me writing a toy CP/M emulator), or they're for learning. And for learning the whole point is to type the code yourself, identify the inevitable bugs, and make iterative improvements.
Looking at what I have now? It feels good. Despite the existance of other lisp interpreters, compilers, or the random LLM stuff people do.
It's not a competition, I've not lost anything, and now I think I've internalized the SysV ABI convention, learned about the limits, and implemented trivial things like "print a floating point number in assembly". As well as learning about how to invoke linux syscalls to read the entries in a directory, & etc.