trainwreck design
Jes Olson j3s@c3f.net
Wed, 14 Aug 2024 18:04:20 -0400
2 files changed,
376 insertions(+),
0 deletions(-)
M
templates/thoughts.html
→
templates/thoughts.html
@@ -4,6 +4,7 @@ {{ template "nav" . }}
<div id="main"> <h3>thoughts</h3> <h4>2024</h4> +<li><a href="/thought/trainwreck-design.html">trainwreck design</a></li> <li><a href="/thought/stop-using-fandom.html">stop using fandom</a></li> <li><a href="/thought/my-deployment-platform-is-a-shell-script.html">my deployment platform is a shell script</a></li> <h4>2023</h4>
A
thought/trainwreck-design.html
@@ -0,0 +1,375 @@
+ trainwreck design + 2024-08-14 + +the year is 2024, and i want to know my disk space +usage. + +i recall a simple command i've used probably +tens of thousands of times. + +df -h + +the year is 2024. instead of sensible output, +i get... this. + + + + + + +Filesystem Size Used Avail Use% Mounted on +dev 7.7G 0 7.7G 0% /dev +run 7.8G 1.5M 7.8G 1% /run +efivarfs 184K 150K 30K 84% /sys/firmware/efi/efivars +/dev/nvme0n1p2 234G 193G 30G 87% / +tmpfs 7.8G 860K 7.8G 1% /dev/shm +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-udev-load-credentials.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup-dev-early.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-sysctl.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup-dev.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-vconsole-setup.service +tmpfs 7.8G 20M 7.7G 1% /tmp +/dev/nvme0n1p1 511M 296M 216M 58% /boot +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup.service +tmpfs 1.6G 32K 1.6G 1% /run/user/1000 +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-resolved.service + + +my eyes glaze over. somehow, i can never seem to find +the disk i actually care about. + +somehow, "mount" is even worse: + + +proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) +sys on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) +dev on /dev type devtmpfs (rw,nosuid,relatime,size=8063880k,nr_inodes=2015970,mode=755,inode64) +run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755,inode64) +efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime) +/dev/nvme0n1p2 on / type ext4 (rw,relatime) +securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) +tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,inode64) +devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) +cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot) +pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime) +bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700) +systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=39,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=1374) +mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime) +hugetlbfs on /dev/hugepages type hugetlbfs (rw,nosuid,nodev,relatime,pagesize=2M) +debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime) +tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime) +tmpfs on /run/credentials/systemd-udev-load-credentials.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) +tmpfs on /run/credentials/systemd-journald.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) +fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime) +tmpfs on /run/credentials/systemd-tmpfiles-setup-dev-early.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) +configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime) +tmpfs on /run/credentials/systemd-sysctl.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) +tmpfs on /run/credentials/systemd-tmpfiles-setup-dev.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) +tmpfs on /run/credentials/systemd-vconsole-setup.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) +tmpfs on /tmp type tmpfs (rw,noatime,inode64) +/dev/nvme0n1p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro) +tmpfs on /run/credentials/systemd-tmpfiles-setup.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) +binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime) +tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=1615816k,nr_inodes=403954,mode=700,uid=1000,gid=1000,inode64) +portal on /run/user/1000/doc type fuse.portal (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) +tmpfs on /run/credentials/systemd-resolved.service type tmpfs (ro,nosuid,nodev,noexec,relatime,nosymfollow,size=1024k,nr_inodes=1024,mode=700,inode64,noswap) + + +jesus christ. + +if you think that the above output is ugly, let +me assure you, it's even worse in a terminal. + +each 150+ character line wraps around my buffer +like a boa constrictor, completely suffocating any +sense of meaning. + +my journey to know how much disk space i had left +has left me confused. annoyed. + +but even worse, i feel disrespected in my own ~home. + + +and i don't like being disrespected. especially +by WORDS and LETTERS and UTF-8??? + +after all, this is MY terminal. + +a program just waltzes in and spews +shitty output all over MY tty? + +HELL NO + +oh, but tmpfs's are so very useful? fuck you. +oh, efivars are important becau- FUCK you. + + +I AM A REGULAR LINUX USER + +JUST SHOW ME MY DISKS PWEASE + +THIS WAS SO MUCH BETTER 10 YEARS AGO + +I AM SO SICK OF "TRAINWRECK DESIGN" + +O DEAR LORD, + +IS THERE ANY END TO THIS TORMENT? + + + + + + + OO O o o o... _______________ _________________ + O ____ | | | | + ][_n_i_| ( ooo___ | trainwreck | | design | +(__________|_[______]_|_____________|_|_______________| + 0--0--0 0 0 0 0 0 0 + +as open ecosystems grow, they tend to experience +what i like to call "trainwreck design" + +basically: when many things are independently designed +and developed, then smashed together, the user +experience suffers. things feel "wrong" because +users aren't stupid - they can sense that there was +no coherent vision. + +take the GNU/Linux ecosystem for example. +"trainwreck design" happens here all of the time. +programs are designed independently, smashed together, +everyone spritzes holy water on their keyboards, +and things mostly sort of keep moving forward. + +but this results in programs like df. they grow weird +appendages, have millions of esoteric flags, and worst +of all, they just feel obviously wrong. + +"trainwreck design" is not intentional design. + +in "open source" communities, these problems are +often worsened - if design disagreements get too +intense, forks arise and kill momentum. + +people have tried using consensus - but consensus +doesn't really work in the design realm. + +when an open, bazaar-like[0] community grows too large, +it becomes impossible to insist on a coherent design +philosophy, people fork around you. rifts develop. +alternatives appear. electing a "design leader" is +not possible because there are simply too many points +of control. + +in other words... + ____ + | | +.----------------------------------------------.| | +| | | +| A camel is a horse designed by a committee | | +| ._|____|_. +'---------------------------------------------\\|o_o | + |:_/ | + // \ \ + (| [4] | ) + +i have my own theory: bazaar-style development does +not necessitate committee-style design. + +a bazaar can in fact have a unified vision without +relying on outright authoritarianism. + +in fact, this is already happening - many projects +that are very much bazaar-like in nature have a strong +visionary + designer (or several), who typically hold +leadership positions. + +but it's rare. + +typically, this position is affectionately called the + + ██████ ██████ ███████ ██ + ██ ██ ██ ██ ██ ██ + ██████ ██ ██ █████ ██ + ██ ██ ██ ██ ██ ██ + ██████ ██████ ██ ███████ + or "benevolent dictator for life" + +for a good example, see the hare[1] project's BDFL page. + +Drew Devault runs the hare project, and wrote that page. + +my conclusions: + - Drew is inclusive of the broader hare community + - Drew has the final say over certain decisions + - Drew will not "abuse" his position + - Drew has "the vision" + - ... + - Drew is the designer. + +if you disagree that hare is designed, try reading +the style[2] guide and this[3] post on hare's design +philosophy. + +"Hare Is Boring" is an assertion made by someone with +a strong innate sense of design. + +a contributor can immediately read, digest, and align +with Hare's vision. they can contribute code in +an expected style with very little oversight. + +they can get excited about hare, because when design +is this up-front, it's exciting to be a part of. + +design requires vision. direction. involvement. + +but design does not require the designer to do +all of the work, or be a gate through which +all work flows. + +the designer does _not_ have to be a dictator. + +this is neither a bazaar nor a cathedral - it's +somewhere in between. + + + + + the cathedral, the bazaar, and... + +████████╗██╗ ██╗███████╗ ██╗ ██╗██╗██╗ ██╗███████╗ +╚══██╔══╝██║ ██║██╔════╝ ██║ ██║██║██║ ██║██╔════╝ + ██║ ███████║█████╗ ███████║██║██║ ██║█████╗ + ██║ ██╔══██║██╔══╝ ██╔══██║██║╚██╗ ██╔╝██╔══╝ + ██║ ██║ ██║███████╗ ██║ ██║██║ ╚████╔╝ ███████╗ + ╚═╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚══════╝ + + .' '. __ + . . . (__\_ + . . . -{{_(|8) + ' . . ' ' . . ' (__/ + +there is third style of software design that is often +conflated with the other two. + +i'm calling it "the hive", and it's a bazaar/cathedral +hybrid. + +hives one or more leaders who influence direction +and vision, but who do _not_ act as dictators. + +hive leaders: + - talk about vision, meaning, direction + - let people own their own decisions + - provide context and warnings + - try their hardest to not act like dictators + +people in hives make decisions autonomously, but +with shared understanding and context. the role +of the hive leader is to keep track of what's +happening, try to keep everyone aligned, get +people excited about a vision, but let people +make their own technical decisions along that +path. + +this dramatically reduces the likelihood of trainwreck +design, and also keeps the communal "vibe of the bazaar" +alive. + + +in other words, + + if somebody watches all of the trains + + maybe we can stop some of them + + from crashing. + + + +love, + + jes + + + + + + + + + + + + + + + + + + + + + + + + + + +P.S. the year is 2035. + + you run "df -h" on your holo-deck. + + +Filesystem Size Used Avail Use% Mounted on +dev 7.7T 0 7.7T 0% /dev +run 7.8T 1.5G 7.8T 1% /run +efivarfs 184K 150K 30K 84% /sys/firmware/efi/efivars +/dev/qua0n1p2s4g8z7@ 234T 193T 30T 87% / +tmpfs 7.8G 860K 7.8G 1% /dev/shm +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-udev-load-credentials.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-systema-systemb.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup-dev-early.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-sysctl.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-kitchen-sink.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup-dev.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-vconsole-setup.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-dishwasher.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-mothership.service +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-taxes.service +tmpfs 7.8G 20M 7.7G 1% /tmp +qtmpfs 7.8G 20M 7.7G 1% /tmp-quantum-rebind +/dev/qua0n1p38fuqff@ 234T 193T 30T 87% / +/dev/qua0n1p1984dja@ 511M 296M 216M 58% /boot +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-tmpfiles-setup.service +tmpfs 1.6G 32K 1.6G 1% /run/user/1000 +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-resolved.service +/dev/quantum0 dead 0 1.0T 0% /quantum/superposition/cat/0 +/dev/quantum1 alive 0 1.0T 0% /quantum/superposition/cat/1 +cybermem 1P 750T 250T 75% /run/cybermemory/cybermem-setup +cybermem 1P 750T 250T 75% /run/cybermemory/cybermem-init +cybermem 1P 750T 250T 75% /run/cybermemory/cybermem-run +cybermem 1P 750T 250T 75% /run/cybermemory/cybermem-RUN +virtualsocks 64G 2G 62G 3% /run/vsockies + + + + + + + + +(\(\ +(-.-) +(")(")* + +[0]: https://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar +[1]: https://archive.is/H6qQA +[2]: https://archive.is/ypKFZ +[3]: https://archive.is/9762X +[4]: ty to dylan araps for this ascii thingy + +thanks to Joan Stark for much of the bee ascii art