From 44610afae157f7c8caed7067c15cfa38432236ed Mon Sep 17 00:00:00 2001 From: Roman Kashitsyn Date: Mon, 20 May 2024 09:47:20 +0200 Subject: [PATCH] post: enlightmentware (#68) Closes #59. --- blogware/render.go | 6 + blogware/symtab.go | 1 + css/tufte.css | 14 ++ fonts/LibertinusKeyboard-Regular.otf | Bin 0 -> 53984 bytes fonts/LibertinusKeyboard-Regular.woff2 | Bin 0 -> 35352 bytes posts/18-if-composers-were-hackers.tex | 1 + posts/23-numeric-tower-fiasco.tex | 1 + posts/28-enlightenmentware.tex | 258 +++++++++++++++++++++++++ 8 files changed, 281 insertions(+) create mode 100644 fonts/LibertinusKeyboard-Regular.otf create mode 100644 fonts/LibertinusKeyboard-Regular.woff2 create mode 100644 posts/28-enlightenmentware.tex diff --git a/blogware/render.go b/blogware/render.go index df07e3b..7122437 100644 --- a/blogware/render.go +++ b/blogware/render.go @@ -478,6 +478,12 @@ func renderGenericCmd(rc *RenderingCtx, buf *strings.Builder, cmd Cmd) error { return err } buf.WriteString("") + case SymKbd: + buf.WriteString("") + if err := renderGenericSeq(&newRc, buf, cmd.args[0]); err != nil { + return err + } + buf.WriteString("") case SymHref: var dst string if err := cmd.ArgText(0, &dst); err != nil { diff --git a/blogware/symtab.go b/blogware/symtab.go index 8f7f303..845bb1c 100644 --- a/blogware/symtab.go +++ b/blogware/symtab.go @@ -62,6 +62,7 @@ var ( SymBlockquote = BuiltinCmd("blockquote", ArgTypeSeq, ArgTypeSeq) SymMulticolumn = BuiltinCmd("multicolumn", ArgTypeNum, ArgTypeAlignSpec, ArgTypeSeq) SymTerm = BuiltinCmd("term", ArgTypeSeq, ArgTypeSeq) + SymKbd = BuiltinCmd("kbd", ArgTypeSeq) // Builtin replacement commands SymLdots = BuiltinReplacement("ldots", "…") diff --git a/css/tufte.css b/css/tufte.css index 0d0798e..e1fa74d 100644 --- a/css/tufte.css +++ b/css/tufte.css @@ -54,6 +54,16 @@ font-display: swap; } +@font-face { + font-family: "Libertinus Keyboard"; + font-style: normal; + font-weight: normal; + src: local("Libertinus Keyboard"), + url("/fonts/LibertinusKeyboard-Regular.otf") format("opentype"), + url("/fonts/LibertinusKeyboard-Regular.woff2") format("woff2"); + font-display: swap; +} + @font-face { font-family: "Neo Euler"; font-style: normal; @@ -358,6 +368,10 @@ pre.apl>code { font-size: 1.03rem; } +kbd { + font-family: "Libertinus Keyboard"; +} + /* Tufte CSS styles */ html { font-size: 15px; diff --git a/fonts/LibertinusKeyboard-Regular.otf b/fonts/LibertinusKeyboard-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..276464accb6c45efda9ef43a79dfe345f53de855 GIT binary patch literal 53984 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 m)Q==e5kU3EHccPhqsq4K=({G9^>;XnlHp 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�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 MbRX=Fe~YpL0DsB!?f?J) literal 0 HcmV?d00001 diff --git a/posts/18-if-composers-were-hackers.tex b/posts/18-if-composers-were-hackers.tex index 586e544..cabf2eb 100644 --- a/posts/18-if-composers-were-hackers.tex +++ b/posts/18-if-composers-were-hackers.tex @@ -6,6 +6,7 @@ \modified{2023-04-01} \keyword{programming} +\keyword{personal} \keyword{glasperlenspiel} \begin{document} diff --git a/posts/23-numeric-tower-fiasco.tex b/posts/23-numeric-tower-fiasco.tex index 81166e1..b458d07 100644 --- a/posts/23-numeric-tower-fiasco.tex +++ b/posts/23-numeric-tower-fiasco.tex @@ -6,6 +6,7 @@ \modified{2023-11-22} \keyword{oop} \keyword{programming} +\keyword{personal} \begin{document} diff --git a/posts/28-enlightenmentware.tex b/posts/28-enlightenmentware.tex new file mode 100644 index 0000000..d3a1ab9 --- /dev/null +++ b/posts/28-enlightenmentware.tex @@ -0,0 +1,258 @@ + +\documentclass{article} + +\title{Enlightenmentware} +\subtitle{Software that makes you a better programmer.} +\date{2024-05-20} +\modified{2024-05-20} +\keyword{programming} +\keyword{personal} + +\begin{document} +\section* +As programmers, we interact with software tools daily. +Most of them can barely get the job done. +But once in a white, we discover a piece of software that transcends mere utility. +These tools capture our imagination, open new possibilities, and affect how we design our own systems. +I call such software \em{enlightenmentware}. + +The most common source of enlightenment for programmers is the programming language they use at work or learn as a hobby. +I experienced many jolts of enlightenment from fiddling with programming languages, from \href{https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler}{\sc{masm}} and \href{https://en.wikipedia.org/wiki/C_(programming_language)}{C} to \href{https://en.wikipedia.org/wiki/Prolog}{Prolog} and \href{https://www.idris-lang.org/}{Idris}. +I won't focus on languages, however, since the effects of language learning on mind expansion is old news\sidenote{sn-norvig}{ + See, for example, Peter Norvig's ``\href{https://norvig.com/21-days.html}{Teach Yourself Programming in Ten Years}''. +}. + +In this article, I praise the tools that contributed the most to my enlightenment as a software engineer. + +\section{unix}{UNIX} + +\epigraph{ + \sc{unix} is user-friendly---it's just choosy about who its friends are. +}{ + Anonymous, in the ``Art of \sc{unix} Programming'' by Eric S. Raymond +} + +I started looking for my first real programming job around 2008, while studying at university in my hometown of Nizhny Novgorod. +Almost all the open positions required knowledge of mysterious things called \sc{unix} and \em{sockets}. +My curriculum didn't offer a course on \sc{unix} or operating systems in general, so I decided to get a textbook and master the topic myself. + +``\href{https://www.goodreads.com/book/show/22066650-unix}{The \sc{unix} Operating System}'' by Andrey Robachevsky et al., also known as the \em{turtle book} in Russia because of its cover, introduced me to the magical world of \sc{unix}-like operating systems. +\sc{unix} became something I could understand, explore, and programmatically interact with. +All pieces of the puzzle---the filesystem interface, the process model with environments and permissions, forking, sockets, and signals---fell into place and revealed a coherent, beautiful picture. + +A search for a working \sc{unix} installation led me to \href{https://en.wikipedia.org/wiki/Mandriva_Linux}{Mandriva Linux}. +It was like discovering a parallel universe where you don't have to pirate software or spend forty minutes installing an \sc{ide} to compile a \sc{c} program. +Here, people developed software for fun and shared it freely. +I couldn't fathom why anyone would use Windows\sidenote{sn-windows}{ + I became significantly more tolerant since my early university years. + Windows (specifically the \href{https://en.wikipedia.org/wiki/Windows_NT}{NT family}) is a great operating system. + I even have it installed on my gaming \sc{pc} so that I can buy games I never play. +}. + +From that moment on, \sc{unix} followed me through all stages of my life: +the toddler phase of keeping up with the cutting-edge \href{https://ubuntu.com}{Ubuntu} releases, +the rebellious teens of compiling custom kernels for my \href{https://www.thinkwiki.org/wiki/Category:T61p}{Thinkpad T61p} and \href{https://wiki.gentoo.org/wiki/Emerge}{emerging} the \href{https://wiki.gentoo.org/wiki/World_set_(Portage)}{\code{@world}} on \href{https://www.gentoo.org/}{Gentoo}, +the maturity of returning to Ubuntu \sc{lts} and delaying upgrades until the first dot one release, +and to the overwhelmed parent stage of becoming a happy macOS user. + +\sc{unix} also became an essential building block in my profession. +Most of the software I wrote operates in a \sc{unix} environment, and I still occasionally consult my copy of \href{https://www.goodreads.com/book/show/603263.Advanced_Programming_in_the_UNIX_Environment}{Advanced Programming in the \sc{unix} Environment}. + +\section{git}{Git} + +\epigraph{ + It is easy to shoot your foot off with git, but also easy to revert to a previous foot and merge it with your current leg. +}{ + Jack William Bell +} + +I encountered version control systems in early 2009; the company I worked for used \href{https://en.wikipedia.org/wiki/IBM_Rational_ClearCase}{Rational ClearCase} to manage their code. +The system versioned each file separately and relied on large configuration files---\em{config specs}---to construct a consistent snapshot of the source tree. +The tool was utterly confusing and intimidating, so I avoided dealing with it beyond the minimal requirements of my job. + +About a year later, I joined a shop that used \href{https://subversion.apache.org/}{Subversion}. +This time, I invested in learning upfront and swallowed the entire \href{https://svnbook.red-bean.com/}{Version Control with Subversion} before making my first commit. +Subversion was easy to understand and use; I couldn't imagine how to improve on it. +Still, I perceived it as a tool that you use at work. +There was enough friction in setting up a repository to hinder its use for small personal projects. +At the time, Google offered hosting on \href{https://code.google.com/}{Google Code}, but I didn't feel comfortable sharing my experiments with the world back then. + +And then I discovered \href{https://git-scm.com/}{Git}. + +Git was nothing like Subversion. +It had a steep learning curve and confused everyone to no end\sidenote{sn-git-random-man}{ + Way before we all got used to ChatGPT, + \href{https://github.com/Lokaltog}{Kim Ødegaard} created a \href{https://git-man-page-generator.lokaltog.net/}{service} that generates random man pages mocking Git's dense documentation style. +}. +Still, the confusion was qualitatively different from what I experienced with ClearCase. +ClearCase is confusing like a Russian novel: All the characters have strange names, the plot is complex, and it doesn't end well. +Git is confusing like math: It slowly melts your brain and molds it into a \href{https://en.wikipedia.org/wiki/Tesseract}{tesseract}, giving access to higher dimensions. + +Git removed the friction from using version control; there was no excuse not to version anything of value anymore. +Merging branches with Git didn't cause anxiety disorders. +The staging area---confusingly named \em{index}---became essential to my workflows. +But my favorite feature was the breathtaking beauty of Git's design, the elegant mix of distributed systems, acyclic graphs, and content-addressed storage. + +Learning about Git's internals was so much fun that I became interested in the bits and bolts of other version control systems. +I travelled through time from \href{https://darcs.net/}{Darcs} to \href{https://www.mercurial-scm.org/}{Mercurial}, \href{https://www.bitkeeper.org/}{BitKeeper}, and the ultimate origin, \href{https://en.wikipedia.org/wiki/Source_Code_Control_System}{SCCS}. +I also built a toy one-file version control system while learning Rust. + +Will Git ever be replaced with something better? +Just as it was hard to imagine an improvement over Subversion before Git came along, it's hard to imagine a significant improvement over Git now. +For me, Git's primary disadvantage is its snapshot-oriented approach that makes merges hard to reason about. +Git, Mercurial, and most other tools make it challenging to separate original code from the decisions that the person merging files had to make\sidenote{sn-janestreet-patch-vs-diff}{ + Jane Street's tech staff reports similar concerns. + See, for example, the \href{https://blog.janestreet.com/patch-review-vs-diff-review-revisited/}{Patch review vs. diff review, revisited} blog article. +}. +Systems based on \href{https://en.m.wikibooks.org/wiki/Understanding_Darcs/Patch_theory}{patch theory}, such as \href{https://pijul.org/}{Pijul} and \href{https://darcs.net/}{Darcs}, might address these issues. + +\section{emacs}{Emacs} + +\epigraph{ + While any text editor can save your files, only Emacs can save your soul. +}{Per Abrahamsen} + +I edited my first programs in a friendly blue window of \href{https://en.wikipedia.org/wiki/Turbo_Pascal}{Turbo Pascal 7.0}. +The environment had little friction: no project or build configuration, no noticeable build time; you type your code and run it. +That was a perfect tool for learning. + +My university used Pascal for introductory programming classes, so I also used Turbo Pascal for my assignments. +Later courses introduced C++ and Java, for which we used \href{https://en.wikipedia.org/wiki/Visual_Studio#6.0_(1998)}{Visual Studio 6.0} and \href{https://en.wikipedia.org/wiki/JBuilder}{JBuilder}. +Although we learned to invoke compilers from the command line, \sc{ide}s dominated my early code-editing experience. + +At my first programming job, I worked on a remote Solaris workstation over a \href{https://en.wikipedia.org/wiki/Citrix_Systems}{Citrix} connection. +Almost everyone in our group used \href{https://en.wikipedia.org/wiki/NEdit}{NEdit} to edit the code. +One day, I noticed a person whose editor looked markedly different from everyone else's; the background was dark, and the code glowed with bright colors. +To me, that was a sign of their superior technical knowledge. +I \em{needed} to learn how to tweak my editor. + +The quest for customization led me to \href{https://www.vim.org/}{Vim} (the workstation had Vim 6 installed out of the box). +After all, if the goal is to stand out from the crowd, why stop at the color scheme? +I went through the Vim tutorial, and it clicked with me immediately. +It felt like playing a musical instrument: challenging but fun. +It turned a mundane job of fixing bugs into an exercise in skill. + +I don't remember exactly when and why I got interested in Emacs\sidenote{sn-wolfram-notes}{ + Daly journaling is one of the things I wish I started doing earlier. + I'm nowhere near \href{https://writings.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/#archiving-and-searching}{Stephen Wolfram's level}, but I enjoy going back and seeing what I was up to a few years ago. +}. +Most likely, it was a result of my obsession with Lisp after reading \href{https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs}{Structure and Interpretation of Computer Programs} and looking for a Lisp to interact with. +I remember reading \href{https://www.gnu.org/software/emacs/manual/eintr.html}{An Introduction to Programming in Emacs Lisp} around 2010 and having a great time. + +I became interested in the editor internals. +Using \href{https://www.finseth.com/craft/}{The Craft of Text Editing} by Craig A. Finseth as a guide, I explored the source code of various editors to see how they worked: which the data structures they used to represent text buffers, how they interacted with extensions and implemented the undo mechanism. +I found Vim's source code somewhat messy, inconsistent, and hard to understand. +Emacs's source was spotless, well-organized, and well-documented. + +A dive into Emacs internals also revealed the inherent beauty of its architecture. +Emacs is a Lisp machine that provides text editing and window management capabilities. +It is a powerful, convenient, and friendly development environment for building dynamic text-driven applications in Emacs Lisp. + +Almost everything in Emacs is a Lisp object you can inspect, interact with, and access its documentation. +That makes Emacs' documentation system unparalleled once you master it. +Emacs' dynamism makes extending it much easier than any other editor. +The feedback loop is airtight: you can immediately try out your code in the context of the editor you use to write it. + +Although I'm writing these words in \href{https://code.visualstudio.com/}{Visual Studio Code}, I always have my Emacs open\sidenote{sn-vim}{ + I also have a \href{https://github.com/tmux/tmux/wiki}{tmux} session with multiple \href{https://neovim.io/}{nvim} instances running. + I use these when my pinky gets tired of holding down the \kbd{Ctrl} key. +}. +Many things are easier in Emacs; I don't think any software will ever completely replace it for me. +It's also my editor of choice if I need to implement an extension. +Programming Emacs Lisp is a joy, especially compared to writing Vimscript. + +\section{boost-graph}{Boost.Graph} + +\epigraph{ + I also must confess to a strong bias against the fashion for reusable code. + To me, ``re-editable code'' is much, much better than an untouchable black box or toolkit. +}{ + Donald Knuth, \href{https://www.informit.com/articles/article.aspx?p=1193856}{Interview with Andrew Binstock} +} + +The evening of 2013 New Year's Eve didn't go as planned. +I was on a cruise ship crossing the stormy Baltic Sea and couldn't stay on my feet because of the seasickness. +Instead of consuming tasty treats with the rest of the passengers, I was lying in bed and reading a book I took for the trip: \href{https://www.goodreads.com/book/show/1705806.The_Boost_Graph_Library}{The Boost Graph Library} by Jeremy G. Siek et al. + +Most algorithm libraries require you to commit to a specific data representation, making integrating them into an existing project prohibitively expensive. +That's especially true for graph algorithms: The vertices and edges are usually implicitly defined and deeply embedded into other data structures, so it's easier to re-implement the algorithm than to use a generic library. + +The \href{https://www.boost.io/libraries/graph/}{Boost.Graph} library solves this problem elegantly using \href{https://en.wikipedia.org/wiki/Alexander_Stepanov}{Alex Stepanov}'s ideas on generic programming. +It uses a bag of tricks (type traits, property maps, visitors) to implement graph algorithms that can work with any graph representation you throw at them, given that you provide an adapter telling the library how to view your data structures as a graph. + +Even though I never had a chance to use the library in practice\sidenote{sn-boost-graph-use}{ + Given that I share Donald Knuth's attitude opening this section, I would probably not use the library even if I had a chance. + I'd rather write one page of interesting code traversing a graph than two pages of boring adapters required to invoke the algorithm. +}, its design helped me deepen my understanding of \href{https://en.wikipedia.org/wiki/Standard_Template_Library}{\sc{stl}} design and generic programming in general. +It also helped me understand the motivation for advanced type-level programming features in other programming languages, such as \href{https://wiki.haskell.org/GHC/Type_families}{type families} in Haskell. +Overall, Boost.Graph is one of the most enlightening pieces of software that I've never used. + +\section{bazel}{Bazel} + +\epigraph{ + If make doesn't do what you expect it to, it's a good chance the makefile is wrong. +}{ + Adam de Boor, ``\href{https://docs-archive.freebsd.org/44doc/psd/12.make/paper.pdf}{PMake---A Tutorial}'' +} + +I wrote my first \code{Makefile} around 2009 while working on a research project in computational mathematics for my degree. +I already used \href{https://en.wikipedia.org/wiki/Make_(software)}{\code{make}} at work, but I didn't need to understand how it worked. +This time, I had to compile a \sc{fortran} program mixing sources adhering to different language standards: from venerable \sc{fortran} 77 to hip Fortran 2003. +To get a deeper understanding of the tool, I referred to \href{https://www.oreilly.com/library/view/managing-projects-with/0596006101/}{Managing Projects with GNU Make} by Robert Mecklenburg. + +Most books on technology excite me: I become enthusiastic about the subject and want to try it out in practice. +The book on \code{make} had the opposite effect. +The complexity required to make builds correct and ergonomic made me earn for a better tool\sidenote{sn-modern-cpp-design}{ + One book that made me feel the same way was \href{https://www.goodreads.com/book/show/871669.Modern_C_Design}{Modern C++ Design} by Andrei Alexandrescu. + The book is deep and beautifully written, but the terrifyingly clever and ugly tricks in the second chapter made me question the choice of the programming language. + Another one is \href{https://nostarch.com/autotools2e}{Autotools} by John Calcote. +}. + +After my deep dive into \code{make}, I often fiddled with build systems at work: +I introduced \href{https://cmake.org/}{CMake} to my first C++ project to replace complex and scarily incorrect \code{Makefile} files and +replaced an inflexible \href{https://ant.apache.org/}{Ant}-based build system in a 500 \sc{kloc} Java project with \href{https://gradle.org/}{Gradle} scripts that everyone on the team could contribute to. +But all of the tools I tried, including \href{https://cmake.org/}{CMake}, \href{https://ant.apache.org/}{Ant}, \href{https://maven.apache.org/}{Maven}, \href{https://gradle.org/}{Gradle}, \href{https://www.scons.org/}{SCons}, and \href{https://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html}{autotools} left me deeply unsatisfied. +They were clanky, awkward, and hard to extend and compose. + +In 2016, I joined Google in Zurich. +I heard about Google's internal build tool, \code{blaze}, and couldn't wait to lay my hands on it. +Surprisingly, I didn't need to fiddle with \code{blaze}, nor did I have to understand how it worked. +I could copy some build targets and edit the dependency list, and the build worked as expected. +\code{blaze} made correct and fast builds not just easy, but \em{boring} in the good sense. +Only a few years later, when I attempted to use \href{https://bazel.build/}{Bazel}---the open-source version of \code{blaze}---for a toy personal project, did I have to understand the underlying model. + +Bazel was the final piece of the puzzle, together with Haskell's typeclasses, \href{https://research.google/pubs/flumejava-easy-efficient-data-parallel-pipelines/}{Flume pipelines} interface, and the \href{https://www.tensorflow.org/}{TensorFlow} 1.0 execution model, that made me understand the ubiquitous plan-execute pattern\sidenote{sn-build-systems-a-la-carte}{ + The \href{https://www.microsoft.com/en-us/research/uploads/prod/2018/03/build-systems.pdf}{Build Systems à la Carte} article by Andrey Mokhov, Neil Mitchell, and Simon Peyton Jones explains how various build system designs map to Haskell typeclasses. + Thomas Leonard's \href{https://roscidus.com/blog/blog/2019/11/14/cicd-pipelines}{CI/CD pipelines: Monad, Arrow or Dart?} blog post is also a great read on this topic. +}. +Bazel build file is a program that constructs a slice of the build artifact graph. +Bazel rules don't \em{run} the build commands; they \em{declare} how to transform inputs into outputs, and the Bazel engine figures out the rest. + +My relationship with the tool reached true intimacy when I helped \href{/posts/17-scaling-rust-builds-with-bazel.html}{transition \sc{dfinity}'s build system to Bazel}. +Despite all the challenges I faced on the way, Bazel is still my favorite build system. +It's fast, correct, easy to use, and language-agnostic. + +Paraphrasing \href{https://www.stroustrup.com/quotes.html}{Bjarne Stroustup}, I think a smaller, simpler, cleaner build system is struggling to get out within Bazel. +I hope this core will someday reveal itself to the world and become the standard tool for building all software. + +\section{conclusion}{Conclusion} + +After presenting my cases, I find it tempting to look for a common theme. +What makes a good enlightenmentware? +For me, these are the key points: + +\begin{itemize} + \item + All these tools address a deep problem, and a kind of problem that I face every day, such as making programs on my computer cooperate, managing concurrent work streams, or generalizing a piece of code. + \item + They are ``round'': they pack the most volume in the smallest surface area. + \sc{unix} surface area is tiny, but it unlocks much power. + Emacs and Git are all over the place, but their \em{core} is small, sweet, and easy to appreciate. + \item + They invite and encourage you to explore their internals. + It's not only about being free and open-source; mastering them is also well worth the investment. +\end{itemize} + +What's your enlightenmentware? Tell me on Reddit! + +\end{document} \ No newline at end of file