73 karma · joined January 29, 2023
With all that said, my sense is that hardware engineering has its own heap of Sisyphean problems and complexities. I definitely would not go back to working on hardware engineering problems like I did super early in my career (a mix of embedded firmware, device drivers, PCB design, and web development). I shudder at the thought of ever working with anything Verilog/VHDL, Xilinx, or SPICE ever again, or debugging PCB designs on the bench top in the lab with an oscilloscope and a logic probe. At least in school I ran more than a few bodge wires to patch a mistake in a PCB design iteration. Maybe in some sense, it's a blessing that those linear systems theory abstractions fall apart utterly in RF engineering problems, and one has to contend with the fact that all circuits radiate. At least circuits that still contain the magic smoke.
For context, Girard is a mathematical logician, philosopher, and co-discoverer of the type system System F (Haskell, ML, etc.). The book is a monograph on proof theory, and I was interested in learning more about affine and linear logic to deepen my understanding of Rust and other language ecosystems focused around the ability to explicitly model resources. However, along the way, I learned some other great things: (1) continental philosophy is deep and cool; (2) mathematical writing can be simultaneously rigorous, clear, and hilarious; and it reinforced (alongside Alain Connes's Noncommutative Geometry, and various French philosophers) (3) French academic writing is both frustratingly and delightfully idiosyncratic. Girard writes polemically about other aspects of knowledge, mathematics, etc., and there's heaps of dry humor and anecdotes throughout the book. It's a hard book to read even by pure mathematics standards--a topic not exactly known for being a brisk read--but it was worth it just for the side discoveries alone.
I was a game collector even when I was a child back in the heyday of console generations 4 and 5 all the way into my mid twenties, and also a game player since then up to the present as well. When I was much younger I used to love collecting original hardware and media complete in box and everything, and I kept everything I got when it was new in absolutely pristine condition (I was a very atypical child) but as I got older I grew tired of the collecting aspect of video games and sold everything off. At some point it dawned on me I was just buying stuff and putting it in a box (falling into the kit quadrant) and not really playing the games at all. After realizing all that, and when I had acquired everything I wanted (I tended to collect a mix of only games I liked + genre instead of by system, so my collecting requirements were much smaller and easier to achieve), the fun was over and I cashed out some years later. With retrogaming I now vastly prefer a Raspberry Pi and a gamepad in the living room. Fortunately I was able to get in and get out of the game collecting hobby when it was a fairly cheap hobby to participate in (i.e. when CIB copies of classic games were like tens of dollars at most).
I was also an avid tabletop gamer who was into the playing and collecting aspect of Magic: The Gathering and other TCGs, particularly Legend of the Five Rings, Vampire: The Eternal Struggle, and VS System. I started playing MTG way back in the ancient days and had a particular taste for vintage. I also played standard, booster draft, legacy, and extended, but vintage was always my favorite. Back then vintage was accessible on a high school budget with planning and dedication, and wasn't the rich man's game it now, at least if one is not using proxies. For a long time I was both into the competitive side of the game, as well as the collecting side of the game. Over time I grew tired of the playing aspect of Magic: The Gathering and vastly preferred the collecting aspect of it, before life priorities changed entirely and I lost interest in TCGs completely.
I don't really do the collecting/kit hounding side of any hobbies anymore, I prefer the actual doing of the thing instead, but I am grateful I was able to get in, enjoy it fully, and get out of the collecting aspect of both video games and MTG long before both became impossibly expensive to participate in, though it is fun to dip in and see what is going on with those things from time to time.
Not stated in the article, but I suspect that another big reason a lot of hobbyists obsess over the gear and kit aspect of a hobby is because buying kit is a substitute for not having time or energy to actually do the hobby itself. In some sense, buying kit is materializing fantasies about actually doing the thing, but not having the time or the place to do it.
Lesson learned: Sometimes type inference fails, and always annotate your types at FFI boundaries!
I got some keys second-hand for Windows 10 Enterprise LTSC a few years ago, installed it on some ten year old hardware at the time, and I was honestly surprised how responsive Windows could be absent (to the best of my knowledge) the telemetry software, Cortana, etc., and how fast it could boot. It's almost like the true blue good Windows experience without all the nonsense is secretly reserved for only business customers and pirates.
The geometric picture underneath is one of the things that keeps me in awe of the subject despite its seeming simplicity, and I keep getting something out of it every time I come back to it. It's a bummer since finite-dimensional linear algebra is one of a handful of mathematics topics where one can answer all the questions posed at the beginning of a course in it by the end of a course in it, so it is a pretty self-contained topic.
After learning e.g. exterior algebra (differential forms), Clifford algebra (geometric algebra in these parts), and so on, the geometric picture of the determinant as the size of an oriented volume makes deriving the algebraic formula super duper slick. Like in Clifford algebra, the formula can be proven in two or three lines. It's unfortunate that it seems like e.g. exterior algebra never get introduced sooner in the pedagogy of linear algebra or multivariable calculus because when used right they make the underlying ideas shine through beautifully. It's a bummer since exterior algebra is much simpler than it looks, though like many things in mathematics, it's takes a lot of work to make that simple idea rigorous. But unfortunately algebra in general given it's abstract nature can absolutely lobotomize the real deal geometric ideas underneath a lot of this stuff when used poorly.
(1) Computer technology and computer programming. This portion does not fundamentally change much. At the end of the day, all our code is running on some kind of Von Neumann architecture hardware, with a C-like ABI, on a 1970s paradigm Unix-like OS based on identity-based access control, that pipes and transforms, displays, and persists data. Given how fad and fashion driven computing is, the vast majority of the change isn't innovation, it's just surface-level change (Change != Innovation). There's very little real deal change in computer technology these days. Refinement yes, step change no.
(2) Domain knowledge. The great part about the second part is that whereas (1) does not fundamentally change very much, software is applicable to pretty much anything, so there is always ample room to explore interesting topics. I like to use side projects as a way of exploring new topics and finding new fields to try my hand at. Even e.g. game development with all the technological wizardry that goes into game engines and tooling is ultimately about creating compelling interactive experiences and entertainment at it's best. At it's worst it's about creating attention-thieving rent-extracting Skinner boxes.
On part (1), I think a big source of the complexity of modern software is the fact that we're trapped in a local maximum that's no longer fit for purpose. But in keeping with established things, big players in any industry--including the tech industry--hate nothing more than real innovation or invention. Couple this with massive amounts of inertia, it makes it really hard to meaningfully explore alternative software systems paradigms. It's a rotting pile of awful, but a pretty darn useful one for a lot of people, so here we are.
In particular, there is a quadfecta of ideas I am thinking of things along the lines of: (a) Capability-based operating systems. (b) Interactive software systems. Things along the lines of the LISP machines of old, Smalltalk, Self, Luna, Erlang, Elixir, and Unison. That is, the idea of software systems as living interactable artifacts. (c) Content-derived code versioning and (binary) reproducible builds. (d) Programming language designs based on linear logic, affine logic, or other kinds of separation logics (Rust, ATS, Austral, and others).
The set of four ideas above have the kernel of some very different paradigms for interacting with and creating truly robust and resilient software systems. Unfortunately the first three ideas also have a very long history of failing to gain traction going back to the 1980s. My sense is that software engineering as a field is in a gnarly state of arrested development (that makes most of us miserable at least some of the time), and the quadfecta above is a big thing that keeps me passionate about it. It's a deep well of idea to explore, and one that keeps me out of apathy over the current state of affairs in computer technology. There is a huge amount of latent potential in software engineering and computer science that feels like is just being left on the ground, even when it feels Sisyphean to bend over and pick it up for the umpteenth time.
On part (2), given the circumstances around part (1), my interests have on another axis shifted towards computers as media for creative expression. In other words, computers as a tool for doing other things. I tend to lean more digitally vegan (in the sense of Andy Farnell's 'Digital Vegan') in my daily life, so I can get to the business of using computers for creative purposes. Of course I still end up doing a lot of tinkering anyway, but that's how things go sometimes. In that sense much of what I like about computers has evolved from the technology itself, to what I can do with it or create with it instead. The beauty of the essentially universal applicability of computer technology is that one's career can always stay fresh by changing business domains. Skill set (1) is pretty stable, so one has a nice stable place to stick a foot while exploring around with skill set (2).
TL;DR it's natural for one's interests and passions to ebb, flow, and evolve. It's called being alive.
It had a nice side effect of saving my bacon several times on final exams. On my engineering electromagnetics final I forgot to change the batteries in my TI-89 the night before and the calculator didn't work. I ended up having to re-derive a small bit of transmission line theory from scratch in order to solve the problems. I somehow managed to be one of the first people done anyway. I did have fun making arcade game clones and custom boot screens in assembly on it though.
Pop!_OS is a remarkably stable and usable Linux distro. At least from a UX and aesthetics standpoint I find it competitive with macOS (I am also a longtime mac user, though macOS has lost its edge in recent years on the UX front). Overall I would say it's my favorite Linux distro these days. I am a big fan of the Debian family of distros in general. I used Arch Linux for almost ten years before switching fully to Pop!_OS and I never had an update go pear-shaped. Rolling release with pacman is amazingly robust indeed. I would say it's my number two.
I was an Ubuntu user from version 7 to version 16. Two things did it in for me. The first one was when Canonical submarined Amazon search queries into the OS's search feature somewhere around version 12 or 13. The second problem I had was major version upgrades reliably crashed my workstations. Every single major version upgrade meant a Busybox prompt after rebooting. After a few too many of those headaches (frustrations with apt upgrades causing trouble aside), it got to the point where I'd just do a nuke and boot to upgrade major versions instead of doing it in situ. After that happened for the last time sometime around Ubuntu 16.10 I said enough and dropped it going fully over to Arch Linux until around 2020, when I switched to Pop!_OS for a change of pace. Pop!_OS major version transitions have never caused problems for me. Arch Linux obviously doesn't have a notion of versions to begin with being rolling release.
In either case, in low-level code and low-high-level code, the number of ideas one deals with is many fewer than in the higher levels of the stack. At the end of the day, computers are really fancy calculators, and the ontology at that level of the stack only consists of a handful of things. A consequence of it is that one reuses the same handful of ideas in myriad different ways. It's part of what makes the lower levels of the stack both fun, and monotonous at the same time for me anyway.
I cannot say whether low-level software or low-high-level software is easier than higher level code. One deals with fewer ideas, but the picky details matter a lot more. Hence why e.g. systems languages generally do not have the abstraction power that higher level languages do, but they allow you to directly manipulate data. With the higher levels, there's an explosion of ideas (far more different problem domains and business domains to consider up there) but one gets to take advantage of good abstractions and good infrastructure to help. I do find that the difficult/time spent per LOC ratio is a lot higher with low-high-level code than high-level code, but low-high-level code is also a tiny fraction of the entire ecosystem. One side benefit of experience in the low-high-level region in particular is that I have yet to run into a software system where having a sense of how that stuff works wasn't hugely beneficial. Since there are relatively few ideas that turn up everywhere in computer software, grokking them has a massive power to weight ratio for working with the higher levels of the stack, especially when debugging and stuff. At least I have yet to find time spent down there to be time wasted.