Knowledge, Writing, and Executability

Primary Audience: Myself.

As I've worked on personal software projects and contemplated how I want to capture knowledge, develop ideas, and build things, I have come to a conclusion that I want the following environment in which to do this work:

  • Capture small units of data as tuples of subject, verb, object, and time.
  • Group units of data as recognizable entities and also capture statements about the entities.
  • Capture large units and groups of data and define programs that use them by weaving prose, data, and executable algorithms.
  • Retrieve all of that information with both structured queries and full-text searches.
  • View and edit that information in both textual forms and high-performance, rich graphical environments.
  • Iterate quickly during development using tests.

I want this universally, for everything from code analysis to system documentation to highly domain-specific data, ad hoc programs. I struggle with a desire to have a universally-applicable set of tools, the concrete needs of individual projects, and a scarcity of free time.

I have spent the last ten years using Clojure joyfully and nearly exclusively. I am completely spoiled by its excellent design, the simplicity of Lisp syntax, the ease of structural editing, and now many years of familiarity not only with Clojure itself, but also the JVM and JavaScript runtimes it targets and their dependency management and library ecosystems.

The primary aspect of Clojure and the JVM's story that limits me is its start-up time. Compilation via GraalVM and using its native-image provides a solution, but there are many features of the JVM that are not compatible with compilation to a native executable with these tools. Trying to get code bases to compile with these specialized tools is itself time-consuming, not on the critical path of conveying knowledge or solving problems, and represents "fixing the build" which is inherently infuriating if it requires constant adjustment.

Time spent learning other platforms to build native executables has generally felt like a less efficient use of my time (though an incredibly tempting one, as I relish learning new languages). Rust represents the only compelling exception.

I also want to produce both live artifacts that are accessible via a web browser as well as static, printable artifacts that can exist in space and time outside of a computer system. As with any creative medium, I want fine-grained control over the output, but also should spend most of my time on the content rather than the form (but again, how tempting the form is!).

To myself: Focus on specific goals for specific projects; pick a good tool for the job, not necessarily the best tool, as the search for that has left you spending time writing things like this post instead of working on and finishing the projects you have in mind. At this rate you'll never fail because you will have never finished even one of those projects.

Tags: clojure knowledge-management datalog publishing

Copyright © 2020 Daniel Gregoire